def getLocalDAStructure(self): """Returns the local type DA structure associated to the anti-braid resolution. """ if self.is_degenerate: if self.c1 == 0: patterns_raw = self._get_patterns_bottom() else: assert self.c2 == self.n - 1 patterns_raw = self._get_patterns_top() else: patterns_raw = self._get_patterns_middle() arrow_patterns = {} for pattern in patterns_raw: start_class, end_class = pattern[0], pattern[1] coeffs_a = [] for i in range(2, len(pattern)-1): coeffs_a.append(self.local_pmc.sd(pattern[i])) key = (start_class, end_class, tuple(coeffs_a)) if key not in arrow_patterns: arrow_patterns[key] = [] arrow_patterns[key].append(self.local_pmc.sd(pattern[-1])) # Now start construction of the local DA structure. alg = LocalStrandAlgebra(F2, self.local_pmc) local_c_pair = 0 # Compute the set of local generators. Generators of class 0 has # idempotents (l_idem, r_idem) where l_idem has the c_pair and # r_idem has one of the u or d pairs (with the rest being the same). # Generators of class 1 and 2 has l_idem = r_idem such that c_pair # is in both. if self.is_degenerate: single_idems = [1] # local p_pair da_idems_0 = [([0], [1])] else: # Non-degenerate case single_idems = [1, 2] # local d_pair and local u_pair da_idems_0 = [([0], [1]), ([0], [2]), ([0, 1], [1, 2]), ([0, 2], [1, 2])] # class 0 local_da = LocalDAStructure( F2, alg, alg, single_idems1 = single_idems, single_idems2 = single_idems) for i in range(len(da_idems_0)): # class 0 l_idem, r_idem = da_idems_0[i] local_da.addGenerator(SimpleDAGenerator( local_da, LocalIdempotent(self.local_pmc, l_idem), LocalIdempotent(self.local_pmc, r_idem), "0_%d" % i)) all_idems = subset(range(self.local_pmc.num_pair)) # class 1 and 2 for i in range(len(all_idems)): idem = LocalIdempotent(self.local_pmc, all_idems[i]) if local_c_pair in idem: local_da.addGenerator( SimpleDAGenerator(local_da, idem, idem, "1_%d" % i)) local_da.addGenerator( SimpleDAGenerator(local_da, idem, idem, "2_%d" % i)) mod_gens = local_da.getGenerators() # Have to take care of u_map. It is sufficient to know that u_map musst # preserve class of generators. for i in range(len(single_idems)): idem = single_idems[i] for local_gen in mod_gens: idem1, idem2 = local_gen.idem1, local_gen.idem2 if idem in idem1 and idem in idem2: # local_gen is eligible for u_maps[i] target_idem1 = idem1.removeSingleHor([idem]) target_idem2 = idem2.removeSingleHor([idem]) target_gen = [target for target in mod_gens if target.idem1 == target_idem1 and target.idem2 == target_idem2 and target.name[0] == local_gen.name[0]] assert len(target_gen) == 1 local_da.add_u_map(i, local_gen, target_gen[0]) # Check all u_map has been filled. local_da.auto_u_map() # Add arrows according to arrow_pattern. for key in arrow_patterns.keys(): start_class, end_class, coeffs_a = key if len(coeffs_a) == 1 and coeffs_a[0].isIdempotent(): continue for coeff_d in arrow_patterns[key]: used = False for x, y in itertools.product(mod_gens, mod_gens): if x.name[0] == "%d" % start_class and \ y.name[0] == "%d" % end_class and \ DAStructure.idemMatchDA(x, y, coeff_d, coeffs_a): local_da.addDelta(x, y, coeff_d, coeffs_a, 1) used = True if not used: print "Warning: unused arrow: %s %s" % (coeffs_a, coeff_d) return local_da
def getLocalDAStructure(self): """Returns the local type DA structure associated to this simple cobordism. """ # Construct arrow_patterns if self.case == self.MIDDLE: patterns_raw = self._patterns_middle() else: patterns_raw = self._patterns_next_bottom() arrow_patterns = dict() for pattern in patterns_raw: start_class, end_class = pattern[0], pattern[1] coeffs_a = [] for i in range(2, len(pattern)-1): coeffs_a.append(self.local_pmc2.sd(pattern[i])) key = (start_class, end_class, tuple(coeffs_a)) if key not in arrow_patterns: arrow_patterns[key] = [] arrow_patterns[key].append(self.local_pmc1.sd(pattern[-1])) alg1 = LocalStrandAlgebra(F2, self.local_pmc1) alg2 = LocalStrandAlgebra(F2, self.local_pmc2) local_da = LocalDAStructure(F2, alg1, alg2) # The original part da_idems = [([], [2]), ([0], [0, 2])] for i in range(len(da_idems)): l_idem, r_idem = da_idems[i] local_da.addGenerator(SimpleDAGenerator( local_da, LocalIdempotent(self.local_pmc1, l_idem), LocalIdempotent(self.local_pmc2, r_idem), "0_%d" % i)) # Part added due to finger-push da_idems_id = [([], [1]), ([0], [0, 1])] for i in range(len(da_idems_id)): l_idem, r_idem = da_idems_id[i] for gen_type in [1, 2]: local_da.addGenerator(SimpleDAGenerator( local_da, LocalIdempotent(self.local_pmc1, l_idem), LocalIdempotent(self.local_pmc2, r_idem), "%d_%d" % (gen_type, i))) mod_gens = local_da.getGenerators() # Manually take care of u_maps single_idems1 = local_da.single_idems1 single_idems2 = local_da.single_idems2 for i in range(len(single_idems1)): i1, i2 = single_idems1[i], single_idems2[i] for local_gen in mod_gens: idem1, idem2 = local_gen.idem1, local_gen.idem2 if i1 in idem1 and i2 in idem2: # local_gen is eligible for u_maps[i] target_idem1 = idem1.removeSingleHor([i1]) target_idem2 = idem2.removeSingleHor([i2]) target_gen = [target for target in mod_gens if target.idem1 == target_idem1 and target.idem2 == target_idem2 and target.name[0] == local_gen.name[0]] assert len(target_gen) == 1 local_da.add_u_map(i, local_gen, target_gen[0]) # Check all u_map have been filled local_da.auto_u_map() # Add arrows according to arrow_pattern for key in arrow_patterns.keys(): start_class, end_class, coeffs_a = key if len(coeffs_a) == 1 and coeffs_a[0].isIdempotent(): continue for coeff_d in arrow_patterns[key]: used = False for x, y in itertools.product(mod_gens, mod_gens): if x.name[0] == "%d" % start_class and \ y.name[0] == "%d" % end_class and \ DAStructure.idemMatchDA(x, y, coeff_d, coeffs_a): local_da.addDelta(x, y, coeff_d, coeffs_a, 1) used = True if not used: print "Warning: unused arrow: %s %s" % \ (coeffs_a, coeff_d) return local_da