Esempio n. 1
0
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])
Esempio n. 2
0
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')
Esempio n. 3
0
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])
Esempio n. 4
0
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])