Changeset 8f643b7 in git
- Timestamp:
- Mar 21, 2006, 9:21:38 AM (18 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- 28b7e70fb7504bfa91d72ad1ee789e50a08f7e84
- Parents:
- 9a7b03d261325d1fc155f5625fe1867b6ef6432c
- Location:
- modules/python
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
modules/python/symm.py
r9a7b03 r8f643b7 1 1 from probstat import Cartesian 2 from itertools import repeat,imap 3 class chainmap(object): 4 """this class represents an equivalent relation, 5 which is implemented by repeated evaluatation of a map 6 c[n]=m means that n is equivalent to m""" 7 def __init__(self): 8 self.mydict={} 9 def canonical(self,var): 10 while var in self.mydict: 11 var=self.mydict[var] 12 return var 13 def all_rewritings(self,var): 14 pass 15 def rewrite(self, a,b): 16 a=self.canonical(a) 17 b=self.canonical(b) 18 if not a==b: 19 self.mydict[a]=b 20 def __getitem__(self,key): 21 return self.canonical(key) 22 def __setitem__(self, val, key): 23 self.rewrite(val,key) 2 from itertools import repeat,imap, ifilter 3 from util import EquivalenceRelation 4 24 5 class modPNumber: 25 6 """simple class for Turaev/Viro colors, … … 40 21 return str(self.val) 41 22 23 colors=3 24 value_range=[modPNumber(i,colors) for i in xrange(colors)] 42 25 43 colors=3 44 def constr_value_range(n): 45 return [modPNumber(i,n) for i in xrange(n)] 46 value_range=constr_value_range(colors) 26 wrel=EquivalenceRelation() 27 for i in value_range: 28 wrel[i]=-i 29 weights_canonical_to_index=dict((weight,i+1) \ 30 for (i,weight) in enumerate(ifilter( \ 31 wrel.isCanonical,value_range))) 32 wtrans=dict((weight,weights_canonical_to_index[wrel.canonical(weight)]) for weight in \ 33 value_range) 34 weights=max([wtrans[i] for i in weights_canonical_to_index]) 47 35 48 chain=chainmap()49 l12=[1,2]50 36 51 37 def constr_variations(): 52 38 return imap(tuple,Cartesian(list(repeat(value_range,6)))) 39 relation=EquivalenceRelation() 53 40 for (a,b,c,d,e,f) in constr_variations(): 54 chain[(a,b,c,d,e,f)]=(b,c,a,f,-d,-e) 55 chain[(a,b,c,d,e,f)]=(a,-d,-e,-b,-c,-f) 56 57 class chaintrans(object): 58 def __init__(self, chain,full): 59 self.table={} 60 self.i=1 61 full=list(full) 62 for c in full: 63 if not c in chain.mydict: 64 self.insert(c) 65 for c in full: 66 self.table[c]=self.table[chain[c]] 67 def __getitem__(self, key): 68 return self.table[key] 69 def insert(self,key): 70 self.table[key]=self.i 71 self.i=self.i+1 72 def __str__(self): 73 return str(self.table) 74 75 76 77 vartrans=chaintrans(chain, constr_variations()) 78 #we only needed this class for construction, can replace it by a function 79 vartrans=vartrans.table 80 del chain 81 82 #weights=2 41 relation[(a,b,c,d,e,f)]=(b,c,a,f,-d,-e) 42 relation[(a,b,c,d,e,f)]=(a,-d,-e,-b,-c,-f) 43 canonical_to_index=dict((symbol,weights+i+1) for (i,symbol) in \ 44 enumerate(ifilter( \ 45 relation.isCanonical,constr_variations()))) 46 vartrans=dict((symbol,canonical_to_index[relation.canonical(symbol)]) for symbol in \ 47 constr_variations()) 48 symbols=max([vartrans[i] for i in canonical_to_index]) 83 49 84 50 from interpreter import * … … 88 54 singular_var=singular.var 89 55 90 def si ngvar(v):56 def six_j_symbol(v): 91 57 i=vartrans[v]+weights 92 return var table[i-1]58 return var_cache[i-1] 93 59 94 wmap=chainmap()95 for i in value_range:96 wmap[i]=-i97 wtrans=chaintrans(wmap,value_range)98 wtrans=wtrans.table99 symbols=max([vartrans[i] for i in vartrans])100 weights=max([wtrans[i] for i in wtrans])101 102 del wmap103 60 104 61 def w(i): 105 return var table[wtrans[i]-1]62 return var_cache[wtrans[i]-1] 106 63 r=create_ring(char=0,nvars=weights+symbols) 107 64 r.set() … … 111 68 acc=Polynomial(0) 112 69 for p in l: 113 acc=acc+p 114 70 acc+=p 115 71 return acc 116 72 117 73 118 var table=[singular_var(x+1) for x in range(singular.nvars(Ring()))]74 var_cache=[singular_var(x+1) for x in range(singular.nvars(Ring()))] 119 75 for (j1,j2,j3,j4,j5,j6,j7,j8,j9) in Cartesian(list(repeat(value_range,9))): 120 76 p=\ 121 si ngvar((j1,j2,j3,j7,j8,j9))*\122 si ngvar((j4,j5,j6,-j7,-j8,-j9))+\77 six_j_symbol((j1,j2,j3,j7,j8,j9))*\ 78 six_j_symbol((j4,j5,j6,-j7,-j8,-j9))+\ 123 79 Number(-1)*\ 124 80 polysum([\ 125 w(j)*si ngvar((j,j1,j2,-j4,-j5,j7))*\126 si ngvar((j,j2,j3,-j5,-j6,j9))*127 si ngvar((j,j3,j1,-j6,-j4,-j8))\81 w(j)*six_j_symbol((j,j1,j2,-j4,-j5,j7))*\ 82 six_j_symbol((j,j2,j3,-j5,-j6,j9))* 83 six_j_symbol((j,j3,j1,-j6,-j4,-j8))\ 128 84 for j in value_range]) 129 85 myideal.append(p) 130 86 87 88 back_table_v=dict((canonical_to_index[s],s) for s\ 89 in canonical_to_index) 90 back_table_w=dict((weights_canonical_to_index[w],w) for w\ 91 in weights_canonical_to_index) 92 back_table_joint=dict(back_table_v) 93 back_table_joint.update(back_table_w) 94 print "back", back_table_joint 95 print "original length",len(myideal) 131 96 print "now calculating" 132 133 print "original length",len(myideal)134 97 myideal=singular.simplify(myideal,4) 135 98 print "simplified", len(myideal) 136 99 gb=singular.slimgb(myideal) 137 100 print gb 138 print len(gb), "GB Elemente"101 print len(gb), "GB elements" -
modules/python/util.py
r9a7b03 r8f643b7 16 16 l=[char,varNames,[[ordering,degvec],["C",modulweights]], Ideal()] 17 17 return singular.ring(l) 18 18 19 20 class EquivalenceRelation(object): 21 """this class represents an equivalent relation, 22 which is implemented by repeated evaluatation of a map 23 c[n]=m means that n is equivalent to m""" 24 def __init__(self): 25 self.mydict={} 26 def canonical(self,var): 27 while var in self.mydict: 28 var=self.mydict[var] 29 return var 30 def isCanonical(self,var): 31 if self.canonical(var)==var: 32 return True 33 else: 34 return False 35 def all_rewritings(self,var): 36 pass 37 def rewrite(self, a,b): 38 a=self.canonical(a) 39 b=self.canonical(b) 40 if not a==b: 41 self.mydict[a]=b 42 def __getitem__(self,key): 43 return self.canonical(key) 44 def __setitem__(self, val, key): 45 self.rewrite(val,key) 46 47 48 class chaintrans(object): 49 def __init__(self, chain,full): 50 self.table={} 51 self.i=1 52 full=list(full) 53 for c in full: 54 if not c in chain.mydict: 55 self.insert(c) 56 for c in full: 57 self.table[c]=self.table[chain[c]] 58 def __getitem__(self, key): 59 return self.table[key] 60 def insert(self,key): 61 self.table[key]=self.i 62 self.i=self.i+1 63 def __str__(self): 64 return str(self.table)
Note: See TracChangeset
for help on using the changeset viewer.