added function iterator to ndarray

This commit is contained in:
Zoltán Vörös 2020-09-29 18:48:02 +02:00
parent dfd4a6729b
commit 501663e3fe
5 changed files with 91 additions and 41 deletions

View file

@ -285,6 +285,33 @@ void ndarray_fill_array_iterable(mp_float_t *array, mp_obj_t iterable) {
} }
} }
#if ULAB_HAS_FUNCTION_ITERATOR
size_t *ndarray_new_coords(uint8_t ndim) {
size_t *coords = m_new(size_t, ndim);
memset(coords, 0, ndim*sizeof(size_t));
return coords;
}
void ndarray_rewind_array(uint8_t ndim, uint8_t *array, size_t *shape, int32_t *strides, size_t *coords) {
// resets the data pointer of a single array, whenever an axis is full
// since we always iterate over the very last axis, we have to keep track of
// the last ndim-2 axes only
array -= shape[ULAB_MAX_DIMS - 1] * strides[ULAB_MAX_DIMS - 1];
array += strides[ULAB_MAX_DIMS - 2];
for(uint8_t i=1; i < ndim-1; i++) {
coords[ULAB_MAX_DIMS - 1 - i] += 1;
if(coords[ULAB_MAX_DIMS - 1 - i] == shape[ULAB_MAX_DIMS - 1 - i]) { // we are at a dimension boundary
array -= shape[ULAB_MAX_DIMS - 1 - i] * strides[ULAB_MAX_DIMS - 1 - i];
array += strides[ULAB_MAX_DIMS - 2 - i];
coords[ULAB_MAX_DIMS - 1 - i] = 0;
coords[ULAB_MAX_DIMS - 2 - i] += 1;
} else { // coordinates can change only, if the last coordinate changes
break;
}
}
}
#endif
static int32_t *strides_from_shape(size_t *shape, uint8_t dtype) { static int32_t *strides_from_shape(size_t *shape, uint8_t dtype) {
// returns a strides array that corresponds to a dense array with the prescribed shape // returns a strides array that corresponds to a dense array with the prescribed shape
int32_t *strides = m_new(int32_t, ULAB_MAX_DIMS); int32_t *strides = m_new(int32_t, ULAB_MAX_DIMS);

View file

@ -126,6 +126,8 @@ bool ndarray_can_broadcast(ndarray_obj_t *, ndarray_obj_t *, uint8_t *, size_t *
mp_obj_t ndarray_binary_op(mp_binary_op_t , mp_obj_t , mp_obj_t ); mp_obj_t ndarray_binary_op(mp_binary_op_t , mp_obj_t , mp_obj_t );
mp_obj_t ndarray_unary_op(mp_unary_op_t , mp_obj_t ); mp_obj_t ndarray_unary_op(mp_unary_op_t , mp_obj_t );
size_t *ndarray_new_coords(uint8_t );
void ndarray_rewind_array(uint8_t , uint8_t *, size_t *, int32_t *, size_t *);
// various ndarray methods // various ndarray methods
#if NDARRAY_HAS_FLATTEN #if NDARRAY_HAS_FLATTEN
@ -220,6 +222,24 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
#endif /* ULAB_MAX_DIMS == 1 */ #endif /* ULAB_MAX_DIMS == 1 */
#if ULAB_MAX_DIMS == 2 #if ULAB_MAX_DIMS == 2
#if ULAB_HAS_FUNCTION_ITERATOR
#define BINARY_LOOP(results, type_out, type_left, type_right, larray, lstrides, rarray, rstrides, OPERATOR)\
type_out *array = (type_out *)(results)->array;\
size_t *lcoords = ndarray_new_coords((results)->ndim);\
size_t *rcoords = ndarray_new_coords((results)->ndim);\
for(size_t i=0; i < (results)->len/(results)->shape[ULAB_MAX_DIMS -1]; i++) {\
size_t l = 0;\
do {\
*array++ = *((type_left *)(larray)) OPERATOR *((type_right *)(rarray));\
(larray) += (lstrides)[ULAB_MAX_DIMS - 1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
ndarray_rewind_array((results)->ndim, larray, (results)->shape, lstrides, lcoords);\
ndarray_rewind_array((results)->ndim, rarray, (results)->shape, rstrides, rcoords);\
} while(0)
#else
#define BINARY_LOOP(results, type_out, type_left, type_right, larray, lstrides, rarray, rstrides, OPERATOR)\ #define BINARY_LOOP(results, type_out, type_left, type_right, larray, lstrides, rarray, rstrides, OPERATOR)\
type_out *array = (type_out *)(results)->array;\ type_out *array = (type_out *)(results)->array;\
size_t k = 0;\ size_t k = 0;\
@ -231,13 +251,15 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
#endif
#define EQUALITY_LOOP(results, array, type_left, type_right, larray, lstrides, rarray, rstrides, OPERATOR)\ #define EQUALITY_LOOP(results, array, type_left, type_right, larray, lstrides, rarray, rstrides, OPERATOR)\
size_t k = 0;\ size_t k = 0;\
do {\ do {\
@ -248,9 +270,9 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
@ -283,9 +305,9 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
@ -306,9 +328,9 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
@ -331,15 +353,15 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 3];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 3];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\
j++;\ j++;\
} while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\ } while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\
@ -382,15 +404,15 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 3];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 3];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\
j++;\ j++;\
} while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\ } while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\
@ -413,21 +435,21 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 3];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 3];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\
j++;\ j++;\
} while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\ } while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 4];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 4];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\
i++;\ i++;\
} while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\ } while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\
@ -452,15 +474,15 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 3];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 3];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\
j++;\ j++;\
} while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\ } while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 4];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 4];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\
i++;\ i++;\
} while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\ } while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\
@ -513,21 +535,21 @@ ndarray_obj_t *ndarray_from_mp_obj(mp_obj_t );
(rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\ } while(l < (results)->shape[ULAB_MAX_DIMS - 1]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 2];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 2];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * results->shape[ULAB_MAX_DIMS-1];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 1] * (results)->shape[ULAB_MAX_DIMS-1];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 2];\
k++;\ k++;\
} while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\ } while(k < (results)->shape[ULAB_MAX_DIMS - 2]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 3];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 3];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * results->shape[ULAB_MAX_DIMS-2];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 2] * (results)->shape[ULAB_MAX_DIMS-2];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 3];\
j++;\ j++;\
} while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\ } while(j < (results)->shape[ULAB_MAX_DIMS - 3]);\
(larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (larray) -= (lstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(larray) += (lstrides)[ULAB_MAX_DIMS - 4];\ (larray) += (lstrides)[ULAB_MAX_DIMS - 4];\
(rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * results->shape[ULAB_MAX_DIMS-3];\ (rarray) -= (rstrides)[ULAB_MAX_DIMS - 3] * (results)->shape[ULAB_MAX_DIMS-3];\
(rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\ (rarray) += (rstrides)[ULAB_MAX_DIMS - 4];\
i++;\ i++;\
} while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\ } while(i < (results)->shape[ULAB_MAX_DIMS - 4]);\

View file

@ -22,6 +22,11 @@
// Possible values lie between 1, and 4, inclusive // Possible values lie between 1, and 4, inclusive
#define ULAB_MAX_DIMS 2 #define ULAB_MAX_DIMS 2
// By setting this constant to 1, iteration over array dimensions will be implemented
// as a function (ndarray_rewind_array), instead of writing out the loops in macros
// This reduces firmware size at the expense of speed
#define ULAB_HAS_FUNCTION_ITERATOR (0)
// The default threshold for pretty printing. These variables can be overwritten // The default threshold for pretty printing. These variables can be overwritten
// at run-time via the set_printoptions() function // at run-time via the set_printoptions() function
#define ULAB_HAS_PRINTOPTIONS (1) #define ULAB_HAS_PRINTOPTIONS (1)

View file

@ -43,7 +43,7 @@ static mp_obj_t vectorise_generic_vector(mp_obj_t o_in, mp_float_t (*f)(mp_float
ndarray_obj_t *source = MP_OBJ_TO_PTR(o_in); ndarray_obj_t *source = MP_OBJ_TO_PTR(o_in);
uint8_t *sarray = (uint8_t *)source->array; uint8_t *sarray = (uint8_t *)source->array;
ndarray_obj_t *ndarray = ndarray_new_dense_ndarray(source->ndim, source->shape, NDARRAY_FLOAT); ndarray_obj_t *ndarray = ndarray_new_dense_ndarray(source->ndim, source->shape, NDARRAY_FLOAT);
uint8_t *array = (uint8_t *)ndarray->array; mp_float_t *array = (mp_float_t *)ndarray->array;
if(source->dtype == NDARRAY_UINT8) { if(source->dtype == NDARRAY_UINT8) {
ITERATE_VECTOR(uint8_t, array, source, sarray); ITERATE_VECTOR(uint8_t, array, source, sarray);
} else if(source->dtype == NDARRAY_INT8) { } else if(source->dtype == NDARRAY_INT8) {

View file

@ -69,8 +69,7 @@ typedef struct _vectorized_function_obj_t {
do {\ do {\
size_t l = 0;\ size_t l = 0;\
do {\ do {\
*((mp_float_t *)(array)) = f(*((type *)(sarray)));\ *array++ = f(*((type *)(sarray)));\
(array) += sizeof(mp_float_t);\
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\ (sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\ } while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
@ -95,8 +94,7 @@ typedef struct _vectorized_function_obj_t {
do {\ do {\
size_t l = 0;\ size_t l = 0;\
do {\ do {\
*((mp_float_t *)(array)) = f(*((type *)(sarray)));\ *array++ = f(*((type *)(sarray)));\
(array) += sizeof(mp_float_t);\
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\ (sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\ } while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
@ -115,8 +113,7 @@ typedef struct _vectorized_function_obj_t {
do {\ do {\
size_t l = 0;\ size_t l = 0;\
do {\ do {\
*((mp_float_t *)(array)) = f(*((type *)(sarray)));\ *array++ = f(*((type *)(sarray)));\
(array) += sizeof(mp_float_t);\
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\ (sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\ } while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
@ -130,8 +127,7 @@ typedef struct _vectorized_function_obj_t {
#define ITERATE_VECTOR(type, array, source, sarray) do {\ #define ITERATE_VECTOR(type, array, source, sarray) do {\
size_t l = 0;\ size_t l = 0;\
do {\ do {\
*((mp_float_t *)(array)) = f(*((type *)(sarray)));\ *array++ = f(*((type *)(sarray)));\
(array) += sizeof(mp_float_t);\
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\ (sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
l++;\ l++;\
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\ } while(l < (source)->shape[ULAB_MAX_DIMS-1]);\