Example #1
0
    def test_first_derivatives_oscpart(self):
        # different value of w
        Omega = self.Omega4
        w = [-0.37704918-0.18456279j, 0.63934426+0.42591413j,
             0.54918033+0.09937996j, -0.21721311-0.07808426j]
        value_z1 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[1,0,0,0]])
        value_z2 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,1,0,0]])
        value_z3 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,0,1,0]])
        value_z4 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,0,0,1]])

        maple_z1 = 1.723280564 + 1.281445835j
        maple_z2 = -1.507523639 + 2.909483373j
        maple_z3 = 4.114046968 + 1.817899948j
        maple_z4 = -3.116133948 - 1.273742661j

        error_z1 = abs(value_z1 - maple_z1)
        error_z2 = abs(value_z2 - maple_z2)
        error_z3 = abs(value_z3 - maple_z3)
        error_z4 = abs(value_z4 - maple_z4)

        self.assertLess(error_z1, 1e-8)
        self.assertLess(error_z2, 1e-8)
        self.assertLess(error_z3, 1e-8)
        self.assertLess(error_z4, 1e-8)
Example #2
0
    def test_sixth_derivatives(self):
        w = [0.2+0.5j, 0.3-0.1j, -0.1+0.2j]
        Omega = self.Omega3
        
        dVec_1 = [[1,0,0],[1,0,0],[0,1,0],[0,0,1],[0,0,1],[0,1,0]]
        dVec_2 = [[1,2,3],[4,5,6],[0.7,0.8,0.9],[0.8,0.7,0.6],[5,4,3],[2,1,0]]
        #dVec_3 = [[-17.3, 6.2, 0],[3.4, 3, 1],[-9,-0.001, 2], 
        #        [1e-2, 0, 19],[210, 0.5, 1.2],[31.323, 0.3, 3]]
        #dVec_4 = [[1,2,3],[4,5,6],[7,8,9],[8,7,6],[5,4,3],[2,1,0]]
        # Neither of the above two examples pass the tests. It appears
        # that for higher order derivatives, if the norm of the directional
        # derivative is too large  

        maple_1 = 42.73836471691125 + 235.2990585642670j
        maple_2 = 0.2152838084588008*10**7 - 0.3287239590246880*10**7*1j
        #maple_3 = 0.2232644817692030*10**12 - 0.1226563725159786*10**12*1j
        #maple_4 = 0.2152838084588008*10**9 - 0.3287239590246880*10**9*1j

        deriv_1 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_2)
        #deriv_3 = RiemannTheta.oscillatory_part(w, Omega, 
        #        epsilon=1e-14, derivs=dVec_3)
        #deriv_4 = RiemannTheta.oscillatory_part(w, Omega, 
        #        epsilon=1e-14, derivs=dVec_4)

        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        #error_3 = abs(deriv_3 - maple_3)
        #error_4 = abs(deriv_4 - maple_4)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
Example #3
0
    def test_against_sympy_jtheta(self):
        N = 64
        sigma = 2
        z = sigma * randn(N) + 1.j * sigma * randn(N)
        z = z.reshape((N, 1))
        tau = [[1.0j]]

        # jtheta inputs
        w = numpy.pi * z[:, 0]
        q = numpy.exp(numpy.pi * 1.0j * tau[0][0])

        values1 = RiemannTheta(z, tau, epsilon=1e-16)
        values2 = numpy.array([jtheta(3, wi, q) for wi in w],
                              dtype=numpy.complex)

        rel_error = abs((values1 - values2) / values1)
        rel_error_avg = numpy.mean(rel_error)
        self.assertLess(rel_error_avg, 1e-14)

        # repeat for different tau
        tau = [[1.0 + 2.5j]]
        q = numpy.exp(numpy.pi * 1.0j * tau[0][0])

        values1 = RiemannTheta(z, tau, epsilon=1e-16)
        values2 = numpy.array([jtheta(3, wi, q) for wi in w],
                              dtype=numpy.complex)

        rel_error = abs((values1 - values2) / values1)
        rel_error_avg = numpy.mean(rel_error)
        self.assertLess(rel_error_avg, 1e-14)
