Merge pull request #37 from jepler/portability
Make portable to CircuitPython within same codebase
This commit is contained in:
commit
49db707a9f
8 changed files with 96 additions and 76 deletions
|
|
@ -78,11 +78,11 @@ void fft_kernel(mp_float_t *real, mp_float_t *imag, int n, int isign) {
|
|||
}
|
||||
|
||||
mp_obj_t fft_fft_ifft_spectrum(size_t n_args, mp_obj_t arg_re, mp_obj_t arg_im, uint8_t type) {
|
||||
if(!mp_obj_is_type(arg_re, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(arg_re, &ulab_ndarray_type)) {
|
||||
mp_raise_NotImplementedError(translate("FFT is defined for ndarrays only"));
|
||||
}
|
||||
if(n_args == 2) {
|
||||
if(!mp_obj_is_type(arg_im, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(arg_im, &ulab_ndarray_type)) {
|
||||
mp_raise_NotImplementedError(translate("FFT is defined for ndarrays only"));
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -20,14 +20,14 @@
|
|||
#if ULAB_FILTER_CONVOLVE
|
||||
mp_obj_t filter_convolve(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_a, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_v, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_a, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_v, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
};
|
||||
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(2, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
if(!mp_obj_is_type(args[0].u_obj, &ulab_ndarray_type) || !mp_obj_is_type(args[1].u_obj, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(args[0].u_obj, &ulab_ndarray_type) || !MP_OBJ_IS_TYPE(args[1].u_obj, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("convolve arguments must be ndarrays"));
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -56,7 +56,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(linalg_transpose_obj, linalg_transpose);
|
|||
#if ULAB_LINALG_RESHAPE
|
||||
mp_obj_t linalg_reshape(mp_obj_t self_in, mp_obj_t shape) {
|
||||
ndarray_obj_t *self = MP_OBJ_TO_PTR(self_in);
|
||||
if(!mp_obj_is_type(shape, &mp_type_tuple) || (MP_OBJ_SMALL_INT_VALUE(mp_obj_len_maybe(shape)) != 2)) {
|
||||
if(!MP_OBJ_IS_TYPE(shape, &mp_type_tuple) || (MP_OBJ_SMALL_INT_VALUE(mp_obj_len_maybe(shape)) != 2)) {
|
||||
mp_raise_ValueError(translate("shape must be a 2-tuple"));
|
||||
}
|
||||
|
||||
|
|
@ -82,20 +82,20 @@ MP_DEFINE_CONST_FUN_OBJ_2(linalg_reshape_obj, linalg_reshape);
|
|||
#if ULAB_LINALG_SIZE
|
||||
mp_obj_t linalg_size(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
};
|
||||
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(1, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
if(!mp_obj_is_type(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("size is defined for ndarrays only"));
|
||||
} else {
|
||||
ndarray_obj_t *ndarray = MP_OBJ_TO_PTR(args[0].u_obj);
|
||||
if(args[1].u_obj == mp_const_none) {
|
||||
return mp_obj_new_int(ndarray->array->len);
|
||||
} else if(mp_obj_is_int(args[1].u_obj)) {
|
||||
} else if(MP_OBJ_IS_INT(args[1].u_obj)) {
|
||||
uint8_t ax = mp_obj_get_int(args[1].u_obj);
|
||||
if(ax == 0) {
|
||||
if(ndarray->m == 1) {
|
||||
|
|
@ -168,11 +168,11 @@ bool linalg_invert_matrix(mp_float_t *data, size_t N) {
|
|||
#if ULAB_LINALG_INV
|
||||
mp_obj_t linalg_inv(mp_obj_t o_in) {
|
||||
// since inv is not a class method, we have to inspect the input argument first
|
||||
if(!mp_obj_is_type(o_in, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(o_in, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("only ndarrays can be inverted"));
|
||||
}
|
||||
ndarray_obj_t *o = MP_OBJ_TO_PTR(o_in);
|
||||
if(!mp_obj_is_type(o_in, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(o_in, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("only ndarray objects can be inverted"));
|
||||
}
|
||||
if(o->m != o->n) {
|
||||
|
|
@ -205,7 +205,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(linalg_inv_obj, linalg_inv);
|
|||
#if ULAB_LINALG_DOT
|
||||
mp_obj_t linalg_dot(mp_obj_t _m1, mp_obj_t _m2) {
|
||||
// TODO: should the results be upcast?
|
||||
if(!mp_obj_is_type(_m1, &ulab_ndarray_type) || !mp_obj_is_type(_m2, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(_m1, &ulab_ndarray_type) || !MP_OBJ_IS_TYPE(_m2, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("arguments must be ndarrays"));
|
||||
}
|
||||
ndarray_obj_t *m1 = MP_OBJ_TO_PTR(_m1);
|
||||
|
|
@ -246,14 +246,14 @@ mp_obj_t linalg_zeros_ones(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw
|
|||
mp_arg_parse_all(n_args, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
uint8_t dtype = args[1].u_int;
|
||||
if(!mp_obj_is_int(args[0].u_obj) && !mp_obj_is_type(args[0].u_obj, &mp_type_tuple)) {
|
||||
if(!MP_OBJ_IS_INT(args[0].u_obj) && !MP_OBJ_IS_TYPE(args[0].u_obj, &mp_type_tuple)) {
|
||||
mp_raise_TypeError(translate("input argument must be an integer or a 2-tuple"));
|
||||
}
|
||||
ndarray_obj_t *ndarray = NULL;
|
||||
if(mp_obj_is_int(args[0].u_obj)) {
|
||||
if(MP_OBJ_IS_INT(args[0].u_obj)) {
|
||||
size_t n = mp_obj_get_int(args[0].u_obj);
|
||||
ndarray = create_new_ndarray(1, n, dtype);
|
||||
} else if(mp_obj_is_type(args[0].u_obj, &mp_type_tuple)) {
|
||||
} else if(MP_OBJ_IS_TYPE(args[0].u_obj, &mp_type_tuple)) {
|
||||
mp_obj_tuple_t *tuple = MP_OBJ_TO_PTR(args[0].u_obj);
|
||||
if(tuple->len != 2) {
|
||||
mp_raise_TypeError(translate("input argument must be an integer or a 2-tuple"));
|
||||
|
|
@ -291,7 +291,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(linalg_ones_obj, 0, linalg_ones);
|
|||
mp_obj_t linalg_eye(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_INT, {.u_int = 0} },
|
||||
{ MP_QSTR_M, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_M, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_k, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
|
||||
{ MP_QSTR_dtype, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = NDARRAY_FLOAT} },
|
||||
};
|
||||
|
|
@ -334,7 +334,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(linalg_eye_obj, 0, linalg_eye);
|
|||
|
||||
#if ULAB_LINALG_DET
|
||||
mp_obj_t linalg_det(mp_obj_t oin) {
|
||||
if(!mp_obj_is_type(oin, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(oin, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("function defined for ndarrays only"));
|
||||
}
|
||||
ndarray_obj_t *in = MP_OBJ_TO_PTR(oin);
|
||||
|
|
@ -375,7 +375,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(linalg_det_obj, linalg_det);
|
|||
|
||||
#if ULAB_LINALG_EIG
|
||||
mp_obj_t linalg_eig(mp_obj_t oin) {
|
||||
if(!mp_obj_is_type(oin, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(oin, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("function defined for ndarrays only"));
|
||||
}
|
||||
ndarray_obj_t *in = MP_OBJ_TO_PTR(oin);
|
||||
|
|
|
|||
|
|
@ -154,7 +154,7 @@ mp_obj_t ndarray_copy(mp_obj_t self_in) {
|
|||
|
||||
STATIC uint8_t ndarray_init_helper(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_dtype, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = NDARRAY_FLOAT } },
|
||||
};
|
||||
|
||||
|
|
@ -165,11 +165,8 @@ STATIC uint8_t ndarray_init_helper(size_t n_args, const mp_obj_t *pos_args, mp_m
|
|||
return dtype;
|
||||
}
|
||||
|
||||
mp_obj_t ndarray_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
||||
mp_arg_check_num(n_args, n_kw, 1, 2, true);
|
||||
mp_map_t kw_args;
|
||||
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
||||
uint8_t dtype = ndarray_init_helper(n_args, args, &kw_args);
|
||||
STATIC mp_obj_t ndarray_make_new_core(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args, mp_map_t *kw_args) {
|
||||
uint8_t dtype = ndarray_init_helper(n_args, args, kw_args);
|
||||
|
||||
size_t len1, len2=0, i=0;
|
||||
mp_obj_t len_in = mp_obj_len_maybe(args[0]);
|
||||
|
|
@ -215,6 +212,25 @@ mp_obj_t ndarray_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw,
|
|||
return MP_OBJ_FROM_PTR(self);
|
||||
}
|
||||
|
||||
#ifdef CIRCUITPY
|
||||
mp_obj_t ndarray_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args) {
|
||||
mp_arg_check_num(n_args, kw_args, 1, 2, true);
|
||||
size_t n_kw = 0;
|
||||
if (kw_args != 0) {
|
||||
n_kw = kw_args->used;
|
||||
}
|
||||
mp_map_init_fixed_table(kw_args, n_kw, args + n_args);
|
||||
return ndarray_make_new_core(type, n_args, n_kw, args, kw_args);
|
||||
}
|
||||
#else
|
||||
mp_obj_t ndarray_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *args) {
|
||||
mp_arg_check_num(n_args, n_kw, 1, 2, true);
|
||||
mp_map_t kw_args;
|
||||
mp_map_init_fixed_table(&kw_args, n_kw, args + n_args);
|
||||
return ndarray_make_new_core(type, n_args, n_kw, args, &kw_args);
|
||||
}
|
||||
#endif
|
||||
|
||||
size_t slice_length(mp_bound_slice_t slice) {
|
||||
int32_t len, correction = 1;
|
||||
if(slice.step > 0) correction = -1;
|
||||
|
|
@ -230,7 +246,7 @@ size_t true_length(mp_obj_t bool_list) {
|
|||
mp_obj_t item, iterable = mp_getiter(bool_list, &iter_buf);
|
||||
size_t trues = 0;
|
||||
while((item = mp_iternext(iterable)) != MP_OBJ_STOP_ITERATION) {
|
||||
if(!mp_obj_is_type(item, &mp_type_bool)) {
|
||||
if(!MP_OBJ_IS_TYPE(item, &mp_type_bool)) {
|
||||
// numpy seems to be a little bit inconsistent in when an index is considered
|
||||
// to be True/False. Bail out immediately, if the items are not True/False
|
||||
return 0;
|
||||
|
|
@ -245,9 +261,9 @@ size_t true_length(mp_obj_t bool_list) {
|
|||
mp_bound_slice_t generate_slice(mp_uint_t n, mp_obj_t index) {
|
||||
// micropython seems to have difficulties with negative steps
|
||||
mp_bound_slice_t slice;
|
||||
if(mp_obj_is_type(index, &mp_type_slice)) {
|
||||
if(MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
|
||||
mp_seq_get_fast_slice_indexes(n, index, &slice);
|
||||
} else if(mp_obj_is_int(index)) {
|
||||
} else if(MP_OBJ_IS_INT(index)) {
|
||||
int32_t _index = mp_obj_get_int(index);
|
||||
if(_index < 0) {
|
||||
_index += n;
|
||||
|
|
@ -461,7 +477,7 @@ mp_obj_t ndarray_get_slice(ndarray_obj_t *ndarray, mp_obj_t index, ndarray_obj_t
|
|||
mp_bound_slice_t row_slice = simple_slice(0, 0, 1), column_slice = simple_slice(0, 0, 1);
|
||||
|
||||
size_t m = 0, n = 0;
|
||||
if(mp_obj_is_int(index) && (ndarray->m == 1) && (values == NULL)) {
|
||||
if(MP_OBJ_IS_INT(index) && (ndarray->m == 1) && (values == NULL)) {
|
||||
// we have a row vector, and don't want to assign
|
||||
column_slice = generate_slice(ndarray->n, index);
|
||||
if(slice_length(column_slice) == 1) { // we were asked for a single item
|
||||
|
|
@ -470,7 +486,7 @@ mp_obj_t ndarray_get_slice(ndarray_obj_t *ndarray, mp_obj_t index, ndarray_obj_t
|
|||
}
|
||||
}
|
||||
|
||||
if(mp_obj_is_int(index) || mp_obj_is_type(index, &mp_type_slice)) {
|
||||
if(MP_OBJ_IS_INT(index) || MP_OBJ_IS_TYPE(index, &mp_type_slice)) {
|
||||
if(ndarray->m == 1) { // we have a row vector
|
||||
column_slice = generate_slice(ndarray->n, index);
|
||||
row_slice = simple_slice(0, 1, 1);
|
||||
|
|
@ -481,7 +497,7 @@ mp_obj_t ndarray_get_slice(ndarray_obj_t *ndarray, mp_obj_t index, ndarray_obj_t
|
|||
m = slice_length(row_slice);
|
||||
n = slice_length(column_slice);
|
||||
return iterate_slice_list(ndarray, m, n, row_slice, column_slice, mp_const_none, mp_const_none, values);
|
||||
} else if(mp_obj_is_type(index, &mp_type_list)) {
|
||||
} else if(MP_OBJ_IS_TYPE(index, &mp_type_list)) {
|
||||
n = true_length(index);
|
||||
if(ndarray->m == 1) { // we have a flat array
|
||||
// we might have to separate the n == 1 case
|
||||
|
|
@ -496,17 +512,17 @@ mp_obj_t ndarray_get_slice(ndarray_obj_t *ndarray, mp_obj_t index, ndarray_obj_t
|
|||
if(tuple->len != 2) {
|
||||
mp_raise_msg(&mp_type_IndexError, translate("too many indices"));
|
||||
}
|
||||
if(!(mp_obj_is_type(tuple->items[0], &mp_type_list) ||
|
||||
mp_obj_is_type(tuple->items[0], &mp_type_slice) ||
|
||||
mp_obj_is_int(tuple->items[0])) ||
|
||||
!(mp_obj_is_type(tuple->items[1], &mp_type_list) ||
|
||||
mp_obj_is_type(tuple->items[1], &mp_type_slice) ||
|
||||
mp_obj_is_int(tuple->items[1]))) {
|
||||
if(!(MP_OBJ_IS_TYPE(tuple->items[0], &mp_type_list) ||
|
||||
MP_OBJ_IS_TYPE(tuple->items[0], &mp_type_slice) ||
|
||||
MP_OBJ_IS_INT(tuple->items[0])) ||
|
||||
!(MP_OBJ_IS_TYPE(tuple->items[1], &mp_type_list) ||
|
||||
MP_OBJ_IS_TYPE(tuple->items[1], &mp_type_slice) ||
|
||||
MP_OBJ_IS_INT(tuple->items[1]))) {
|
||||
mp_raise_msg(&mp_type_IndexError, translate("indices must be integers, slices, or Boolean lists"));
|
||||
}
|
||||
if(mp_obj_is_type(tuple->items[0], &mp_type_list)) { // rows are indexed by Boolean list
|
||||
if(MP_OBJ_IS_TYPE(tuple->items[0], &mp_type_list)) { // rows are indexed by Boolean list
|
||||
m = true_length(tuple->items[0]);
|
||||
if(mp_obj_is_type(tuple->items[1], &mp_type_list)) {
|
||||
if(MP_OBJ_IS_TYPE(tuple->items[1], &mp_type_list)) {
|
||||
n = true_length(tuple->items[1]);
|
||||
return iterate_slice_list(ndarray, m, n, row_slice, column_slice,
|
||||
tuple->items[0], tuple->items[1], values);
|
||||
|
|
@ -520,7 +536,7 @@ mp_obj_t ndarray_get_slice(ndarray_obj_t *ndarray, mp_obj_t index, ndarray_obj_t
|
|||
} else { // rows are indexed by a slice, or an integer
|
||||
row_slice = generate_slice(ndarray->m, tuple->items[0]);
|
||||
m = slice_length(row_slice);
|
||||
if(mp_obj_is_type(tuple->items[1], &mp_type_list)) { // columns are indexed by a Boolean list
|
||||
if(MP_OBJ_IS_TYPE(tuple->items[1], &mp_type_list)) { // columns are indexed by a Boolean list
|
||||
n = true_length(tuple->items[1]);
|
||||
return iterate_slice_list(ndarray, m, n, row_slice, column_slice,
|
||||
mp_const_none, tuple->items[1], values);
|
||||
|
|
@ -541,12 +557,12 @@ mp_obj_t ndarray_subscr(mp_obj_t self_in, mp_obj_t index, mp_obj_t value) {
|
|||
if (value == MP_OBJ_SENTINEL) { // return value(s)
|
||||
return ndarray_get_slice(self, index, NULL);
|
||||
} else { // assignment to slices; the value must be an ndarray, or a scalar
|
||||
if(!mp_obj_is_type(value, &ulab_ndarray_type) &&
|
||||
!mp_obj_is_int(value) && !mp_obj_is_float(value)) {
|
||||
if(!MP_OBJ_IS_TYPE(value, &ulab_ndarray_type) &&
|
||||
!MP_OBJ_IS_INT(value) && !mp_obj_is_float(value)) {
|
||||
mp_raise_ValueError(translate("right hand side must be an ndarray, or a scalar"));
|
||||
} else {
|
||||
ndarray_obj_t *values = NULL;
|
||||
if(mp_obj_is_int(value)) {
|
||||
if(MP_OBJ_IS_INT(value)) {
|
||||
values = create_new_ndarray(1, 1, self->array->typecode);
|
||||
mp_binary_set_val_array(values->array->typecode, values->array->items, 0, value);
|
||||
} else if(mp_obj_is_float(value)) {
|
||||
|
|
@ -680,7 +696,7 @@ mp_obj_t ndarray_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
|||
// TODO: implement in-place operators
|
||||
mp_obj_t RHS = MP_OBJ_NULL;
|
||||
bool rhs_is_scalar = true;
|
||||
if(mp_obj_is_int(rhs)) {
|
||||
if(MP_OBJ_IS_INT(rhs)) {
|
||||
int32_t ivalue = mp_obj_get_int(rhs);
|
||||
if((ivalue > 0) && (ivalue < 256)) {
|
||||
CREATE_SINGLE_ITEM(RHS, uint8_t, NDARRAY_UINT8, ivalue);
|
||||
|
|
@ -701,7 +717,7 @@ mp_obj_t ndarray_binary_op(mp_binary_op_t op, mp_obj_t lhs, mp_obj_t rhs) {
|
|||
rhs_is_scalar = false;
|
||||
}
|
||||
//else
|
||||
if(mp_obj_is_type(lhs, &ulab_ndarray_type) && mp_obj_is_type(RHS, &ulab_ndarray_type)) {
|
||||
if(MP_OBJ_IS_TYPE(lhs, &ulab_ndarray_type) && MP_OBJ_IS_TYPE(RHS, &ulab_ndarray_type)) {
|
||||
// next, the ndarray stuff
|
||||
ndarray_obj_t *ol = MP_OBJ_TO_PTR(lhs);
|
||||
ndarray_obj_t *or = MP_OBJ_TO_PTR(RHS);
|
||||
|
|
|
|||
|
|
@ -58,7 +58,11 @@ void ndarray_assign_elements(mp_obj_array_t *, mp_obj_t , uint8_t , size_t *);
|
|||
ndarray_obj_t *create_new_ndarray(size_t , size_t , uint8_t );
|
||||
|
||||
mp_obj_t ndarray_copy(mp_obj_t );
|
||||
#ifdef CIRCUITPY
|
||||
mp_obj_t ndarray_make_new(const mp_obj_type_t *type, size_t n_args, const mp_obj_t *args, mp_map_t *kw_args);
|
||||
#else
|
||||
mp_obj_t ndarray_make_new(const mp_obj_type_t *, size_t , size_t , const mp_obj_t *);
|
||||
#endif
|
||||
mp_obj_t ndarray_subscr(mp_obj_t , mp_obj_t , mp_obj_t );
|
||||
mp_obj_t ndarray_getiter(mp_obj_t , mp_obj_iter_buf_t *);
|
||||
mp_obj_t ndarray_binary_op(mp_binary_op_t , mp_obj_t , mp_obj_t );
|
||||
|
|
|
|||
|
|
@ -32,11 +32,11 @@ enum NUMERICAL_FUNCTION_TYPE {
|
|||
#if ULAB_NUMERICAL_LINSPACE
|
||||
mp_obj_t numerical_linspace(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_num, MP_ARG_INT, {.u_int = 50} },
|
||||
{ MP_QSTR_endpoint, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_TRUE} },
|
||||
{ MP_QSTR_retstep, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_FALSE} },
|
||||
{ MP_QSTR_endpoint, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_true} },
|
||||
{ MP_QSTR_retstep, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_false} },
|
||||
{ MP_QSTR_dtype, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = NDARRAY_FLOAT} },
|
||||
};
|
||||
|
||||
|
|
@ -258,8 +258,8 @@ mp_obj_t numerical_argmin_argmax_ndarray(ndarray_obj_t *ndarray, mp_obj_t axis,
|
|||
|
||||
STATIC mp_obj_t numerical_function(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args, uint8_t optype) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE} } ,
|
||||
{ MP_QSTR_axis, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none} } ,
|
||||
{ MP_QSTR_axis, MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
};
|
||||
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
|
|
@ -344,8 +344,8 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_mean_obj, 1, numerical_mean);
|
|||
|
||||
mp_obj_t numerical_std(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } } ,
|
||||
{ MP_QSTR_axis, MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } } ,
|
||||
{ MP_QSTR_axis, MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_ddof, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 0} },
|
||||
};
|
||||
|
||||
|
|
@ -375,9 +375,9 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_std_obj, 1, numerical_std);
|
|||
#if ULAB_NUMERICAL_ROLL
|
||||
mp_obj_t numerical_roll(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
};
|
||||
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
|
|
@ -459,14 +459,14 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_roll_obj, 2, numerical_roll);
|
|||
#if ULAB_NUMERICAL_FLIP
|
||||
mp_obj_t numerical_flip(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
};
|
||||
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(1, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
if(!mp_obj_is_type(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("flip argument must be an ndarray"));
|
||||
}
|
||||
if((args[1].u_obj != mp_const_none) &&
|
||||
|
|
@ -510,7 +510,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_flip_obj, 1, numerical_flip);
|
|||
#if ULAB_NUMERICAL_DIFF
|
||||
mp_obj_t numerical_diff(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_n, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = 1 } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_INT, {.u_int = -1 } },
|
||||
};
|
||||
|
|
@ -518,7 +518,7 @@ mp_obj_t numerical_diff(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_ar
|
|||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(1, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
|
||||
if(!mp_obj_is_type(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("diff argument must be an ndarray"));
|
||||
}
|
||||
|
||||
|
|
@ -581,7 +581,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_diff_obj, 1, numerical_diff);
|
|||
|
||||
#if ULAB_NUMERICAL_SORT
|
||||
mp_obj_t numerical_sort_helper(mp_obj_t oin, mp_obj_t axis, uint8_t inplace) {
|
||||
if(!mp_obj_is_type(oin, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(oin, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("sort argument must be an ndarray"));
|
||||
}
|
||||
|
||||
|
|
@ -639,7 +639,7 @@ mp_obj_t numerical_sort_helper(mp_obj_t oin, mp_obj_t axis, uint8_t inplace) {
|
|||
// numpy function
|
||||
mp_obj_t numerical_sort(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_int = -1 } },
|
||||
};
|
||||
|
||||
|
|
@ -654,7 +654,7 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_sort_obj, 1, numerical_sort);
|
|||
// method of an ndarray
|
||||
mp_obj_t numerical_sort_inplace(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_int = -1 } },
|
||||
};
|
||||
|
||||
|
|
@ -670,12 +670,12 @@ MP_DEFINE_CONST_FUN_OBJ_KW(numerical_sort_inplace_obj, 1, numerical_sort_inplace
|
|||
#if ULAB_NUMERICAL_ARGSORT
|
||||
mp_obj_t numerical_argsort(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args) {
|
||||
static const mp_arg_t allowed_args[] = {
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = MP_ROM_NONE } },
|
||||
{ MP_QSTR_, MP_ARG_REQUIRED | MP_ARG_OBJ, {.u_rom_obj = mp_const_none } },
|
||||
{ MP_QSTR_axis, MP_ARG_KW_ONLY | MP_ARG_OBJ, {.u_int = -1 } },
|
||||
};
|
||||
mp_arg_val_t args[MP_ARRAY_SIZE(allowed_args)];
|
||||
mp_arg_parse_all(1, pos_args, kw_args, MP_ARRAY_SIZE(allowed_args), allowed_args, args);
|
||||
if(!mp_obj_is_type(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
if(!MP_OBJ_IS_TYPE(args[0].u_obj, &ulab_ndarray_type)) {
|
||||
mp_raise_TypeError(translate("argsort argument must be an ndarray"));
|
||||
}
|
||||
|
||||
|
|
|
|||
12
code/poly.c
12
code/poly.c
|
|
@ -18,17 +18,17 @@
|
|||
|
||||
#if ULAB_POLY_POLYVAL || ULAB_POLY_POLYFIT
|
||||
bool object_is_nditerable(mp_obj_t o_in) {
|
||||
if(mp_obj_is_type(o_in, &ulab_ndarray_type) ||
|
||||
mp_obj_is_type(o_in, &mp_type_tuple) ||
|
||||
mp_obj_is_type(o_in, &mp_type_list) ||
|
||||
mp_obj_is_type(o_in, &mp_type_range)) {
|
||||
if(MP_OBJ_IS_TYPE(o_in, &ulab_ndarray_type) ||
|
||||
MP_OBJ_IS_TYPE(o_in, &mp_type_tuple) ||
|
||||
MP_OBJ_IS_TYPE(o_in, &mp_type_list) ||
|
||||
MP_OBJ_IS_TYPE(o_in, &mp_type_range)) {
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
size_t get_nditerable_len(mp_obj_t o_in) {
|
||||
if(mp_obj_is_type(o_in, &ulab_ndarray_type)) {
|
||||
if(MP_OBJ_IS_TYPE(o_in, &ulab_ndarray_type)) {
|
||||
ndarray_obj_t *in = MP_OBJ_TO_PTR(o_in);
|
||||
return in->array->len;
|
||||
} else {
|
||||
|
|
@ -43,7 +43,7 @@ mp_obj_t poly_polyval(mp_obj_t o_p, mp_obj_t o_x) {
|
|||
// TODO: there is a bug here: matrices won't work,
|
||||
// because there is a single iteration loop
|
||||
size_t m, n;
|
||||
if(mp_obj_is_type(o_x, &ulab_ndarray_type)) {
|
||||
if(MP_OBJ_IS_TYPE(o_x, &ulab_ndarray_type)) {
|
||||
ndarray_obj_t *ndx = MP_OBJ_TO_PTR(o_x);
|
||||
m = ndx->m;
|
||||
n = ndx->n;
|
||||
|
|
|
|||
|
|
@ -24,11 +24,11 @@
|
|||
|
||||
mp_obj_t vectorise_generic_vector(mp_obj_t o_in, mp_float_t (*f)(mp_float_t)) {
|
||||
// Return a single value, if o_in is not iterable
|
||||
if(mp_obj_is_float(o_in) || mp_obj_is_integer(o_in)) {
|
||||
if(mp_obj_is_float(o_in) || MP_OBJ_IS_INT(o_in)) {
|
||||
return mp_obj_new_float(f(mp_obj_get_float(o_in)));
|
||||
}
|
||||
mp_float_t x;
|
||||
if(mp_obj_is_type(o_in, &ulab_ndarray_type)) {
|
||||
if(MP_OBJ_IS_TYPE(o_in, &ulab_ndarray_type)) {
|
||||
ndarray_obj_t *source = MP_OBJ_TO_PTR(o_in);
|
||||
ndarray_obj_t *ndarray = create_new_ndarray(source->m, source->n, NDARRAY_FLOAT);
|
||||
mp_float_t *dataout = (mp_float_t *)ndarray->array->items;
|
||||
|
|
@ -44,8 +44,8 @@ mp_obj_t vectorise_generic_vector(mp_obj_t o_in, mp_float_t (*f)(mp_float_t)) {
|
|||
ITERATE_VECTOR(mp_float_t, source, dataout);
|
||||
}
|
||||
return MP_OBJ_FROM_PTR(ndarray);
|
||||
} else if(mp_obj_is_type(o_in, &mp_type_tuple) || mp_obj_is_type(o_in, &mp_type_list) ||
|
||||
mp_obj_is_type(o_in, &mp_type_range)) { // i.e., the input is a generic iterable
|
||||
} else if(MP_OBJ_IS_TYPE(o_in, &mp_type_tuple) || MP_OBJ_IS_TYPE(o_in, &mp_type_list) ||
|
||||
MP_OBJ_IS_TYPE(o_in, &mp_type_range)) { // i.e., the input is a generic iterable
|
||||
mp_obj_array_t *o = MP_OBJ_TO_PTR(o_in);
|
||||
ndarray_obj_t *out = create_new_ndarray(1, o->len, NDARRAY_FLOAT);
|
||||
mp_float_t *dataout = (mp_float_t *)out->array->items;
|
||||
|
|
|
|||
Loading…
Reference in a new issue