Exemplo n.º 1
0
def test_flattenings_from_tetrahedra_shapes_of_manifold():

    old_precision = pari.set_real_precision(100)

    # real parts need to be equal
    # imaginary parts need to be equal up to pi^2/6
    p = pari('Pi * Pi / 6')

    def is_close(cvol1, cvol2, epsilon):
        diff = cvol1 - cvol2
        return diff.real().abs() < epsilon and ((diff.imag() % p) < epsilon or
                                                (-diff.imag() % p) < epsilon)

    from snappy import OrientableCuspedCensus

    for M in (list(OrientableCuspedCensus()[0:10]) +
              list(OrientableCuspedCensus()[10000:10010])):

        flattening = Flattenings.from_tetrahedra_shapes_of_manifold(M)
        flattening.check_against_manifold(M, epsilon=1e-80)

        if not is_close(
                flattening.complex_volume(),
                M.complex_volume(),  # returns only double precision
                epsilon=1e-13):
            raise Exception("Wrong volume")

    # test high precision

    M = ManifoldGetter("5_2")
    flattening = Flattenings.from_tetrahedra_shapes_of_manifold(M)
    flattening.check_against_manifold(M, epsilon=1e-80)

    if not is_close(
            flattening.complex_volume(),
            pari(
                '2.828122088330783162763898809276634942770981317300649477043520327258802548322471630936947017929999108 - 3.024128376509301659719951221694600993984450242270735312503300643508917708286193746506469158300472966*I'
            ),
            epsilon=1e-80):
        raise Exception("Wrong volume")

    pari.set_real_precision(old_precision)
Exemplo n.º 2
0
def testGeneralizedObstructionClass(compute_solutions):

    vols = [pari('0'), 2 * vol_tet]
    test__m003__2 = (
        ManifoldGetter("m003"),  # Manifold
        2,  # N = 2
        vols,  # expected volumes
        [0])  # expected dimensions

    vols = [2 * vol_tet]
    test__m004__2 = (
        ManifoldGetter("m004"),  # Manifold
        2,  # N = 2
        vols,  # expected volumes
        [0])  # expected dimensions

    vols = [
        pari('0'),
        pari(
            '2.595387593686742138301993834077989475956329764530314161212797242812715071384508096863829303251915501'
        ),
        2 * 4 * vol_tet,
    ]
    test__m003__3 = (
        ManifoldGetter("m003"),  # Manifold
        3,  # N = 3
        vols,  # expected volumes
        [0, 1])  # expected dimensions

    test_cases = [test__m003__2, test__m004__2]

    if (not _within_sage) or (not compute_solutions):
        test_cases += [test__m003__3]

    for manifold, N, vols, dims in test_cases:

        print("Checking for", manifold.name(), "N = %d" % N)

        testComputeSolutionsForManifoldGeneralizedObstructionClass(
            manifold, N, compute_solutions, vols, dims)
Exemplo n.º 3
0
def check_volumes(complex_volumes,
                  baseline_complex_volumes,
                  check_real_part_only=False,
                  torsion_imaginary_part=6,
                  epsilon=1e-80):

    # add complex volumes from complex conjugation to baseline

    conjugates = [-cvol.conj() for cvol in baseline_complex_volumes]

    baseline_complex_volumes = baseline_complex_volumes + conjugates

    # real parts need to be equal
    # imaginary parts need to be equal up to pi^2/torstion
    p = pari('Pi * Pi') / torsion_imaginary_part

    def is_close(cvol1, cvol2):
        diff = cvol1 - cvol2

        if diff.real().abs() > epsilon:
            return False

        if check_real_part_only:
            return True

        return (((diff.imag()) % p) < epsilon
                or ((-diff.imag()) % p) < epsilon)

    # check that every base line volume appears in computed volumes
    for cvol1 in baseline_complex_volumes:

        if not True in [is_close(cvol1, cvol2) for cvol2 in complex_volumes]:
            print("Missing base line volume:", cvol1)

            print("Volumes:")
            for i in complex_volumes:
                print("     ", i)

            raise Exception

    # check that every computed volume is a base line volume
    for cvol2 in complex_volumes:
        if not True in [
                is_close(cvol1, cvol2) for cvol1 in baseline_complex_volumes
        ]:
            print("Extra volume:", cvol2)

            print("Volumes:")
            for i in complex_volumes:
                print("     ", i)

            raise Exception
