Adjust dimensionality and strides for index object iterators --- i.e. broadcast */ NUMPY_API*/
| 1159 | */ |
| 1160 | /*NUMPY_API*/ |
| 1161 | NPY_NO_EXPORT int |
| 1162 | PyArray_Broadcast(PyArrayMultiIterObject *mit) |
| 1163 | { |
| 1164 | int i, nd, k, j; |
| 1165 | int src_iter = -1; /* Initializing avoids a compiler warning. */ |
| 1166 | npy_intp tmp; |
| 1167 | PyArrayIterObject *it; |
| 1168 | |
| 1169 | /* Discover the broadcast number of dimensions */ |
| 1170 | for (i = 0, nd = 0; i < mit->numiter; i++) { |
| 1171 | nd = PyArray_MAX(nd, PyArray_NDIM(mit->iters[i]->ao)); |
| 1172 | } |
| 1173 | mit->nd = nd; |
| 1174 | |
| 1175 | /* Discover the broadcast shape in each dimension */ |
| 1176 | for (i = 0; i < nd; i++) { |
| 1177 | mit->dimensions[i] = 1; |
| 1178 | for (j = 0; j < mit->numiter; j++) { |
| 1179 | it = mit->iters[j]; |
| 1180 | /* This prepends 1 to shapes not already equal to nd */ |
| 1181 | k = i + PyArray_NDIM(it->ao) - nd; |
| 1182 | if (k >= 0) { |
| 1183 | tmp = PyArray_DIMS(it->ao)[k]; |
| 1184 | if (tmp == 1) { |
| 1185 | continue; |
| 1186 | } |
| 1187 | if (mit->dimensions[i] == 1) { |
| 1188 | mit->dimensions[i] = tmp; |
| 1189 | src_iter = j; |
| 1190 | } |
| 1191 | else if (mit->dimensions[i] != tmp) { |
| 1192 | set_shape_mismatch_exception(mit, src_iter, j); |
| 1193 | return -1; |
| 1194 | } |
| 1195 | } |
| 1196 | } |
| 1197 | } |
| 1198 | |
| 1199 | /* |
| 1200 | * Reset the iterator dimensions and strides of each iterator |
| 1201 | * object -- using 0 valued strides for broadcasting |
| 1202 | * Need to check for overflow |
| 1203 | */ |
| 1204 | tmp = PyArray_OverflowMultiplyList(mit->dimensions, mit->nd); |
| 1205 | if (tmp < 0) { |
| 1206 | PyErr_SetString(PyExc_ValueError, |
| 1207 | "broadcast dimensions too large."); |
| 1208 | return -1; |
| 1209 | } |
| 1210 | mit->size = tmp; |
| 1211 | for (i = 0; i < mit->numiter; i++) { |
| 1212 | it = mit->iters[i]; |
| 1213 | it->nd_m1 = mit->nd - 1; |
| 1214 | it->size = tmp; |
| 1215 | nd = PyArray_NDIM(it->ao); |
| 1216 | if (nd != 0) { |
| 1217 | it->factors[mit->nd-1] = 1; |
| 1218 | } |
no test coverage detected