예제 #1
0
def test_concat_generator():
    size1, size2 = 10, 20
    t_min, t_max = 0.5, 1.5
    generator1 = Generator1D(size1, t_min=t_min, t_max=t_max)
    generator2 = Generator1D(size2, t_min=t_min, t_max=t_max)
    concat_generator = ConcatGenerator(generator1, generator2)
    x = concat_generator.get_examples()
    assert _check_shape_and_grad(concat_generator, size1 + size2, x)

    grid1 = (4, 4, 4)
    size1, size2, size3 = grid1[0] * grid1[1] * grid1[2], 100, 200
    generator1 = Generator3D(grid=grid1)
    generator2 = GeneratorSpherical(size2)
    generator3 = GeneratorSpherical(size3)
    concat_generator = ConcatGenerator(generator1, generator2, generator3)
    r, theta, phi = concat_generator.get_examples()
    assert _check_shape_and_grad(concat_generator, size1 + size2 + size3, r,
                                 theta, phi)

    added_generator = generator1 + generator2 + generator3
    r, theta, phi = added_generator.get_examples()
    assert _check_shape_and_grad(added_generator, size1 + size2 + size3, r,
                                 theta, phi)

    str(concat_generator)
    repr(concat_generator)
예제 #2
0
def x():
    g = EnsembleGenerator(
        Generator1D(GRID[0], R_MIN, R_MAX, method='uniform'),
        Generator1D(GRID[1], 0, np.pi * 2, method='uniform'),
        Generator1D(GRID[2], Z_MIN, Z_MAX, method='uniform'),
    )
    return SamplerGenerator(g).get_examples()
예제 #3
0
def generators():
    return dict(
        train=Generator1D(64, t_min=T_MIN, t_max=T_MAX, method='uniform'),
        valid=Generator1D(64,
                          t_min=T_MIN,
                          t_max=T_MAX,
                          method='equally-spaced'),
    )
예제 #4
0
    def __init__(
            self,
            ode_system,
            conditions,
            t_min,
            t_max,
            nets=None,
            train_generator=None,
            valid_generator=None,
            analytic_solutions=None,
            optimizer=None,
            criterion=None,
            n_batches_train=1,
            n_batches_valid=4,
            metrics=None,
            n_output_units=1,
            # deprecated arguments are listed below
            batch_size=None,
            shuffle=None):

        if train_generator is None or valid_generator is None:
            if t_min is None or t_max is None:
                raise ValueError(
                    f"Either generator is not provided, t_min and t_max should be both provided: \n"
                    f"got t_min={t_min}, t_max={t_max}, "
                    f"train_generator={train_generator}, valid_generator={valid_generator}"
                )

        if train_generator is None:
            train_generator = Generator1D(32,
                                          t_min=t_min,
                                          t_max=t_max,
                                          method='equally-spaced-noisy')
        if valid_generator is None:
            valid_generator = Generator1D(32,
                                          t_min=t_min,
                                          t_max=t_max,
                                          method='equally-spaced')

        self.t_min, self.t_max = t_min, t_max

        super(Solver1D, self).__init__(
            diff_eqs=ode_system,
            conditions=conditions,
            nets=nets,
            train_generator=train_generator,
            valid_generator=valid_generator,
            analytic_solutions=analytic_solutions,
            optimizer=optimizer,
            criterion=criterion,
            n_batches_train=n_batches_train,
            n_batches_valid=n_batches_valid,
            metrics=metrics,
            n_input_units=1,
            n_output_units=n_output_units,
            shuffle=shuffle,
            batch_size=batch_size,
        )
예제 #5
0
def test_generator1d_log_spaced_input(method):
    size = 32
    with pytest.raises(ValueError):
        Generator1D(size=size, t_min=0.0, t_max=1.0, method=method)
    with pytest.raises(ValueError):
        Generator1D(size=size, t_min=1.0, t_max=0.0, method=method)
    with pytest.raises(ValueError):
        Generator1D(size=size, t_min=-1.0, t_max=1.0, method=method)
    with pytest.raises(ValueError):
        Generator1D(size=size, t_min=1.0, t_max=-1.0, method=method)
