def test_adjoint():

    solver = kode.Solver()
    primal_step = solver.primal_step
    adjoint_step = solver.adjoint_step
    s0 = solver.s0
    state_dim = solver.state_dim
    u0 = primal_step(solver.u_init,s0,100)
    epsi = 1.e-4

    y1 = array([0.0,1.,0.,0.])
    y0_ana = adjoint_step(y1,u0,s0,y1)

    y0_fd = zeros(state_dim)
    v0 = zeros(state_dim)
    for i in arange(state_dim):
        v0 = zeros(state_dim)
        v0[i] = 1.0
        u0pert = u0 + epsi*v0
        u1pert =  primal_step(u0pert,s0,1)
        obj2 = u0pert[1] + u1pert[1]

        u0pert = u0 - epsi*v0
        u1pert =  primal_step(u0pert,s0,1)
        obj1 = u0pert[1] + u1pert[1]

        y0_fd[i] = (obj2 - obj1)/(2.0*epsi) 
    assert(norm(y0_fd-y0_ana) < 1.e-8)
def test_DfDs():
    solver = kode.Solver()
    state_dim = solver.state_dim
    param_dim = solver.param_dim
    u0 = solver.u_init
    dt = solver.dt
    primal_step = solver.primal_step
    DfDs = solver.DfDs
    s0 = solver.s0
    n_epsi = 10
    param_dim = s0.size
    epsi = logspace(-n_epsi,-1.0,n_epsi)
    dfds_fd = zeros((n_epsi,param_dim,state_dim))
    dfds_ana = zeros((param_dim,state_dim))
    for i in range(param_dim):
        for k in range(n_epsi):
            splus = copy(s0)
            splus[i] += epsi[k]
            sminus = copy(s0)
            sminus[i] -= epsi[k]

            dfds_fd[k,i] = (primal_step(u0,splus,1) - 
                            primal_step(u0,sminus,1))/(2.0*epsi[k])/dt
    err_dfds = zeros(n_epsi)
    dfds_ana = DfDs(u0,s0)
    for k in range(n_epsi):
        err_dfds[k] = norm(dfds_fd[k]-dfds_ana)
    figure()
    loglog(epsi,err_dfds, 'o-')
    savefig('err_dfds')

    assert(min(err_dfds) < 1.e-8)
def test_jacobian():
    solver = kode.Solver()
    state_dim = solver.state_dim
    T = solver.T
    dt = solver.dt
    primal_step = solver.primal_step
    tangent_step = solver.tangent_step
    gradfs = solver.gradfs
    s0 = solver.s0
    u0 = rand(state_dim)
    u0[3] *= T
    epsi = 1.e-4
    Jacu = zeros((state_dim,state_dim))
    Jacu[:,0] = ((primal_step(u0 + epsi*array([1.0,0.0,0.0,0.0]),s0,1) - 
                            primal_step(u0 - epsi*array([1.0,0.0,0.0,0.0]),s0,1))/
                            (2.0*epsi))

    Jacu[:,1] = ((primal_step(u0 + epsi*array([0.0,1.0,0.0,0.0]),s0,1) - 
                            primal_step(u0 - epsi*array([0.0,1.0,0.0,0.0]),s0,1))/
                            (2.0*epsi))

    Jacu[:,2] = ((primal_step(u0 + epsi*array([0.0,0.0,1.0,0.0]),s0,1) - 
                            primal_step(u0 - epsi*array([0.0,0.0,1.0,0.0]),s0,1))/
                            (2.0*epsi))

    Jacu[:,3] = ((primal_step(u0 + epsi*array([0.0,0.0,0.0,1.0]),s0,1) - 
                            primal_step(u0 - epsi*array([0.0,0.0,0.0,1.0]),s0,1))/
                            (2.0*epsi))

    dFds1 = (primal_step(u0,s0 + epsi*array([1.0,0.0]),1)-primal_step(u0,s0
                    - epsi*array([1.0,0.0]),1))/(2.0*epsi)        


    dFds2 = (primal_step(u0,s0 + epsi*array([0.0,1.0]),1)-primal_step(u0,s0
                    - epsi*array([0.0,1.0]),1))/(2.0*epsi)        

    Jacana = dt*gradfs(u0,s0) + eye(state_dim,state_dim)
    assert(norm(Jacu-Jacana) < 1.e-5)
        
    v0 = rand(4)
    v0_fd = dot(Jacu,v0) 
    v0_hand = tangent_step(v0,u0,s0,zeros(2))
    assert(norm(v0_fd - v0_hand) < 1.e-6)


    v1_fd = v0_fd + dFds1 
    v1_hand = tangent_step(v0,u0,s0,[1.0,0.0])
    assert(norm(v1_fd - v1_hand) < 1.e-6)

    v2_fd = v0_fd + dFds2 
    v2_hand = tangent_step(v0,u0,s0,[0.0,1.0])
    assert(norm(v2_fd - v2_hand) < 1.e-6)
