Source code for prodigy.analysis.instructionhandler.assignment_handler
from __future__ import annotations
import logging
from typing import get_args, Callable, Union, Sequence
from prodigy.pgcl import Instr, AsgnInstr, CategoricalExpr, FunctionCallExpr, Expr, BinopExpr, Binop, VarExpr
from prodigy.analysis.config import ForwardAnalysisConfig
from prodigy.analysis.instructionhandler import _assume
from prodigy.analysis.instructionhandler.function_handler import FunctionHandler
from prodigy.analysis.instructionhandler.instruction_handler import InstructionHandler
from prodigy.analysis.instructionhandler.program_info import ProgramInfo
from prodigy.distribution import Distribution
from prodigy.util.logger import log_setup
logger = log_setup(str(__name__).rsplit(".", maxsplit=1)[-1], logging.DEBUG)
[docs]
class AssignmentHandler(InstructionHandler):
[docs]
@staticmethod
def compute(
instruction: Instr, prog_info: ProgramInfo,
distribution: Distribution, error_prob: Distribution,
config: ForwardAnalysisConfig,
analyzer: Callable[
[Union[Instr, Sequence[Instr]], ProgramInfo, Distribution, Distribution, ForwardAnalysisConfig],
tuple[Distribution, Distribution]
]
) -> tuple[Distribution, Distribution]:
_assume(instruction, AsgnInstr, 'AssignmentHandler')
# rhs is a categorical expression (explicit finite distr)
if isinstance(instruction.rhs, CategoricalExpr):
raise NotImplementedError(
"Categorical expression are currently not supported.")
if isinstance(instruction.rhs, FunctionCallExpr):
return FunctionHandler.compute(instruction, prog_info,
distribution, error_prob, config, analyzer)
if not isinstance(instruction.rhs, get_args(Expr)):
raise SyntaxError(
f"Assignment {instruction} is ill-formed. right-hand-side must be an expression."
)
logger.info("Update %s", instruction)
return distribution.update(
BinopExpr(operator=Binop.EQ,
lhs=VarExpr(instruction.lhs),
rhs=instruction.rhs)), \
error_prob