37 const auto it = provenance_mapping.find(g);
38 if(it != provenance_mapping.end())
50 "The requested semiring does not admit a homomorphism "
51 "from Boolean functions; this gate's wires were rewritten "
52 "under a Boolean-only rule (typically idempotence or "
53 "plus-with-one absorber by foldBooleanIdentities, gated "
54 "on provsql.boolean_provenance = on) and the evaluation "
55 "is unsound under this semiring. Re-run with "
56 "provsql.boolean_provenance = off, or pick a "
57 "Boolean-compatible semiring (boolean, boolexpr, "
77 std::vector<typename S::value_type> childrenResult;
78 std::transform(children.begin(), children.end(), std::back_inserter(childrenResult), [&](
auto u) {
79 return evaluate<S>(u, provenance_mapping, semiring);
82 childrenResult.erase(std::remove(std::begin(childrenResult), std::end(childrenResult),
semiring.zero()),
83 childrenResult.end());
84 return semiring.plus(childrenResult);
86 for(
const auto &c: childrenResult) {
90 childrenResult.erase(std::remove(std::begin(childrenResult), std::end(childrenResult),
semiring.one()),
91 childrenResult.end());
92 return semiring.times(childrenResult);
94 if(childrenResult[0]==
semiring.zero() || childrenResult[0]==childrenResult[1])
97 return semiring.monus(childrenResult[0], childrenResult[1]);
117 if(!
semiring.compatibleWithBooleanRewrite())
119 "The requested semiring does not admit a homomorphism "
120 "from Boolean functions; the wrapped sub-circuit was "
121 "computed under a Boolean-provenance assumption "
122 "(typically by the safe-query rewrite, "
123 "provsql.boolean_provenance = on) and the evaluation is "
124 "unsound under this semiring. Re-run the query with "
125 "provsql.boolean_provenance = off, or pick a "
126 "Boolean-compatible semiring (boolean, boolexpr, "
136 "Comparison operator OID " +
152 std::vector<typename S::value_type> vec;
S::value_type evaluate(gate_t g, std::unordered_map< gate_t, typename S::value_type > &provenance_mapping, S semiring) const
Evaluate the sub-circuit rooted at gate g over semiring semiring.