Document the new DPF surfaces in one command set, and test the field, half-tree, and multipoint edges.
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
parent
0d8a5a8131
commit
0dff6df8ed
250 changed files with 12199 additions and 1981 deletions
|
|
@ -107,7 +107,6 @@ struct ip_accum
|
|||
HEDLEY_PRAGMA(GCC diagnostic push)
|
||||
HEDLEY_PRAGMA(GCC diagnostic ignored "-Wignored-attributes")
|
||||
if constexpr (simd64 && std::is_same_v<LeafT, simde__m128i>)
|
||||
HEDLEY_PRAGMA(GCC diagnostic pop)
|
||||
{
|
||||
if (HEDLEY_LIKELY(opl == 2))
|
||||
{
|
||||
|
|
@ -126,6 +125,7 @@ HEDLEY_PRAGMA(GCC diagnostic pop)
|
|||
return;
|
||||
}
|
||||
}
|
||||
HEDLEY_PRAGMA(GCC diagnostic pop)
|
||||
|
||||
for (std::size_t p = 0; p < opl; ++p)
|
||||
{
|
||||
|
|
@ -208,7 +208,10 @@ void eval_inner_product_exterior(const DpfKey & dpf, IntegralT from_node,
|
|||
|
||||
using node_type = typename DpfKey::exterior_node;
|
||||
using outputs_tuple = typename DpfKey::concrete_outputs_tuple;
|
||||
HEDLEY_PRAGMA(GCC diagnostic push)
|
||||
HEDLEY_PRAGMA(GCC diagnostic ignored "-Wignored-attributes")
|
||||
using range = ip_prg_range<node_type, outputs_tuple, Is...>;
|
||||
HEDLEY_PRAGMA(GCC diagnostic pop)
|
||||
constexpr std::size_t opl = DpfKey::outputs_per_leaf;
|
||||
|
||||
std::size_t nodes_in_interval = static_cast<std::size_t>(to_node - from_node);
|
||||
|
|
@ -397,11 +400,18 @@ auto eval_inner_product_impl(const DpfKey & dpf, InputT from, InputT to,
|
|||
|
||||
} // namespace internal
|
||||
|
||||
/// Expand the interior tree for `[from, to]`. A wrapping interval is left
|
||||
/// @brief Expand the interior tree for `[from, to]`. A wrapping interval is left
|
||||
/// cold: the memoizer holds one half, and walking the first half of the later
|
||||
/// inner product would clobber a cached second half. Safe to call before the
|
||||
/// weight vector exists; a subsequent inner-product on the same memoizer
|
||||
/// skips the interior AES when the interval did not wrap.
|
||||
/// @tparam DpfKey DPF key type
|
||||
/// @tparam InputT input domain type
|
||||
/// @tparam IntervalMemoizer interval memoizer type
|
||||
/// @param dpf the DPF key
|
||||
/// @param from the inclusive start of the range
|
||||
/// @param to the `to`
|
||||
/// @param memoizer the memoizer built for this key
|
||||
template <typename DpfKey,
|
||||
typename InputT,
|
||||
typename IntervalMemoizer>
|
||||
|
|
@ -425,11 +435,24 @@ void eval_prepare_full(const DpfKey & dpf, IntervalMemoizer && memoizer)
|
|||
memoizer);
|
||||
}
|
||||
|
||||
/// `sum_x DPF_I(x) * w[x]` (additive) or `xor_x DPF_I(x) & w[x]` (XOR).
|
||||
/// `w[j]` is the weight for the `j`-th output in the interval, matching
|
||||
/// @brief `sum_x DPF_I(x) * w[x]` (additive) or `xor_x DPF_I(x) & w[x]` (XOR).
|
||||
/// @details `w[j]` is the weight for the `j`-th output in the interval, matching
|
||||
/// `eval_interval`'s destination layout. Multiple `Is` take a tuple of
|
||||
/// weight ranges and return a tuple of accumulators; a single `I` takes
|
||||
/// one range and returns one accumulator.
|
||||
/// @tparam I output index
|
||||
/// @tparam Is is
|
||||
/// @tparam DpfKey DPF key type
|
||||
/// @tparam InputT input domain type
|
||||
/// @tparam Weights weights
|
||||
/// @tparam IntervalMemoizer interval memoizer type
|
||||
/// @tparam DpfKey DPF key type
|
||||
/// @param dpf the DPF key
|
||||
/// @param from the inclusive start of the range
|
||||
/// @param to the `to`
|
||||
/// @param weights the weights
|
||||
/// @param memoizer the memoizer built for this key
|
||||
/// @return `sum_x DPF_I(x) * w[x]` (additive) or `xor_x DPF_I(x) & w[x]` (XOR)
|
||||
template <std::size_t I = 0,
|
||||
std::size_t ...Is,
|
||||
typename DpfKey,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue