def test_get_set_parameters_functions(self): """Test get_parameters, set_parameters, and get_parameter_names""" p1 = ddm.Fittable(minval=0, maxval=1) p2 = ddm.Fittable(minval=.3, maxval=.9, default=.4) m = ddm.Model(drift=ddm.DriftConstant(drift=p1), noise=ddm.NoiseLinear(noise=p2, x=.2, t=p1)) print(m.get_model_parameters()) assert all(id(a) == id(b) for a,b in zip(m.get_model_parameters(), [p1, p2])) assert all(a == b for a,b in zip(m.get_model_parameter_names(), ["drift/t", "noise"])) m.set_model_parameters(m.get_model_parameters()) assert all(id(a) == id(b) for a,b in zip(m.get_model_parameters(), [p1, p2])) m.set_model_parameters([.5, .5]) assert all(a == b for a,b in zip(m.get_model_parameters(), [.5, .5]))
def __init__(self, ndt='gaussian'): overlay = (ddm.OverlayNonDecisionUniform(nondectime=ddm.Fittable(minval=0, maxval=0.5), halfwidth=ddm.Fittable(minval=0.001, maxval=0.3)) if ndt=='uniform' else self.OverlayNonDecisionGaussian(nondectime=ddm.Fittable(minval=0, maxval=0.6), ndsigma=ddm.Fittable(minval=0.001, maxval=0.3))) self.model = ddm.Model(name='5 TTA- and d-dependent drift and bounds and uniformly distributed nondecision time', drift=self.DriftTtaDistance(alpha=ddm.Fittable(minval=0.1, maxval=3), beta=ddm.Fittable(minval=0, maxval=1), theta=ddm.Fittable(minval=4, maxval=40)), noise=ddm.NoiseConstant(noise=1), bound=self.BoundCollapsingTta(b_0=ddm.Fittable(minval=0.5, maxval=5), k=ddm.Fittable(minval=0.1, maxval=2), tta_crit=ddm.Fittable(minval=3, maxval=6)), overlay=overlay, T_dur=self.T_dur)
def test_double_fit(self): """Fit different parameters in the same (or a different) model using a single Fittable object""" class NoiseDouble(ddm.Noise): name = "time-varying noise" required_parameters = ["noise1", "noise2"] def get_noise(self, **kwargs): if np.random.rand() > .5: return self.noise1 else: return self.noise2 class NoiseConstantButNot(ddm.Noise ): # To avoid the numerical simulations name = "almost noise constant" required_parameters = ["noise"] def get_noise(self, **kwargs): return self.noise # Generate data m = ddm.Model(name="DDM", drift=ddm.DriftConstant(drift=1), noise=ddm.NoiseConstant(noise=1.7)) s = m.solve_numerical( ) # Solving analytical and then fitting numerical may give a bias sample = s.resample(10000) mone = ddm.fit_model( sample, drift=ddm.DriftConstant(drift=1), noise=NoiseConstantButNot(noise=ddm.Fittable(minval=.5, maxval=3))) sigs = ddm.Fittable(minval=.5, maxval=3) msam = ddm.fit_model(sample, drift=ddm.DriftConstant(drift=1), noise=NoiseDouble(noise1=sigs, noise2=sigs)) assert msam._noisedep.noise1 == msam._noisedep.noise2, "Fitting to be the same failed" assert abs(msam._noisedep.noise1 - mone._noisedep.noise) < 0.1 * mone._noisedep.noise
def test_fit_with_condition(self): """A simple one-parameter fit with conditions""" m = self.cond_m s = self.cond_s mfit = ddm.Model(drift=self.DriftCond( param=ddm.Fittable(minval=.1, maxval=3))) ddm.fit_adjust_model(model=mfit, sample=s) # Within 10% if SHOW_PLOTS: mfit.name = "Fitted solution" sfit = mfit.solve() plot_compare_solutions(s, sfit) plt.show() _verify_param_match("drift", "param", m, mfit)
def test_fit_drift(self): """A simple one-parameter fit""" m = ddm.Model(name="DDM", drift=ddm.DriftConstant(drift=2)) s = m.solve() sample = s.resample(10000) mfit = ddm.Model( name="DDM", drift=ddm.DriftConstant(drift=ddm.Fittable(minval=0, maxval=10))) ddm.fit_adjust_model(model=mfit, sample=sample) # Within 10% if SHOW_PLOTS: mfit.name = "Fitted solution" sfit = mfit.solve() plot_compare_solutions(s, sfit) plt.show() _verify_param_match("drift", "drift", m, mfit)
FakePointModel.solve_numerical = FakePointModel.solve FakePointModel.solve_numerical_cn = FakePointModel.solve FakePointModel.solve_numerical_implicit = FakePointModel.solve FakePointModel.solve_numerical_explicit = FakePointModel.solve m = FakePointModel() s = m.solve() so = OverlayNonDecisionUniform(nondectime=-.05, st=.1).apply(s) so2 = OverlayNonDecisionUniform2(nondectime=-.05, st=.1).apply(s) assert np.all(so.corr == so2.corr) so = OverlayNonDecisionGamma(shape=4, scale=.01, nondectime=.1).apply(s) print(list(so.corr)) print(np.sum(so.corr)) #m = FakePointModel(overlay=OverlayNonDecisionGamma(shape=ddm.Fittable(minval=1, maxval=3), scale=ddm.Fittable(minval=0, maxval=.2), nondectime=ddm.Fittable(minval=0, maxval=1))) m = FakePointModel(overlay=OverlayNonDecisionGaussian( ndsigma=ddm.Fittable(minval=0, maxval=1), nondectime=ddm.Fittable(minval=0, maxval=1))) #m = FakePointModel(overlay=OverlayNonDecisionUniform(st=ddm.Fittable(minval=0, maxval=1), nondectime=ddm.Fittable(minval=0, maxval=1))) import ddm.plot ddm.plot.model_gui( m, ddm.Sample(np.asarray([1, 1.1, 1.2, 1.3, 1.4, 1.5]), np.asarray([1]))) from ddm import ICGaussian r = ICPointRew(x0=.99) #print(r.get_IC(np.linspace(-1, 1, 201), dx=.01, conditions={"highreward": 1}))
traj = model.simulate_trial(conditions=conditions, rk4=rk4, seed=seed, cutoff=True) set_dip_type(model, diptype) return traj # END overlay #################### Example usage #################### if __name__ == "__main__": # BEGIN demo DIPTYPE = 1 # Change to 1, 2, or 3 depending on which model you want snr = ddm.Fittable(minval=0.5, maxval=20, default=9.243318909157688) leak = ddm.Fittable(minval=-10, maxval=30, default=9.46411355874963) x0 = ddm.Fittable(minval=-.5, maxval=.5, default=0.1294632585920082) leaktargramp = ddm.Fittable(minval=0, maxval=3, default=0) noise = ddm.Fittable(minval=.2, maxval=2, default=1.1520906498077081) t1 = ddm.Fittable(minval=0, maxval=1, default=0.34905555600815663) t1slope = ddm.Fittable(minval=0, maxval=3, default=1.9643425020687162) dipstart = ddm.Fittable(minval=-.4, maxval=0, default=-.2) dipstop = ddm.Fittable(minval=0, maxval=.5, default=.05) nondectime = ddm.Fittable(minval=0, maxval=.3, default=.1) detect = ddm.Fittable(minval=2, maxval=50, default=10) diptype = DIPTYPE dipparam = ddm.Fittable(minval=0, maxval=50) if diptype == 2 else 0 pmixturecoef = ddm.Fittable(minval=0, maxval=.2, default=.03) rate = ddm.Fittable(minval=.1, maxval=10, default=1)