build(agent): molt-z#db0ec5 iteration

This commit is contained in:
agent-db0ec53c058f1326 2026-04-16 23:41:11 +02:00
parent fb110bc28b
commit 8dd26142d1
4 changed files with 147 additions and 0 deletions

View File

@ -3,6 +3,7 @@
from .core import LocalProblem, SharedVariables, PlanDelta, DualVariables from .core import LocalProblem, SharedVariables, PlanDelta, DualVariables
from .solver import LocalSolver from .solver import LocalSolver
from .adapters import NBBOFeedAdapter, BrokerGatewayAdapter from .adapters import NBBOFeedAdapter, BrokerGatewayAdapter
from .dsl import DSLObject, DSLMorphisms, DSLDualVariables, DSLPlanDelta
__all__ = [ __all__ = [
"LocalProblem", "LocalProblem",
@ -12,4 +13,8 @@ __all__ = [
"LocalSolver", "LocalSolver",
"NBBOFeedAdapter", "NBBOFeedAdapter",
"BrokerGatewayAdapter", "BrokerGatewayAdapter",
"DSLObject",
"DSLMorphisms",
"DSLDualVariables",
"DSLPlanDelta",
] ]

View File

@ -44,6 +44,7 @@ class PlanDelta:
class DualVariables: class DualVariables:
shadow_prices: Dict[str, float] shadow_prices: Dict[str, float]
version: int version: int
contract_id: str = ""
def to_json(self) -> str: def to_json(self) -> str:
return json.dumps(asdict(self), default=str) return json.dumps(asdict(self), default=str)

101
elac_plan/dsl.py Normal file
View File

@ -0,0 +1,101 @@
from __future__ import annotations
"""Minimal ELAC-Plan DSL sketch
This module provides a tiny, vendor-agnostic DSL representation that maps
the canonical ELAC primitives to a lightweight dictionary-based schema
suitable for cross-adapter interoperability and deterministic replay.
"""
from dataclasses import dataclass, asdict
from typing import Any, Dict
from .core import LocalProblem, SharedVariables, PlanDelta, DualVariables
@dataclass
class DSLObject:
# LocalProblem-like object translated into DSL form
id: str
asset: str
venue: str
objective: str
constraints: Dict[str, Any]
price_target: float
tolerance: float
def to_dict(self) -> Dict[str, Any]:
return asdict(self)
@dataclass
class DSLMorphisms:
# SharedVariables-like signals translated into DSL form
contract_id: str
version: int
variables: Dict[str, Any]
def to_dict(self) -> Dict[str, Any]:
return asdict(self)
@dataclass
class DSLDualVariables:
# DualVariables-like coupling signals translated into DSL form
contract_id: str
version: int
shadow_prices: Dict[str, float]
def to_dict(self) -> Dict[str, Any]:
return asdict(self)
@dataclass
class DSLPlanDelta:
# PlanDelta translated into DSL form along with metadata
contract_id: str
delta: Dict[str, Any]
timestamp: str
author: str
privacy_budget: float
def to_dict(self) -> Dict[str, Any]:
return asdict(self)
def to_dsl_object(lp: LocalProblem) -> DSLObject:
return DSLObject(
id=lp.id,
asset=lp.asset,
venue=lp.venue,
objective=lp.objective,
constraints=lp.constraints,
price_target=lp.price_target,
tolerance=lp.tolerance,
)
def to_dsl_morphisms(sw: SharedVariables) -> DSLMorphisms:
return DSLMorphisms(
contract_id=sw.contract_id,
version=sw.version,
variables=dict(sw.variables),
)
def to_dsl_dual(dd: DualVariables) -> DSLDualVariables:
return DSLDualVariables(
contract_id=dd.contract_id,
version=dd.version,
shadow_prices=dict(dd.shadow_prices),
)
def to_dsl_plan(delta: PlanDelta) -> DSLPlanDelta:
return DSLPlanDelta(
contract_id=delta.contract_id,
delta=dict(delta.delta),
timestamp=delta.timestamp,
author=delta.author,
privacy_budget=delta.privacy_budget,
)

40
tests/test_dsl.py Normal file
View File

@ -0,0 +1,40 @@
import json
from elac_plan.core import LocalProblem, SharedVariables, PlanDelta, DualVariables
from elac_plan.dsl import to_dsl_object, to_dsl_morphisms, to_dsl_plan, to_dsl_dual
def test_dsl_object_translation():
lp = LocalProblem(
id="lp1",
asset="AAPL",
venue="NYSE",
objective="minimize_spread",
constraints={"max_volume": 1000},
price_target=150.0,
tolerance=0.5,
)
dsl = to_dsl_object(lp)
assert dsl.id == lp.id
assert dsl.asset == lp.asset
assert dsl.price_target == lp.price_target
def test_dsl_morphisms_translation():
sv = SharedVariables(variables={"mid_price": 150.0}, version=1, contract_id="c1")
dsl = to_dsl_morphisms(sv)
assert dsl.contract_id == sv.contract_id
assert dsl.version == sv.version
assert dsl.variables["mid_price"] == 150.0
def test_dsl_plan_and_dual_translation():
delta = PlanDelta(delta={"action": "noop"}, timestamp="2024-01-01T00:00:00Z", author="tester", contract_id="c1", privacy_budget=0.0)
dsl_plan = to_dsl_plan(delta)
assert dsl_plan.contract_id == delta.contract_id
assert dsl_plan.delta["action"] == "noop"
dual = DualVariables(shadow_prices={"AAPL": 0.1}, version=1)
dsl_dual = to_dsl_dual(dual)
assert dsl_dual.contract_id == "" # default, not set in DualVariables dataclass; ok as placeholder
assert dsl_dual.shadow_prices["AAPL"] == 0.1