| 1912 | } |
| 1913 | |
| 1914 | Status ValidateSparseTensor(InferenceContext* c, ShapeHandle indices_shape, |
| 1915 | ShapeHandle values_shape, ShapeHandle shape_shape) { |
| 1916 | // Validate ranks. |
| 1917 | ShapeHandle unused_shape; |
| 1918 | TF_RETURN_IF_ERROR(c->WithRank(indices_shape, 2, &unused_shape)); |
| 1919 | TF_RETURN_IF_ERROR(c->WithRank(values_shape, 1, &unused_shape)); |
| 1920 | TF_RETURN_IF_ERROR(c->WithRank(shape_shape, 1, &unused_shape)); |
| 1921 | |
| 1922 | // Number of elements in indices and values must match. |
| 1923 | DimensionHandle num_index_elements_dim = c->Dim(indices_shape, 0); |
| 1924 | if (c->ValueKnown(num_index_elements_dim)) { |
| 1925 | DimensionHandle num_values_elements_dim = c->Dim(values_shape, 0); |
| 1926 | if (c->ValueKnown(num_values_elements_dim)) { |
| 1927 | int64 num_index_elements = c->Value(num_index_elements_dim); |
| 1928 | int64 num_values_elements = c->Value(num_values_elements_dim); |
| 1929 | if (num_index_elements != num_values_elements) { |
| 1930 | return errors::InvalidArgument("Number of elements in index (", |
| 1931 | num_index_elements, ") and values (", |
| 1932 | num_values_elements, ") do not match."); |
| 1933 | } |
| 1934 | } |
| 1935 | } |
| 1936 | |
| 1937 | // Rank embedded in indices must match shape. |
| 1938 | DimensionHandle index_rank_dim = c->Dim(indices_shape, 1); |
| 1939 | if (c->ValueKnown(index_rank_dim)) { |
| 1940 | DimensionHandle shape_rank_dim = c->Dim(shape_shape, 0); |
| 1941 | if (c->ValueKnown(shape_rank_dim)) { |
| 1942 | int64 index_rank = c->Value(index_rank_dim); |
| 1943 | int32 shape_rank = c->Value(shape_rank_dim); |
| 1944 | if (index_rank != shape_rank) { |
| 1945 | return errors::InvalidArgument("Index rank (", index_rank, |
| 1946 | ") and shape rank (", shape_rank, |
| 1947 | ") do not match."); |
| 1948 | } |
| 1949 | } |
| 1950 | } |
| 1951 | |
| 1952 | return Status::OK(); |
| 1953 | } |
| 1954 | |
| 1955 | Status ValidateVariableResourceHandle( |
| 1956 | InferenceContext* c, std::vector<ShapeAndType>* shape_and_type) { |