Example #4
0
    def test_value(self):
        z = [0, 0, 0]
        Omega = self.Omega3

        value = RiemannTheta(z, Omega, epsilon=1e-14)
        maple = 1.2362529854204190 - 0.52099320642367818e-10j
        error = abs(value - maple)
        self.assertLess(error, 1e-8)

        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        value = RiemannTheta(w, Omega, epsilon=1e-14)
        maple = 1.2544694041047501 - 0.77493173321770725j
        error = abs(value - maple)
        self.assertLess(error, 1e-8)
Example #5
0
    def test_second_derivatives_oscpart(self):
        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        Omega = self.Omega3

        H = RiemannTheta.oscillatory_part_hessian(w, Omega, epsilon=1e-14)

        maple_00 = -2.160656081990225 + 14.02434682346524j
        maple_01 = -1.483857302597929 - 0.9449250397349686j
        maple_02 = 1.954110529051029 - 1.042434632145520j
        maple_11 = 1.037397682580653 + 0.1077503940181105j
        maple_12 = 0.09466454944980265 - 0.3593388338083318j
        maple_22 = -0.3227275082474401 - 2.585609638196203j

        error_00 = abs(H[0, 0] - maple_00)
        error_01 = abs(H[0, 1] - maple_01)
        error_02 = abs(H[0, 2] - maple_02)
        error_11 = abs(H[1, 1] - maple_11)
        error_12 = abs(H[1, 2] - maple_12)
        error_22 = abs(H[2, 2] - maple_22)

        self.assertLess(error_00, 1e-8)
        self.assertLess(error_01, 1e-8)
        self.assertLess(error_02, 1e-8)
        self.assertLess(error_11, 1e-8)
        self.assertLess(error_12, 1e-8)
        self.assertLess(error_22, 1e-8)
Example #6
0
    def test_second_derivatives_oscpart(self):
        w = [0.2+0.5j, 0.3-0.1j, -0.1+0.2j]
        Omega = self.Omega3

        H = RiemannTheta.oscillatory_part_hessian(w, Omega, epsilon=1e-14)

        maple_00 = -2.160656081990225 + 14.02434682346524j
        maple_01 = -1.483857302597929 - 0.9449250397349686j
        maple_02 = 1.954110529051029 - 1.042434632145520j
        maple_11 = 1.037397682580653 + 0.1077503940181105j
        maple_12 = 0.09466454944980265 - 0.3593388338083318j
        maple_22 = -0.3227275082474401 - 2.585609638196203j

        error_00 = abs(H[0,0] - maple_00)
        error_01 = abs(H[0,1] - maple_01)
        error_02 = abs(H[0,2] - maple_02)
        error_11 = abs(H[1,1] - maple_11)
        error_12 = abs(H[1,2] - maple_12)
        error_22 = abs(H[2,2] - maple_22)

        self.assertLess(error_00, 1e-8)
        self.assertLess(error_01, 1e-8)
        self.assertLess(error_02, 1e-8)
        self.assertLess(error_11, 1e-8)
        self.assertLess(error_12, 1e-8)
        self.assertLess(error_22, 1e-8)
Example #7
0
    def test_issue159(self):
        Omega = [[10j]]
        z = [5j]

        theta_actual = 2
        theta = RiemannTheta(z, Omega)
        error = abs(theta - theta_actual)
        self.assertLess(error, 1e-8)
Example #8
0
    def test_against_naive_implementation_genus1(self):
        # tests the genus 1 Riemann theta function against the naive
        # implementation written above (directly using the summation formula).

        # first test the relative error using values close to the origin,
        # avoiding the double-exponential growth
        N = 64
        sigma = 0.1
        z = sigma * randn(N) + 1.j * sigma * randn(N)
        z = z.reshape((N, 1))
        tau = [[1.0j]]

        values1 = RiemannTheta(z, tau, epsilon=1e-16)
        values2 = thetag1(z, tau[0][0])[:, 0]

        rel_error = abs((values1 - values2) / values1)
        rel_error_max = numpy.max(rel_error)
        rel_error_avg = numpy.mean(rel_error)
        self.assertLess(rel_error_max, 1e-14)
        self.assertLess(rel_error_avg, 1e-14)

        # next, test the relative error using larger magnitude values. we don't
        # test the max error due to possible numerical roundoff issues
        sigma = 3
        z = sigma * randn(N) + 1.j * sigma * randn(N)
        z = z.reshape((N, 1))
        tau = [[1.0j]]

        values1 = RiemannTheta(z, tau, epsilon=1e-16)
        values2 = thetag1(z, tau[0][0])[:, 0]

        rel_error = abs((values1 - values2) / values1)
        rel_error_avg = numpy.mean(rel_error)
        self.assertLess(rel_error_avg, 1e-14)

        # repeat for different tau
        tau = [[1.0 + 2.5j]]

        values1 = RiemannTheta(z, tau, epsilon=1e-16)
        values2 = thetag1(z, tau[0][0])[:, 0]

        rel_error = abs((values1 - values2) / values1)
        rel_error_avg = numpy.mean(rel_error)
        self.assertLess(rel_error_avg, 1e-14)
