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 fixed_point_cast_unsafe(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. 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 (hence the name unsafe).

template<typename RANDOM_ACCESS_ITERATOR_IN, typename RANDOM_ACCESS_ITERATOR_OUT>
static inline void fixed_point_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)
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 at least src1_limbs + src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for at least 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 at least 2 * src_limbs limbs. The scratch vector op_abs must have space for at least 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 at least 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for at least 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 at least 2 + 2 * src1_limbs + 2 * src2_limbs limbs. The scratch vectors op1_abs and op2_abs must have space for at least 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.

static inline apy_limb_t fixed_point_from_double_single_limb(double value, int frac_bits, unsigned shift_amount)
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 frac_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.