Exemple #1
0
    def upsample2(Sl, Ql):  #pm has the same resolution as Ql

        layout = add(Ql, 1)
        print(id(Model.get_model(layout)), len(Model.get_model(layout)))
        Ql1 = add(Ql, layout)
        print(id(Model.get_model(layout)), id(Model.get_model(Ql1)), len(Model.get_model(layout)))
        Sl1 = add(Sl, layout)
        print(id(Model.get_model(layout)), id(Model.get_model(Ql1)), len(Model.get_model(layout)))

        dis_d = add(Ql1, Sl1)
        print(id(Model.get_model(layout)), id(Model.get_model(Ql1)), len(Model.get_model(layout)))

        return dis_d
Exemple #2
0
 def model(self, x):
     layout = fastpm.decompose(x, pm=self.pm)
     x1 = fastpm.exchange(x, layout)
     y1 = fastpm.paint(x1, mass=1.0, layout=None, pm=self.pm)
     y = linalg.add(y1,
                    self.mesh)  # biasing a bit to get non-zero derivatives.
     return y
Exemple #3
0
def test_operator_watchpoint():
    from vmad.core.stdlib import watchpoint
    foo = [0]
    def monitor(x):
        foo[0] = 1

    with Builder() as m:
        a = m.input('a')
        b = linalg.add(a, a)
        watchpoint(a, monitor=monitor)
        m.output(c=b)

    init = [('a', 1)]
#    for node in m:
#        print('m', node)
    c, tape = m.compute(init=init, vout='c', return_tape=True)
#    vjp = tape.get_vjp()
#    for node in vjp:
#        print('vjp', node)

    [c], [_a] = m.compute_with_vjp(init=init, v=[('_c', 1.0)])
    assert foo[0] == 1
    assert c == 2
    assert _a == 2.0

    foo[0] = 0
    c, c_ = m.compute_with_jvp(vout='c', init=init, v=[('a_', 1.0)])
    assert foo[0] == 1
    assert c == 2
    assert c_ == 2.0
Exemple #4
0
def test_model_partial_out():
    with Builder() as m:
        a = m.input('a')
        t1 = add(x1=a, x2=a)
        m.output(c=t1)
        m.output(a=a)

    init = dict(a=3)

    (a, c), tape = m.compute(init=init, vout=['a', 'c'], return_tape=True)
    assert c == 6
    assert a == 3

    vjp = tape.get_vjp()

    # test two outputs individually
    init = dict(_c=1.0, _a=0.0)
    _a = vjp.compute(init=init, vout='_a', monitor=print)
    assert _a == 2.0

    init = dict(_c=0.0, _a=1.0)
    _a = vjp.compute(init=init, vout='_a', monitor=print)
    assert _a == 1.0

    jvp = tape.get_jvp()
    init = dict(a_=1.0)
    a_, c_ = jvp.compute(init=init, vout=['a_', 'c_'], monitor=print)
    assert c_ == 2.0
    assert a_ == 1.0
Exemple #5
0
def test_vmad3_functional():
    """ this test demonstrates building a model directly """
    with Builder() as m:
        a, b = m.input('a', 'b')

        t1 = add(a, a)
        t2 = add(b, 0)
        c = add(t1, t2)

        m.output(c=c)

    print("----- model -----")
    pprint(m)
    pprint(m[:])

    print("----- compute -----")
    init = dict(a=3, b=4)

    c = m.compute(init=init, vout='c')
    print(init, c)

    print("----- tape -----")
    init = dict(a=3, b=4)
    c, tape = m.compute(init=init, vout='c', return_tape=True)
    print(init, c)
    pprint(tape)

    print("----- vjp -----")
    vjp = tape.get_vjp()
    pprint(vjp)
    pprint(vjp[:])

    init = dict(_c=1.0)
    _a, _b = vjp.compute(init=init, vout=['_a', '_b'], monitor=print)
    print('_a, _b = ', _a, _b)

    print("----- jvp -----")
    jvp = tape.get_jvp()
    pprint(jvp)
    pprint(jvp[:])

    init = dict(a_=1.0, b_=1.0)
    c_, = jvp.compute(init=init, vout=['c_'], monitor=print)
    print('c_ = ', c_)
