ProvSQL C/C++ API
Adding support for provenance and uncertainty management to PostgreSQL databases
Loading...
Searching...
No Matches
Formula.h File Reference

Symbolic representation of provenance as a human-readable formula. More...

#include <numeric>
#include <vector>
#include <string>
#include <sstream>
#include <iomanip>
#include <iterator>
#include "Semiring.h"
Include dependency graph for Formula.h:
This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Classes

class  semiring::Formula
 Symbolic provenance representation over std::string. More...

Namespaces

namespace  semiring

Functions

template<typename Range, typename Value = typename Range::value_type>
static std::string join (Range const &elements, const char *const delimiter)
 Concatenate elements of a range with a delimiter.
static std::string strip_wrap_if_op (const std::string &s, const std::string &op)
 If s is wrapped in a single matched outer paren pair AND its top-level operator (depth 1, inside that pair) is op, return the inner content; otherwise return s unchanged.
static std::string format_number (double v)
 Render a probability for display in a symbolic formula.

Detailed Description

Symbolic representation of provenance as a human-readable formula.

The Formula pseudo-semiring (std::string, \(\oplus\), \(\otimes\), "šŸ˜", "šŸ™") produces a symbolic representation of provenance using Unicode semiring symbols. It is primarily used for debugging and testing.

Each gate evaluates to a string:

  • zero() → "šŸ˜"
  • one() → "šŸ™"
  • plus() → "(a āŠ• b āŠ• …)" or just "a" for singletons
  • times() → "(a āŠ— b āŠ— …)" or just "a" for singletons
  • monus() → "(a āŠ– b)"
  • delta() → "Ī“(a)" or "Ī“a" if a starts with (
  • cmp() → "[s1 op s2]"
  • semimod()→ "x*s"
  • agg() → operator-specific notation (e.g., "min(a,b)")
  • value() → the literal string itself
  • unmapped_input() → the leaf's abbreviated UUID ("1361b50e…")

It also renders the measure-carrier gates that carry no algebraic meaning, and that every proper semiring therefore refuses – being a serialisation of the circuit rather than an evaluation of it, Formula has a faithful rendering for each and refuses nothing:

  • rv() → "normal(2.5, 0.5)" (wired parameters substituted)
  • arith() → ordinary arithmetic notation ("(a + b)", "ln(a)"…), kept visually distinct from the semiring's \(\oplus\) / \(\otimes\)
  • mixture() → "(p ? x : y)"
  • categorical() → "categorical(Īŗ; 0.3: a, 0.7: b)"
  • guarded_case()→ "case(g → v; else d)"
  • observe() → "observe(x = 2.5)"
  • conditioned() → "(x | c)"

Definition in file Formula.h.

Function Documentation

◆ format_number()

std::string format_number ( double v)
static

Render a probability for display in a symbolic formula.

Enough significant digits that the usual decimal probabilities print back as themselves (0.3, not 0.299999), without the full round-trip verbosity of setprecision(17).

Definition at line 125 of file Formula.h.

Here is the caller graph for this function:

◆ join()

template<typename Range, typename Value = typename Range::value_type>
std::string join ( Range const & elements,
const char *const delimiter )
static

Concatenate elements of a range with a delimiter.

Used internally by Formula::plus(), Formula::times(), and Formula::agg() to build operator-separated strings.

Template Parameters
RangeAny range type with a value_type typedef.
ValueElement type (defaults to Range::value_type).
Parameters
elementsThe range to join.
delimiterString to insert between adjacent elements.
Returns
All elements concatenated with delimiter between them.

Definition at line 62 of file Formula.h.

Here is the caller graph for this function:

◆ strip_wrap_if_op()

std::string strip_wrap_if_op ( const std::string & s,
const std::string & op )
static

If s is wrapped in a single matched outer paren pair AND its top-level operator (depth 1, inside that pair) is op, return the inner content; otherwise return s unchanged.

Used by Formula::plus() and Formula::times() to flatten same-op nested gates by associativity: a child "(a āŠ• b)" feeding into a parent plus is unwrapped to "a āŠ• b" so the join produces "a āŠ• b āŠ• c" instead of "(a āŠ• b) āŠ• c". A different top-level op (e.g., a times child) keeps its parens.

Definition at line 88 of file Formula.h.

Here is the caller graph for this function: