Active black-box Mealy model learning and replay-confirmed behavioral compatibility checks.
///|
import {
"CaptainK-65/moon-statelens" @lens,
}///|
test "quick start learns a resettable session" {
let active = [false]
let target = @lens.System::new(reset=() => active[0] = false, step=input => {
match input {
"login" => {
active[0] = true
"ok"
}
"logout" => {
active[0] = false
"ok"
}
"request" => if active[0] { "allowed" } else { "denied" }
_ => raise @lens.UnknownInput(input)
}
})
let experiment = @lens.Experiment::new(target, ["login", "logout", "request"])
let result = @lens.learn(experiment, @lens.Oracle::w_method(2))
assert_true(result.status is Supported(ConditionalStateBound(2)))
let model = result.model.unwrap()
assert_eq(model.state_count(), 2)
assert_eq(model.trace(["login", "logout", "request"]), ["ok", "ok", "denied"])
assert_true(
@lens.distinguish(model, @lens.decode_model(model.encode())) is None,
)
}///|
test "quick start preserves an inconclusive query budget" {
let target = @lens.System::new(reset=() => (), step=_ => "ok")
let experiment = @lens.Experiment::new(target, ["x"], max_queries=0)
let result = @lens.learn(experiment, @lens.Oracle::w_method(1))
assert_true(result.status is Inconclusive("physical-queries"))
assert_true(result.model is None)
}pub(all) struct CompatibilityResult {
status : CompatibilityStatus
left : LearningResult
right : LearningResult
left_statistics : Statistics
right_statistics : Statistics
refinements : Int
spurious_inputs : Array[Array[String]]
} derive(Debug)pub(all) enum CompatibilityStatus {
ConfirmedDifference(Difference)
NoDifferenceBetweenHypotheses
Inconclusive(String)
ReplayUnstable(side~ : String, word~ : Array[String], expected~ : Array[String], actual~ : Array[String])
} derive(Debug)pub struct Experiment {
// private fields
}fn Experiment::new(system : System, alphabet : Array[String], max_queries? : Int, max_steps? : Int, max_word_length? : Int, max_cache_nodes? : Int, max_output_code_units? : Int, use_cache? : Bool, recheck_every? : Int) -> Experiment raise LensErrorfn Experiment::query(self : Experiment, requested_word : Array[String], bypass_cache? : Bool) -> Array[String] raisepub(all) struct LearningResult {
model : Machine?
status : LearningStatus
statistics : Statistics
rounds : Array[LearningRound]
counterexamples : Array[Difference]
} derive(Debug)impl ToJson for LearningResultpub struct Oracle {
// private fields
}fn Oracle::evaluate(self : Oracle, hypothesis : Machine, experiment : Experiment) -> CheckResult raisepub struct System {
// private fields
}fn compare(left : Experiment, right : Experiment, left_oracle : Oracle, right_oracle : Oracle, max_states? : Int, max_refinements? : Int) -> CompatibilityResult raisefn confirm_difference(left : Experiment, right : Experiment, inputs : Array[String]) -> Difference? raisefn learn(experiment : Experiment, oracle : Oracle, max_states? : Int, max_rounds? : Int, max_table_cells? : Int, max_table_symbols? : Int, max_prefixes? : Int) -> LearningResult raiseInstall
Download zipActive black-box Mealy model learning and replay-confirmed behavioral compatibility checks.