Ejemplo n.º 1
0
def test_UniformCausticSampling_simple():
    """
    Tests only very basic usage of UniformCausticSampling.
    """
    sampling = mm.UniformCausticSampling(s=1.5, q=0.9, n_points=10)
    assert sampling.s == 1.5
    assert sampling.q == 0.9
    assert sampling.n_caustics == 1
Ejemplo n.º 2
0
def test_get_uniform_sampling():
    """
    Basic test for get_uniform_sampling() - only if the shape of output is
    correct
    """
    n = 50

    sampling = mm.UniformCausticSampling(s=1.1, q=0.5, n_points=100)
    (x_caustic_in, x_caustic_out) = sampling.get_uniform_sampling(n_points=n)
    assert x_caustic_in.shape == (n,)
    assert x_caustic_out.shape == (n,)
Ejemplo n.º 3
0
def test_UniformCausticSampling():
    """
    Test if the main functions of work correctly, namely:
    - get_standard_parameters(),
    - get_x_in_x_out(),
    - check_valid_trajectory(),
    - caustic_point(),
    - n_caustics,
    - which_caustic().
    Most tests are run for each of the three topologies.
    """
    s_ = [1.1, 0.5, 2]
    q_ = [0.1, 0.001, 0.01]
    n_points = 1000
    # Expected results:
    n_c = [1, 3, 2]
    p_ = [0.01401270+0.22985537j, -1.49730846-0.11183662j,
          1.49051495+0.03108463j]
    checks = [False, False, True]

    for (s, q, nc, p, c) in zip(s_, q_, n_c, p_, checks):
        sampling = mm.UniformCausticSampling(s=s, q=q, n_points=n_points)
        standard = sampling.get_standard_parameters(0.2, 0.499, 0., 10.)
        x_list = sampling.get_x_in_x_out(standard['u_0'], standard['alpha'])
        assert np.min(np.abs(np.array(x_list) - 0.2)) < 1.e-6
        assert np.min(np.abs(np.array(x_list) - 0.499)) < 2.e-6
        assert sampling.check_valid_trajectory(0.2, 0.5) == c
        np.testing.assert_almost_equal(sampling.caustic_point(0.3), p)
        assert sampling.n_caustics == nc
        assert sampling.which_caustic(0.95) == sampling.n_caustics
    np.testing.assert_almost_equal(standard['t_0'], 216.3783662)
    np.testing.assert_almost_equal(standard['u_0'], 0.0076099741)
    np.testing.assert_almost_equal(standard['t_E'], 142.7154375)
    np.testing.assert_almost_equal(standard['alpha'], 180.54305134)

    # For the last (s, q) we also check alpha = 90 or 270:
    x_1 = 0.1885475223517683
    x_2 = 0.9504818975429649
    u_0 = s - 1. / s + s * q / (1. + q)
    standard = sampling.get_standard_parameters(x_1, x_2, -10., 0.)
    np.testing.assert_almost_equal(standard['alpha'], 270.)
    np.testing.assert_almost_equal(standard['u_0'], u_0)
    standard = sampling.get_standard_parameters(x_2, x_1, -10., 0.)
    np.testing.assert_almost_equal(standard['alpha'], 90.)
    np.testing.assert_almost_equal(standard['u_0'], -u_0)
def generate_random_parameters(parameters, starting, n, s=None, q=None):
    """
    Generate *n* vectors of values of *parameters* according to distributions
    specified in *starting*.
    """
    values = []
    for param in parameters:
        settings = starting[param]
        if settings[0] == 'gauss':
            v = settings[2] * np.random.randn(n)
            v += settings[1]
        elif settings[0] == 'uniform':
            v = np.random.uniform(low=settings[1], high=settings[2], size=n)
        elif settings[0] == 'log-uniform':
            beg = np.log(settings[1])
            end = np.log(settings[2])
            v = np.exp(np.random.uniform(beg, end, n))
        values.append(v)
    if 'x_caustic_in' in parameters and 'x_caustic_out' in parameters:
        sampling = mm.UniformCausticSampling(s=s, q=q)
        (x_in, x_out) = sampling.get_uniform_sampling(n)
        values[parameters.index('x_caustic_in')] = x_in
        values[parameters.index('x_caustic_out')] = x_out
    return np.array(values).T.tolist()
s = 1.2
q = 0.5
n_points = 200

color = np.linspace(0., 1., n_points)

# First, we use standard procedure to plot the caustic. You will see that
# the points are distributed non-uniformly, i.e., the density is higher
# near cusps. We also add color to indicate order of plotting.
# It turns out to be a complicated shape.
caustic = mm.Caustics(s=s, q=q)
caustic.plot(c=color, n_points=n_points)
plt.axis('equal')
plt.colorbar()
plt.title('standard plotting')

# Second, we use uniform sampling. The density of points is constant.
# Here the color scale indicates x_caustic values.
plt.figure()
sampling = mm.UniformCausticSampling(s=s, q=q)
points = [sampling.caustic_point(c) for c in color]
x = [p.real for p in points]
y = [p.imag for p in points]
plt.scatter(x, y, c=color)
plt.axis('equal')
plt.colorbar()
plt.title('uniform sampling plotting')

plt.show()