Esempio n. 1
0
    def _build_endmap(self, consolidate=False):
        """
        Builds the map on ends for graph_map.  Called when Core is initialized.
        """
        alph = self._graph_map.domain()._alphabet
        inv_alph = self._inv_graph_map.domain()._alphabet
        FA = FreeGroup(alph)
        FB = FreeGroup(inv_alph)
        for x in self._graph_map.domain().edge_labels():
            X = alph.inverse_letter(x)
            self._signed_ends[x] = []
            self._signed_ends[X] = []

        for x in self._inv_graph_map.domain().edge_labels():
            X = inv_alph.inverse_letter(x)
            inv_image_x = self._inv_graph_map(x)
            vp = ''  # vanishing path
            for a in inv_image_x:
                A = alph.inverse_letter(a)
                if vp == '' or vp[
                        -1] != X:  # coming from + side, no cancellation
                    self._signed_ends[a].append(vp + x)
                else:  # coming from - side, cancels x
                    self._signed_ends[a].append('-' + vp)  # - + vp #
                # add to vanishing path
                vp = str(FB.reduced_product(str(self._graph_map(A)), vp))
                # repeat for inverse, we've added to the vanishing path because we are
                # coming from the other side
                if vp == '' or vp[
                        -1] != X:  # coming from - side, no cancellation
                    self._signed_ends[A].append('-' + vp + x)  # - + vp + x
                else:  # coming from + side, cancels x
                    self._signed_ends[A].append(vp)

        if consolidate:
            for a in self._signed_ends.keys():
                removed_end = True
                N = 2 * inv_alph.cardinality(
                )  # should take into account the actual vertex...
                while removed_end:
                    removed_end = False
                    prefix = []
                    for e in self._signed_ends[a]:
                        prefix.append(e[:-1])
                    prefix_counts = dict(
                        (p, prefix.count(p)) for p in set(prefix))
                    for p in prefix_counts.keys():
                        p_opp = p[1:] if p[:1] == '-' else '-' + p
                        removed_ends = []
                        tails = []
                        if prefix_counts[p] == N - 1:
                            removed_end = True
                            for e in self._signed_ends[a]:
                                if e[:-1] == p:
                                    removed_ends.append(e)
                                    tails.append(e[-1:])
                            if p == '' or p == '-':
                                for aa in inv_alph:
                                    if aa not in tails:
                                        self._signed_ends[a].append(p_opp + aa)
                            else:
                                self._signed_ends[a].append(p)
                            for e in removed_ends:
                                self._signed_ends[a].remove(e)
                        if prefix_counts[
                                p] == N - 2 and p_opp in self._signed_ends[a]:
                            removed_end = True
                            for e in self._signed_ends[a]:
                                if e[:-1] == p:
                                    removed_ends.append(e)
                                    tails.append(e[-1:])
                            tails.append(inv_alph.inverse_letter(p[-1:]))
                            for aa in inv_alph:
                                if aa not in tails:
                                    self._signed_ends[a].append(p_opp + aa)
                            for e in removed_ends:
                                self._signed_ends[a].remove(e)
                            self._signed_ends[a].remove(p_opp)
Esempio n. 2
0
    def _build_endmap(self,consolidate=False):
        """
        Builds the map on ends for graph_map.  Called when Core is initialized.
        """
        alph=self._graph_map.domain()._alphabet
        inv_alph=self._inv_graph_map.domain()._alphabet
        FA=FreeGroup(alph)
        FB=FreeGroup(inv_alph)
        for x in self._graph_map.domain().edge_labels():
            X=alph.inverse_letter(x)
            self._signed_ends[x]=[]
            self._signed_ends[X]=[]

        for x in self._inv_graph_map.domain().edge_labels():
            X=inv_alph.inverse_letter(x)
            inv_image_x = self._inv_graph_map(x)
            vp='' # vanishing path
            for a in inv_image_x:
                A=alph.inverse_letter(a)
                if vp=='' or vp[-1]!=X: # coming from + side, no cancellation
                    self._signed_ends[a].append(vp + x)
                else: # coming from - side, cancels x
                    self._signed_ends[a].append('-' + vp) # - + vp #
                # add to vanishing path
                vp=str(FB.reduced_product(str(self._graph_map(A)),vp))
                # repeat for inverse, we've added to the vanishing path because we are
	  	# coming from the other side
                if vp=='' or vp[-1]!=X: # coming from - side, no cancellation
                    self._signed_ends[A].append('-' + vp + x) # - + vp + x
                else: # coming from + side, cancels x
                    self._signed_ends[A].append(vp)

        if consolidate:
            for a in self._signed_ends.keys():
                removed_end=True
                N=2*inv_alph.cardinality() # should take into account the actual vertex...
                while removed_end:
                    removed_end=False
                    prefix=[]
                    for e in self._signed_ends[a]:
                        prefix.append(e[:-1])
                    prefix_counts=dict((p,prefix.count(p)) for p in set(prefix))
                    for p in prefix_counts.keys():
                        p_opp = p[1:] if p[:1]=='-' else '-'+p
                        removed_ends=[]
                        tails=[]
                        if prefix_counts[p]==N-1:
                            removed_end=True
                            for e in self._signed_ends[a]:
                                if e[:-1]==p:
                                    removed_ends.append(e)
                                    tails.append(e[-1:])
                            if p=='' or p=='-':
                                for aa in inv_alph:
                                    if aa not in tails: self._signed_ends[a].append(p_opp+aa)
                            else: self._signed_ends[a].append(p)
                            for e in removed_ends: self._signed_ends[a].remove(e)
                        if prefix_counts[p]==N-2 and p_opp in self._signed_ends[a]:
                            removed_end=True
                            for e in self._signed_ends[a]:
                                if e[:-1]==p:
                                    removed_ends.append(e)
                                    tails.append(e[-1:])
                            tails.append(inv_alph.inverse_letter(p[-1:]))
                            for aa in inv_alph:
                                if aa not in tails: self._signed_ends[a].append(p_opp+aa)
                            for e in removed_ends: self._signed_ends[a].remove(e)
                            self._signed_ends[a].remove(p_opp)