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_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.

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.

struct FixedPointInnerProduct

Public Types

using It = APyBuffer<apy_limb_t>::vector_type::iterator
using CIt = APyBuffer<apy_limb_t>::vector_type::const_iterator

Public Functions

inline explicit FixedPointInnerProduct(const APyFixedSpec &src1_spec, const APyFixedSpec &src2_spec, const APyFixedSpec &dst_spec, const std::optional<APyFixedAccumulatorOption> acc_mode)
inline void operator()(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M = 1, std::size_t DST_STEP = 1) const

Private Functions

inline void inner_product_simd(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
inline void inner_product_one_limb_src_two_limb_dst(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
template<bool is_acc_context = false, bool support_sign_ext = false>
inline void inner_product(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const

Private Members

void (FixedPointInnerProduct::* f)(CIt src1, CIt src2, It dst, std::size_t N, std::size_t M, std::size_t DST_STEP) const
std::size_t src1_limbs
std::size_t src2_limbs
std::size_t dst_limbs
std::size_t product_limbs
std::optional<APyFixedAccumulatorOption> acc_mode
int product_bits
int product_int_bits
mutable ScratchVector<apy_limb_t, 8> op1_abs
mutable ScratchVector<apy_limb_t, 8> op2_abs
mutable ScratchVector<apy_limb_t, 16> product