Annotate noexcept and constexpr with HEDLEY, and add interval containment, ChaCha, and the dyadic range tables.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
875f09fec1
commit
0d8a5a8131
97 changed files with 9212 additions and 1159 deletions
|
|
@ -22,6 +22,8 @@
|
|||
#ifndef LIBDPF_INCLUDE_GROTTO_OFFSET_HORNER_HPP__
|
||||
#define LIBDPF_INCLUDE_GROTTO_OFFSET_HORNER_HPP__
|
||||
|
||||
#include "hedley/hedley.h"
|
||||
|
||||
#include <algorithm>
|
||||
#include <array>
|
||||
#include <cstddef>
|
||||
|
|
@ -43,6 +45,7 @@ namespace grotto
|
|||
inline constexpr std::size_t offset_horner_max_degree = 3;
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
T offset_horner_group_add(T a, T b) noexcept
|
||||
{
|
||||
using u = std::make_unsigned_t<T>;
|
||||
|
|
@ -50,6 +53,7 @@ T offset_horner_group_add(T a, T b) noexcept
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
T offset_horner_group_sub(T a, T b) noexcept
|
||||
{
|
||||
using u = std::make_unsigned_t<T>;
|
||||
|
|
@ -65,6 +69,7 @@ struct offset_horner_x_plus_r
|
|||
};
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
offset_horner_x_plus_r<T> offset_horner_at_x_plus_r(T x, T r) noexcept
|
||||
{
|
||||
return offset_horner_x_plus_r<T>{
|
||||
|
|
@ -86,6 +91,7 @@ inline constexpr uint64_t binom[4][4] = {
|
|||
};
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
uint64_t lift(T v) noexcept
|
||||
{
|
||||
if constexpr (std::is_signed_v<T>)
|
||||
|
|
@ -95,6 +101,7 @@ uint64_t lift(T v) noexcept
|
|||
}
|
||||
|
||||
template <std::size_t Degree>
|
||||
HEDLEY_NO_THROW
|
||||
uint64_t horner_at(const std::array<uint64_t, Degree + 1> & coeff, uint64_t point) noexcept
|
||||
{
|
||||
uint64_t acc = coeff[Degree];
|
||||
|
|
@ -104,6 +111,7 @@ uint64_t horner_at(const std::array<uint64_t, Degree + 1> & coeff, uint64_t poin
|
|||
}
|
||||
|
||||
template <std::size_t Degree>
|
||||
HEDLEY_NO_THROW
|
||||
void fill_payloads(uint64_t base, uint64_t (&payload)[Degree + 1]) noexcept
|
||||
{
|
||||
uint64_t pow = 1;
|
||||
|
|
@ -191,6 +199,7 @@ std::vector<uint64_t> segments_of(const Key & key, const std::vector<InputT> & k
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
int64_t math_lift(T value) noexcept
|
||||
{
|
||||
if constexpr (std::is_signed_v<T>)
|
||||
|
|
@ -200,6 +209,7 @@ int64_t math_lift(T value) noexcept
|
|||
}
|
||||
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
T domain_min() noexcept
|
||||
{
|
||||
if constexpr (std::is_signed_v<T>)
|
||||
|
|
@ -211,6 +221,7 @@ T domain_min() noexcept
|
|||
/// Public center-space cut where `center + eta` crosses the domain end.
|
||||
/// Empty when that cut is outside the domain, including `eta == 0`.
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
std::optional<T> carry_threshold(T eta) noexcept
|
||||
{
|
||||
constexpr unsigned bits = dpf::utils::bitlength_of_v<T>;
|
||||
|
|
@ -237,6 +248,7 @@ std::optional<T> carry_threshold(T eta) noexcept
|
|||
|
||||
/// `center + kappa` is the wrapped representative, as a mathematical integer.
|
||||
template <typename T>
|
||||
HEDLEY_NO_THROW
|
||||
int64_t kappa_for(T left, T eta) noexcept
|
||||
{
|
||||
constexpr unsigned bits = dpf::utils::bitlength_of_v<T>;
|
||||
|
|
@ -528,7 +540,7 @@ namespace offset_horner_detail
|
|||
|
||||
template <std::size_t Degree, typename InputT, typename Rng>
|
||||
geneval_offset_horner_result<Degree, InputT> geneval_at(
|
||||
InputT center0, InputT center1, InputT center, InputT eta,
|
||||
bool arith, InputT center0, InputT center1, InputT center, InputT eta,
|
||||
const std::vector<InputT> & knots,
|
||||
const std::vector<std::array<uint64_t, Degree + 1>> & coeff,
|
||||
Rng rng)
|
||||
|
|
@ -553,8 +565,11 @@ geneval_offset_horner_result<Degree, InputT> geneval_at(
|
|||
std::array<std::vector<uint64_t>, Degree + 1> seg1;
|
||||
for (std::size_t m = 0; m <= Degree; ++m)
|
||||
{
|
||||
const auto opened = dpf::geneval_cmp(center0, center1,
|
||||
shifted.begin(), shifted.end(), rng, payload[m]);
|
||||
const auto opened = arith
|
||||
? dpf::geneval_cmp(dpf::arith_input, center0, center1,
|
||||
shifted.begin(), shifted.end(), rng, payload[m])
|
||||
: dpf::geneval_cmp(center0, center1,
|
||||
shifted.begin(), shifted.end(), rng, payload[m]);
|
||||
const uint64_t blind = dpf::uniform_sample<uint64_t>();
|
||||
wrap[m][0] = blind;
|
||||
wrap[m][1] = payload[m] - blind;
|
||||
|
|
@ -574,6 +589,17 @@ geneval_offset_horner_result<Degree, InputT> geneval_at(
|
|||
return out;
|
||||
}
|
||||
|
||||
template <std::size_t Degree, typename InputT, typename Rng>
|
||||
geneval_offset_horner_result<Degree, InputT> geneval_at(
|
||||
InputT center0, InputT center1, InputT center, InputT eta,
|
||||
const std::vector<InputT> & knots,
|
||||
const std::vector<std::array<uint64_t, Degree + 1>> & coeff,
|
||||
Rng rng)
|
||||
{
|
||||
return geneval_at<Degree>(false, center0, center1, center, eta, knots, coeff,
|
||||
std::move(rng));
|
||||
}
|
||||
|
||||
} // namespace offset_horner_detail
|
||||
|
||||
/// Geneval-style offset Horner. The center is XOR-shared as in `geneval_point`.
|
||||
|
|
@ -609,10 +635,25 @@ geneval_offset_horner_result<Degree, InputT> geneval_offset_horner(
|
|||
center0, center1, eta, knots, coeff, std::move(rng));
|
||||
}
|
||||
|
||||
/// Additive shares of the center: `center0 + center1` is the comparison point.
|
||||
template <std::size_t Degree = offset_horner_max_degree,
|
||||
typename InputT,
|
||||
typename Rng>
|
||||
geneval_offset_horner_result<Degree, InputT> geneval_offset_horner(
|
||||
dpf::arith_input_t, InputT center0, InputT center1, InputT eta,
|
||||
const std::vector<InputT> & knots,
|
||||
const std::vector<std::array<uint64_t, Degree + 1>> & coeff,
|
||||
Rng rng)
|
||||
{
|
||||
const InputT center = offset_horner_group_add(center0, center1);
|
||||
return offset_horner_detail::geneval_at<Degree>(
|
||||
true, center0, center1, center, eta, knots, coeff, std::move(rng));
|
||||
}
|
||||
|
||||
/// Additive shares of the input `x` and the mask `r`. Reconstructs
|
||||
/// `eta = x - r` and `center = 2r`, XOR-shares that center as `(center, 0)`,
|
||||
/// and returns both parties' Horner shares of the cubic at `x + r`
|
||||
/// (the group element `x + r`).
|
||||
/// `eta = x - r` and passes additive shares of `center = 2r` (`2·r0`, `2·r1`)
|
||||
/// to arithmetic `geneval_cmp`. Returns both parties' Horner shares of the
|
||||
/// cubic at `x + r` (the group element `x + r`).
|
||||
template <std::size_t Degree = offset_horner_max_degree,
|
||||
typename InputT,
|
||||
typename Rng>
|
||||
|
|
@ -625,10 +666,11 @@ geneval_offset_horner_result<Degree, InputT> geneval_offset_horner(
|
|||
const InputT x = offset_horner_group_add(x0, x1);
|
||||
const InputT r = offset_horner_group_add(r0, r1);
|
||||
const InputT eta = offset_horner_group_sub(x, r);
|
||||
const InputT center = offset_horner_group_add(r, r);
|
||||
InputT zero{};
|
||||
const InputT center0 = offset_horner_group_add(r0, r0);
|
||||
const InputT center1 = offset_horner_group_add(r1, r1);
|
||||
const InputT center = offset_horner_group_add(center0, center1);
|
||||
return offset_horner_detail::geneval_at<Degree>(
|
||||
center, zero, center, eta, knots, coeff, std::move(rng));
|
||||
true, center0, center1, center, eta, knots, coeff, std::move(rng));
|
||||
}
|
||||
|
||||
template <std::size_t Degree = offset_horner_max_degree, typename InputT>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue