Problem
AEES.__init__ hardcodes the reward and controller construction. Even though BaseReward and BaseController are public protocols, every user gets:
NormalizedLossImprovementReward
DiscountedUCBController / BucketedContextualController / RandomController
There is no injection point, so the protocol abstraction is half-finished — the types are public but the instantiation is closed.
Proposal
Accept optional pre-built controller / reward instances (or factories) on AEES.__init__, falling back to today's defaults when not provided. Something like:
AEES(
optimizer,
reward: BaseReward | None = None,
lr_controller: BaseController | None = None,
noise_controller: BaseController | list[BaseController] | None = None,
...
)
Acceptance criteria
Problem
AEES.__init__hardcodes the reward and controller construction. Even thoughBaseRewardandBaseControllerare public protocols, every user gets:NormalizedLossImprovementRewardDiscountedUCBController/BucketedContextualController/RandomControllerThere is no injection point, so the protocol abstraction is half-finished — the types are public but the instantiation is closed.
Proposal
Accept optional pre-built controller / reward instances (or factories) on
AEES.__init__, falling back to today's defaults when not provided. Something like:Acceptance criteria
BaseReward/BaseControllerimplementations.