mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
[python/ulab] Updated ulab
This commit is contained in:
156
python/port/mod/ulab/numpy/vector.h
Normal file
156
python/port/mod/ulab/numpy/vector.h
Normal file
@@ -0,0 +1,156 @@
|
||||
|
||||
/*
|
||||
* This file is part of the micropython-ulab project,
|
||||
*
|
||||
* https://github.com/v923z/micropython-ulab
|
||||
*
|
||||
* The MIT License (MIT)
|
||||
*
|
||||
* Copyright (c) 2019-2021 Zoltán Vörös
|
||||
*/
|
||||
|
||||
#ifndef _VECTOR_
|
||||
#define _VECTOR_
|
||||
|
||||
#include "../ulab.h"
|
||||
#include "../ndarray.h"
|
||||
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_acos_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_acosh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_2(vectorise_arctan2_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_KW(vectorise_around_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_asin_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_asinh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_atan_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_atanh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_ceil_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_cos_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_cosh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_degrees_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_erf_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_erfc_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_exp_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_expm1_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_floor_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_gamma_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_lgamma_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_log_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_log10_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_log2_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_radians_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_sin_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_sinh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_sqrt_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_tan_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_1(vectorise_tanh_obj);
|
||||
MP_DECLARE_CONST_FUN_OBJ_KW(vectorise_vectorize_obj);
|
||||
|
||||
typedef struct _vectorized_function_obj_t {
|
||||
mp_obj_base_t base;
|
||||
uint8_t otypes;
|
||||
mp_obj_t fun;
|
||||
const mp_obj_type_t *type;
|
||||
} vectorized_function_obj_t;
|
||||
|
||||
#if ULAB_HAS_FUNCTION_ITERATOR
|
||||
#define ITERATE_VECTOR(type, array, source, sarray)\
|
||||
({\
|
||||
size_t *scoords = ndarray_new_coords((source)->ndim);\
|
||||
for(size_t i=0; i < (source)->len/(source)->shape[ULAB_MAX_DIMS -1]; i++) {\
|
||||
for(size_t l=0; l < (source)->shape[ULAB_MAX_DIMS - 1]; l++) {\
|
||||
*(array)++ = f(*((type *)(sarray)));\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
|
||||
}\
|
||||
ndarray_rewind_array((source)->ndim, sarray, (source)->shape, (source)->strides, scoords);\
|
||||
}\
|
||||
})
|
||||
|
||||
#else
|
||||
|
||||
#if ULAB_MAX_DIMS == 4
|
||||
#define ITERATE_VECTOR(type, array, source, sarray) do {\
|
||||
size_t i=0;\
|
||||
do {\
|
||||
size_t j = 0;\
|
||||
do {\
|
||||
size_t k = 0;\
|
||||
do {\
|
||||
size_t l = 0;\
|
||||
do {\
|
||||
*(array)++ = f(*((type *)(sarray)));\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
|
||||
l++;\
|
||||
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 1] * (source)->shape[ULAB_MAX_DIMS-1];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 2];\
|
||||
k++;\
|
||||
} while(k < (source)->shape[ULAB_MAX_DIMS-2]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 2] * (source)->shape[ULAB_MAX_DIMS-2];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 3];\
|
||||
j++;\
|
||||
} while(j < (source)->shape[ULAB_MAX_DIMS-3]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 3] * (source)->shape[ULAB_MAX_DIMS-3];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 4];\
|
||||
i++;\
|
||||
} while(i < (source)->shape[ULAB_MAX_DIMS-4]);\
|
||||
} while(0)
|
||||
#endif /* ULAB_MAX_DIMS == 4 */
|
||||
|
||||
#if ULAB_MAX_DIMS == 3
|
||||
#define ITERATE_VECTOR(type, array, source, sarray) do {\
|
||||
size_t j = 0;\
|
||||
do {\
|
||||
size_t k = 0;\
|
||||
do {\
|
||||
size_t l = 0;\
|
||||
do {\
|
||||
*(array)++ = f(*((type *)(sarray)));\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
|
||||
l++;\
|
||||
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 1] * (source)->shape[ULAB_MAX_DIMS-1];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 2];\
|
||||
k++;\
|
||||
} while(k < (source)->shape[ULAB_MAX_DIMS-2]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 2] * (source)->shape[ULAB_MAX_DIMS-2];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 3];\
|
||||
j++;\
|
||||
} while(j < (source)->shape[ULAB_MAX_DIMS-3]);\
|
||||
} while(0)
|
||||
#endif /* ULAB_MAX_DIMS == 3 */
|
||||
|
||||
#if ULAB_MAX_DIMS == 2
|
||||
#define ITERATE_VECTOR(type, array, source, sarray) do {\
|
||||
size_t k = 0;\
|
||||
do {\
|
||||
size_t l = 0;\
|
||||
do {\
|
||||
*(array)++ = f(*((type *)(sarray)));\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
|
||||
l++;\
|
||||
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
|
||||
(sarray) -= (source)->strides[ULAB_MAX_DIMS - 1] * (source)->shape[ULAB_MAX_DIMS-1];\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 2];\
|
||||
k++;\
|
||||
} while(k < (source)->shape[ULAB_MAX_DIMS-2]);\
|
||||
} while(0)
|
||||
#endif /* ULAB_MAX_DIMS == 2 */
|
||||
|
||||
#if ULAB_MAX_DIMS == 1
|
||||
#define ITERATE_VECTOR(type, array, source, sarray) do {\
|
||||
size_t l = 0;\
|
||||
do {\
|
||||
*(array)++ = f(*((type *)(sarray)));\
|
||||
(sarray) += (source)->strides[ULAB_MAX_DIMS - 1];\
|
||||
l++;\
|
||||
} while(l < (source)->shape[ULAB_MAX_DIMS-1]);\
|
||||
} while(0)
|
||||
#endif /* ULAB_MAX_DIMS == 1 */
|
||||
#endif /* ULAB_HAS_FUNCTION_ITERATOR */
|
||||
|
||||
#define MATH_FUN_1(py_name, c_name) \
|
||||
static mp_obj_t vectorise_ ## py_name(mp_obj_t x_obj) { \
|
||||
return vectorise_generic_vector(x_obj, MICROPY_FLOAT_C_FUN(c_name)); \
|
||||
}
|
||||
|
||||
#endif /* _VECTOR_ */
|
||||
Reference in New Issue
Block a user