apyfixed_util.h

Functions

template<typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_trn(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_trn_inf(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_trn_zero(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_trn_mag(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_trn_away(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd_zero(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd_inf(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd_min_inf(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd_conv(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_rnd_conv_odd(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_jam(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<class RANDOM_ACCESS_ITERATOR_INOUT>
static inline void _quantize_jam_unbiased(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits)
template<typename RANDOM_ACCESS_ITERATOR_INOUT>
static void quantize(RANDOM_ACCESS_ITERATOR_INOUT it_begin, RANDOM_ACCESS_ITERATOR_INOUT it_end, int bits, int int_bits, int new_bits, int new_int_bits, QuantizationMode quantization)
template<class RANDOM_ACCESS_ITERATOR>
static inline void _overflow_twos_complement(RANDOM_ACCESS_ITERATOR it_begin, RANDOM_ACCESS_ITERATOR it_end, int bits, int int_bits)
template<class RANDOM_ACCESS_ITERATOR>
static inline void _overflow_saturate(RANDOM_ACCESS_ITERATOR it_begin, RANDOM_ACCESS_ITERATOR it_end, int bits, int int_bits)
template<class RANDOM_ACCESS_ITERATOR>
static inline void _overflow_numeric_std(RANDOM_ACCESS_ITERATOR it_begin, RANDOM_ACCESS_ITERATOR it_end, int bits, int int_bits)
template<class RANDOM_ACCESS_ITERATOR>
static void overflow(RANDOM_ACCESS_ITERATOR it_begin, RANDOM_ACCESS_ITERATOR it_end, int new_bits, int new_int_bits, OverflowMode overflow)
template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static inline void _cast(RANDOM_ACCESS_ITERATOR_IN src_begin, RANDOM_ACCESS_ITERATOR_IN src_end, RANDOM_ACCESS_ITERATOR_OUT dst_begin, RANDOM_ACCESS_ITERATOR_OUT dst_end, int src_bits, int src_int_bits, int dst_bits, int dst_int_bits, QuantizationMode q_mode, OverflowMode v_mode)

General casting method for fixed-point numbers. It is named _cast to differentiate it from the Python exposed cast methods (that usually just call this method). General casting can perform both quantization and overflowing. The size of the output region (std::distance(dst_begin, dst_end)) must be greater than or equal to the size of the input region (std::distance(src_begin, src_end)), even when the output bit-specifiers are smaller then the input bit-specifiers.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static inline void _cast_no_quantize_no_overflow(RANDOM_ACCESS_ITERATOR_IN src_begin, RANDOM_ACCESS_ITERATOR_IN src_end, RANDOM_ACCESS_ITERATOR_OUT dst_begin, RANDOM_ACCESS_ITERATOR_OUT dst_end, unsigned int left_shift_amount)

Casting when there is known before hand that no quantization or overflowing will occur. Takes left_shift_amount which is the destination fractional bits minus the source fractional bits.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static inline void _cast_no_quantize_no_overflow(RANDOM_ACCESS_ITERATOR_IN src, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src_limbs, std::size_t dst_limbs, std::size_t n_items, unsigned int left_shift_amount)

Casting when there is known before hand that no quantization or overflowing will occur. Takes left_shift_amount which is the destination fractional bits minus the source fractional bits.

template<typename RANDOM_ACCESS_ITERATOR_IN1, typename RANDOM_ACCESS_ITERATOR_IN2, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void fixed_point_product(RANDOM_ACCESS_ITERATOR_IN1 src1, RANDOM_ACCESS_ITERATOR_IN2 src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, RANDOM_ACCESS_ITERATOR_INOUT op1_abs, RANDOM_ACCESS_ITERATOR_INOUT op2_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_abs)

Iterator-based multi-limb two’s complement fixed-point product. The scratch vector prod_abs must have space for atleast src1_limbs + src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for atleast src1_limbs and src2_limbs limbs, respectively. No overlap between prod_abs and op[12]_abs allowed. Overlap between prod_abs and dst is allowed if dst_limbs >= src1_limbs + src2_limbs.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void fixed_point_square(RANDOM_ACCESS_ITERATOR_IN src, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src_limbs, std::size_t dst_limbs, RANDOM_ACCESS_ITERATOR_INOUT op_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_abs)

Iterator-based multi-limb two’s complement fixed-point squaring. The scratch vector prod_abs must have space for atleast 2 * src_limbs limbs. The scratch vector op_abs must have space for atleast src_limbs limbs. No overlap between prod_abs and op_abs allowed. Overlap between prod_abs and dst is allowed if dst_limbs >= 2 * src_limbs.

template<typename RANDOM_ACCESS_ITERATOR_IN1, typename RANDOM_ACCESS_ITERATOR_IN2, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void complex_fixed_point_product(RANDOM_ACCESS_ITERATOR_IN1 src1, RANDOM_ACCESS_ITERATOR_IN2 src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, RANDOM_ACCESS_ITERATOR_INOUT op1_abs, RANDOM_ACCESS_ITERATOR_INOUT op2_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_imm)

Iterator-based multi-limb two’s complement complex-valued fixed-point multiplication. The scratch vector prod_imm must have space for atleast 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for atleast src1_limbs and src2_limbs limbs, respectively. No overlap between prod_imm and op[12]_abs allowed. No overlap between prod_imm and dst allowed.

template<typename RANDOM_ACCESS_ITERATOR_IN1, typename RANDOM_ACCESS_ITERATOR_IN2, typename RANDOM_ACCESS_ITERATOR_OUT, typename RANDOM_ACCESS_ITERATOR_INOUT>
static inline void complex_fixed_point_division(RANDOM_ACCESS_ITERATOR_IN1 src1, RANDOM_ACCESS_ITERATOR_IN2 src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, std::size_t src2_bits, std::size_t div_limbs, RANDOM_ACCESS_ITERATOR_INOUT op1_abs, RANDOM_ACCESS_ITERATOR_INOUT op2_abs, RANDOM_ACCESS_ITERATOR_INOUT prod_imm, RANDOM_ACCESS_ITERATOR_INOUT den_imm, RANDOM_ACCESS_ITERATOR_INOUT num_imm, RANDOM_ACCESS_ITERATOR_INOUT qte_imm)

Iterator-based multi-limb two’s complement complex-valued fixed-point division. The scratch vector prod_imm must have space for atleast 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for atleast src1_limbs and src2_limbs limbs, respectively. No overlap between prod_imm and op[12]_abs allowed. No overlap between prod_imm and dst allowed.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static void fixed_point_hadamard_product(RANDOM_ACCESS_ITERATOR_IN src1, RANDOM_ACCESS_ITERATOR_IN src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, std::size_t n_items)

Iterator-based multi-limb fixed-point hadamard product.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static void fixed_point_inner_product(RANDOM_ACCESS_ITERATOR_IN src1, RANDOM_ACCESS_ITERATOR_IN src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, std::size_t n_items)

Iterator-based multiply-accumulate.

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static void fixed_point_inner_product_accumulator(RANDOM_ACCESS_ITERATOR_IN src1, RANDOM_ACCESS_ITERATOR_IN src2, RANDOM_ACCESS_ITERATOR_OUT dst, std::size_t src1_limbs, std::size_t src2_limbs, std::size_t dst_limbs, std::size_t n_items, int product_bits, int product_int_bits, const APyFixedAccumulatorOption &acc)

Iterator-based multiply-accumulate using in accumulator context.

template<typename VECTOR_TYPE>
static std::function<void(typename VECTOR_TYPE::const_iterator, typename VECTOR_TYPE::const_iterator, typename VECTOR_TYPE::iterator, std::size_t, std::size_t, std::size_t, std::size_t)> inner_product_func_from_acc_mode(int product_bits, int product_int_bits, const std::optional<APyFixedAccumulatorOption> &accumulator_mode)

Retrieve an appropriate fixed-point inner product function from accumulator_mode. The returned inner product function object will have the accumulator mode bound, if available. Otherwise, the return function object will be a plain inner product function.

template<typename RANDOM_ACCESS_IT>
void fixed_point_from_double(double value, RANDOM_ACCESS_IT begin_it, RANDOM_ACCESS_IT end_it, int bits, int int_bits)
template<typename RANDOM_ACCESS_IT>
double fixed_point_to_double(RANDOM_ACCESS_IT begin_it, RANDOM_ACCESS_IT end_it, int bits, int int_bits)
template<typename RANDOM_ACCESS_IT>
void fixed_point_from_py_integer(const nb::int_ &value, RANDOM_ACCESS_IT begin_it, RANDOM_ACCESS_IT end_it, int bits, int int_bits)
template<typename RANDOM_ACCESS_IT>
void fixed_point_from_integer(const std::uint64_t value, RANDOM_ACCESS_IT begin_it, RANDOM_ACCESS_IT end_it, int bits, int int_bits)
template<typename RANDOM_ACCESS_IT>
std::string fixed_point_to_string_dec(RANDOM_ACCESS_IT begin_it, RANDOM_ACCESS_IT end_it, int bits, int int_bits)
template<typename VECTOR_TYPE>
static inline std::function<void(typename VECTOR_TYPE::iterator, typename VECTOR_TYPE::const_iterator)> fold_accumulate(std::size_t src_limbs, std::size_t acc_limbs)

Retrieve an accumulative fixed-point fold function.

template<typename VECTOR_TYPE, typename SCRATCH_VEC>
static inline std::function<void(typename VECTOR_TYPE::iterator, typename VECTOR_TYPE::const_iterator)> fold_multiply(std::size_t src_limbs, std::size_t acc_limbs, SCRATCH_VEC &scratch)

Retrieve a multiplicative fold function.

template<typename VECTOR_TYPE>
static inline std::function<void(typename VECTOR_TYPE::iterator, typename VECTOR_TYPE::const_iterator)> fold_complex_accumulate(std::size_t src_limbs, std::size_t acc_limbs)

Retrieve a complex-valued accumulative fixed-point fold function.

template<typename VECTOR_TYPE, typename SCRATCH_VEC>
static inline std::function<void(typename VECTOR_TYPE::iterator, typename VECTOR_TYPE::const_iterator)> fold_complex_multiply(std::size_t src_limbs, std::size_t acc_limbs, SCRATCH_VEC &scratch)

Retrieve a complex-valued multiplicative fold function.