def test_threshold_param(self): D = DDM(name='DDM', function=DriftDiffusionIntegrator(threshold=10.0)) assert D.function_object.threshold == 10.0 D.function_object.threshold = 5.0 assert D.function_object._threshold == 5.0
def test_reset_state_integrator_mechanism(self): A = IntegratorMechanism(name='A', function=DriftDiffusionIntegrator()) # Execute A twice # [0] saves decision variable only (not time) original_output = [A.execute(1.0)[0], A.execute(1.0)[0]] # SAVING STATE - - - - - - - - - - - - - - - - - - - - - - - - - reinitialize_values = [] for attr in A.function_object.stateful_attributes: reinitialize_values.append(getattr(A.function_object, attr)) # Execute A twice AFTER saving the state so that it continues accumulating. # We expect the next two outputs to repeat once we reset the state b/c we will return it to the current state output_after_saving_state = [A.execute(1.0)[0], A.execute(1.0)[0]] # RESETTING STATE - - - - - - - - - - - - - - - - - - - - - - - - A.reinitialize(*reinitialize_values) # We expect these results to match the results from immediately after saving the state output_after_reinitialization = [A.execute(1.0)[0], A.execute(1.0)[0]] assert np.allclose(output_after_saving_state, output_after_reinitialization) assert np.allclose( original_output, [np.array([[1.0]]), np.array([[2.0]])]) assert np.allclose( output_after_reinitialization, [np.array([[3.0]]), np.array([[4.0]])])
def test_save_state_before_simulations(self): A = TransferMechanism(name='A', integrator_mode=True, integration_rate=0.2) B = IntegratorMechanism(name='B', function=DriftDiffusionIntegrator(rate=0.1)) C = TransferMechanism(name='C') P = Process(pathway=[A, B, C]) S = System(processes=[P], reinitialize_mechanisms_when=Never()) S.run(inputs={A: [[1.0], [1.0]]}) run_1_values = [A.value, B.value[0], C.value] # "Save state" code from EVCaux # Get any values that need to be reinitialized for each run reinitialization_values = {} for mechanism in S.stateful_mechanisms: # "save" the current state of each stateful mechanism by storing the values of each of its stateful # attributes in the reinitialization_values dictionary; this gets passed into run and used to call # the reinitialize method on each stateful mechanism. reinitialization_value = [] if isinstance(mechanism.function_object, Integrator): for attr in mechanism.function_object.stateful_attributes: reinitialization_value.append( getattr(mechanism.function_object, attr)) elif hasattr(mechanism, "integrator_function"): if isinstance(mechanism.integrator_function, Integrator): for attr in mechanism.integrator_function.stateful_attributes: reinitialization_value.append( getattr(mechanism.integrator_function, attr)) reinitialization_values[mechanism] = reinitialization_value # Allow values to continue accumulating so that we can set them back to the saved state S.run(inputs={A: [[1.0], [1.0]]}) run_2_values = [A.value, B.value[0], C.value] S.run(inputs={A: [[1.0], [1.0]]}, reinitialize_values=reinitialization_values) run_3_values = [A.value, B.value[0], C.value] assert np.allclose(run_2_values, run_3_values) assert np.allclose( run_1_values, [np.array([[0.36]]), np.array([[0.056]]), np.array([[0.056]])]) assert np.allclose(run_2_values, [ np.array([[0.5904]]), np.array([[0.16384]]), np.array([[0.16384]]) ])
def test_integrator_type_diffusion_rate_list(self): I = IntegratorMechanism( default_variable=[0, 0, 0], name='IntegratorMechanism', function=DriftDiffusionIntegrator(rate=[5.0, 5.0, 5.0])) # P = Process(pathway=[I]) val = list(I.execute([10.0, 10.0, 10.0])[0]) assert val == [50.0, 50.0, 50.0]
def test_integrator_drift_diffusion_noise_val(self): I = IntegratorMechanism(name='IntegratorMechanism', function=DriftDiffusionIntegrator(noise=5.0, ), time_scale=TimeScale.TIME_STEP) val = float(I.execute(10)) np.testing.assert_allclose(val, 15.010789523731438)
def test_DDM_noise_2_0(): stim = 10 T = DDM(name='DDM', function=DriftDiffusionIntegrator(noise=2.0, rate=1.0, time_step_size=1.0)) val = float(T.execute(stim)[0]) assert val == 12.641125838188323
def test_DDM_Integrator(): stim = 10 T = DDM(name='DDM', function=DriftDiffusionIntegrator(initializer=20.0), time_scale=TimeScale.TIME_STEP) val = float(T.execute(stim)[0]) T.function_object.initializer = 30.0 val2 = float(T.execute(stim)[0])
def test_integrator_drift_diffusion_noise_val(self): I = IntegratorMechanism( name='IntegratorMechanism', function=DriftDiffusionIntegrator(noise=5.0, ), ) val = float(I.execute(10)) np.testing.assert_allclose(val, 12.188524664621541)
def test_DDM_size_too_large(): with pytest.raises(DDMError) as error_text: T = DDM(name='DDM', size=3.0, function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) assert "must have only a single numeric item" in str(error_text.value)
def test_DDM_size_too_long(): with pytest.raises(DDMError) as error_text: T = DDM(name='DDM', size=[1, 1], function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) assert "is greater than 1, implying there are" in str(error_text.value)
def test_DDM_mech_size_negative_one(): with pytest.raises(ComponentError) as error_text: T = DDM(name='DDM', size=-1.0, function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) assert "is not a positive number" in str(error_text.value)
def test_DDM_size_int_inputs_(): T = DDM(name='DDM', size=1.0, function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) val = T.execute([.4]).tolist() assert val == [[-2.0], [1.0]]
def test_DDM_size_int_check_var(): T = DDM(name='DDM', size=1, function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) assert len(T.instance_defaults.variable ) == 1 and T.instance_defaults.variable[0][0] == 0
def test_DDM_zero_noise(): stim = 10 T = DDM(name='DDM', function=DriftDiffusionIntegrator(noise=0.0, rate=1.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) val = float(T.execute(stim)[0]) assert val == 10
def test_DDM_input_fn(): with pytest.raises(TypeError) as error_text: stim = NormalDist().function T = DDM(name='DDM', function=DriftDiffusionIntegrator(noise=0.0, rate=1.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) float(T.execute(stim)) assert "not supported for the input types" in str(error_text.value)
def test_DDM_input_rate_negative(): stim = [10] T = DDM(name='DDM', default_variable=[0], function=DriftDiffusionIntegrator(noise=0.0, rate=-5.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) val = float(T.execute(stim)[0]) assert val == -50
def test_threshold_sets_is_finished(self): D = DDM(name='DDM', function=DriftDiffusionIntegrator(threshold=5.0)) D.execute(2.0) # 2.0 < 5.0 assert not D.is_finished D.execute(2.0) # 4.0 < 5.0 assert not D.is_finished D.execute(2.0) # 5.0 = threshold assert D.is_finished
def test_DDM_rate_float(): stim = 10 T = DDM( name='DDM', function=DriftDiffusionIntegrator(noise=0.0, rate=5, time_step_size=1.0), ) val = float(T.execute(stim)[0]) assert val == 50
def test_integrator_type_diffusion_rate_float(self): I = IntegratorMechanism( name='IntegratorMechanism', function=DriftDiffusionIntegrator( rate=5.0 ) ) # P = Process(pathway=[I]) val = I.execute(10.0) assert np.allclose([[[50.0]], [[1.0]]], val)
def test_DDM_noise_0_5(): stim = 10 T = DDM(name='DDM', function=DriftDiffusionIntegrator(noise=0.5, rate=1.0, time_step_size=1.0)) val = float(T.execute(stim)[0]) assert val == 11.320562919094161
def test_DDM_input_list_len_1(): stim = [10] T = DDM( name='DDM', function=DriftDiffusionIntegrator(noise=0.0, rate=1.0, time_step_size=1.0), ) val = float(T.execute(stim)[0]) assert val == 10
def test_integrator_drift_diffusion_noise_val(self): I = IntegratorMechanism( name='IntegratorMechanism', function=DriftDiffusionIntegrator( noise=5.0, ), ) val = I.execute(10.0) assert np.allclose(val, [[[15.01078952]], [[1.]]])
def test_integrator_type_diffusion_rate_list_input_float(self): with pytest.raises(FunctionError) as error_text: I = IntegratorMechanism( name='IntegratorMechanism', function=DriftDiffusionIntegrator(rate=[5.0, 5.0, 5.0])) # P = Process(pathway=[I]) float(I.execute(10.0)) assert ("array specified for the rate parameter" in str(error_text) and "must match the length" in str(error_text) and "of the default input" in str(error_text))
def test_DDM_noise_fn(): with pytest.raises(FunctionError) as error_text: stim = 10 T = DDM(name='DDM', function=DriftDiffusionIntegrator(noise=NormalDist().function, rate=1.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) float(T.execute(stim)[0]) assert "DriftDiffusionIntegrator requires noise parameter to be a float" in str( error_text.value)
def test_drift_diffusion_integrator(self): I = IntegratorMechanism(function=DriftDiffusionIntegrator( initializer=10.0, rate=10, time_step_size=0.5, offset=10, )) # P = Process(pathway=[I]) # 10 + 10*0.5 + 0 + 10 = 25 val = I.execute(1) assert val == 25
def test_is_finished_stops_system(self): D = DDM(name='DDM', function=DriftDiffusionIntegrator(threshold=10.0)) P = Process(pathway=[D]) S = System(processes=[P]) S.run(inputs={D: 2.0}, termination_processing={TimeScale.TRIAL: WhenFinished(D)}) # decision variable's value should match threshold assert D.value[0] == 10.0 # it should have taken 5 executions (and time_step_size = 1.0) assert D.value[1] == 5.0
def test_DDM_rate_fn(): with pytest.raises(typecheck.framework.InputParameterError) as error_text: stim = [10] T = DDM(name='DDM', default_variable=[0], function=DriftDiffusionIntegrator(noise=0.0, rate=NormalDist().function, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) float(T.execute(stim)[0]) assert "incompatible value" in str(error_text.value)
def test_DDM_input_list_len_2(): with pytest.raises(DDMError) as error_text: stim = [10, 10] T = DDM(name='DDM', default_variable=[0, 0], function=DriftDiffusionIntegrator(noise=0.0, rate=1.0, time_step_size=1.0), time_scale=TimeScale.TIME_STEP) float(T.execute(stim)[0]) assert "must have only a single numeric item" in str(error_text.value)
def test_DDM_noise_int(): with pytest.raises(FunctionError) as error_text: stim = 10 T = DDM( name='DDM', function=DriftDiffusionIntegrator(noise=2, rate=1.0, time_step_size=1.0), ) float(T.execute(stim)[0]) assert "DriftDiffusionIntegrator requires noise parameter to be a float" in str( error_text.value)
def test_integrator_diffusion_with_reset_intializer(self): I = IntegratorMechanism(name='IntegratorMechanism', function=DriftDiffusionIntegrator(), time_scale=TimeScale.TIME_STEP) # val = float(I.execute(10)[0]) # P = Process(pathway=[I]) val = float(I.execute(10)) # testing initializer I.function_object.reset_initializer = 1.0 val2 = float(I.execute(0)) assert [val, val2] == [10.0, 1.0]