def visualize_tangent_stereographic(u, v, c1="black"):
    EPS = 1E-8
    u_plus, u_minus = u + v * EPS, u - v * EPS
    stereographic_projection = kode.Solver().stereographic_projection
    stereo_real, stereo_imag = stereographic_projection(u.T)
    stereo_real_plus, stereo_imag_plus = stereographic_projection(u_plus.T)
    stereo_real_minus, stereo_imag_minus = stereographic_projection(u_minus.T)
    stereo_real_plus = extrapolate(stereo_real, stereo_real_plus, 1E6)
    stereo_real_minus = extrapolate(stereo_real, stereo_real_minus, 1E6)
    stereo_imag_plus = extrapolate(stereo_imag, stereo_imag_plus, 1E6)
    stereo_imag_minus = extrapolate(stereo_imag, stereo_imag_minus, 1E6)
    plot([stereo_real_plus, stereo_real_minus],
         [stereo_imag_plus, stereo_imag_minus], color=c1, ms=10)
def test_tangent():

        n_testpoints = 1
        n_epsi = 8
        solver = kode.Solver()
        s0 = solver.s0
        state_dim = solver.state_dim 
        param_dim = s0.size
        n_poincare = solver.n_poincare
        u0 = rand(n_testpoints,state_dim)
        epsi = logspace(-n_epsi,-1.0,n_epsi)
        vu_fd = zeros((n_epsi,n_testpoints,state_dim))
        vs_fd = zeros((n_epsi,n_testpoints,state_dim))
        vu_ana = zeros((n_testpoints,state_dim))
        vs_ana = zeros((n_testpoints,state_dim))
        v0 = rand(state_dim)
        ds0 = array([1.,1.])
        primal_step = solver.primal_step
        tangent_step = solver.tangent_step
        for i in arange(n_testpoints):
            u0[i] = primal_step(solver.u_init,s0,int(200*\
                    rand()))        
            for k in arange(n_epsi):                
                vu_fd[k,i] = (primal_step(u0[i] + epsi[k]*v0,
                            s0,1)-\
                            primal_step(u0[i] - epsi[k]*v0,s0,1)\
                            )/(2.0*epsi[k]) 

                vs_fd[k,i] = (primal_step(u0[i],s0 + epsi[k]*ds0,1) - 
                            primal_step(u0[i],s0 - epsi[k]*ds0,1)) \
                                    /(2.0*epsi[k]) 

            #vu_ana[i] = solver.dt*dot(solver.gradfs(u0[i],s0),v0) 
            vu_ana[i] = tangent_step(v0,u0[i],s0,zeros(param_dim))
            vs_ana[i] = tangent_step(zeros(state_dim),u0[i],s0,ds0)

        erru = zeros(n_epsi)
        errs = zeros(n_epsi)

        for k in arange(n_epsi):
                erru[k] = norm(vu_ana-vu_fd[k])
                errs[k] = norm(vs_ana-vs_fd[k])

        figure()
        loglog(epsi,erru, 'o-')
        savefig('erru')
        figure()
        loglog(epsi,errs, 'o-')
        savefig('errs')
        assert(min(erru) < 1.e-5)
        assert(min(errs) < 1.e-5)
def test_tangentadjoint():
    solver = kode.Solver()
    tangent_step = solver.tangent_step
    adjoint_step = solver.adjoint_step
    state_dim = solver.state_dim
    param_dim = solver.param_dim
    s0 = solver.s0
    T = solver.T
    u = solver.primal_step(solver.u_init,\
            s0,int(3000*rand()))

    y1 = rand(state_dim)
    v0 = rand(state_dim)
    v1 = tangent_step(v0,u,s0,zeros(param_dim))
    y0 = adjoint_step(y1,u,s0,zeros(state_dim))
    assert(abs(dot(v1,y1)-dot(v0,y0)) < 1.e-10)
def visualize_poincare_primal():
    solver_ode = kode.Solver()
    u_init = solver_ode.u_init
    n_map = solver_ode.n_poincare
    n_steps = 500*n_map
    s0 = solver_ode.s0
    sens_object = flow_sens.Sensitivity(solver_ode,n_steps)
    solve_primal = sens_object.solve_primal
    u_ode = solve_primal(solver_ode,\
            u_init,n_steps,s0)
    u_ode = u_ode[::n_map]
    stereo_real, stereo_imag = \
        solver_ode.stereographic_projection(u_ode.T)
    figure()
    plot(stereo_real, stereo_imag, '.')
    savefig('st_proj_poincare_attractor.png')
