def transitive(self, other=None): r""" TBD """ if other is None: raise ValueError, "Enter a reduction map as a parameter" elif self.get_B() != other.get_A(): raise ValueError, "These are not good candidate sets for reduction mapping" else: dic_h = dict() dic_h0 = dict() A = self.get_A() B = self.get_B() C = other.get_B() f = self.get_SRWP() f0 = self.get_SPWP() g = other.get_SRWP() g0 = other.get_SPWP() for elm in A: if elm in fixed_points(f): if f0(elm) in fixed_points(g): dic_h0[elm] = g0(f0(elm)) dic_h[elm] = elm else: dic_h[elm] = inverse(f0)(g(f0(elm))) else: dic_h[elm] = f(elm) h = FiniteSetMaps(A, A).from_dict(dic_h) h0 = FiniteSetMaps(CombinatorialScalarWrapper(dic_h0.keys()), C).from_dict(dic_h0) return ReductionMaps(A, C, h, h0)
def transitive(self,other=None): r""" TBD """ if other is None: raise ValueError, "Enter a reduction map as a parameter" elif self.get_B() != other.get_A(): raise ValueError, "These are not good candidate sets for reduction mapping" else: dic_h = dict() dic_h0 = dict() A = self.get_A() B = self.get_B() C = other.get_B() f = self.get_SRWP() f0 = self.get_SPWP() g = other.get_SRWP() g0 = other.get_SPWP() for elm in A: if elm in fixed_points(f): if f0(elm) in fixed_points(g): dic_h0[elm] = g0(f0(elm)) dic_h[elm] = elm else: dic_h[elm] = inverse(f0)(g(f0(elm))) else: dic_h[elm] = f(elm) h = FiniteSetMaps(A,A).from_dict(dic_h) h0 = FiniteSetMaps(CombinatorialScalarWrapper(dic_h0.keys()),C).from_dict(dic_h0) return ReductionMaps(A,C,h,h0)
def reverse(self): if self.get_A().get_size() != self.get_B().get_size(): raise ValueError, "Reduction direction cannot be reversed unless scalars are equivalent" else: A = self.get_B() B = self.get_A() f0 = inverse(self.get_SPWP()) dic_f = dict() for elm in A: dic_f[elm] = elm f = FiniteSetMaps(A, A).from_dict(dic_f) return ReductionMaps(A, B, f, f0)
def reverse(self): if self.get_A().get_size() != self.get_B().get_size(): raise ValueError, "Reduction direction cannot be reversed unless scalars are equivalent" else: A = self.get_B() B = self.get_A() f0 = inverse(self.get_SPWP()) dic_f = dict() for elm in A: dic_f[elm] = elm f = FiniteSetMaps(A,A).from_dict(dic_f) return ReductionMaps(A,B,f,f0)
def confluence(self, other=None): r""" Returns the reduction of C to B, where the usage is: r1.confluence(r2), and r1 maps A to B, B fully cancelled, and r2 maps A to C. """ if other is None: raise ValueError, "Enter a redution map as a parameter" elif self.get_A() != other.get_A(): raise ValueError, """ "A" """ " sets have to match" elif not (self.get_B().is_fully_cancelled()): raise ValueError, """ "B" """ " on the left is not fully cancelled" else: dic_h = dict() dic_h0 = dict() A = self.get_A() B = self.get_B() C = other.get_B() f = self.get_SRWP() f0 = self.get_SPWP() g = other.get_SRWP() g0 = other.get_SPWP() fxd_f = fixed_points(self.get_SRWP()) fxd_g = fixed_points(other.get_SRWP()) for c in C: x = inverse(g0)(c) while True: if x in fxd_f: #a fixed point of h dic_h[c] = c dic_h0[c] = f0(x) break else: x = f(x) if x in fxd_g: #not a fixed point of h dic_h[c] = g0(x) break else: x = g(x) h = FiniteSetMaps(C, C).from_dict(dic_h) h0 = FiniteSetMaps(CombinatorialScalarWrapper(dic_h0.keys()), B).from_dict(dic_h0) return ReductionMaps(C, B, h, h0)
def confluence(self,other=None): r""" Returns the reduction of C to B, where the usage is: r1.confluence(r2), and r1 maps A to B, B fully cancelled, and r2 maps A to C. """ if other is None: raise ValueError, "Enter a redution map as a parameter" elif self.get_A() != other.get_A(): raise ValueError, """ "A" """ " sets have to match" elif not(self.get_B().is_fully_cancelled()): raise ValueError, """ "B" """ " on the left is not fully cancelled" else: dic_h = dict() dic_h0 = dict() A = self.get_A() B = self.get_B() C = other.get_B() f = self.get_SRWP() f0 = self.get_SPWP() g = other.get_SRWP() g0 = other.get_SPWP() fxd_f = fixed_points(self.get_SRWP()) fxd_g = fixed_points(other.get_SRWP()) for c in C: x = inverse(g0)(c) while True: if x in fxd_f: #a fixed point of h dic_h[c] = c dic_h0[c] = f0(x) break else: x = f(x) if x in fxd_g: #not a fixed point of h dic_h[c]=g0(x) break else: x = g(x) h = FiniteSetMaps(C,C).from_dict(dic_h) h0 = FiniteSetMaps(CombinatorialScalarWrapper(dic_h0.keys()),B).from_dict(dic_h0) return ReductionMaps(C,B,h,h0)