Example #1
0
 def getDDStructure(self, abs_gr_info = None):
     """Returns the type DD structure corresponding to this arcslide."""
     self.all_idems = self.getIdems()
     self.all_chords = []
     if self.slide_type == UNDER_SLIDE:
         for chord_type in self._UChords:
             chord_type(self)
     else:
         for chord_type in self._OChords:
             chord_type(self)
     alg1 = self.start_pmc.getAlgebra()
     alg2 = self.end_pmc.opp().getAlgebra()
     ddstr = DDStrFromChords(alg1, alg2, self.all_idems, self.all_chords)
     if abs_gr_info is not None:
         self._getAbsGrading(ddstr, abs_gr_info)
     else:
         for gen in ddstr.getGenerators():
             base_gen = gen
             break
         ddstr.registerHDiagram(getArcslideDiagram(self), base_gen)
     return ddstr
Example #2
0
    def _getAbsGrading(self, ddstr, abs_gr_info, expand_after = True):
        """Find absolute grading for type DD structure (to replace finding a
        relative grading). It can be shown that value of expand_after does not
        matter.

        """
        # Find grading of elements:
        # Create Heegaard diagram for the expanded arcslide.
        genus = self.start_pmc.genus
        if expand_after:
            ex_start_pmc = connectSumPMC(self.start_pmc, splitPMC(genus))
            ex_slide = Arcslide(ex_start_pmc, self.b1, self.c1)
        else:
            ex_start_pmc = connectSumPMC(splitPMC(genus), self.start_pmc)
            ex_slide = Arcslide(ex_start_pmc, 4*genus+self.b1, 4*genus+self.c1)
        ex_end_pmc = ex_slide.end_pmc
        ex_hdiagram = getArcslideDiagram(ex_slide)
        hgens = ex_hdiagram.getHFGenerators()

        # First step, find grading of two extreme generators, using one of
        # which as the base generator.
        base_idem = [Idempotent(ex_start_pmc, range(2*genus)),
                     Idempotent(ex_end_pmc.opp(), range(2*genus))]
        base_idem2 = [Idempotent(ex_start_pmc, range(2*genus, 4*genus)),
                      Idempotent(ex_end_pmc.opp(), range(2*genus, 4*genus))]
        if abs_gr_info == 0:
            base_gen = ex_hdiagram.getGeneratorByIdem(base_idem, True)
        else:
            base_gen = ex_hdiagram.getGeneratorByIdem(base_idem2, True)
        ex_gr_set, ex_grs = ex_hdiagram.computeDDGrading(base_gen)

        # Second step
        # # print ex_gr_set
        # base_gr1 = ex_grs[base_gen]
        # base_gr2 = ex_grs[base_gen2]
        # # print base_gr1, base_gr2
        # spinc11, spinc12 = base_gr1.data[0].spinc, base_gr1.data[1].spinc
        # spinc21, spinc22 = base_gr2.data[0].spinc, base_gr2.data[1].spinc
        # spincmavg1 = [-(a+b)/Fraction(2) for a,b in zip(spinc11, spinc21)]
        # spincmavg2 = [-(a+b)/Fraction(2) for a,b in zip(spinc12, spinc22)]
        # maslovavg = base_gr1.data[0].maslov + base_gr2.data[0].maslov + \
        #     base_gr1.data[1].maslov + base_gr2.data[1].maslov
        # mavg1 = SmallGradingElement(
        #     base_gr1.data[0].parent, -maslovavg, spincmavg1)
        # mavg2 = SmallGradingElement(
        #     base_gr2.data[0].parent, -Fraction(1,16), spincmavg2)
        # ex_gr_set, ex_grs = ex_hdiagram.computeDDGrading(base_gen,
        #                                                  (mavg1, mavg2))
        # # print ex_gr_set
        # # print ex_grs[base_gen], ex_grs[base_gen2]

        # Form the grading set for the original arcslide from the extended one
        periodic_domains = []
        for ex_gr1, ex_gr2 in ex_gr_set.periodic_domains:
            ex_spinc1, ex_spinc2 = ex_gr1.spinc, ex_gr2.spinc
            if expand_after:
                spinc1, spinc2 = ex_spinc1[0:2*genus], ex_spinc2[2*genus:]
            else:
                spinc1, spinc2 = ex_spinc1[2*genus:], ex_spinc2[0:2*genus]
            if not (all([n == 0 for n in spinc1]) and
                    all([n == 0 for n in spinc2])):
                gr1 = self.start_pmc.small_gr(ex_gr1.maslov, spinc1)
                gr2 = self.end_pmc.opp().small_gr(ex_gr2.maslov, spinc2)
                periodic_domains.append([gr1, gr2])
        ddstr.gr_set = SimpleDbGradingSet(
            SmallGradingGroup(self.start_pmc), ACTION_LEFT,
            SmallGradingGroup(self.end_pmc.opp()), ACTION_LEFT,
            periodic_domains)

        # Now obtain the grading of generators
        ddstr.grading = dict()
        for hgen, ex_gr in ex_grs.items():
            ex_idem1, ex_idem2 = hgen.getDIdem()
            ex_gr1, ex_gr2 = ex_gr.data
            if expand_after:
                pairs1 = [n for n in ex_idem1 if n < 2*genus]
                pairs2 = [n-2*genus for n in ex_idem2 if n >= 2*genus]
            else:
                pairs1 = [n-2*genus for n in ex_idem1 if n >= 2*genus]
                pairs2 = [n for n in ex_idem2 if n < 2*genus]
            if len(pairs1) == genus:
                # Get the corresponding generator in ddstr
                cur_idem = [Idempotent(self.start_pmc, pairs1),
                            Idempotent(self.end_pmc.opp(), pairs2)]
                cur_gen = [gen for gen in ddstr.getGenerators()
                           if [gen.idem1, gen.idem2] == cur_idem]
                assert len(cur_gen) == 1
                cur_gen = cur_gen[0]
                # Finally get the grading
                ex_spinc1, ex_spinc2 = ex_gr1.spinc, ex_gr2.spinc
                if expand_after:
                    for i in range(2*genus):
                        assert ex_spinc2[i] == ex_spinc1[4*genus-i-1]
                    spinc1 = ex_spinc1[0:2*genus]
                    spinc2 = ex_spinc2[2*genus:]
                else:
                    for i in range(2*genus, 4*genus):
                        assert ex_spinc2[i] == ex_spinc1[4*genus-i-1]
                    spinc1 = ex_spinc1[2*genus:]
                    spinc2 = ex_spinc2[0:2*genus]
                gr = SimpleDbGradingSetElement(
                    ddstr.gr_set,
                    [self.start_pmc.small_gr(ex_gr1.maslov, spinc1),
                     self.end_pmc.opp().small_gr(ex_gr2.maslov, spinc2)])
                if cur_gen in ddstr.grading:
                    assert ddstr.grading[cur_gen] == gr
                else:
                    ddstr.grading[cur_gen] = gr
        ddstr.checkGrading()
        return ddstr
