Source code for sequince.steps.mutation.conditional
from __future__ import annotations
import logging
from typing import TYPE_CHECKING
from ..base import FixedLengthMutation, SMCStep, validate_n_steps
from ..context import StepContext
from ..control import ConditionalStepOutput
if TYPE_CHECKING:
from orng import RandomGenerator
from ...state import ParticleState
logger = logging.getLogger(__name__)
[docs]
class MutateIfResampled(SMCStep):
"""Apply a mutation step only when the preceding step resampled.
This step reads the ``resampled`` flag written to the current
:class:`StepContext` by Sequince's resampling steps. The resulting
execution decision is returned explicitly in the step output.
Parameters
----------
mutation:
Mutation step to apply after resampling.
"""
def __init__(self, mutation: SMCStep) -> None:
self.mutation = mutation
[docs]
def apply(
self,
state: ParticleState,
context: StepContext,
rng: "RandomGenerator",
) -> tuple[ParticleState, StepContext, ConditionalStepOutput]:
mutation_skipped = not bool(context.metadata.get("resampled", False))
child_output = None
if mutation_skipped:
logger.debug(
"Iteration %d: Skipping mutation step because no resampling occurred.",
context.t,
)
updated = state
else:
logger.debug(
"Iteration %d: Applying mutation step because resampling occurred.",
context.t,
)
updated, context, child_output = self.mutation(state, context, rng)
return (
updated,
context,
ConditionalStepOutput(not mutation_skipped, child_output),
)
[docs]
def apply_with_n_steps(
self,
state: ParticleState,
context: StepContext,
rng: "RandomGenerator",
*,
n_steps: int,
) -> tuple[ParticleState, StepContext, ConditionalStepOutput]:
n_steps = validate_n_steps(n_steps)
if not isinstance(self.mutation, FixedLengthMutation):
raise TypeError(
"MutateIfResampled's child does not support fixed-length mutation."
)
if not bool(context.metadata.get("resampled", False)):
return state, context, ConditionalStepOutput(False)
updated, context, output = self.mutation.apply_with_n_steps(
state, context, rng, n_steps=n_steps
)
return updated, context, ConditionalStepOutput(True, output)