예제 #1
0
 def test_rotate_periodicity(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     dth = np.full([ds.n], np.pi / 2.0)
     for i in range(4):
         ds.rotate(dth)
     self.assertTrue(np.allclose(ds.u_0, ds.u))
예제 #2
0
파일: agents.py 프로젝트: eddiejessup/ahoy
def agents_factory(rng, dim, aligned_flag,
                   n=None, rho_0=None,
                   chi=None, onesided_flag=None,
                   tumble_flag=None, p_0=None, tumble_chemo_flag=None,
                   rotation_flag=None, Dr_0=None, rotation_chemo_flag=None,
                   temporal_chemo_flag=None, dt_mem=None, t_mem=None, time=None,
                   spatial_flag=None, v_0=None,
                   periodic_flag=None, L=None, origin_flags=None, obstructor=None,
                   c_field_flag=None, c_field=None):
    if rho_0 is not None:
        try:
            volume_free = obstructor.volume_free
        except AttributeError:
            volume_free = np.product(L)
        n = int(round(rho_0 * volume_free))
    ds = directions_factory(n, dim, aligned_flag=aligned_flag,
                            rng=rng)
    ps = positions_factory(spatial_flag, periodic_flag, n, dim, L,
                           origin_flags, rng, obstructor)
    rudder_sets = rudder_set_factory(temporal_chemo_flag,
                                     ds,
                                     ps, v_0, dt_mem, t_mem, time,
                                     c_field_flag, c_field,
                                     onesided_flag, chi,
                                     tumble_flag, p_0, tumble_chemo_flag,
                                     rotation_flag, Dr_0, dim, rotation_chemo_flag)
    swims = swimmers_factory(spatial_flag, v_0, ds)
    return Agents(ds, ps, rudder_sets, swims)
예제 #3
0
 def test_rotate_idempotence(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     dth = self.rng.uniform(-np.pi, np.pi, size=self.n)
     ds.rotate(dth)
     ds.rotate(-dth)
     self.assertTrue(np.allclose(ds.u_0, ds.u))
예제 #4
0
 def test_tumble_coverage(self):
     n = 2000
     ds = directions.directions_factory(n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     tumblers = np.ones([ds.n], dtype=np.bool)
     ds.tumble(tumblers)
     frac_close = np.isclose(ds.u_0, ds.u).sum() / float(ds.n)
     self.assertAlmostEqual(frac_close, 0.5, 1)
예제 #5
0
 def test_tumble_magnitude_conservation(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     mags_0 = np.sum(np.square(ds.u))
     tumblers = self.rng.choice([True, False], size=ds.n)
     ds.tumble(tumblers)
     mags_rot = np.sum(np.square(ds.u))
     self.assertTrue(np.allclose(mags_0, mags_rot))
예제 #6
0
 def test_rotate_magnitude_conservation(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     mags_0 = np.sum(np.square(ds.u))
     dth = self.rng.uniform(-np.pi, np.pi, size=self.n)
     ds.rotate(dth)
     mags_rot = np.sum(np.square(ds.u))
     self.assertTrue(np.allclose(mags_0, mags_rot))
예제 #7
0
 def get_ds(npy_seed):
     rng = np.random.RandomState(rng_seed)
     np.random.seed(npy_seed)
     ds = directions.directions_factory(n, self.dim, aligned_flag=True)
     ruds = self.rudders_cls(self.noise_measurer)
     for _ in range(num_iterations):
         ruds.rotate(ds, self.dt, rng)
     return ds
예제 #8
0
    def test_tumble_rate(self):
        n = 2000
        dt = 1.0
        p = self.rng.uniform(0.0, 1.0, size=n)
        noise_measurer = noise_measurers.NoiseMeasurer(p)

        n_expected = (p * dt).sum()
        # In 1D is a half chance to tumble back to the same direction.
        if self.dim == 1:
            n_expected /= 2.0
        ds = directions.directions_factory(n, self.dim, aligned_flag=False,
                                           rng=self.rng)
        ruds = rudders.TumbleRudders(noise_measurer)
        ruds.rotate(ds, dt, self.rng)
        u_change = np.not_equal(ds.u_0, ds.u)
        n_actual = np.any(u_change, axis=-1).sum()
        err = np.abs(n_expected - n_actual) / n_expected
        self.assertTrue(err < 0.05)
예제 #9
0
    def test_rudder_autocorrelation(self):
        n = 10000
        t_max = 0.5

        ds = directions.directions_factory(n, self.dim, aligned_flag=True)
        rudders = self.rudders_cls(self.noise_measurer)

        u_0 = ds.u
        ts = np.arange(0.0, t_max, self.dt)
        mean_dots = []
        for t in ts:
            rudders.rotate(ds, self.dt, self.rng)
            mean_dot = np.mean(np.sum(u_0 * ds.u, axis=-1))
            mean_dots.append(mean_dot)

        def exp(t, t_rot):
            return np.exp(-t / t_rot)

        popt, pcov = curve_fit(exp, ts, mean_dots)
        t_rot_actual = popt[0]
        self.assertAlmostEqual(t_rot_actual, self.t_rot_expect, 1)
예제 #10
0
 def test_rotate_identity(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     dth = np.zeros([ds.n])
     ds.rotate(dth)
     self.assertTrue(np.allclose(ds.u_0, ds.u))
예제 #11
0
 def test_tumble_coverage(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     tumblers = np.ones([ds.n], dtype=np.bool)
     ds.tumble(tumblers, rng=self.rng)
     self.assertFalse(np.any(np.isclose(ds.u_0, ds.u)))
예제 #12
0
 def test_tumble_identity(self):
     ds = directions.directions_factory(self.n, self.dim,
                                        aligned_flag=False, rng=self.rng)
     tumblers = np.zeros([ds.n], dtype=np.bool)
     ds.tumble(tumblers)
     self.assertTrue(np.allclose(ds.u_0, ds.u))