예제 #6
0
def test_ensemble_generator():
    size = 100

    generator1 = Generator1D(size)
    ensemble_generator = EnsembleGenerator(generator1)
    x = ensemble_generator.get_examples()
    assert _check_shape_and_grad(ensemble_generator, size, x)

    old_x = torch.rand(size)
    old_y = torch.rand(size)
    old_z = torch.rand(size)
    generator1 = PredefinedGenerator(old_x)
    generator2 = PredefinedGenerator(old_y)
    generator3 = PredefinedGenerator(old_z)
    ensemble_generator = EnsembleGenerator(generator1, generator2, generator3)
    x, y, z = ensemble_generator.get_examples()
    assert _check_shape_and_grad(ensemble_generator, size, x, y, z)
    assert _check_iterable_equal(old_x, x)
    assert _check_iterable_equal(old_y, y)
    assert _check_iterable_equal(old_z, z)

    old_x = torch.rand(size)
    old_y = torch.rand(size)
    generator1 = PredefinedGenerator(old_x)
    generator2 = PredefinedGenerator(old_y)
    product_generator = generator1 * generator2
    x, y = product_generator.get_examples()
    assert _check_shape_and_grad(product_generator, size, x, y)
    assert _check_iterable_equal(old_x, x)
    assert _check_iterable_equal(old_y, y)

    str(ensemble_generator)
    repr(ensemble_generator)
예제 #7
0
def test_generator1d():
    size = 32
    generator = Generator1D(size=size, t_min=0.0, t_max=2.0, method='uniform')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size, t_min=0.0, t_max=2.0, method='equally-spaced')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size, t_min=0.0, t_max=2.0, method='equally-spaced-noisy')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced-noisy')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced-noisy',
                            noise_std=0.01)
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    with raises(ValueError):
        generator = Generator1D(size=size, t_min=0.0, t_max=2.0, method='magic')
    print('ExampleGenerator test passed.')
예제 #8
0
def test_sampler_geneartor():
    size = 10
    generator = Generator1D(size)
    sampler_generator = SamplerGenerator(generator)
    x = sampler_generator.get_examples()
    assert isinstance(x, (list, tuple))
    x, = x
    assert x.shape == (size, 1)

    print('testing generator name: ', sampler_generator)
예제 #9
0
def test_sampler_geneartor():
    size = 10
    generator = Generator1D(size)
    sampler_generator = SamplerGenerator(generator)
    x = sampler_generator.get_examples()
    assert isinstance(x, (list, tuple))
    x, = x
    assert x.shape == (size, 1)

    str(sampler_generator)
    repr(sampler_generator)
예제 #10
0
def test_train_generator():
    exponential = lambda x, t: diff(x, t) - x
    init_val_ex = IVP(t_0=0.0, x_0=1.0)

    train_gen = Generator1D(size=32, t_min=0.0, t_max=2.0, method='uniform')
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.0, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=0.0, t_max=2.0, method='equally-spaced')
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.0, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=0.0, t_max=2.0, method='equally-spaced-noisy')
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.0, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=0.0, t_max=2.0, method='equally-spaced-noisy', noise_std=0.01)
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.0, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced')
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.1, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced-noisy')
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.1, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)
    train_gen = Generator1D(size=32, t_min=np.log10(0.1), t_max=np.log10(2.0), method='log-spaced-noisy', noise_std=0.01)
    solution_ex, _ = solve(ode=exponential, condition=init_val_ex,
                           t_min=0.1, t_max=2.0,
                           train_generator=train_gen,
                           max_epochs=3)

    with raises(ValueError):
        train_gen = Generator1D(size=32, t_min=0.0, t_max=2.0, method='magic')
    print('ExampleGenerator test passed.')
