def eval_rvalue_RValueBetween(r, context): from .eval_resources_imp import eval_rvalue from mcdp_dp import UncertainGate check_isinstance(r, CDP.RValueBetween) rl = eval_rvalue(r.lower, context) ru = eval_rvalue(r.upper, context) Rl = context.get_rtype(rl) dp = UncertainGate(Rl) return create_operation(context, dp=dp, resources=[rl, ru])
def eval_rvalue_approx_u(r, context): assert isinstance(r, CDP.ApproxURes) # # r1-approx-r2----------------- Uncertainty gate # |____(+ step)--[r3]| r1 = eval_rvalue(r.rvalue, context) step = eval_constant(r.step, context) R = context.get_rtype(r1) tu = get_types_universe() try: tu.check_leq(step.unit, R) except NotLeq as e: msg = ('The step is specified in a unit (%s), which is not compatible ' 'with the resource (%s).' % (step.unit, R)) raise_wrapped(DPSemanticError, e, msg, compact=True) stepu = step.cast_value(R) if stepu == 0.0: return r1 dp = makeLinearFloor0DP(R, stepu) r2 = create_operation(context, dp=dp, resources=[r1], name_prefix='_approx', op_prefix='_toapprox', res_prefix='_result') dpsum = PlusValueDP(R, c_value=step.value, c_space=step.unit) r3 = create_operation(context, dp=dpsum, resources=[r2], name_prefix='_sum') dpu = UncertainGate(R) return create_operation(context, dp=dpu, resources=[r2, r3], name_prefix='_uncertain')
def eval_rvalue_RValuePlusOrMinus(r, context): from mcdp_dp import UncertainGate, MinusValueDP, PlusValueDP from .eval_resources_imp import eval_rvalue from .eval_constant_imp import eval_constant check_isinstance(r, CDP.RValuePlusOrMinus) median = eval_rvalue(r.median, context) extent = eval_constant(r.extent, context) Rl = context.get_rtype(median) dpl = MinusValueDP(Rl, extent.value, extent.unit) rl = create_operation(context, dpl, resources=[median]) dpu = PlusValueDP(Rl, extent.value, extent.unit) ru = create_operation(context, dpu, resources=[median]) dp = UncertainGate(Rl) return create_operation(context, dp=dp, resources=[rl, ru])
def eval_rvalue_RValuePlusOrMinusPercent(r, context): from mcdp_dp import UncertainGate, MultValueDP from .eval_resources_imp import eval_rvalue check_isinstance(r, CDP.RValuePlusOrMinusPercent) median = eval_rvalue(r.median, context) check_isinstance(r.perc, CDP.ValueExpr) p0 = r.perc.value pl = 1 - p0 / 100.0 pu = 1 + p0 / 100.0 Rl = context.get_rtype(median) dpl = MultValueDP(Rl, Rl, R_dimensionless, pl) dpu = MultValueDP(Rl, Rl, R_dimensionless, pu) rl = create_operation(context, dpl, resources=[median]) ru = create_operation(context, dpu, resources=[median]) dp = UncertainGate(Rl) return create_operation(context, dp=dp, resources=[rl, ru])