Add boundary checks and add tests for SparseTensorProtoToDenseTensorProto (#27323)
### Motivation and Context
### Description
This pull request improves the robustness and correctness of sparse
tensor conversion to dense tensors in the ONNX Runtime codebase. The
main changes include enhanced validation of tensor shapes and indices,
improved support for different index data types, and better error
handling for out-of-bounds indices and invalid shapes.
**Validation and Error Handling Improvements:**
- Added explicit checks to ensure that sparse tensor indices are either
rank 1 or 2, and that values are 1D, returning clear errors for
unsupported shapes. Also, added checks to ensure all dimension sizes are
positive for both values and dense tensors.
- Improved error messages and validation for out-of-bounds indices
during the sparse-to-dense copy process, including both flattened and
multi-dimensional COO indices.
[[1]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1827-R1850)
[[2]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406R1861-R1863)
**Index Data Type Handling:**
- Enhanced support for INT8 and INT16 index types by allowing them to be
provided in the `int32_data` field (not just as raw data), and improved
handling of index data extraction for all supported types.
**API and Internal Consistency:**
- Refactored the `CopySparseData` function to take both `dense_dims` and
`dense_elements` as arguments for clearer logic and consistency.
[[1]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1747-R1781)
[[2]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1904-R1947)
[[3]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1928-R1957)
[[4]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1938-R1967)
- Updated function documentation to clarify supported formats and
expected tensor shapes.
**Minor Corrections:**
- Improved error messages for invalid index shapes and ensured correct
usage of ONNX enum values and utility functions.
[[1]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1863-R1872)
[[2]](diffhunk://#diff-d31e9fbe0f5334fcd949833e035f2b25d5ae810dcd505c545f6b372b546b1406L1747-R1781)
These changes collectively make sparse tensor handling more robust,
user-friendly, and standards-compliant.
### Motivation and Context
Make the code more robust