For engineers

Try the filter.

Paste the minimal GSRF Practical loop below into a notebook—or run gsrf-bench on your own CSV for local metrics. Evaluation only—not a production license grant.

Product: gsrf@boonmind.io · Request Audit Pack · first run gsrf-bench

License boundary: Demo / snippet use does not authorize production deployment, redistribution, or SaaS embedding. See licensing notes.

What it looks like (static)

Raw vs EMA vs GSRF on a synthetic mid-band + spike sample—illustrates ring damp and peak pull. Not a free-form playground; locked metrics live on Evidence.

Line chart of synthetic burst: raw (grey) oscillates and spikes; EMA (yellow) tracks; GSRF Practical (cyan) damps mid-band ring and compresses the peak

Minimal GSRF Practical (Python)

Positive signals only (log-space). Set x_star from a healthy baseline (e.g. median log of a calm prefix). Balanced-style defaults match the public identity docs.

gsrf_practical_minimal.py
import numpy as np

class GSRFPractical:
    """Minimal evaluation implementation of GSRF Practical (log-space soft thermostat).
    For intuition and offline tests only — not a production license.
    """
    def __init__(self, x_star, beta=0.3, k_return=1.0, mem=0.2,
                 obs_weight=0.6, baseline=0.0, dt=1.0, epsilon=1e-10):
        self.x_star = float(x_star)
        self.beta = float(beta)
        self.k_return = float(k_return)
        self.mem = float(mem)
        self.obs_weight = float(obs_weight)
        self.baseline = float(baseline)
        self.dt = float(dt)
        self.epsilon = float(epsilon)
        self.x_prev = None
        self.x_current = self.x_star

    def update(self, observation: float) -> float:
        x_obs = np.log(max(float(observation), self.epsilon))
        if self.x_prev is None:
            self.x_prev = x_obs
            self.x_current = x_obs
        gradient = -(self.x_current - self.x_star)
        memory = np.tanh(self.x_current - self.x_prev)
        obs_pull = np.tanh(x_obs - self.x_current)
        update = (self.baseline
                  + self.k_return * gradient
                  + self.mem * memory
                  + self.obs_weight * obs_pull)
        x_new = self.x_current + self.beta * update * self.dt
        self.x_prev = self.x_current
        self.x_current = x_new
        return float(np.exp(x_new))

def run_gsrf(signal, x_star=None, **kwargs):
    signal = np.asarray(signal, dtype=float)
    if x_star is None:
        x_star = float(np.median(np.log(np.maximum(signal, 1e-10))))
    filt = GSRFPractical(x_star=x_star, **kwargs)
    return np.array([filt.update(v) for v in signal])

# --- quick smoke (synthetic burst; seed 20260426 for reproducible local checks) ---
if __name__ == "__main__":
    rng = np.random.default_rng(20260426)
    t = np.arange(200)
    raw = 50 + 4 * np.sin(2 * np.pi * t / 80)  # mid-band ring
    raw[80:95] += 12                            # spike
    # tiny noise so seed is load-bearing if you extend the sample
    raw = raw + rng.normal(0, 0.05, size=raw.shape)
    out = run_gsrf(raw)
    print("raw mean/std", raw.mean(), raw.std())
    print("gsrf mean/std", out.mean(), out.std())
    # Compare peak excursion from median baseline
    base = float(np.median(raw[:40]))
    print("peak |raw-base|", np.max(np.abs(raw - base)))
    print("peak |gsrf-base|", np.max(np.abs(out - base)))
    # See "What the output looks like" on this page for the fixed reference table

What the output looks like

Run the snippet above on the included synthetic burst sample (fixed seed 20260426) to reproduce these figures:

Metric Raw Signal GSRF Practical Improvement
Oscillation (std high-pass) 2.162 0.685 ~ −68.0%
Peak Excursion 15.5 9.6 ~ −38.0%
Tracking (MAD) 0.000 2.326 (worse—by design)

No tuning. This is the balanced preset. The trade-off is visible in one line.

Static reference for the synthetic sample only — not a universal performance guarantee. Full locked packs: Evidence.

What to look for

  • Spike peaks pulled toward the normal (x*)
  • Mid-band ring quieter than raw (and often vs a light EMA)
  • MAD-to-raw often worse than EMA — expected
  • After a permanent level shift, freeze vs adaptive x* (see evidence §3)

What the trial unlocks

  • Validated balanced / conservative / fast presets
  • Audit Workbench evaluation path (local, offline)
  • Claim ladder + NDA packs when needed
  • Commercial terms for Pro / Enterprise / QEC path

Request Audit Pack

Still have 60 seconds?

Read the red lights before you productize anything.

Not a tracker. Not delay-tolerant closed-loop command. Not a fixed-FA alarm engine. Full safety cage →

Questions people actually ask

How do I try GSRF for free?

Copy the Python snippet on this page, or run local gsrf-bench on a CSV. Evaluation only.

Does the snippet grant production rights?

No. Commercial license required for production. Pricing →

Want the full Workbench?

Request Audit Pack · gsrf-bench · Workbench