Example #9
0
    def test_gradient(self):
        Omega = self.Omega3

        # generate random test z-values
        N = 32
        u = numpy.random.rand(N,3)
        v = numpy.random.rand(N,3)
        W = u + 1.0j*v

        # manually compute gradients
        dz0 = RiemannTheta(W,Omega,derivs=[[1,0,0]])
        dz1 = RiemannTheta(W,Omega,derivs=[[0,1,0]])
        dz2 = RiemannTheta(W,Omega,derivs=[[0,0,1]])
        grad1 = numpy.zeros_like(W, dtype=numpy.complex)
        grad1[:,0] = dz0
        grad1[:,1] = dz1
        grad1[:,2] = dz2

        # compute using "gradient"
        grad2 = RiemannTheta.gradient(W,Omega)
        self.assertLess(numpy.linalg.norm(grad1-grad2), 1e-14)

        Omega = self.Omega4

        # generate random test z-values
        N = 32
        u = numpy.random.rand(N,4)
        v = numpy.random.rand(N,4)
        W = u + 1.0j*v

        # manually compute gradients
        dz0 = RiemannTheta(W,Omega,derivs=[[1,0,0,0]])
        dz1 = RiemannTheta(W,Omega,derivs=[[0,1,0,0]])
        dz2 = RiemannTheta(W,Omega,derivs=[[0,0,1,0]])
        dz3 = RiemannTheta(W,Omega,derivs=[[0,0,0,1]])
        grad1 = numpy.zeros_like(W, dtype=numpy.complex)
        grad1[:,0] = dz0
        grad1[:,1] = dz1
        grad1[:,2] = dz2
        grad1[:,3] = dz3

        # compute using "gradient"
        grad2 = RiemannTheta.gradient(W,Omega)
        self.assertLess(numpy.linalg.norm(grad1-grad2), 1e-14)
Example #10
0
    def test_issue84_value(self):
        z = [0.5 - 1.10093687j, -0.11723434j]
        Omega = [[0.5 + 2j, 0.5 + 1j], [0.5 + 1j, 1 + 1.5j]]

        theta_actual = 0.963179246467 - 6.2286820685j
        for _ in range(1000):
            theta = RiemannTheta(z, Omega)
            error = abs(theta - theta_actual)
            self.assertLess(
                error, 1e-5, '%s not less than %s'
                '\ntheta:  %s\nactual: %s' %
                (error, 1e-5, theta, theta_actual))
Example #11
0
    def test_sixth_derivatives(self):
        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        Omega = self.Omega3

        dVec_1 = [[1, 0, 0], [1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1],
                  [0, 1, 0]]
        dVec_2 = [[1, 2, 3], [4, 5, 6], [0.7, 0.8, 0.9], [0.8, 0.7, 0.6],
                  [5, 4, 3], [2, 1, 0]]
        #dVec_3 = [[-17.3, 6.2, 0],[3.4, 3, 1],[-9,-0.001, 2],
        #        [1e-2, 0, 19],[210, 0.5, 1.2],[31.323, 0.3, 3]]
        #dVec_4 = [[1,2,3],[4,5,6],[7,8,9],[8,7,6],[5,4,3],[2,1,0]]
        # Neither of the above two examples pass the tests. It appears
        # that for higher order derivatives, if the norm of the directional
        # derivative is too large

        maple_1 = 42.73836471691125 + 235.2990585642670j
        maple_2 = 0.2152838084588008 * 10**7 - 0.3287239590246880 * 10**7 * 1j
        #maple_3 = 0.2232644817692030*10**12 - 0.1226563725159786*10**12*1j
        #maple_4 = 0.2152838084588008*10**9 - 0.3287239590246880*10**9*1j

        deriv_1 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_2)
        #deriv_3 = RiemannTheta.oscillatory_part(w, Omega,
        #        epsilon=1e-14, derivs=dVec_3)
        #deriv_4 = RiemannTheta.oscillatory_part(w, Omega,
        #        epsilon=1e-14, derivs=dVec_4)

        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        #error_3 = abs(deriv_3 - maple_3)
        #error_4 = abs(deriv_4 - maple_4)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
Example #12
0
    def test_second_derivative_symmetric(self):
        w = [0.2+0.5j, 0.3-0.1j, -0.1+0.2j]
        Omega = [[1.j, 0.5, 0.5],
                 [0.5, 1.j, 0.5],
                 [0.5, 0.5, 1.j]]

        dz_01 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[1,0,0],[0,1,0]])
        dz_10 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,1,0],[1,0,0]])
        dz_02 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[1,0,0],[0,0,1]])
        dz_20 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,0,1],[1,0,0]])
        dz_12 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,1,0],[0,0,1]])
        dz_21 = RiemannTheta.oscillatory_part(
            w, Omega, epsilon=1e-14, derivs=[[0,0,1],[0,1,0]])

        error_01_10 = abs(dz_01 - dz_10)
        error_02_20 = abs(dz_02 - dz_20)
        error_12_21 = abs(dz_12 - dz_21)

        self.assertLess(error_01_10, 1e-8)
        self.assertLess(error_02_20, 1e-8)
        self.assertLess(error_12_21, 1e-8)
Example #13
0
    def test_gradient(self):
        Omega = self.Omega3

        # generate random test z-values
        N = 32
        u = numpy.random.rand(N, 3)
        v = numpy.random.rand(N, 3)
        W = u + 1.0j * v

        # manually compute gradients
        dz0 = RiemannTheta(W, Omega, derivs=[[1, 0, 0]])
        dz1 = RiemannTheta(W, Omega, derivs=[[0, 1, 0]])
        dz2 = RiemannTheta(W, Omega, derivs=[[0, 0, 1]])
        grad1 = numpy.zeros_like(W, dtype=numpy.complex)
        grad1[:, 0] = dz0
        grad1[:, 1] = dz1
        grad1[:, 2] = dz2

        # compute using "gradient"
        grad2 = RiemannTheta.gradient(W, Omega)
        self.assertLess(numpy.linalg.norm(grad1 - grad2), 1e-14)

        Omega = self.Omega4

        # generate random test z-values
        N = 32
        u = numpy.random.rand(N, 4)
        v = numpy.random.rand(N, 4)
        W = u + 1.0j * v

        # manually compute gradients
        dz0 = RiemannTheta(W, Omega, derivs=[[1, 0, 0, 0]])
        dz1 = RiemannTheta(W, Omega, derivs=[[0, 1, 0, 0]])
        dz2 = RiemannTheta(W, Omega, derivs=[[0, 0, 1, 0]])
        dz3 = RiemannTheta(W, Omega, derivs=[[0, 0, 0, 1]])
        grad1 = numpy.zeros_like(W, dtype=numpy.complex)
        grad1[:, 0] = dz0
        grad1[:, 1] = dz1
        grad1[:, 2] = dz2
        grad1[:, 3] = dz3

        # compute using "gradient"
        grad2 = RiemannTheta.gradient(W, Omega)
        self.assertLess(numpy.linalg.norm(grad1 - grad2), 1e-14)
Example #14
0
    def test_first_derivatives_oscpart(self):
        # different value of w
        Omega = self.Omega4
        w = [
            -0.37704918 - 0.18456279j, 0.63934426 + 0.42591413j,
            0.54918033 + 0.09937996j, -0.21721311 - 0.07808426j
        ]
        value_z1 = RiemannTheta.oscillatory_part(w,
                                                 Omega,
                                                 epsilon=1e-14,
                                                 derivs=[[1, 0, 0, 0]])
        value_z2 = RiemannTheta.oscillatory_part(w,
                                                 Omega,
                                                 epsilon=1e-14,
                                                 derivs=[[0, 1, 0, 0]])
        value_z3 = RiemannTheta.oscillatory_part(w,
                                                 Omega,
                                                 epsilon=1e-14,
                                                 derivs=[[0, 0, 1, 0]])
        value_z4 = RiemannTheta.oscillatory_part(w,
                                                 Omega,
                                                 epsilon=1e-14,
                                                 derivs=[[0, 0, 0, 1]])

        maple_z1 = 1.723280564 + 1.281445835j
        maple_z2 = -1.507523639 + 2.909483373j
        maple_z3 = 4.114046968 + 1.817899948j
        maple_z4 = -3.116133948 - 1.273742661j

        error_z1 = abs(value_z1 - maple_z1)
        error_z2 = abs(value_z2 - maple_z2)
        error_z3 = abs(value_z3 - maple_z3)
        error_z4 = abs(value_z4 - maple_z4)

        self.assertLess(error_z1, 1e-8)
        self.assertLess(error_z2, 1e-8)
        self.assertLess(error_z3, 1e-8)
        self.assertLess(error_z4, 1e-8)
Example #15
0
    def test_second_derivative_symmetric(self):
        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        Omega = [[1.j, 0.5, 0.5], [0.5, 1.j, 0.5], [0.5, 0.5, 1.j]]

        dz_01 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[1, 0, 0], [0, 1, 0]])
        dz_10 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[0, 1, 0], [1, 0, 0]])
        dz_02 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[1, 0, 0], [0, 0, 1]])
        dz_20 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[0, 0, 1], [1, 0, 0]])
        dz_12 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[0, 1, 0], [0, 0, 1]])
        dz_21 = RiemannTheta.oscillatory_part(w,
                                              Omega,
                                              epsilon=1e-14,
                                              derivs=[[0, 0, 1], [0, 1, 0]])

        error_01_10 = abs(dz_01 - dz_10)
        error_02_20 = abs(dz_02 - dz_20)
        error_12_21 = abs(dz_12 - dz_21)

        self.assertLess(error_01_10, 1e-8)
        self.assertLess(error_02_20, 1e-8)
        self.assertLess(error_12_21, 1e-8)
Example #16
0
    def test_third_derivatives_oscpart(self):
        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        Omega = self.Omega3

        dVec_1 = [[1, 0, 0], [1, 0, 0], [1, 0, 0]]
        dVec_2 = [[1, 0, 0], [0, 1, 0], [1, 0, 0]]
        dVec_3 = [[1, 0, 0], [0, 0, 1], [0, 1, 0]]
        dVec_4 = [[0, 1, 0], [0, 0, 1], [0, 1, 0]]
        dVec_5 = [[0, 0, 1], [0, 0, 1], [0, 0, 1]]
        dVec_6 = [[0, 0, 1], [0, 1, 0], [0, 0, 1]]
        dVec_7 = [[1, 2, 3.1], [2.9, -0.3, 1.0], [-20, 13.3, 0.6684]]

        maple_1 = 88.96174663331488 + 12.83401972101860j
        maple_2 = -5.963646070489819 + 9.261504506522976j
        maple_3 = -1.347499363888600 + 0.5297607158965981j
        maple_4 = 1.217499355198950 + 0.8449102496878512j
        maple_5 = -15.58299545726265 - 0.4376346712347114j
        maple_6 = -2.441570516715710 - 0.2535384980716853j
        maple_7 = -2791.345600876934 + 1286.207313664481j

        deriv_1 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_2)
        deriv_3 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_3)
        deriv_4 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_4)
        deriv_5 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_5)
        deriv_6 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_6)
        deriv_7 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_7)

        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        error_3 = abs(deriv_3 - maple_3)
        error_4 = abs(deriv_4 - maple_4)
        error_5 = abs(deriv_5 - maple_5)
        error_6 = abs(deriv_6 - maple_6)
        error_7 = abs(deriv_7 - maple_7)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
        self.assertLess(error_3, 1e-8)
        self.assertLess(error_4, 1e-8)
        self.assertLess(error_5, 1e-8)
        self.assertLess(error_6, 1e-8)
        self.assertLess(error_7, 1e-8)

        # Genus 4 example
        Omega = self.Omega4
        w = [
            -0.37704918 - 0.18456279j, 0.63934426 + 0.42591413j,
            0.54918033 + 0.09937996j, -0.21721311 - 0.07808426j
        ]

        dVec_1 = [[1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0]]
        dVec_2 = [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0]]
        dVec_3 = [[1, 0, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
        dVec_4 = [[1, 0, 0, 0], [0, 1, 1, 0], [1, 0, 0, 1]]
        dVec_5 = [[0, 0, 1, 0], [0, 1, 1, 0], [1, 0, 0, 1]]
        dVec_6 = [[0, 0, 1, 0], [1, 2, 3, 4], [1, 0, 0, 1]]
        dVec_7 = [[3.2, -9.8, 0.004, -13.9], [0, 2.4, 0, 4],
                  [90.1, -12.93947, -1e-4, 3]]

        maple_1 = -67.14022021800414 - 50.25487358123665j
        maple_2 = 6.220027066901749 - 16.96996479658767j
        maple_3 = 14.42498231220689 + 16.30518807929409j
        maple_4 = -35.67483045211793 - 18.14139876283777j
        maple_5 = 53.25640352451774 + 18.93871689387491j
        maple_6 = -185.6760275507559 - 93.99261766419004j
        maple_7 = 239954.2751344823 + 129975.3988999572j

        deriv_1 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_2)
        deriv_3 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_3)
        deriv_4 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_4)
        deriv_5 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_5)
        deriv_6 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_6)
        deriv_7 = RiemannTheta.oscillatory_part(w,
                                                Omega,
                                                epsilon=1e-14,
                                                derivs=dVec_7)

        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        error_3 = abs(deriv_3 - maple_3)
        error_4 = abs(deriv_4 - maple_4)
        error_5 = abs(deriv_5 - maple_5)
        error_6 = abs(deriv_6 - maple_6)
        error_7 = abs(deriv_7 - maple_7)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
        self.assertLess(error_3, 1e-8)
        self.assertLess(error_4, 1e-8)
        self.assertLess(error_5, 1e-8)
        self.assertLess(error_6, 1e-8)
        self.assertLess(error_7, 1e-8)
