def testUnionRename(self): from iegen import Relation from iegen.parser import PresParser prelation1=PresParser.parse_relation('{[a]->[ap]:a>10 and ap>20}') prelation2=PresParser.parse_relation('{[a]->[ap]:a<5 and ap<10}') prelation3=PresParser.parse_relation('{[a]->[ap]:a=7 and ap=14}') relation1=Relation('{[a]->[ap]:a>10 and ap>20}') relation2=Relation('{[b]->[bp]:b<5 and bp<10}') relation3=Relation('{[c]->[cp]:c=7 and cp=14}') unioned=relation1.union(relation2).union(relation3) unioned_res=Relation(relations=[prelation1,prelation2,prelation3]) self.failUnless(unioned==unioned_res,'%s!=%s'%(unioned,unioned_res)) prelation1=PresParser.parse_relation('{[a]->[ap]:a>10 and ap>20}') prelation2=PresParser.parse_relation('{[a]->[ap]:a<5 and ap<10}') prelation3=PresParser.parse_relation('{[a]->[ap]:a=7 and ap=14}') relation1=Relation('{[a]->[ap]:a>10 and ap>20}') relation2=Relation('{[b]->[bp]:b<5 and bp<10}') relation3=Relation('{[c]->[cp]:c=7 and cp=14}') unioned=unioned.union(relation1) unioned_res=Relation(relations=[prelation1,prelation2,prelation3]) self.failUnless(unioned==unioned_res,'%s!=%s'%(unioned,unioned_res))
def testUnionNonDestructive(self): from iegen import Relation relation1=Relation('{[a]->[a]}') relation2=Relation('{[b]->[b]}') unioned=relation1.union(relation2) self.failIf(unioned is relation1,'%s is %s'%(unioned,relation1)) self.failIf(unioned is relation2,'%s is %s'%(unioned,relation2))
def testUnion(self): from iegen import Relation from iegen.parser import PresParser prelation1=PresParser.parse_relation('{[a]->[a]:a>10}') prelation2=PresParser.parse_relation('{[b]->[b]:b>11}') relation1=Relation('{[a]->[a]:a>10}') relation2=Relation('{[b]->[b]:b>11}') unioned=relation1.union(relation2) unioned_res=Relation(relations=[prelation1,prelation2]) self.failUnless(unioned==unioned_res,'%s!=%s'%(unioned,unioned_res)) prelation1=PresParser.parse_relation('{[a]->[a]:a>10}') prelation2=PresParser.parse_relation('{[b]->[b]:b>11}') prelation3=PresParser.parse_relation('{[b]->[b]:b>11}') relation1=Relation('{[a]->[a]:a>10}') relation2=Relation('{[b]->[b]:b>11}') unioned=unioned.union(relation1) unioned_res=Relation(relations=[prelation1,prelation2,prelation3]) self.failUnless(unioned==unioned_res,'%s!=%s'%(unioned,unioned_res))
a4_1 = R_x0_x1.compose(a4_0) #print a4_1 #PrettyPrintVisitor().visit(a4_1) print print "\ta8_1 = R_x0_x1 compose a8_0 = " a8_1 = R_x0_x1.compose(a8_0) #print a8_1 #PrettyPrintVisitor().visit(a8_1) #### Loop Alignment print print "==== Loop Alignment" print "The transformation relation: " T_I0_to_I1 = Relation('{[c0, s, c0, i, c0] -> [c0, s, c0, j, c0] : c0=0 && j=sigma(i)}') T_I0_to_I1 = T_I0_to_I1.union( Relation('{[c0, s, c1, ii, x] -> [c0, s, c1, ii, x] : c0=0 && c1=1}') ) print "\tT_I0_to_I1 = " #PrettyPrintVisitor().visit(T_I0_to_I1) print print "Updating access relations due to T_I0_to_I1: " print print "\ta1_2 = a1_1 compose (inverse T_I0_to_I1)" a1_2 = a1_1.compose( T_I0_to_I1.inverse() ) #print a1_2 #PrettyPrintVisitor().visit(a1_2) print print "\ta4_2 = a4_1 compose (inverse T_I0_to_I1)" a4_2 = a4_1.compose( T_I0_to_I1.inverse() ) #print a4_2 #PrettyPrintVisitor().visit(a4_2) print
# Turned out this was another un-renaming bug. Issue #124 is now fixed. import iegen from iegen import Set from iegen import Relation from iegen import Symbolic import iegen.simplify iegen.simplify.register_inverse_pair('delta','delta_inv') from iegen.ast.visitor import PrettyPrintVisitor D_1_2 = Relation("{[c0,s,c1,i,c2] -> [c0,s,c3,ii,c2] : i = inter1(ii) && c1=0 && c2=0 && c0=0 && c3=1}") D_1_2 = D_1_2.union(Relation("{[c0,s,c1,i,c2] -> [c0,s,c3,ii,c2] : i = inter2(ii) && c1=0 && c2=0 && c0=0 && c3=1}")) print print "D_1_2 = ", D_1_2 PrettyPrintVisitor().visit(D_1_2) D_1_3 = D_1_2 print T_I0_to_I1 = Relation('{[c0, s, c0, i, c0] -> [c0, s, c0, j, c0] : c0=0 && j=sigma(i)}') T_I0_to_I1 = T_I0_to_I1.union( Relation('{[c0, s, c1, ii, x] -> [c0, s, c1, ii, x] : c0=0 && c1=1}') ) print "\tT_I0_to_I1 = " PrettyPrintVisitor().visit(T_I0_to_I1) print T_I1_to_I2 = Relation("{[c0,s,c0,i,c0] -> [c0,s,c0,i,c0] : c0=0 }") T_I1_to_I2 = T_I1_to_I2.union( Relation("{[c0,s,c1,ii,x] -> [c7,s,c8,j,x] : j = delta(ii) && c0=0 && c1=1 }")) print "T_I1_to_I2 = "
# compose_bug_136.py # import iegen from iegen import Set from iegen import Relation from iegen import Symbolic import iegen.simplify iegen.simplify.register_inverse_pair("delta", "delta_inv") from iegen.ast.visitor import PrettyPrintVisitor D_ST = Relation("{ [c0,i] -> [x,j] : i+-1*sigma(inter1(delta_inv(j)))=0 && c0=0 }") D_ST = D_ST.union(Relation("{ [c0,i] -> [x,j] : i+-1*sigma(inter2(delta_inv(j)))=0 && c0 = 0 }")) D_ST.compose(D_ST)
def testNoUnionSameObject(self): from iegen import Relation rel=Relation('{[a]->[a]}') rel.union(rel)
def testUnionDiffArity(self): from iegen import Relation relation1=Relation('{[]->[]}') relation2=Relation('{[a]->[a]}') relation1.union(relation2)
#print '___START___' #print 'R_x0_x1:',R_x0_x1 #print 'a8_0:',a8_0 a8_1 = R_x0_x1.compose(a8_0) #print 'R_x0_x1.compose(a8_0):',a8_1 #print '___END___' print a8_1 #PrettyPrintVisitor().visit(a8_1) #### Loop Alignment print print "==== Loop Alignment" print "The transformation relation: " T_I0_to_I1 = Relation('{[c0, s, c0, i, c0] -> [c0, s, c0, j, c0] : c0=0 && j=sigma(i)}') T_I0_to_I1 = T_I0_to_I1.union( Relation('{[c0, s, c1, ii, x] -> [c0, s, c1, ii, x] : c0=0 && c1=1}') ) print "\tT_I0_to_I1 = " print T_I0_to_I1 #PrettyPrintVisitor().visit(T_I0_to_I1) print print "Updating access relations due to T_I0_to_I1: " print print "\ta1_2 = a1_1 compose (inverse T_I0_to_I1)" #print '___START___' #print 'a1_1:',a1_1 #print 'T_I0_to_I1:',T_I0_to_I1 #print 'T_I0_to_I1.inverse():',T_I0_to_I1.inverse() a1_2 = a1_1.compose( T_I0_to_I1.inverse() ) #print 'a1_1.compose(T_I0_to_I1.inverse())',a1_2 #print '___END___' print 'a1_2 = a1_1.compose( T_I0_to_I1.inverse() ):'