def setUp(self): self.samps = { # Empty sample "empty": ddm.Sample(aa([]), aa([]), 0), # Simple sample "simple": ddm.Sample(aa([1, 2]), aa([.5, .7]), 0), # Sample with conditions "conds": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa([1, 1, 2]), aa([]))), # Sample with conditions and explicitly showing undecided "condsexp": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa([1, 1, 2]), aa([]), aa([]))), # Sample with undecided "undec": ddm.Sample(aa([1, 2]), aa([.5, .7]), 2), # Sample with undecided and conditions "undeccond": ddm.Sample(aa([1, 2, 3]), aa([]), 3, cond1=(aa([1, 1, 2]), aa([]), aa([2, 2, 1]))), # For the adding test "adda": ddm.Sample(aa([1]), aa([2, 4]), 3, cond1=(aa(["a"]), aa(["a", "b"]), aa(["a", "b", "b"]))), "addb": ddm.Sample(aa([1.5, 2, 1]), aa([]), 1, cond1=(aa(["b", "b", "c"]), aa([]), aa(["d"]))), # Two conditions "two": ddm.Sample(aa([1]), aa([2]), 1, conda=(aa(["a"]), aa(["b"]), aa(["a"])), condb=(aa([1]), aa([2]), aa([2]))), }
def test_LossLikelihood(self): """Likelihood loss function""" # We can calculate likelihood for this simple case m = self.FakePointModel(dt=.02) sol = m.solve() s = ddm.Sample(aa([.02]), aa([])) expected = -np.log(np.sum(sol.corr)/m.dt) assert np.isclose(expected, ddm.models.LossLikelihood(sample=s, dt=m.dt, T_dur=m.T_dur).loss(m)) # And for the uniform case we can assert equivalence m = self.FakeUniformModel() s1 = ddm.Sample(aa([.02, .05, .07, .12]), aa([.33, .21])) s2 = ddm.Sample(aa([.13, .1, .02]), aa([.66, .15, .89])) assert np.isclose(ddm.models.LossLikelihood(sample=s1, dt=m.dt, T_dur=m.T_dur).loss(m), ddm.models.LossLikelihood(sample=s2, dt=m.dt, T_dur=m.T_dur).loss(m))
def test_BIC(self): """BIC loss function""" # -2*Likelihood == BIC for a sample size of 1 m = self.FakePointModel(dt=.02) sol = m.solve() s = ddm.Sample(aa([.02]), aa([])) expected = -np.log(np.sum(sol.corr)/m.dt) assert np.isclose(ddm.models.LossBIC(sample=s, dt=m.dt, T_dur=m.T_dur, nparams=1, samplesize=1).loss(m), 2*ddm.models.LossLikelihood(sample=s, dt=m.dt, T_dur=m.T_dur).loss(m))
def test_LossSquaredError(self): """Squared error loss function""" # Should be zero for empty sample when all undecided m = self.FakeUndecidedModel() s = ddm.Sample(aa([]), aa([]), undecided=1) assert ddm.models.LossSquaredError(sample=s, dt=m.dt, T_dur=m.T_dur).loss(m) == 0 # Can also be determined precisely for the point model m = self.FakePointModel() sol = m.solve() err = ddm.models.LossSquaredError(sample=s, dt=m.dt, T_dur=m.T_dur).loss(m) assert np.isclose(err, np.sum(sol.corr)**2 + np.sum(sol.err)**2)
def prepare_sample_for_variable_drift(sample, resolution=RESOLUTION): new_samples = [] for i in range(0, resolution): corr = sample.corr.copy() err = sample.err.copy() undecided = sample.undecided conditions = copy.deepcopy(sample.conditions) conditions['driftnum'] = (np.asarray([i]*len(corr)), np.asarray([i]*len(err)), np.asarray([i]*undecided)) new_samples.append(ddm.Sample(corr, err, undecided, **conditions)) new_sample = new_samples.pop() for s in new_samples: new_sample += s return new_sample
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}))
def setUp(self): # You need some gymnastics to get numpy to accept an array of # same-length tuples _tuple_same_length = np.empty(3, dtype=object) _tuple_same_length[:] = [(3, 1, 2), (3, 3, 3), (5, 4, 3)] self.samps = { # Empty sample "empty": ddm.Sample(aa([]), aa([]), 0), # Simple sample "simple": ddm.Sample(aa([1, 2]), aa([.5, .7]), 0), # Sample with conditions "conds": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa([1, 1, 2]), aa([]))), # Sample with conditions as strings "condsstr": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa(["x", "yy", "z z z"]), aa([]))), # Sample with conditions as tuples "condstuple": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa([(3, 1, 2), (5, 5), (1, 1, 1, 1, 1)], dtype=object), aa([]))), # Sample with conditions as tuples which are the same length "condstuplesame": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(_tuple_same_length, aa([]))), # Sample with conditions and explicitly showing undecided "condsexp": ddm.Sample(aa([1, 2, 3]), aa([]), 0, cond1=(aa([1, 1, 2]), aa([]), aa([]))), # Sample with undecided "undec": ddm.Sample(aa([1, 2]), aa([.5, .7]), 2), # Sample with undecided and conditions "undeccond": ddm.Sample(aa([1, 2, 3]), aa([]), 3, cond1=(aa([1, 1, 2]), aa([]), aa([2, 2, 1]))), # For the adding test "adda": ddm.Sample(aa([1]), aa([2, 4]), 3, cond1=(aa(["a"]), aa(["a", "b"]), aa(["a", "b", "b"]))), "addb": ddm.Sample(aa([1.5, 2, 1]), aa([]), 1, cond1=(aa(["b", "b", "c"]), aa([]), aa(["d"]))), # Two conditions "two": ddm.Sample(aa([1]), aa([2]), 1, conda=(aa(["a"]), aa(["b"]), aa(["a"])), condb=(aa([1]), aa([2]), aa([2]))), }