def __add__(self, obj) -> "optplan.Sum": if isinstance(obj, optplan.Sum): return obj.__add__(self) if isinstance(obj, optplan.Constant): return optplan.Sum(functions=[self, obj]) if isinstance(obj, (numbers.Number, optplan.ComplexNumber)): return optplan.Sum(functions=[self, optplan.make_constant(obj)]) if isinstance(obj, Function): return optplan.Sum(functions=[self, obj]) raise TypeError("Attempting to add node with type {}".format(type(obj)))
def test_sum_add_to_sum(): var1 = optplan.Parameter() var2 = optplan.Parameter() var3 = optplan.Parameter() var4 = optplan.Parameter() sum1 = optplan.Sum(functions=[var1, var2]) sum2 = optplan.Sum(functions=[var3, var4]) sum3 = sum1 + sum2 assert isinstance(sum3, optplan.Sum) assert sum3.functions == [var1, var2, var3, var4]
def test_validate_references_nested_raises_value_error(): with pytest.raises(ValueError, match="Expected type"): optplan.validate_references( optplan.Sum(functions=[ optplan.Power( function=optplan.Sum(functions=[ optplan.make_constant(2), optplan.SimulationSpace() ])), optplan.make_constant(2) ]))
def test_sum_add_bad_node_raise_type_error(): var1 = optplan.Parameter() var2 = optplan.Parameter() sum1 = optplan.Sum(functions=[var1, var2]) with pytest.raises(TypeError, match="add a node"): sum1 + optplan.SimulationSpace()
def test_sum_add_to_fun(): var1 = optplan.Parameter() var2 = optplan.Parameter() var3 = optplan.Parameter() sum1 = optplan.Sum(functions=[var1, var2]) sum2 = sum1 + var3 assert isinstance(sum2, optplan.Sum) assert sum2.functions == [var1, var2, var3]
def test_sum_add_to_value(): var1 = optplan.Parameter() var2 = optplan.Parameter() sum1 = optplan.Sum(functions=[var1, var2]) sum2 = sum1 + 3 assert isinstance(sum2, optplan.Sum) assert var1 in sum2.functions assert var2 in sum2.functions assert sum2.functions[-1].value.real == 3 assert sum2.functions[-1].value.imag == 0
def test_dumps(): plan = optplan.OptimizationPlan( nodes=[ optplan.Sum( functions=[ optplan.Constant(value=optplan.ComplexNumber(real=2)), optplan.Constant(value=optplan.ComplexNumber(real=3)), ],) ],) plan_dict = json.loads(optplan.dumps(plan))
def test_dumps_duplicate_name_raises_value_error(): plan = optplan.OptimizationPlan( nodes=[ optplan.Sum( functions=[ optplan.Constant( name="const", value=optplan.ComplexNumber(real=2)), optplan.Constant( name="const", value=optplan.ComplexNumber(real=3)), ],) ],) with pytest.raises(ValueError, match="Nonunique name found"): optplan.dumps(plan)
def test_custom_function_node(): @optplan.register_node_type(optplan.NodeMetaType.OPTPLAN_NODE) class CustomOp(optplan.Function): type = schema_utils.polymorphic_model_type("custom_op") int_val = types.IntType() plan = optplan.OptimizationPlan( nodes=[ optplan.Sum( functions=[ optplan.Constant(value=optplan.ComplexNumber(real=2)), CustomOp(int_val=3), ],) ],) optplan.loads(optplan.dumps(plan))
def test_validate_references_lists_raises_value_error(): with pytest.raises(ValueError, match="Expected type"): optplan.validate_references( optplan.Sum(functions=[optplan.SimulationSpace()]))
def test_problem_node_bad_name_raises_value_error(): with pytest.raises(ValueError, match="cannot start with two underscores"): optplan.Sum(name="__doubleunderscore")