35template <
typename Params>
48 [](
const auto& x1,
const auto& y1,
const auto& x2,
const auto& y2,
auto& dx,
auto& dy,
auto& xsum) {
63 [](
const auto& x1,
const auto& y1,
const auto& dy,
const auto& inv,
const auto& xsum,
auto& ox,
auto& oy) {
64 auto slope = dy * inv;
65 auto x3 = slope * slope - xsum;
66 auto y3 = slope * (x1 - x3) - y1;
93template <
typename Params>
98 zip_for_each(in.x, in.y, s.den, s.num, [](
const auto& x,
const auto& y,
auto& den,
auto& num) {
100 const auto xx = x * x;
111 [](
const auto& x,
const auto& y,
const auto& num,
const auto& inv,
auto& ox,
auto& oy) {
112 auto slope = num * inv;
113 auto x3 = slope * slope - (x + x);
114 auto y3 = slope * (x - x3) - y;
133template <
typename Field>
137 Field* scratch)
noexcept
142 Field acc = Field::one();
145 for_each_indexed_pair<Direction::Forward>(
146 buckets,
pairs,
num_pairs, [&](Field& x_dst, Field& y_dst,
const Field& x_src,
const Field& y_src,
size_t i) {
147 scratch[i] = x_src + x_dst;
154 if (acc == Field::zero()) {
155 throw_or_abort(
"attempted to invert zero in batch_affine_add_indexed_scalar");
160 for_each_indexed_pair<Direction::Backward>(
161 buckets,
pairs,
num_pairs, [&](Field& x_dst, Field& y_dst,
const Field& x_src,
const Field& y_src,
size_t i) {
166 Field temp = x_src - x_dst;
168 y_dst = temp - y_src;
174template <
typename Field>
178 Field* scratch)
noexcept
183 Field acc = Field::one();
185 for_each_indexed_point<Direction::Forward>(buckets,
indices,
num_points, [&](Field& x, Field& y,
size_t i) {
186 scratch[i] = x.sqr();
187 scratch[i] = scratch[i] + scratch[i] + scratch[i];
192 if (acc == Field::zero()) {
193 throw_or_abort(
"attempted to invert zero in batch_affine_double_indexed_scalar");
197 for_each_indexed_point<Direction::Backward>(buckets,
indices,
num_points, [&](Field& x, Field& y,
size_t i) {
201 x = scratch[i].sqr() - (x + x);
202 y = scratch[i] * (tx - x) - y;
221template <
typename Params>
238 lhs.gather_from(buckets, [&](
size_t k) {
return pairs[span_base + k].first; }, chunk);
239 rhs.gather_from(buckets, [&](
size_t k) {
return pairs[span_base + k].second; }, chunk);
241 out.scatter_to(buckets, [&](
size_t k) {
return pairs[span_base + k].first; });
252template <
typename Params>
263 const size_t capacity = in.capacity();
268 in.gather_from(buckets, [&](
size_t k) {
return indices[span_base + k]; }, chunk);
270 out.scatter_to(buckets, [&](
size_t k) {
return indices[span_base + k]; });
#define BB_ASSERT(expression,...)
AffineElement const size_t num_pairs
void batch_affine_add_indexed_scalar(AffineColumnSpan< Field > &buckets, const std::pair< uint32_t, uint32_t > *pairs, size_t num_pairs, Field *scratch) noexcept
void batch_affine_add(const VectorAffineElementPushSpan< Params > &lhs, const VectorAffineElementPushSpan< Params > &rhs, VectorAffineElementPushSpan< Params > &out, BatchAffineAddScratch< Params > &s) noexcept
void batch_affine_double(const VectorAffineElementPushSpan< Params > &in, VectorAffineElementPushSpan< Params > &out, BatchAffineDoubleScratch< Params > &s) noexcept
void batch_affine_double_indexed_scalar(AffineColumnSpan< Field > &buckets, const uint32_t *indices, size_t num_points, Field *scratch) noexcept
void batch_affine_double_indexed_packed(AffineColumnSpan< typename VectorField< Params >::Field > &buckets, const uint32_t *indices, size_t num_points, VectorAffineElementPushSpan< Params > &in, VectorAffineElementPushSpan< Params > &out, BatchAffineDoubleScratch< Params > &scratch) noexcept
const std::pair< uint32_t, uint32_t > * pairs
void batch_affine_add_indexed_packed(AffineColumnSpan< typename VectorField< Params >::Field > &buckets, const std::pair< uint32_t, uint32_t > *pairs, size_t num_pairs, VectorAffineElementPushSpan< Params > &lhs, VectorAffineElementPushSpan< Params > &rhs, VectorAffineElementPushSpan< Params > &out, BatchAffineAddScratch< Params > &scratch) noexcept
void zip_for_each(Args &&... args)
void batch_invert(const VectorFieldPushSpan< Params > &in, VectorFieldPushSpan< Params > &out) noexcept
constexpr decltype(auto) get(::tuplet::tuple< T... > &&t) noexcept
bb::VectorAffineElementPushSpan< BaseParams > lhs
bb::VectorAffineElementPushSpan< BaseParams > out
VectorFieldPushSpan< Params > inv
VectorFieldPushSpan< Params > xsum
VectorFieldPushSpan< Params > dy
VectorFieldPushSpan< Params > dx
VectorFieldPushSpan< Params > den
VectorFieldPushSpan< Params > num
VectorFieldPushSpan< Params > inv
void throw_or_abort(std::string const &err)