Architecture¶
ArqonHPO is built as a control primitive, not a search algorithm. This page explains how the pieces fit together.
System Overview¶
graph LR
subgraph "ArqonHPO Runtime"
A[Telemetry] --> B[Probe]
B --> C[Classify]
C --> D[Refine]
D --> E[Safety Executor]
E --> F[Apply]
end
F --> G[Your System]
G --> A The PCR Loop¶
ArqonHPO uses a Probe → Classify → Refine architecture:
1. Probe (Tier 0)¶
Goal: Efficiently scan the parameter landscape.
- Uses Low-Discrepancy Sequences (LDS) for uniform coverage
- Prime-sqrt-slopes rotation for high-dimensional spaces
- Stateless, deterministic, shardable via
ArqonProbe
2. Classify (Tier Ω)¶
Goal: Detect whether the landscape is structured or chaotic.
- Analyzes probe results for patterns
- Determines optimal strategy for refinement
- Detects: smooth gradients vs. noisy/multimodal surfaces
3. Refine (Tier 2)¶
Goal: Converge to optimal parameters.
Strategies:
- Nelder-Mead — Simplex method for smooth functions
- Multi-Start Nelder-Mead — Parallel restarts for multimodal
- TPE — Bayesian optimization for noisy landscapes
Safety Layer (Hotpath)¶
The Safety Executor enforces governance on every parameter update:
graph TD
A[Proposal] --> B{Guardrails Check}
B -->|Pass| C{Rate Limit Check}
B -->|Fail| D[Violation]
C -->|Pass| E{Bounds Check}
C -->|Fail| D
E -->|Pass| F[Apply Atomically]
E -->|Fail| D
F --> G[Audit Log]
D --> G Key Components¶
| Component | Responsibility |
|---|---|
SafetyExecutor | Enforces all safety rules |
Guardrails | Configures bounds, rate limits, delta limits |
RollbackPolicy | Defines when to revert changes |
ControlSafety | Implements safe mode and exemptions |
AuditQueue | Lock-free event logging |
Crate Structure¶
crates/
├── core/ # Solver, Probe, Classify, Strategies
│ └── strategies/ # Nelder-Mead, Multi-Start NM, TPE
├── hotpath/ # Safety Executor, SPSA, Telemetry, Audit
├── cli/ # CLI, TUI, Dashboard
├── ffi/ # C FFI bindings
└── ship/ # ArqonShip DevSecOps tool
bindings/
└── python/ # PyO3 bindings (ArqonSolver, ArqonProbe)
Data Flow¶
- User calls
ask()→ Solver returns candidate parameters - User evaluates candidates → calls
tell()with results - Solver updates internal state, refines strategy
- Repeat until budget exhausted
For online mode, use ask_one() + seed() for single-candidate flow.
Performance Characteristics¶
| Metric | Value |
|---|---|
| Overhead per trial | ~3ms |
| Throughput | ~33,000 trials/sec |
| Memory | O(history_size) |
| Deterministic | Yes (with fixed seed) |
Next Steps¶
- Quickstart — Get running in 5 minutes
- Safety Deep Dive — Guardrails and rollback
- Strategies — When to use each