Example #17
0
    def test_third_derivatives_oscpart(self):
        w = [0.2+0.5j, 0.3-0.1j, -0.1+0.2j]
        Omega = self.Omega3

        dVec_1 = [[1,0,0],[1,0,0],[1,0,0]]
        dVec_2 = [[1,0,0],[0,1,0],[1,0,0]]
        dVec_3 = [[1,0,0],[0,0,1],[0,1,0]]
        dVec_4 = [[0,1,0],[0,0,1],[0,1,0]]
        dVec_5 = [[0,0,1],[0,0,1],[0,0,1]]
        dVec_6 = [[0,0,1],[0,1,0],[0,0,1]]
        dVec_7 = [[1,2,3.1],[2.9,-0.3,1.0],[-20,13.3,0.6684]]

        maple_1 = 88.96174663331488 + 12.83401972101860j
        maple_2 = -5.963646070489819 + 9.261504506522976j
        maple_3 = -1.347499363888600 + 0.5297607158965981j
        maple_4 = 1.217499355198950 + 0.8449102496878512j
        maple_5 = -15.58299545726265 - 0.4376346712347114j
        maple_6 = -2.441570516715710 - 0.2535384980716853j
        maple_7 = -2791.345600876934 + 1286.207313664481j

        deriv_1 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_2)
        deriv_3 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_3)
        deriv_4 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_4)
        deriv_5 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_5)
        deriv_6 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_6)
        deriv_7 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_7)
    
        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        error_3 = abs(deriv_3 - maple_3)
        error_4 = abs(deriv_4 - maple_4)
        error_5 = abs(deriv_5 - maple_5)
        error_6 = abs(deriv_6 - maple_6)
        error_7 = abs(deriv_7 - maple_7)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
        self.assertLess(error_3, 1e-8)
        self.assertLess(error_4, 1e-8)
        self.assertLess(error_5, 1e-8)
        self.assertLess(error_6, 1e-8)
        self.assertLess(error_7, 1e-8)

        # Genus 4 example
        Omega = self.Omega4
        w = [-0.37704918-0.18456279j, 0.63934426+0.42591413j,
             0.54918033+0.09937996j, -0.21721311-0.07808426j]

        dVec_1 = [[1,0,0,0],[1,0,0,0],[1,0,0,0]]
        dVec_2 = [[1,0,0,0],[0,1,0,0],[0,0,1,0]]
        dVec_3 = [[1,0,0,0],[0,0,1,0],[0,0,0,1]]
        dVec_4 = [[1,0,0,0],[0,1,1,0],[1,0,0,1]]
        dVec_5 = [[0,0,1,0],[0,1,1,0],[1,0,0,1]]
        dVec_6 = [[0,0,1,0],[1,2,3,4],[1,0,0,1]]
        dVec_7 = [[3.2,-9.8,0.004,-13.9],[0,2.4,0,4],[90.1,-12.93947,-1e-4,3]]

        maple_1 = -67.14022021800414 - 50.25487358123665j
        maple_2 = 6.220027066901749 - 16.96996479658767j
        maple_3 = 14.42498231220689 + 16.30518807929409j
        maple_4 = -35.67483045211793 - 18.14139876283777j
        maple_5 = 53.25640352451774 + 18.93871689387491j
        maple_6 = -185.6760275507559 - 93.99261766419004j
        maple_7 = 239954.2751344823 + 129975.3988999572j

        deriv_1 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_1)
        deriv_2 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_2)
        deriv_3 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_3)
        deriv_4 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_4)
        deriv_5 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_5)
        deriv_6 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_6)
        deriv_7 = RiemannTheta.oscillatory_part(w, Omega, 
                epsilon=1e-14, derivs=dVec_7)

        error_1 = abs(deriv_1 - maple_1)
        error_2 = abs(deriv_2 - maple_2)
        error_3 = abs(deriv_3 - maple_3)
        error_4 = abs(deriv_4 - maple_4)
        error_5 = abs(deriv_5 - maple_5)
        error_6 = abs(deriv_6 - maple_6)
        error_7 = abs(deriv_7 - maple_7)

        self.assertLess(error_1, 1e-8)
        self.assertLess(error_2, 1e-8)
        self.assertLess(error_3, 1e-8)
        self.assertLess(error_4, 1e-8)
        self.assertLess(error_5, 1e-8)
        self.assertLess(error_6, 1e-8)
        self.assertLess(error_7, 1e-8)
