def test_connect_compositions_with_simple_states(self, mode): comp1 = Composition(name="first_composition") A = TransferMechanism(name="A", function=Linear(slope=2.0)) B = TransferMechanism(name="B", function=Linear(slope=3.0)) comp1.add_node(A) comp1.add_node(B) comp1.add_projection(MappingProjection(sender=A, receiver=B), A, B) comp1._analyze_graph() inputs_dict = { A: [[5.]], } sched = Scheduler(composition=comp1) comp2 = Composition(name="second_composition") A2 = TransferMechanism(name="A2", function=Linear(slope=2.0)) B2 = TransferMechanism(name="B2", function=Linear(slope=3.0)) comp2.add_node(A2) comp2.add_node(B2) comp2.add_projection(MappingProjection(sender=A2, receiver=B2), A2, B2) comp2._analyze_graph() sched = Scheduler(composition=comp2) comp3 = Composition(name="outer_composition") comp3.add_node(comp1) comp3.add_node(comp2) comp3.add_projection(MappingProjection(), comp1, comp2) # comp1: # input = 5.0 # mechA: 2.0*5.0 = 10.0 # mechB: 3.0*10.0 = 30.0 # output = 30.0 # comp2: # input = 30.0 # mechA2: 2.0*30.0 = 60.0 # mechB2: 3.0*60.0 = 180.0 # output = 180.0 # comp3: # input = 5.0 # output = 180.0 res = comp3.run(inputs={comp1: [[5.]]}, bin_execute=mode) assert np.allclose(res, [[[180.0]]]) if mode == 'Python': assert np.allclose(comp1.output_state.parameters.value.get(comp3), [30.0]) assert np.allclose(comp2.output_state.parameters.value.get(comp3), [180.0]) assert np.allclose(comp3.output_state.parameters.value.get(comp3), [180.0])
def test_connect_compositions_with_complicated_states(self, mode): inner_composition_1 = Composition(name="comp1") A = TransferMechanism(name="A1", default_variable=[[0.0], [0.0]], function=Linear(slope=2.0)) B = TransferMechanism(name="B1", default_variable=[[0.0], [0.0]], function=Linear(slope=3.0)) inner_composition_1.add_node(A) inner_composition_1.add_node(B) inner_composition_1.add_projection( MappingProjection(sender=A, receiver=B), A, B) inner_composition_1.add_projection( MappingProjection(sender=A.output_states[1], receiver=B.input_states[1]), A, B) inner_composition_1._analyze_graph() inner_composition_2 = Composition(name="comp2") A2 = TransferMechanism(name="A2", default_variable=[[0.0], [0.0]], function=Linear(slope=2.0)) B2 = TransferMechanism(name="B2", default_variable=[[0.0], [0.0]], function=Linear(slope=3.0)) inner_composition_2.add_node(A2) inner_composition_2.add_node(B2) inner_composition_2.add_projection( MappingProjection(sender=A2, receiver=B2), A2, B2) inner_composition_2.add_projection( MappingProjection(sender=A2.output_states[1], receiver=B2.input_states[1]), A2, B2) inner_composition_2._analyze_graph() outer_composition = Composition(name="outer_composition") outer_composition.add_node(inner_composition_1) outer_composition.add_node(inner_composition_2) outer_composition.add_projection(projection=MappingProjection(), sender=inner_composition_1, receiver=inner_composition_2) outer_composition.add_projection(projection=MappingProjection( sender=inner_composition_1.output_CIM.output_states[1], receiver=inner_composition_2.input_CIM.input_states[1]), sender=inner_composition_1, receiver=inner_composition_2) sched = Scheduler(composition=outer_composition) outer_composition._analyze_graph() output = outer_composition.run( inputs={inner_composition_1: [[[5.0], [50.0]]]}, scheduler_processing=sched, bin_execute=mode) assert np.allclose(output, [[[180.], [1800.]]]) if mode == 'Python': assert np.allclose( inner_composition_1.get_output_values(outer_composition), [[30.], [300.]]) assert np.allclose( inner_composition_2.get_output_values(outer_composition), [[180.], [1800.]]) assert np.allclose( outer_composition.get_output_values(outer_composition), [[180.], [1800.]])
def test_compositions_as_origin_nodes_multiple_trials(self, comp_mode): inner_composition_1 = Composition(name="inner_composition_1") A = TransferMechanism(name="A", function=Linear(slope=0.5)) B = TransferMechanism(name="B", function=Linear(slope=2.0)) C = TransferMechanism(name="C", function=Linear(slope=3.0)) inner_composition_1.add_node(A) inner_composition_1.add_node(B) inner_composition_1.add_node(C) inner_composition_1.add_projection(MappingProjection(), A, C) inner_composition_1.add_projection(MappingProjection(), B, C) inner_composition_2 = Composition(name="inner_composition_2") A2 = TransferMechanism(name="A2", function=Linear(slope=0.25)) B2 = TransferMechanism(name="B2", function=Linear(slope=1.0)) inner_composition_2.add_node(A2) inner_composition_2.add_node(B2) inner_composition_2.add_projection(MappingProjection(), A2, B2) mechanism_d = TransferMechanism(name="D", function=Linear(slope=3.0)) outer_composition = Composition(name="outer_composition") outer_composition.add_node(inner_composition_1) outer_composition.add_node(inner_composition_2) outer_composition.add_node(mechanism_d) inner_composition_1._analyze_graph() outer_composition.add_projection(projection=MappingProjection(), sender=inner_composition_1, receiver=mechanism_d) inner_composition_2._analyze_graph() outer_composition.add_projection(projection=MappingProjection(), sender=inner_composition_2, receiver=mechanism_d) sched = Scheduler(composition=outer_composition) # FIX: order of InputPorts on inner composition 1 is not stable output = outer_composition.run(inputs={ inner_composition_1: { A: [[2.0], [1.5], [2.5]], B: [[1.0], [1.5], [1.5]] }, inner_composition_2: [[12.0], [11.5], [12.5]] }, scheduler=sched, execution_mode=comp_mode) # trial 0: # inner composition 1 = (0.5*2.0 + 2.0*1.0) * 3.0 = 9.0 # inner composition 2 = 0.25*12.0 = 3.0 # outer composition = (3.0 + 9.0) * 3.0 = 36.0 # trial 1: # inner composition 1 = (0.5*1.5 + 2.0*1.5) * 3.0 = 11.25 # inner composition 2 = 0.25*11.5 = 2.875 # outer composition = (2.875 + 11.25) * 3.0 = 42.375 # trial 2: # inner composition 1 = (0.5*2.5 + 2.0*1.5) * 3.0 = 12.75 # inner composition 2 = 0.25*12.5 = 3.125 # outer composition = (3.125 + 12.75) * 3.0 = 47.625 assert np.allclose(output, np.array([47.625]))