pachet's picture
Deploy Theme Lab Docker app
187bf9a
Raw
History Blame Contribute Delete
2.41 kB
"""Variable-order Markov engine backed by vo_regular_bp."""
from __future__ import annotations
import random
import sys
from pathlib import Path
from typing import Any
from ..common import START_SYMBOL, Symbol
from ..constraints import make_theme_acceptor
VO_REGULAR_PATH = Path("/Users/francoispachet/IdeaProjects/vo_regular_bp")
if VO_REGULAR_PATH.exists():
sys.path.insert(0, str(VO_REGULAR_PATH))
try:
from vo_regular_bp import (
ConstraintSet,
LongestFeasiblePolicy,
OrderStackModel,
prepare_constrained_order_stack,
)
except ImportError as exc: # pragma: no cover - depends on local sibling repo.
ConstraintSet = None
LongestFeasiblePolicy = None
OrderStackModel = None
prepare_constrained_order_stack = None
VO_REGULAR_IMPORT_ERROR = exc
else:
VO_REGULAR_IMPORT_ERROR = None
def require_vo_regular() -> None:
if VO_REGULAR_IMPORT_ERROR is not None:
raise RuntimeError(
"The Markov engine requires the local vo_regular_bp package. "
"Expected it at /Users/francoispachet/IdeaProjects/vo_regular_bp."
) from VO_REGULAR_IMPORT_ERROR
def generate_markov(
*,
sequences: list[tuple[Symbol, ...]],
length: int,
samples: int,
max_order: int,
start_weights: dict[int, float],
end_weights: dict[int, float],
endpoint_strength: float,
enforce_triplet_groups: bool,
seed: int,
) -> tuple[list[tuple[Symbol, ...]], dict[str, Any]]:
require_vo_regular()
model = OrderStackModel.from_sequences(
sequences,
max_order=max_order,
start_symbol=START_SYMBOL,
)
acceptor = make_theme_acceptor(
length=length,
alphabet=model.alphabet,
start_weights=start_weights,
end_weights=end_weights,
strength=endpoint_strength,
enforce_triplet_groups=enforce_triplet_groups,
)
backend = prepare_constrained_order_stack(
model,
ConstraintSet(regular_acceptors=(acceptor,)),
length=length,
prefix=(START_SYMBOL,),
policy=LongestFeasiblePolicy(),
)
rng = random.Random(seed)
generated = [backend.sample(rng=rng) for _ in range(samples)]
diagnostics = {
"constrained success mass": f"{backend.diagnostics.success_mass:.6g}",
"engine": "vo_regular variable-order Markov",
}
return generated, diagnostics