Exemple #6
0
def test_model_compute_with_jvp():
    with Builder() as m:
        a = m.input('a')
        t1 = add(x1=a, x2=a)
        m.output(b=t1)

    init = [('a', 1)]
    b, b_ = m.compute_with_jvp(vout='b', init=init, v=[('a_', 1.0)])
    assert b == 2.0
    assert b_ == 2.0
Exemple #7
0
def test_model_compute_with_vjp():
    with Builder() as m:
        a = m.input('a')
        t1 = add(x1=a, x2=a)
        m.output(b=t1)

    init = [('a', 1)]
    [b], [_a] = m.compute_with_vjp(init=init, v=[('_b', 1.0)])
    assert b == 2.0
    assert _a == 2.0
Exemple #8
0
def test_model_attr():
    import numpy
    with Builder() as m:
        a, b = m.input('a', 'b')
        d = add(x1=b, x2=1)
        t1 = add(x1=a, x2=b.eval(lambda b: b.size))
        m.output(c=t1)

    init = dict(a=2, b=numpy.array([2,]))

    c, tape = m.compute(init=init, vout='c', return_tape=True)
    assert c == 3

    vjp = tape.get_vjp()
    init = dict(_c=1.0)
    _a = vjp.compute(init=init, vout='_a', monitor=print)
    assert _a == 1.0

    jvp = tape.get_jvp()
    init = dict(a_=1.0)
    c_ = jvp.compute(init=init, vout='c_', monitor=print)
    assert c_ == 1.0
Exemple #9
0
    def __init__(self, comm, forward_operator, residuals, vectorspace=None):
        self.residuals = residuals
        self.forward_operator = forward_operator
        self.comm = comm

        if vectorspace is None:
            vectorspace = MPIVectorSpace(comm)

        with Builder() as m:
            x = m.input('x')
            y = 0
            fx = forward_operator(x)
            # fixme: need a way to directly include a subgraphs
            # rather than building it again.
            for operator in self.residuals:
                r = operator(*fx)
                chi2 = MPIChiSquareOperator(r, comm)
                y = linalg.add(y, chi2)
            m.output(y=y)

        def objective(x):
            return m.compute(vout='y', init=dict(x=x))

        def gradient(x):
            y, [vjp] = m.compute_with_vjp(init=dict(x=x), v=dict(_y=1.0))
            return vjp

        def hessian_vector_product(x, v):
            Dv = 0

            replay = forward_operator.precompute(x=x)

            for operator in self.residuals:
                with Builder() as m:
                    xx = m.input('x')
                    fx = replay(xx)
                    r = operator(*fx)
                    m.output(y=r)

                y, [Dv1] = m.compute_with_gnDp(vout='y',
                                               init=dict(x=x),
                                               v=dict(x_=v))
                Dv = Dv + Dv1
            # H is 2 JtJ, see wikipedia on Gauss Newton.
            return Dv * 2

        BaseProblem.__init__(self,
                             vs=vectorspace,
                             objective=objective,
                             gradient=gradient,
                             hessian_vector_product=hessian_vector_product)
    def interp(self, dx, p, kmaps, dx_PGD, ax, ap, ai, af):

        di, df = self.cosmo.comoving_distance(
            1. / numpy.array([ai, af], dtype=float) - 1.)

        for M in self.imgen.generate(di, df):
            # if lower end of box further away than source -> do nothing
            if df > self.max_ds:
                continue
            else:
                M, boxshift = M

                # positions of unevolved particles after rotation
                d_approx = self.rotate.build(M=M, boxshift=boxshift).compute(
                    'd', init=dict(x=self.q))
                z_approx = z_chi.apl.impl(node=None,
                                          cosmo=self.cosmo,
                                          z_chi_int=self.z_chi_int,
                                          chi=d_approx)['z']
                a_approx = 1. / (z_approx + 1.)

                # move particles to a_approx, then add PGD correction

                dx1 = dx + p * self.DriftFactor(a_approx, ax,
                                                ap)[:, None] + dx_PGD

                # rotate their positions
                xy, d = self.rotate((dx1 + self.q) % self.pm.BoxSize, M,
                                    boxshift)

                # projection
                xy = ((xy - self.pm.BoxSize[:2] * 0.5) /
                      linalg.broadcast_to(linalg.reshape(d, (len(self.q), 1)),
                                          (len(self.q), 2)) +
                      self.mappm.BoxSize * 0.5)

                for ii, ds in enumerate(self.ds):
                    w = self.wlen(d, ds)
                    mask = stdlib.eval(
                        d,
                        lambda d, di=di, df=df, ds=ds, d_approx=d_approx: 1.0 *
                        (d_approx < di) * (d_approx >= df) * (d <= ds))
                    kmap = list_elem(kmaps, ii)
                    kmap_ = self.makemap(xy, w * mask) * self.factor
                    kmap = linalg.add(kmap_, kmap)
                    kmaps = list_put(kmaps, kmap, ii)

        return kmaps