예제 #11
0
def test_static_generator():
    size = 100
    generator = Generator1D(size)
    static_generator = StaticGenerator(generator)
    x1 = static_generator.get_examples()
    x2 = static_generator.get_examples()
    assert _check_shape_and_grad(generator, size)
    assert _check_shape_and_grad(static_generator, size, x1, x2)
    assert (x1 == x2).all()

    size = 100
    generator = GeneratorSpherical(size)
    static_generator = StaticGenerator(generator)
    r1, theta1, phi1 = static_generator.get_examples()
    r2, theta2, phi2 = static_generator.get_examples()
    assert _check_shape_and_grad(generator, size)
    assert _check_shape_and_grad(static_generator, size, r1, theta1, phi1, r2, theta2, phi2)
    assert (r1 == r2).all() and (theta1 == theta2).all() and (phi1 == phi2).all()
예제 #12
0
def test_mesh_generator():
    size = 10
    x_min, x_max = 0.0, 1.0
    y_min, y_max = 1.0, 2.0
    z_min, z_max = 2.0, 3.0

    generator1 = Generator1D(size)
    mesh_generator = MeshGenerator(generator1)
    x = mesh_generator.get_examples()
    assert _check_shape_and_grad(mesh_generator, size, x)

    mesh_generator = MeshGenerator(generator1, generator1, generator1)
    m1, m2, m3 = mesh_generator.get_examples()
    assert _check_shape_and_grad(mesh_generator, (size**3), m1, m2, m3)

    generator1x = Generator1D(size, x_min, x_max, method="equally-spaced")
    generator1y = Generator1D(size, y_min, y_max, method="equally-spaced")
    generator1z = Generator1D(size, z_min, z_max, method="equally-spaced")
    generator3 = Generator3D((size, size, size), (x_min, y_min, z_min),
                             (x_max, y_max, z_max),
                             method="equally-spaced")
    mesh_generator = MeshGenerator(generator1x, generator1y, generator1z)
    m1, m2, m3 = mesh_generator.get_examples()
    g1, g2, g3 = generator3.get_examples()
    assert _check_shape_and_grad(mesh_generator, (size**3), m1, m2, m3)
    assert _check_iterable_equal(g1, m1)
    assert _check_iterable_equal(g2, m2)
    assert _check_iterable_equal(g3, m3)

    generator1x = Generator1D(size, x_min, x_max, method="equally-spaced")
    generator1y = Generator1D(size, y_min, y_max, method="equally-spaced")
    generator1z = Generator1D(size, z_min, z_max, method="equally-spaced")
    generator3 = Generator3D((size, size, size), (x_min, y_min, z_min),
                             (x_max, y_max, z_max),
                             method="equally-spaced")
    xor_generator = generator1x ^ generator1y ^ generator1z
    m1, m2, m3 = xor_generator.get_examples()
    g1, g2, g3 = generator3.get_examples()
    assert _check_shape_and_grad(xor_generator, (size**3), m1, m2, m3)
    assert _check_iterable_equal(g1, m1)
    assert _check_iterable_equal(g2, m2)
    assert _check_iterable_equal(g3, m3)

    str(mesh_generator)
    repr(mesh_generator)
예제 #13
0
def test_generator1d():
    size = 32
    generator = Generator1D(size=size, t_min=0.0, t_max=2.0, method='uniform')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.0,
                            t_max=2.0,
                            method='equally-spaced')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.0,
                            t_max=2.0,
                            method='equally-spaced-noisy')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='log-spaced')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='log-spaced-noisy')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='log-spaced-noisy',
                            noise_std=0.01)
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='chebyshev')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='chebyshev1')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    generator = Generator1D(size=size,
                            t_min=0.1,
                            t_max=2.0,
                            method='chebyshev2')
    x = generator.getter()
    assert _check_shape_and_grad(generator, size, x)

    with raises(ValueError):
        generator = Generator1D(size=size,
                                t_min=0.0,
                                t_max=2.0,
                                method='magic')

    str(generator)
    repr(generator)