Example #3
0
    def __init__(self, slide):
        """Specifies the arcslide to use. slide should be of type Arcslide.
        In addition to recording slide, construct the following:
        local_pmc1, mapping1 - restriction of starting pmc to location of slide.
        outer_pmc1, outer_mapping1 - complement of slide in starting pmc.
        local_pmc2, mapping2, outer_pmc2, outer_mapping2
          - same, but for ending pmc.
        Moreover, find pattern_fun and translator as appropriate for the case at
        hand.

        """
        self.slide = slide
        self.pmc1, self.pmc2 = slide.start_pmc, slide.end_pmc

        n = self.pmc1.n
        b1, c1, c2 = slide.b1, slide.c1, slide.c2
        b1p, c1p, c2p = [slide.to_r[p] for p in b1, c1, c2]

        # Note intervals (start, end) with start > end are ignored.
        # patterns_base specifies one of the four base patterns of arcslides.
        # translator gives the mapping between points in the base pattern and
        # points in the pattern at hand.
        if b1 == c1 + 1:  # downward
            if c2 == c1 + 2:  # short underslide downward
                local_cut1, local_cut2 = ([(c1, c2)], [(c1p, c2p)])
                patterns_fun = ArcslideDA._short_underslide_down
                if c1 == 0:
                    translator = ([-1, 0, 1, 2, 3], [-1, 0, 1, 2, 3])
                elif c2 == n - 1:
                    translator = ([0, 1, 2, 3, -1], [0, 1, 2, 3, -1])
                else:
                    translator = None
            elif c2 > c1:  # general underslide downward
                local_cut1, local_cut2 = (
                    [(c1, b1), (c2, c2)], [(c1p, c1p), (b1p, c2p)])
                patterns_fun = ArcslideDA._general_underslide_down
                if c1 == 0:
                    translator = ([-1, 0, 1, 2, 3, 4, 5],
                                  [-1, 0, 1, 2, 3, 4, 5])
                elif c2 == n - 1:
                    translator = ([0, 1, 2, 3, 4, 5, -1],
                                  [0, 1, 2, 3, 4, 5, -1])
                else:
                    translator = None
            else:  # c2 < c1, general overslide downward
                local_cut1, local_cut2 = (
                    [(c2, c2), (c1, b1)], [(b1p, c2p), (c1p, c1p)])
                patterns_fun = ArcslideDA._general_underslide_down
                if c2 == 0 and b1 == n - 1:
                    translator = ([2, 3, 4, -1, -1, 0, 1],
                                  [3, 4, -1, -1, 0, 1, 2])
                elif c2 == 0:
                    translator = ([2, 3, 4, 5, -1, 0, 1],
                                  [3, 4, 5, -1, 0, 1, 2])
                elif b1 == n - 1:
                    translator = ([3, 4, 5, -1, 0, 1, 2],
                                  [4, 5, -1, 0, 1, 2, 3])
                else:
                    translator = ([3, 4, 5, 6, 0, 1, 2], [4, 5, 6, 0, 1, 2, 3])
        elif b1 == c1 - 1:  # upward
            if c2 == c1 - 2:  # short underslide upward
                local_cut1, local_cut2 = ([(c2, c1)], [(c2p, c1p)])
                patterns_fun = ArcslideDA._short_underslide_up
                if c2 == 0:
                    translator = ([-1, 0, 1, 2, 3], [-1, 0, 1, 2, 3])
                elif c1 == n - 1:
                    translator = ([0, 1, 2, 3, -1], [0, 1, 2, 3, -1])
                else:
                    translator = None
            elif c2 < c1:  # general underslide upward
                local_cut1, local_cut2 = (
                    [(c2, c2), (b1, c1)], [(c2p, b1p), (c1p, c1p)])
                patterns_fun = ArcslideDA._general_underslide_up
                if c2 == 0:
                    translator = ([-1, 0, 1, 2, 3, 4, 5],
                                  [-1, 0, 1, 2, 3, 4, 5])
                elif c1 == n - 1:
                    translator = ([0, 1, 2, 3, 4, 5, -1],
                                  [0, 1, 2, 3, 4, 5, -1])
                else:
                    translator = None
            else:  # c2 > c1, general overslide upward
                local_cut1, local_cut2 = (
                    [(b1, c1), (c2, c2)], [(c1p, c1p), (c2p, b1p)])
                patterns_fun = ArcslideDA._general_underslide_up
                if b1 == 0 and c2 == n - 1:
                    translator = ([3, 4, -1, -1, 0, 1, 2],
                                  [2, 3, 4, -1, -1, 0, 1])
                elif b1 == 0:
                    translator = ([3, 4, 5, -1, 0, 1, 2],
                                  [2, 3, 4, 5, -1, 0, 1])
                elif c2 == n - 1:
                    translator = ([4, 5, -1, 0, 1, 2, 3],
                                  [3, 4, 5, -1, 0, 1, 2])
                else:
                    translator = ([4, 5, 6, 0, 1, 2, 3], [3, 4, 5, 6, 0, 1, 2])
        else:
            # All cases are covered. Should not happen.
            raise NotImplementedError(
                "This slide pattern is not yet implemented.")

        self.patterns_fun = patterns_fun
        self.translator = translator

        # Necesssary to get local DA structure.
        self.splitting1 = PMCSplitting(self.pmc1, local_cut1)
        self.splitting2 = PMCSplitting(self.pmc2, local_cut2)
        self.local_pmc1 = self.splitting1.local_pmc
        self.local_pmc2 = self.splitting2.local_pmc
        self.mapping1 = self.splitting1.local_mapping
        self.mapping2 = self.splitting2.local_mapping

        # Required so the left to right transition on the outside can proceed.
        assert self.splitting1.outer_pmc == self.splitting2.outer_pmc

        # Initiate the ExtendedDAStructure
        ExtendedDAStructure.__init__(
            self, self.getLocalDAStructure(), self.splitting1, self.splitting2)

        # With generators set, add grading. Any generator can serve as base_gen
        for gen in self.generators:
            base_gen = gen
            break
        self.registerHDiagram(getArcslideDiagram(self.slide), base_gen)