Example #18
0
    def test_first_derivatives(self):
        w = [0.2 + 0.5j, 0.3 - 0.1j, -0.1 + 0.2j]
        Omega = self.Omega3

        value_z1 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[1, 0, 0]])
        value_z2 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 1, 0]])
        value_z3 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 0, 1]])

        maple_z1 = -5.7295900733729553 - 0.89199375315523345j
        maple_z2 = -0.16300987772384356 - 0.65079269102999180j
        maple_z3 = 1.0115406077003542 + 0.030528533907836019j

        error_z1 = abs(value_z1 - maple_z1)
        error_z2 = abs(value_z2 - maple_z2)
        error_z3 = abs(value_z3 - maple_z3)

        self.assertLess(error_z1, 1e-8)
        self.assertLess(error_z2, 1e-8)
        self.assertLess(error_z3, 1e-8)

        Omega = self.Omega4

        w = [0, 0, 0, 0]
        value_z1 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[1, 0, 0, 0]])
        value_z2 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 1, 0, 0]])
        value_z3 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 0, 1, 0]])
        value_z4 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 0, 0, 1]])

        maple_z1 = 0.0
        maple_z2 = 0.0
        maple_z3 = 0.0
        maple_z4 = 0.0

        error_z1 = abs(value_z1 - maple_z1)
        error_z2 = abs(value_z2 - maple_z2)
        error_z3 = abs(value_z3 - maple_z3)
        error_z4 = abs(value_z4 - maple_z4)

        self.assertLess(error_z1, 1e-8)
        self.assertLess(error_z2, 1e-8)
        self.assertLess(error_z3, 1e-8)
        self.assertLess(error_z4, 1e-8)

        # different value of w
        w = [
            -0.37704918 - 0.18456279j, 0.63934426 + 0.42591413j,
            0.54918033 + 0.09937996j, -0.21721311 - 0.07808426j
        ]
        value_z1 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[1, 0, 0, 0]])
        value_z2 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 1, 0, 0]])
        value_z3 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 0, 1, 0]])
        value_z4 = RiemannTheta(w, Omega, epsilon=1e-14, derivs=[[0, 0, 0, 1]])

        maple_z1 = 3.3644150756 + 2.5018071784j
        maple_z2 = -2.9431860155 + 5.6802762853j
        maple_z3 = 8.0319838396 + 3.5491434873j
        maple_z4 = -6.0837267311 - 2.4867680289j

        error_z1 = abs(value_z1 - maple_z1)
        error_z2 = abs(value_z2 - maple_z2)
        error_z3 = abs(value_z3 - maple_z3)
        error_z4 = abs(value_z4 - maple_z4)

        self.assertLess(error_z1, 1e-8)
        self.assertLess(error_z2, 1e-8)
        self.assertLess(error_z3, 1e-8)
        self.assertLess(error_z4, 1e-8)