class QDPGEmitter(MultiEmitter):
def __init__(
self,
config: QDPGEmitterConfig,
policy_network: nn.Module,
env: QDEnv,
score_novelty: Callable[[Archive, StateDescriptor], Reward],
selector: Optional[Selector] = None,
) -> None:
self._config = config
self._policy_network = policy_network
self._env = env
# define the quality emitter
q_emitter = QualityPGEmitter(
config=config.qpg_config,
policy_network=policy_network,
env=env,
selector=selector,
)
# define the diversity emitter
d_emitter = DiversityPGEmitter(
config=config.dpg_config,
policy_network=policy_network,
env=env,
score_novelty=score_novelty,
)
# define the GA emitter
variation_fn = functools.partial(
isoline_variation, iso_sigma=config.iso_sigma, line_sigma=config.line_sigma
)
ga_emitter = MixingEmitter(
mutation_fn=lambda x, r: (x, r),
variation_fn=variation_fn,
variation_percentage=1.0,
batch_size=config.ga_batch_size,
selector=selector,
)
super().__init__(emitters=(q_emitter, d_emitter, ga_emitter))