16#include <system_error>
30 v = std::stod(s, &idx);
31 }
catch (
const std::exception &) {
45 std::array<char, 32> buf;
46 auto [ptr, ec] = std::to_chars(buf.data(), buf.data() + buf.size(), v);
47 if (ec == std::errc{})
return std::string(buf.data(), ptr);
48 std::ostringstream oss;
49 oss << std::setprecision(17) << v;
55void strip(std::string &s)
57 while (!s.empty() && std::isspace(
static_cast<unsigned char>(s.front())))
59 while (!s.empty() && std::isspace(
static_cast<unsigned char>(s.back())))
63bool parse_double(
const std::string &raw,
double &out)
67 if (s.empty())
return false;
70 out = std::stod(s, &idx);
71 return idx == s.size();
72 }
catch (
const std::exception &) {
84 if (s.empty())
return false;
85 if (s.front() ==
'$') {
86 std::string idx_str = s.substr(1);
88 if (idx_str.empty())
return false;
91 const long slot = std::stol(idx_str, &idx);
92 if (idx != idx_str.size() || slot < 0)
return false;
94 out.wire_slot =
static_cast<int>(slot);
96 }
catch (
const std::exception &) {
100 if (!parse_double(s, out.literal))
return false;
107std::optional<DistributionTemplate>
110 const auto colon = s.find(
':');
111 if (colon == std::string::npos)
return std::nullopt;
113 std::string kind_str = s.substr(0, colon);
114 std::string params = s.substr(colon + 1);
121 if (!family)
return std::nullopt;
126 const auto comma = params.find(
',');
127 if (comma == std::string::npos)
return std::nullopt;
128 if (!parse_param(params.substr(0, comma), out.
p1))
return std::nullopt;
129 if (!parse_param(params.substr(comma + 1), out.
p2))
return std::nullopt;
131 if (!parse_param(params, out.
p1))
return std::nullopt;
144 if (!tmpl || tmpl->parametric())
return std::nullopt;
146 out.
family = tmpl->family;
147 out.
p1 = tmpl->p1.literal;
148 out.
p2 = tmpl->p2.literal;
Generic directed-acyclic-graph circuit template and gate identifier.
Per-family polymorphic view over a continuous gate_rv distribution (§F.1 class hierarchy).
Continuous random-variable helpers (distribution parsing, moments).
Exception type thrown by circuit operations on invalid input.
double analytical_variance(const DistributionSpec &d)
Closed-form variance Var(X) for a basic distribution.
double parseDoubleStrict(const std::string &s)
Strictly parse s as a double.
std::unique_ptr< Distribution > makeDistribution(const DistributionSpec &spec)
Construct the per-family Distribution for a parsed spec.
std::optional< DistributionSpec > parse_distribution_spec(const std::string &s)
Parse the on-disk text encoding of a gate_rv distribution.
std::optional< DistributionTemplate > parse_distribution_template(const std::string &s)
Parse the on-disk text encoding of a gate_rv distribution, keeping wired (token) parameters as wire r...
double analytical_mean(const DistributionSpec &d)
Closed-form expectation E[X] for a basic distribution.
const DistributionFamily * lookupDistributionFamily(const std::string &name)
Look up a family by its on-disk name token.
double analytical_raw_moment(const DistributionSpec &d, unsigned k)
Closed-form raw moment for a basic distribution.
std::string double_to_text(double v)
Format a double back into the canonical text form used by gate_value extras and gate_rv distribution ...
A registered family's descriptor: its complete identity.
unsigned nparams
1 or 2 (a 1-parameter family leaves p2 = 0)
One parameter slot of a gate_rv, either a literal or a wire.
Parsed distribution spec (family + up to two parameters).
const DistributionFamily * family
double p2
Second parameter (σ, b, or λ; unused for 1-parameter families).
double p1
First parameter (μ, a, k, or λ).
A gate_rv distribution spec that may carry wired (token) parameters – the parse-time counterpart of D...
const DistributionFamily * family