pub struct ExperimentEngine { /* private fields */ }Expand description
Autonomous parameter-tuning engine.
The engine evaluates a baseline configuration, then generates and tests parameter variations one at a time. Accepted variations update the progressive baseline (greedy hill-climbing). The loop terminates on budget exhaustion, search-space exhaustion, wall-time limit, or cancellation.
§Storage
When memory is Some, each result is persisted to SQLite via
SemanticMemory::sqlite. When None, results are kept only in the
in-memory results vec of the final report.
§Budget ownership
The Evaluator is passed pre-built by the caller. The caller is responsible
for constructing it with the desired budget_tokens (typically
config.eval_budget_tokens). The eval_budget_tokens field in
ExperimentConfig is a hint for the caller — the engine itself does not
construct the evaluator.
Implementations§
Source§impl ExperimentEngine
impl ExperimentEngine
Sourcepub fn new(
evaluator: Evaluator,
generator: Box<dyn VariationGenerator>,
subject: Arc<AnyProvider>,
baseline: ConfigSnapshot,
config: ExperimentConfig,
memory: Option<Arc<SemanticMemory>>,
) -> Self
pub fn new( evaluator: Evaluator, generator: Box<dyn VariationGenerator>, subject: Arc<AnyProvider>, baseline: ConfigSnapshot, config: ExperimentConfig, memory: Option<Arc<SemanticMemory>>, ) -> Self
Create a new ExperimentEngine.
A fresh UUID session ID is generated at construction time.
The evaluator should already be configured with the desired token budget
(typically config.eval_budget_tokens).
§Contract
The caller must ensure config is valid before constructing the engine.
Call ExperimentConfig::validate during bootstrap — passing invalid config
(e.g., max_experiments=0, max_wall_time_secs=0) results in unspecified
loop behaviour (immediate exit or no effective budget enforcement).
Sourcepub fn with_source(self, source: ExperimentSource) -> Self
pub fn with_source(self, source: ExperimentSource) -> Self
Set the ExperimentSource for this session.
Defaults to ExperimentSource::Manual. Use ExperimentSource::Scheduled
for runs triggered by the scheduler.
Sourcepub fn cancel_token(&self) -> CancellationToken
pub fn cancel_token(&self) -> CancellationToken
Return a clone of the internal CancellationToken.
External callers (CLI, TUI, scheduler) can hold a token handle and call
.cancel() to trigger graceful shutdown. See also Self::stop.
Sourcepub fn stop(&self)
pub fn stop(&self)
Stop the engine by cancelling the internal CancellationToken.
The current evaluation call will complete; the loop exits after it returns.
Sourcepub async fn run(&mut self) -> Result<ExperimentSessionReport, EvalError>
pub async fn run(&mut self) -> Result<ExperimentSessionReport, EvalError>
Run the experiment loop and return a session report.
The loop:
- Evaluates the baseline once to obtain
initial_baseline_score. - Generates variations via the
VariationGenerator. - Evaluates each variation with a clone of
subjectpatched with generation overrides derived from the candidateConfigSnapshotviaAnyProvider::with_generation_overrides. - Accepts the variation if
delta >= config.min_improvement. - On acceptance, updates the progressive baseline (greedy hill-climbing). Known limitation (S1): single-sample acceptance has no statistical confidence check. Noise in the evaluator can cause gradual score drift. Phase 5 should add repeated trials or a confidence margin derived from per-case variance before promoting a variation.
- Optionally persists results to
SQLitewhenmemoryisSome. - Breaks on: max experiments, wall-time, search exhaustion, or cancellation.
§Errors
Returns EvalError if the baseline evaluation or any subject LLM call fails.
SQLite persistence failures are returned as EvalError::Storage.
Auto Trait Implementations§
impl Freeze for ExperimentEngine
impl !RefUnwindSafe for ExperimentEngine
impl Send for ExperimentEngine
impl Sync for ExperimentEngine
impl Unpin for ExperimentEngine
impl UnsafeUnpin for ExperimentEngine
impl !UnwindSafe for ExperimentEngine
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> IntoRequest<T> for T
impl<T> IntoRequest<T> for T
Source§fn into_request(self) -> Request<T>
fn into_request(self) -> Request<T>
T in a tonic::Request