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
Exemple #2
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]])])
Exemple #3
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]