Exemple #11
0
    def model(self, x):
        di, df = self.cosmo.comoving_distance(1. /
                                              numpy.array([self.ai, self.af]) -
                                              1.)
        kmap = lightcone.list_elem(self.kmaps, 0)
        for M in self.sim.imgen.generate(di, df):
            #if lower end of box further away than source -> do nothing
            if df > self.sim.max_ds:
                continue
            else:
                M, boxshift = M

                #positions of unevolved particles after rotation
                d_approx = self.sim.rotate.build(
                    M=M, boxshift=boxshift).compute('d', init=dict(x=self.q))
                z_approx = lightcone.z_chi.apl.impl(
                    node=None,
                    cosmo=self.cosmo,
                    z_chi_int=self.sim.z_chi_int,
                    chi=d_approx)['z']
                a_approx = 1. / (z_approx + 1.)

                #move particles to a_approx, then add PGD correction

                dx1 = x + self.p * self.DriftFactor(
                    a_approx, self.ac, self.ac)[:, None] + self.dx_PGD
                #rotate their positions
                xy, d = self.sim.rotate((dx1 + self.q) % self.pm.BoxSize, M,
                                        boxshift)

                #projection
                xy = (xy - self.pm.BoxSize[:2] * 0.5) / linalg.broadcast_to(
                    linalg.reshape(d, (np.prod(self.pm.Nmesh), 1)),
                    (np.prod(self.pm.Nmesh), 2)) + self.sim.mappm.BoxSize * 0.5

                for ii, ds in enumerate(self.sim.ds):
                    w = self.sim.wlen(d, ds)
                    mask = stdlib.eval(
                        d,
                        lambda d, di=di, df=df, ds=ds, d_approx=d_approx: 1.0 *
                        (d_approx < di) * (d_approx >= df) * (d <= ds))
                    #kmap     = lightcone.list_elem(self.kmaps,ii)
                    kmap_ = self.sim.makemap(xy, w * mask)
                    kmap = linalg.add(kmap_, kmap)
                    #self.kmaps = lightcone.list_put(self.kmaps,kmap,ii)
        #kmap_ = RealField(lightcone.list_elem(self.kmaps,0))
        return kmap
Exemple #12
0
def test_model_many_rewrites():
    # this is a nasty model with many variable rewrites.
    n = 2
    with Builder() as m:
        x = m.input('x')
        for i in range(2):
            x = add(x1=x, x2=x)

        m.output(y=x)

    init = dict(x=1.0)
    y, tape = m.compute(init=init, vout='y', return_tape=True)
    assert y == 4.0

    vjp = tape.get_vjp()
    init = dict(_y = 1.0)
    _x = vjp.compute(init=init, vout='_x', monitor=print)
    assert _x == 4.0
