Evolutionary Symbolic Regression (PySR).
Discovers algebraic equations y = f(x1, x2, ...) from feature/target
data. Returns a Pareto front ranked by the complexity/accuracy
tradeoff. Slower than SINDy (10-60s); searches often terminate early
on convergence. For differential equations from time series, use
sindy_run instead.
Pricing: free tier up to 100 rows × 8 features, 60s timeout. Beyond
that, $0.25 + $0.03 per 100 extra rows + $0.01 per extra feature
squared, timeout up to 300s (5 min), via x402 (USDC on Base) or
MPP/Stripe. MPP/Stripe adds a flat $0.35 per-transaction fee (Stripe
processing), so the MPP challenge amount in a `payment_required`
response is $0.35 higher than the x402 amount for the same base
price; x402 gets the lower rate. Omit `payment` for free-tier
requests; paid requests without a valid credential receive a
`payment_required` result with pricing and accepted schemes. Full
pricing: occam://pricing
Advisory limits: jobs over 50,000 rows or 20 features are accepted
but may not converge; response carries a top-level `warning`.
Operators: fixed supported set only — custom operators (e.g.
'inv(x) = 1/x') are rejected. Unary: sin, cos, tan, exp, log, log2,
log10, sqrt, abs, sinh, cosh, tanh. Binary: +, -, *, /, ^.
See also prompt `supported_operators`.
Loss metric: `loss` (in `pareto_front[].loss` and `best_loss`) is
mean squared error between model prediction and `y` on the full
training set — not RMSE, and not normalized by Var(y). A threshold
appropriate for one dataset scales with y's magnitude, so set
`loss_threshold` with that in mind (e.g. for y values near 1.0,
1e-6 is a tight fit; for y near 1000, the equivalent is 1.0).
Early termination: set `loss_threshold` to stop at your noise floor.
The server also stops when the search stalls (<1% improvement in the
last third of the budget); disable with `stall_detection=false`.
Response `stop_reason` is one of: loss_threshold, stall, timeout,
natural.
If `feature_names` is supplied, its length must equal the number of
columns in `X`; a mismatch is rejected with a validation error.
Follow-up: call `pysr_uncertainty` with a chosen expression and the
same dataset for bootstrap confidence intervals on its fit constants
and optional prediction bands.
Rate limit: 10 requests/hour per IP, 200/hour global, max queue
depth 20 (shared with sindy_run and pysr_uncertainty).
Response (success) includes `pareto_front[]` (each with `complexity`,
`loss`, `expression`, `expression_latex`), `best_expression`,
`best_expression_latex`, `best_loss`, `best_complexity`, `stop_reason`,
`elapsed_seconds`, `queue_seconds` (>0 = server saturated; use as
backoff signal), optional `warning`, optional `_meta` (MPP receipt).
Full response and payment-required schemas: occam://tool-schemas
Example request:
X=[[0.0], [1.0], [2.0], [3.0]], y=[1.0, 3.0, 5.0, 7.0],
feature_names=["x"], max_complexity=10, timeout_seconds=15
Policy: occam://privacy-policy — Citation: occam://citation-info