def visualize_unstable_direction():
    solver_ode = kode.Solver()
    u_init = solver_ode.u_init
    v_init = rand(u_init.size)
    v_init /= norm(v_init)
    n_map = solver_ode.n_poincare
    n_steps = 500*n_map
    s0 = solver_ode.s0
    sens_object = flow_sens.Sensitivity(solver_ode,n_steps)
    solve_primal = sens_object.solve_primal
    u_ode = solve_primal(solver_ode,\
            u_init,n_steps,s0)
    solve_unstable_direction = sens_object.\
            solve_unstable_direction
    v = solve_unstable_direction(solver_ode,\
        u_ode, v_init,n_steps,\
        s0)
    visualize_tangent_2D(u_ode[::n_map],\
            v[::n_map])
def test_divGradfs():

    n_samples = 100
    n_epsi = 10
    epsi = logspace(-n_epsi,-1,n_epsi)
    solver = kode.Solver()
    state_dim = solver.state_dim
    s0 = solver.s0
    gradfs = solver.gradfs
    primal_step = solver.primal_step
    divGradfs = solver.divGradfs
    u0 = zeros((n_samples,state_dim))
    dgf_hand = zeros((n_samples,state_dim))
    dgf_fd = zeros((n_epsi,n_samples,state_dim))
    tmp_matrix = zeros((state_dim,state_dim))
    for i in range(n_samples):
        u0[i] = primal_step(solver.u_init,\
                s0,int(10*n_samples*rand()))
        dgf_hand[i] = divGradfs(u0[i],s0) 
        for k in range(n_epsi):
            for j in range(state_dim):
                v0 = zeros(state_dim)
                v0[j] = 1.0
                tmp_matrix = (gradfs(u0[i]+epsi[k]*v0,s0) -
                              gradfs(u0[i]-epsi[k]*v0,s0))/(2.0*epsi[k])
                dgf_fd[k,i] += tmp_matrix[j]
        
    err = zeros(n_epsi)
    for k in range(n_epsi):
        err[k] = norm(dgf_hand-dgf_fd[k]) 
    figure()
    loglog(epsi,err,'o-')
    ylabel(r'$|| \nabla\cdot(\nabla f_s) -\nabla\cdot(\nabla f_s)_\epsilon^{\rm FD}||$')
    xlabel(r'$\epsilon$')
    savefig('err_divGradfs')

    assert(min(err)<1.e-8)
def test_step_primal():
    holes = array([1./sqrt(2.),0,1./sqrt(2.0),\
                   -1./sqrt(2.),0,1./sqrt(2.0), \
                    1./sqrt(2.),0,-1./sqrt(2.0), \
                    -1./sqrt(2.),0,-1./sqrt(2.0)]) 
    holes = holes.reshape(4,3)
    solver_ode = kode.Solver()
    flag = 1
    u_init = solver_ode.u_init
    T = solver_ode.T
    dt = solver_ode.dt
    fac = 100
    n_steps = fac*int(T/dt)
    s0 = solver_ode.s0
    primal_step = solver_ode.primal_step
    sens_object = flow_sens.Sensitivity(solver_ode,n_steps)
    u_init = primal_step(u_init,s0,sens_object.n_runup)
    solve_primal = sens_object.solve_primal
    u = solve_primal(solver_ode,u_init,n_steps,s0)
    for i in range(1,n_steps):
        if(dot((u[i,:3]-u[i-1,:3])/dt,u[i-1,:3])>1.e-8):
            break
    assert(i==n_steps-1)
            
    u = u[::int(T/dt)]
    
    epsi = 1.e-1
    for i in range(1,fac):
        if(not(flag)):
            break
        for j in range(holes.shape[0]):
            if(norm(u[i,:3]-holes[j])<epsi):
                flag = 0
            if(norm(u[i,:3])>1.0 + epsi):
                flag = 0
    assert(i==fac-1)
import sys
sys.path.insert(0, '../examples/')
import kuznetsov_poincare as kmap
import kuznetsov as kode
import map_sens as map_sens
import flow_sens as flow_sens
from time import clock
if __name__ == "__main__":
    solver_ode = kode.Solver()
    solver_map = kmap.Solver()
    n_map = solver_ode.n_poincare
    n_steps_map = 50
    n_steps = n_map * n_steps_map
    plykin = flow_sens.Sensitivity(solver_ode, n_steps)
    t0 = clock()
    u_ode = plykin.solve_primal(solver_ode,solver_ode.u_init,\
            n_steps,
            solver_ode.s0)
    t1 = clock()
    print('{:<60s}{:>16.10f}'.format(\
            "Time to solve primal: ",\
        t1-t0))

    t2 = clock()
    plykin.precompute_sources(solver_ode, u_ode)
    t3 = clock()
    print('{:<60s}{:>16.10f}'.format(\
            "Time for flow precomputations: ",\
        t3-t2))

    poincare_plykin = map_sens.Sensitivity(solver_map, n_steps_map)