Exemple #13
0
def test_model_partial():
    with Builder() as m:
        a = m.input('a')
        t1 = add(x1=a, x2=a)
        m.output(c=t1)

    init = dict(a=3)

    c, tape = m.compute(init=init, vout='c', return_tape=True)
    assert c == 6

    vjp = tape.get_vjp()
    init = dict(_c=1.0)
    _a = vjp.compute(init=init, vout='_a', monitor=print)
    assert _a == 2.0

    jvp = tape.get_jvp()
    init = dict(a_=1.0)
    c_ = jvp.compute(init=init, vout='c_', monitor=print)
    assert c_ == 2.0
    def no_interp(self, kmaps, q, ai, af, jj):

        di, df = self.cosmo.comoving_distance(
            1. / numpy.array([ai, af], dtype=object) - 1.)

        #q      = np.random.random(self.q.shape)*self.pm.BoxSize[0]

        for M in self.imgen.generate(di, df):
            # if lower end of box further away than source -> do nothing
            if df > self.max_ds:
                if self.params['logging']:
                    self.logger.info('imgen passed, %d' % jj)
                continue
            else:
                if self.params['logging']:
                    self.logger.info('imgen with projection, %d' % jj)
                M, boxshift = M
                xy, d = self.rotate(q, M, boxshift)
                d_approx = self.rotate.build(M=M, boxshift=boxshift).compute(
                    'd', init=dict(x=q))

                xy = ((xy - self.pm.BoxSize[:2] * 0.5) /
                      linalg.broadcast_to(linalg.reshape(d, (len(self.q), 1)),
                                          (len(self.q), 2)) +
                      self.mappm.BoxSize * 0.5)

                for ii, ds in enumerate(self.ds):
                    if self.params['logging']:
                        self.logger.info('projection, %d' % jj)
                    w = self.wlen(d, ds)
                    mask = stdlib.eval(
                        d,
                        lambda d, di=di, df=df, ds=ds, d_approx=d_approx: 1.0 *
                        (d_approx < di) * (d_approx >= df) * (d <= ds))
                    kmap_ = self.makemap(xy, w * mask) * self.factor
                    kmap = list_elem(kmaps, ii)
                    kmap = linalg.add(kmap_, kmap)
                    kmaps = list_put(kmaps, kmap, ii)

        return kmaps
Exemple #15
0
 def model(self, x):
     c = linalg.pack_complex(x, x)
     r, i = linalg.unpack_complex(c)
     return linalg.add(r, i)
Exemple #16
0
 def model(self, x):
     return linalg.add(x, 5.0)
Exemple #17
0
 def model(self, x):
     return linalg.add(linalg.abs(x), x)
Exemple #18
0
 def main(self, x, n):
     for i in range(n):
         x = add(x1=x, x2=x)
     return dict(y=x)
Exemple #19
0
def example_func(x, n):
    for i in range(n):
        x = add(x1=x, x2=x)
    return dict(y=x)
Exemple #20
0
        def main(model, a, b, n):
            for i in range(n):
                a = add(a, a)

            t2 = add(b, 0)
            return dict(c=add(a, t2))
Exemple #21
0
 def model(self, x):
     layout = fastpm.decompose(x, pm=self.pm)
     y = fastpm.paint(x, layout=layout, mass=1.0, pm=self.pm)
     y = linalg.add(y,
                    self.mesh)  # biasing a bit to get non-zero derivatives.
     return y
Exemple #22
0
 def model(self, x):
     dx1, dx2 = fastpm.lpt(fastpm.r2c(x), q=self.pos, pm=self.pm)
     return linalg.add(dx1, dx2)