| 1025 | } |
| 1026 | |
| 1027 | Status InferenceContext::Divide(DimensionHandle dividend, |
| 1028 | DimensionOrConstant divisor, |
| 1029 | bool evenly_divisible, DimensionHandle* out) { |
| 1030 | const int64 divisor_value = Value(divisor); |
| 1031 | if (divisor_value == 1) { |
| 1032 | *out = dividend; |
| 1033 | } else if (!ValueKnown(dividend) || |
| 1034 | (divisor.dim.IsSet() && !ValueKnown(divisor.dim))) { |
| 1035 | *out = UnknownDim(); |
| 1036 | } else { |
| 1037 | const int64 v = Value(dividend); |
| 1038 | if (divisor_value <= 0) { |
| 1039 | return errors::InvalidArgument("Divisor must be positive but is ", |
| 1040 | divisor_value); |
| 1041 | } |
| 1042 | if (evenly_divisible && (v % divisor_value) != 0) { |
| 1043 | return errors::InvalidArgument( |
| 1044 | "Dimension size must be evenly divisible by ", divisor_value, |
| 1045 | " but is ", v); |
| 1046 | } |
| 1047 | *out = MakeDim(v / divisor_value); |
| 1048 | } |
| 1049 | return Status::OK(); |
| 1050 | } |
| 1051 | |
| 1052 | Status InferenceContext::Add(DimensionHandle first, DimensionOrConstant second, |
| 1053 | DimensionHandle* out) { |