Exemplo n.º 4
0
def main(verbose=False, doctest=True):
    print("Testing in sage:", _within_sage)

    print("Testing in regina:", test_regina)

    if doctest:
        print("Running doctests...")
        run_doctests(verbose)
        print()

    if test_regina:
        print("Testing that regina agrees with snappy obstruction classes")
        test_num_obstruction_class_match()

    if not test_regina:
        print("Testing Flattenings.from_tetrahedra_shapes_of_manifold...")

        test_flattenings_from_tetrahedra_shapes_of_manifold()

    compute_solutions = False

    if '--compute' in sys.argv:
        compute_solutions = True

    if test_regina and not compute_solutions:
        print("regina testing requires --compute")
        sys.exit(1)

    old_precision = pari.set_real_precision(100)

    print("Testing induced representation...")

    test_induced_representation()

    print("Testing induced SL(4,C) representation...")

    test_induced_sl4_representation()

    print("Running manifold tests for generalized obstruction class...")

    testGeneralizedObstructionClass(compute_solutions)

    if not test_regina:
        print("Testing RUR for m052__sl3_c0.rur")

        testMapleLikeRur()

    print("Testing numerical solution retrieval method...")

    testNumericalSolutions()

    print("Testing geometricRep...")
    testGeometricRep(compute_solutions)

    if _within_sage:
        print("Testing in sage command line...")
        testSageCommandLine()

    print("Running manifold tests...")

    ### Test for a non-hyperbolic manifold

    cvols = [  # Expected Complex volumes
        pari('0')
    ]
    test__3_1__2 = (
        ManifoldGetter("3_1"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # No non-zero dimensional components

    ### Test for 4_1, amphichiral, expect zero CS

    cvols = [  # Expected Complex volumes
        2 * vol_tet
    ]
    test__4_1__2 = (
        ManifoldGetter("4_1"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect non-zero dimensional components

    ### N = 3

    cvols = [  # Expected Complex volumes
        pari(0), 2 * 4 * vol_tet
    ]
    test__4_1__3 = (
        ManifoldGetter("4_1"),  # Manifold
        3,  # N = 3
        cvols,  # expected complex volumes
        False)  # expect non-zero dimensional components

    ### N = 4

    cvols = [  # Expected Complex volumes
        2 * 10 * vol_tet,
        pari(
            '8.355502146379565994303773768814775354386025704336131822255670190659042090899812770381061831431114740 - 0.7836375483069721973241186952472609466029570462055317453592429525294418326815666413123016980810744089*I'
        ),
        pari(
            '7.327724753417752120436828119459072886193194994253377074131984956974104158210038155834852103408920850'
        ),
        pari(
            '4.260549384199988638895626360783795200167603461491438308495654794999595513880915593832371886868625127 + 0.1361281655780504266700965891301086052404492485996004213292764928775628027210816440355745847599247091*I'
        ),
        pari(
            '3.276320849776062968038680855240250653840691843746753028019901828179320044237305241434903501877259688 + 0.03882948511714102091208888807575164800651790439786747350853616215556190252003379560451275222880494392*I'
        ),
        pari(
            '3.230859569867059515989136707781810556962637199799080875515780771251800351524537196576706995730457048'
        )
    ]

    # amphicheiral, so complex volumes should appear in pairs

    cvols = cvols + [cvol.conj() for cvol in cvols]

    test__4_1__4 = (
        ManifoldGetter("4_1"),  # Manifold
        4,  # N = 2
        cvols,  # expected complex volumes
        True)  # expect non-zero dimensional components

    ### Test for 5_2, expect non-trivial CS
    ### Number field has one real embedding with non-trival CS
    ### And one pair of complex embeddings with non-trivial CS

    cvols = [  # Expected Complex volumes
        pari(
            '+ 1.113454552473924010022656943451126420312050780921075311799926598907813005362784871512051614741669817*I'
        ),
        pari(
            '2.828122088330783162763898809276634942770981317300649477043520327258802548322471630936947017929999108 - 3.024128376509301659719951221694600993984450242270735312503300643508917708286193746506469158300472966*I'
        )
    ]
    test__5_2__2 = (
        ManifoldGetter("5_2"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect no non-zero dimensional components

    ### m015 which is isometric to 5_2
    ### This example is also appearing on the website

    cvols = [  # Expected Complex volumes
        pari(
            '+ 0.4033353624187061319128390413376061001062613536896471642214173008084760853375773296525240139108027276*I'
        ),
        pari(
            '- 0.4809839906489832693266177261335698864086465799360940660069682924787703897584631354526802428925968492*I'
        ),
        pari(
            '+ 0.6579736267392905745889660666584100756875799604827193750942232917480029881612803495334515602479034826*I'
        ),
        pari(
            '- 0.6579736267392905745889660666584100756875799604827193750942232917480029881612803495334515602479034826*I'
        ),
        pari(
            '6.332666642499251344664115407516762513592210378740462564820401485540596854320653136703448734707430999 + 0.6207993522147601522797880626542095445563442737585756367570704642807656925328117720905524433544779886*I'
        ),
        pari(
            '11.31248835332313265105559523710653977108392526920259790817408130903521019328988652374778807171999643 - 0.5819750380996215835728987202562276514051516606353521858642949684456185403223688691904743288635809278*I'
        )
    ]

    test__m015__3 = (
        ManifoldGetter("m015"),  # Manifold
        3,  # N = 3
        cvols,  # expected volumes
        False)  # expect no non-zero dimensional components

    ### Test for m135
    ### Ptolemy Variety has one non-zero dimensional component

    cvols = [  # Expected Complex volumes
        pari(
            '3.66386237670887606021841405972953644309659749712668853706599247848705207910501907791742605170446042499429769047678479831614359521330343623772637894992 + 4.93480220054467930941724549993807556765684970362039531320667468811002241120960262150088670185927611591201295688701157203888617406101502336380530883900*I'
        )
    ]

    test__m135__2 = (
        ManifoldGetter("m135"),  # Manifold
        2,  # N = 2
        cvols,  # expected volumes
        True)  # expect a non-zero dimensional component

    ### Test for s000
    ### Number field has one real embedding with non-trival CS
    ### And two complex embeddings with non-trivial CS

    cvols = [  # Expected Complex volumes
        pari(
            '3.296902414326637335562593088559162089146991699269941951875989849869324250860299302482577730785960256 + 0.4908671850777469648812718224097607532197026477625119178645010117072332396428578681905186509136879130*I'
        ),
        pari(
            '2.270424126345803402614201085375714538056567876339790536089272218685353247084791707534069624462050547 - 0.4107712000441024931074403997367404299427214514732528671142771778838924102954454212055598588991237349*I'
        ),
        pari(
            '0.8061270618942289713279174295562193428686541442399728535727328789432842090598108984711933183445551654 - 0.08009598503364447177383142267302032327698119628925905075022383382334082934741244698495879201456417902*I'
        )
    ]

    test__s000__2 = (
        ManifoldGetter("s000"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect non-zero dimensional components

    ### Test for v0000
    ### This also tests the case of having more than one (here two)
    ### cusps

    cvols = [  # Expected Complex volumes
        pari(
            '3.377597408231442496961257171798882829176020069714519460350380851901055794392493960110119513942153791 + 0.3441889979504813554136570264352067044809511501367282461849580661783699588789118851518262199077361427*I'
        ),
        pari(
            '1.380586178282342062845519278761524817753278777803238623999221385504661588501960339341800843520223671 + 0.06704451876157525370444676522629959282378632516497136324893149116413190872188833330658100524720353406*I'
        )
    ]

    test__v0000__2 = (
        ManifoldGetter("v0000"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect non-zero dimensional components

    ### Test for t00000
    ### This also tests the case of having more than one (here two)
    ### cusps

    cvols = [  # Expected Complex volumes
        pari(
            '1.801231981344929412976326011175173926741195258454700704383597306674496002389749200442131507334117933 - 0.5490336239273931479260463113980794374780078424892352183284248305887346671477869107359071072271699046*I'
        ),
        pari(
            '3.434540885902563701250335473165274495380101665474171663779718033441916041515556280543077990039279103 - 0.2258335622748003900958464044389939976977579115267501160859900439335840118881246299028850924706341411*I'
        ),
        pari(
            '2.781430316400743786576311128801205534982324055570742403430395886754122643539081915302290955978507418 - 0.1135489194824466736456241002458946823709871812077727407261274931826622024508518397031626436088171650*I'
        ),
        pari(
            '0.6223401945262803853426860070209275705147832620602921139947907237662088851273537136119288228151713940 + 0.06594907226052699343130923275995552293727798462035885627276325301997714628516294342514039299674185799*I'
        )
    ]

    test__t00000__2 = (
        ManifoldGetter("t00000"),  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect non-zero dimensional components

    ### Check a big link
    ### Also an example from the website

    magma_file_name = os.path.join(
        testing_files_directory, 'DT_mcbbiceaibjklmdfgh__sl2_c0.magma_out.bz2')
    magma_file = bz2.BZ2File(magma_file_name, 'r').read().decode('ascii')
    M = get_manifold(magma_file)

    cvols = [  # Expected complex volumes
        pari(
            '+ 0.7322614121694386973039290771667413108310290182470824825342304051284154933661673470336385959164416421*I'
        ),
        pari(
            '+ 0.6559698855197901194421542799077526971594537987318704612418448259078988296037785866985260815280619566*I'
        ),
        pari(
            '+ 0.2247361398283578756297647616373802721002644994163825408181485469244129408530290519698535075998585820*I'
        ),
        pari(
            '- 0.2027422644881176424634704044404281277501368039784045126270573672316679046996639567741375438621581585*I'
        ),
        pari(
            '- 0.5165804080147074827389022895582362309867052040022748905555220755792330887283843134684241943604049933*I'
        ),
        pari(
            '- 0.6947370811282851128538476965898593866158843479399924653138487625940910866865914821776342801425993440*I'
        ),
        pari(
            '0.5540930202692745891960825388466975825977590423995169588735760161940190344506116205300980253997539517 + 0.4068295289298811130481298436200768517194764143946539028521976313233755795250413907401491036923026977*I'
        ),
        pari(
            '1.107573735539315638081527574351339252286206152514359620788778723352858972530297840033883810630372795 - 0.5969698437345460065934215233692845699554045087887375026603956452869723823599605032061849791769108861*I'
        ),
        pari(
            '2.930037687027569312623189945781681052278144410906236798293622026086427321638842320557907595726492995 + 0.3289208659101980133472847400704889056725461985759517831954390384444124055329869355087545294359968288*I'
        ),
        pari(
            '3.125178220789358723184584053682215536632004045535766511323850625359539915401419555941250425818672532 - 0.3045460696329709194663539414577718771554887499547088593863438059068830455709928110292357447645590516*I'
        ),
        pari(
            '4.421889017241566419690868074785716366646707154662264036268588279252613543336245268108457201245088608 + 0.6139898590804745843458673335891956572719167936270349811550161917334120397060146434004694625036091183*I'
        ),
        pari(
            '5.114841460302400721438106628468470523914735245629326811523719108779649554034504844499930511307337652 - 0.05922105399342951023220969900445652084832276940306885833938997476066822991673855494231393721309130829*I'
        ),
        pari(
            '6.222431566185758097679258799420253341029081314309961806975091338751806200485840320374430035873760649 - 0.4263260019368806638768168211894976779995931712761356294379973306148491137274105197747275282097587014*I'
        ),
        pari(
            '9.266495487232495996324305783134684559241087943387258046228284813849170601366096263130956023317432143 + 0.03172800820055749085258729263585301130211316529809616828980203075096987437740390637996179595789268661*I'
        ),
        pari(
            '11.33736073062520808632824769184286601589152410942391317127856679767752551409389094871647937428783709 - 0.5767482750608833159526763068340021498631801513808564565980389960163842898485087439099502988183940450*I'
        ),
        pari(
            '12.48005937399413830153052941177305767103579608241815594942757035041902652992672347868089986739774396 + 0.4828891402943609873677952178777231024869262986704386628808130740557195704279966401921665132533128189*I'
        )
    ]

    test__morwen_link__2 = (
        M,  # Manifold
        2,  # N = 2
        cvols,  # expected complex volumes
        False)  # expect no non-zero dimensional components

    test_cases = [
        test__3_1__2, test__4_1__2, test__5_2__2, test__m135__2, test__s000__2,
        test__v0000__2, test__t00000__2, test__morwen_link__2, test__4_1__3,
        test__m015__3, test__4_1__4
    ]

    pari.set_real_precision(old_precision)

    for manifold, N, cvols, expect_non_zero_dim in test_cases:

        print("Checking for", manifold.name(), "N = %d" % N)

        testComputeSolutionsForManifold(
            manifold,
            N,
            compute_solutions=compute_solutions,
            baseline_cvolumes=cvols,
            expect_non_zero_dimensional=expect_non_zero_dim)
Exemplo n.º 5
0
def test_induced_representation():

    M = ManifoldGetter("m015")
    variety__sl2_c1 = M.ptolemy_variety(2, obstruction_class=1)
    variety__sl3_c0 = M.ptolemy_variety(3, obstruction_class=0)

    solutions__sl2_c1 = compute_using_precomputed_magma(
        variety__sl2_c1, dir=testing_files_generalized_directory)
    solutions__sl3_c0 = compute_using_precomputed_magma(
        variety__sl3_c0, dir=testing_files_generalized_directory)

    # Check that is_real

    got_exception = False
    try:
        solutions__sl3_c0[0].cross_ratios().is_real(epsilon=1e-80)
    except:
        got_exception = True
    assert got_exception, (
        "Expected error when calling is_real on exact solution")

    # For each component of sl3 c0, determine the number
    # of solutions which are real vs number of all solutions

    numbers_all_and_real = []
    for component in solutions__sl3_c0:
        number_real = 0
        number_all = 0
        for z in component.cross_ratios_numerical():
            if z.is_real(epsilon=1e-80):
                number_real += 1
            number_all += 1
        numbers_all_and_real.append((number_all, number_real))

    # Bring into canonical form
    numbers_all_and_real.sort()

    expected_numbers = [
        (3, 1),  # component has 3 solutions, 1 of them has real cross ratios
        (4, 2),
        (6, 0)
    ]

    assert numbers_all_and_real == expected_numbers, (
        "Order of components and number of real solutions is off")

    # Check is_induced_from_psl2

    number_psl2 = 0

    for component in solutions__sl3_c0:
        if component.cross_ratios().is_induced_from_psl2():
            number_psl2 += 1

    assert number_psl2 == 1, "Only one component can come from psl2"

    number_psl2 = 0

    for component in solutions__sl3_c0:
        is_induced_from_psl2 = [
            z.is_induced_from_psl2(epsilon=1e-80)
            for z in component.cross_ratios_numerical()
        ]
        if True in is_induced_from_psl2:
            number_psl2 += 1
            assert not False in is_induced_from_psl2, (
                "Mixed up is_induced_from_psl2")

    assert number_psl2 == 1, (
        "Only one component can come from psl2 (numerically)")

    # Check that induced_representation for sl3 throws error
    got_exception = False
    try:
        solutions__sl3_c0[0].cross_ratios().induced_representation(3)
    except:
        got_exception = True
    assert got_exception, (
        "Expected error when calling induced_representation on sl3")

    # Check that induced_representation(3) works for m015

    m015_volume = pari(
        "2.828122088330783162763898809276634942770981317300649477043520327258802548322471630936947017929999108"
    )

    z = solutions__sl2_c1[0].cross_ratios().induced_representation(3)
    assert z.is_induced_from_psl2(), (
        "induced_representation failed to be detected as being induced")

    assert z.check_against_manifold, (
        "induced_representation fails to be valid")

    for v in z.volume_numerical():
        assert v.abs() < 1e-80 or (v.abs() - 4 * m015_volume).abs() < 1e-80, (
            "Did not get expected voluem for induced representation")

    for z in solutions__sl2_c1[0].cross_ratios_numerical():
        v = z.induced_representation(3).volume_numerical()
        assert v.abs() < 1e-80 or (v.abs() - 4 * m015_volume).abs() < 1e-80, (
            "Did not get expected voluem for induced representation")
Exemplo n.º 6
0
def testNumericalSolutions():

    M = ManifoldGetter("m003")
    N = 3

    varities = M.ptolemy_variety(N, obstruction_class='all')

    solutions = [
        solutions_from_magma(get_precomputed_magma(
            variety, dir=testing_files_generalized_directory),
                             numerical=True) for variety in varities
    ]

    for obstruction_index, obstruction in enumerate(solutions):
        for component in obstruction:
            for solution in component:
                flattenings = solution.flattenings_numerical()
                if not test_regina:
                    flattenings.check_against_manifold(epsilon=1e-80)
                order = flattenings.get_order()

                if obstruction_index:
                    assert order == 6
                else:
                    assert order == 2

                cross_ratios = solution.cross_ratios()
                is_cr = cross_ratios.is_pu_2_1_representation(epsilon=1e-80,
                                                              epsilon2=1e-10)

                if cross_ratios.volume_numerical().abs() < 1e-10:
                    # Every volume 0 representation of m003 happens to be
                    # cr
                    assert is_cr
                else:
                    assert not is_cr

    number_one_dimensional = 0

    allComponents = sum(solutions, [])

    dimension_dict = {}
    degree_dict = {}

    for component in allComponents:

        dim = component.dimension
        deg = len(component)

        dimension_dict[dim] = 1 + dimension_dict.get(dim, 0)
        degree_dict[deg] = 1 + degree_dict.get(deg, 0)

        assert (dim == 0) ^ (deg == 0)

    assert dimension_dict == {0: 4, 1: 2}
    assert degree_dict == {0: 2, 2: 2, 8: 2}

    allSolutions = sum(allComponents, [])

    allCVolumes = [s.complex_volume_numerical() for s in allSolutions]

    expected_cvolume = pari(
        '2.595387593686742138301993834077989475956329764530314161212797242812715071384508096863829303251915501 + 0.1020524924166561605528051801006522147774827678324290664524996742369032819581086580383974219370194645*I'
    )

    expected_cvolumes = [
        pari(0), expected_cvolume,
        expected_cvolume.conj(), 2 * 4 * vol_tet
    ]

    check_volumes(allCVolumes, expected_cvolumes)
Exemplo n.º 7
0
def testMapleLikeRur():

    M = ManifoldGetter("m052")
    p = M.ptolemy_variety(3, 0)

    sols = parse_solutions(
        bz2.BZ2File(
            os.path.join(testing_files_rur_directory,
                         p.filename_base() + '.rur.bz2'),
            'r').read().decode('ascii'))
    assert len(sols) == 4
    assert [sol.dimension for sol in sols] == [0, 0, 0, 1]

    sols.check_against_manifold()
    cross_ratios = sols.cross_ratios()
    cross_ratios.check_against_manifold()

    assert sols.number_field()[0:3] == [
        pari('3*x^5 - 3*x^4 + 7*x^3 - 11*x^2 + 6*x - 1'),
        pari('x^5 - 3*x^4 + x^3 + x^2 + 2*x - 1'),
        pari(
            '29987478321*x^50 + 79088110854*x^49 + 146016538609*x^48 + 168029123283*x^47 + 195292402206*x^46 + 249251168329*x^45 + 342446347782*x^44 + 342999865332*x^43 + 169423424001*x^42 - 273623428749*x^41 - 913797131672*x^40 - 1673817412888*x^39 - 2346916788229*x^38 - 2864053668977*x^37 - 3089416575581*x^36 - 3067233025932*x^35 - 2754270808082*x^34 - 2290714735763*x^33 - 1691408820544*x^32 - 1128722560267*x^31 - 616892765351*x^30 - 264545491200*x^29 - 28918206196*x^28 + 65364520067*x^27 + 95427288700*x^26 + 68490651548*x^25 + 40427041992*x^24 + 8765319150*x^23 - 5368633716*x^22 - 14060382008*x^21 - 12638294169*x^20 - 10728252922*x^19 - 6615567685*x^18 - 4275928015*x^17 - 2168416333*x^16 - 1279131210*x^15 - 627103252*x^14 - 403508975*x^13 - 222568645*x^12 - 147840406*x^11 - 81185759*x^10 - 46353128*x^9 - 21481295*x^8 - 9738710*x^7 - 3418080*x^6 - 1145883*x^5 - 254870*x^4 - 44273*x^3 - 565*x^2 + 2925*x + 487'
        )
    ]

    sols[0].multiply_terms_in_RUR().check_against_manifold()
    sols[0].multiply_and_simplify_terms_in_RUR().check_against_manifold()
    sol_pur = sols[0].to_PUR()
    sol_pur.check_against_manifold()

    cross_ratios[0].multiply_terms_in_RUR().check_against_manifold()
    cross_ratios[0].multiply_and_simplify_terms_in_RUR(
    ).check_against_manifold()
    cross_ratio_pur = cross_ratios[0].to_PUR()

    old_precision = pari.set_real_precision(60)

    sols.numerical().check_against_manifold(epsilon=1e-50)
    sols.numerical().cross_ratios().check_against_manifold(epsilon=1e-50)
    cross_ratios.numerical().check_against_manifold(epsilon=1e-50)
    sol_pur.numerical().check_against_manifold(epsilon=1e-50)
    cross_ratio_pur.numerical().check_against_manifold(epsilon=1e-50)

    expected_cvols = [
        pari('-0.78247122081308825152609555186377860994691907952043*I'),
        pari('-0.72702516069067618470921136741414357709195254197557*I'),
        pari('-0.68391161907531103571619313072177855528960855942240*I'),
        pari('-0.56931748709124386099667356226108260894423337722116*I'),
        pari('-0.51896820855866930434990357344936169357239176536016*I'),
        pari('-0.51572066892431201326839038002795162651553325964817*I'),
        pari('-0.43203716183360487568405407399314603426109522825732*I'),
        pari('-0.36010613661069069469455670342059458401551240819467*I'),
        pari('-0.30859303742385031407330927444373574273739067157054*I'),
        pari('-0.026277944917886842767978680898127354858352285383691*I'),
        pari('0.0248303748672046904847696634069363554930433748091423*I'),
        pari('0.099321499468818761939078653627745421972173499236569*I'),
        pari('0.10014328074298669302370298811922885078531513167037*I'),
        pari('0.26650486587884614841887735378855648561147071193673*I'),
        pari('0.28149146457238928303062789829916587391163953396165*I'),
        pari('0.31647148942727816629296211895022802382665885673450*I'),
        pari('0.43039483620012844786769013182478937263427654168349*I'),
        pari('0.69353686619303521491910998831602468798059163569136*I'),
        pari(
            '0.54467996179900207437301145027949601489757288486931 - 0.63094967104322016076042058145264363658770535751782*I'
        ),
        pari(
            '2.01433658377684250427882647709079550884158567943161 - 0.49992935281631459421725377501106345869263727223108*I'
        ),
        pari(
            '2.5032821968844998826603550693091792509880846739036 - 0.26075155111137757913541371074811175755130345738250*I'
        ),
        pari(
            '2.9278315480495821855974883510454022661942898386197 + 0.19505171376983273645226251276721729342140990274561*I'
        ),
        pari(
            '3.3588310807753976907039310005151876035685073404636 - 0.59541514146929793136574297969820009572263815053647*I'
        ),
        pari(
            '3.5588560966663108341691237279801529977950803397723 - 0.65837426652607617086885854703688633418948363301344*I'
        ),
        pari(
            '4.3805052030906555151826572095707468309691641904106 - 0.53144574794454652850763996164828079301339638663719*I'
        ),
        pari(
            '5.2749826604398957699736902920967737019972675833349 + 0.72096167973012423863761073630614422902154219296456*I'
        ),
        pari(
            '5.5615522795375430947143486065492921841179004148132 - 0.28072986489486989042244876551205538542949560983728*I'
        ),
        pari(
            '8.0573463351073700171153059083631820353663427177264 - 0.35478334441703194039659993339822864555159918771765*I'
        ),
        pari(
            '13.232966218921677854715244009824382732164844146922 + 0.13989736389653471530824083989755826875684215156147*I'
        )
    ]

    expected_cvols = expected_cvols + [-a.conj() for a in expected_cvols]

    cvols = sols.complex_volume_numerical().flatten(2)  # Include witnesses

    check_volumes(cvols, expected_cvols, epsilon=1e-40)

    vols = sols.volume_numerical().flatten(2)  # Include witnesses

    check_volumes(vols,
                  expected_cvols,
                  check_real_part_only=True,
                  epsilon=1e-40)

    pari.set_real_precision(old_precision)
Exemplo n.º 8
0
def checkSolutionsForManifoldGeneralizedObstructionClass(
        solutions_trivial, solutions_non_trivial, manifold, N,
        baseline_volumes, baseline_dimensions):

    torsionTrivial = pari('Pi^2/6 * I')
    torsionNonTrivial = pari('Pi^2/18 * I')

    solutions = ([(s, False) for s in solutions_trivial] +
                 [(s, True) for s in solutions_non_trivial])

    # Dimensions and volumes encounterd
    dimensions = set()
    volumes = []
    volumes_2 = []

    for solution, sol_is_non_trivial in solutions:
        # Add the dimension
        dimensions.add(solution.dimension)
        if solution.dimension == 0:

            if sol_is_non_trivial:
                got_exception = False
                try:
                    solution.check_against_manifold(manifold)
                except PtolemyCannotBeCheckedError:
                    got_exception = True

                    assert got_exception, (
                        "check_against_manifold should not have passed")
            else:
                solution.check_against_manifold(manifold)

            fl = solution.flattenings_numerical()
            for f in fl:
                if not test_regina:
                    # Not supported yet in regina
                    f.check_against_manifold(epsilon=1e-80)

                cvol, modulo = f.complex_volume(with_modulo=True)

                if sol_is_non_trivial and N == 3:
                    assert (modulo - torsionNonTrivial).abs() < 1e-80, (
                        "Wrong modulo returned non-trivial case")
                else:
                    assert (modulo - torsionTrivial).abs() < 1e-80, (
                        "Wrong modulo returned trivial case")

                volumes_2.append(cvol.real())

            # Add the volumes
            volumes += solution.volume_numerical()

            # Check that the resulting cross ratios full fill
            # the gluing equations
            cross_ratios = solution.cross_ratios()
            if not test_regina:
                cross_ratios.check_against_manifold(manifold)

    def is_close(a, b):
        return (a - b).abs() < 1e-80

    def make_unique(L):
        L.sort()
        result = L[:1]

        for i in L:
            if not is_close(result[-1], i):
                result.append(i)
        return result

    volumes = make_unique(volumes)
    volumes_2 = make_unique(volumes_2)
    all_expected_volumes = make_unique(baseline_volumes +
                                       [-vol for vol in baseline_volumes])

    assert len(all_expected_volumes) >= 2 * len(baseline_volumes) - 1

    for volume, expected_volume in zip(volumes, all_expected_volumes):
        assert is_close(volume, expected_volume)

    for volume, expected_volume in zip(volumes_2, all_expected_volumes):
        assert is_close(volume, expected_volume)

    assert dimensions == set(baseline_dimensions)
Exemplo n.º 9
0
if test_regina:
    from regina import NTriangulation
    from snappy.ptolemy.reginaWrapper import *

    def ManifoldGetter(name):
        return NTriangulationForPtolemy(
            NTriangulation(Manifold(name)._to_string()))
else:

    def ManifoldGetter(name):
        return Manifold(name)


vol_tet = pari(
    '1.014941606409653625021202554274520285941689307530299792017489106776597476258244022136470354228256695'
)


def check_volumes(complex_volumes,
                  baseline_complex_volumes,
                  check_real_part_only=False,
                  torsion_imaginary_part=6,
                  epsilon=1e-80):

    # add complex volumes from complex conjugation to baseline

    conjugates = [-cvol.conj() for cvol in baseline_complex_volumes]

    baseline_complex_volumes = baseline_complex_volumes + conjugates