source: git/dyn_modules/openmath/cas/singular.py @ 3c473c

spielwiese
Last change on this file since 3c473c was 3c473c, checked in by Kai Krüger <krueger@…>, 14 years ago
rename directory modules to dyn_modules anticipating "modules" directory for cmake. git-svn-id: file:///usr/local/Singular/svn/trunk@13033 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 4.8 KB
Line 
1from Singular import *
2from interpreter import *
3from objects import *
4from util import create_ring
5import cd.polyd, cd.primdec, cd.list1
6from cd.polyd import DMPsym, SDMPsym, termsym, lpsym,dpsym,poly_ring_dsym, DMPLsym, implementation, groebnerdsym
7from cd.fieldname1 import Qsym as Rationals
8singular=SingularGlobalsProxy()
9import cd.primdec
10class SingularException(Exception):
11  pass
12
13def poly2OM(p):
14  terms=[term2OM(t) for t in p]
15  return OMA(SDMPsym,terms)
16
17def poly_in_ring2OM(p):
18  pe=poly2OM(p)
19  r=ring2OM(p.ring())
20  return OMA(DMPsym,[r,pe])
21 
22def gb2OM(gb):
23  i=ideal2OM(gb)
24  o=ordering2OM(gb.ring())
25  return OMA(groebnerdsym,[o,i])
26orderingTable={
27  "lp": lpsym,
28  "dp": dpsym
29}
30OrderingTableBack={}
31for k in orderingTable:
32  OrderingTableBack[orderingTable[k]]=k
33
34def ordering2OM(r):
35  rl=singular.ringlist(r)
36  return orderingTable[rl[2][0][0]]
37
38def encode_field(r):
39  char=singular.char(r)
40  if char==0 and singular.npars(r)==0:
41    return Rationals
42  else:
43    raise SingularException("unknown field to encode")
44
45def ideal2OM(i):
46  r=ring2OM(i.ring())
47  return OMA(DMPLsym,[r]+[poly2OM(p) for p in i])
48def ring2OM(r):
49    nv=singular.nvars(r)
50    f=encode_field(r)
51    return OMA(poly_ring_dsym,[f,nv])   
52
53def OM2ring(ring_desc, ordering="dp"):
54  assert isinstance(ring_desc, OMA)
55  if (ring_desc.args[0]==Rationals):
56    i=ring_desc.args[1]
57    return create_ring(char=0, nvars=i, ordering=ordering)
58 
59  raise SingularException("ring not supported")
60def OM2poly(poly_desc):
61  """assumes the right ring is set"""
62  assert isinstance(poly_desc, OMA)
63  terms=[OM2term(t) for t in poly_desc.args]
64  res=Polynomial(Number(0))
65  for t in terms:
66    res=res+t
67    #res+=t
68  return res
69def OM2term(term_desc):
70  assert isinstance(term_desc, OMA)
71  assert len(term_desc.args)==singular.nvars(Ring())+1
72  assert isinstance(term_desc.args[0], int)
73 
74  coef=Number(term_desc.args[0])
75  exp=IntVector()
76  for e in term_desc.args[1:]:
77    assert isinstance(e,int)
78    exp.append(e)
79  #print coef, polynomial(exp)
80  return coef*Polynomial(exp)
81
82def OM2ideal_raw(dmpl):
83  """assumes that the right ring is set"""
84  i=Ideal()
85  assert len(dmpl.args)>=1
86  ps=[OM2poly(d) for d in dmpl.args[1:]]
87  for p in ps:
88    i.append(p)
89  return i
90def OM2ideal(dmpl,o):
91  assert len(dmpl.args)>=1
92  return OM2ring(dmpl.args[0], ordering=OrderingTableBack[o])
93
94leadcoef=singular.leadcoef
95leadexp=singular.leadexp
96def term2OM(t):
97  """FIXME: ugly because it uses slow interpreter interface and setting of rings for this should be automatically"""
98  #t.ring().set()
99  #exponents=leadexp(t)
100  #c=leadcoef(t)
101  exponents=t.leadExp()
102  c=t.leadCoef()
103  exponents=[i for i in exponents]
104  return OMA(termsym,[int(str(c))]+exponents)
105def groebnerfunc(ordering, dmpl):
106
107  r=OM2ring(dmpl.args[0], OrderingTableBack[ordering])
108  r.set()
109  i=OM2ideal_raw(dmpl)
110  res=singular.groebner(i)
111  #FIXME: singular.groebner does not work may because of bad ring changes
112  #FIXME: increase reference to ring in ideal, polynomial class
113  return gb2OM(res)
114implementation.groebner=groebnerfunc
115
116def dmplQ(a):
117    if isinstance(a,OMA) and a.func==DMPLsym:
118        return True
119    else:
120        return False
121
122
123def input_convert(f):
124    def my2OM(a):
125        """FIXME: very dirty"""
126        global save_ring
127
128
129        if (dmplQ(a)):
130            dmpl=a
131            r=OM2ring(dmpl.args[0])
132            r.set()
133            i=OM2ideal_raw(dmpl)
134            save_ring=r
135            return i
136       
137        return a
138           
139    def wrapper(*args):
140        return f(*[my2OM(a) for a in args])
141   
142   
143    wrapper.__name__=f.__name__
144    return wrapper
145   
146def output_convert(f):
147    def my2om(a):
148        """FIXME: very dirty"""
149        global save_ring
150
151        if isinstance(a,Ideal):
152            return ideal2OM(a)
153        if (isinstance(a,list)):
154            return cd.list1.list2OM([my2om(a2) for a2 in a])
155       
156        return a
157           
158    def wrapper(*args):
159        return my2om(f(*args))
160   
161   
162    wrapper.__name__=f.__name__
163    return wrapper
164   
165def min_ass_func(dmpl):
166    r=OM2ring(dmpl.args[0])
167    r.set()
168    i=OM2ideal_raw(dmpl)
169    l=singular.minAssGTZ(i)
170    return cd.list1.OM2list([ideal2OM(i) for i in l])
171@input_convert
172def min_ass_func2(i):
173
174    l=singular.minAssGTZ(i)
175    return cd.list1.list2OM([ideal2OM(i) for i in l])
176   
177
178def singular_default_converter(f):
179    return output_convert(input_convert(f))
180cd.primdec.implementation.converter=singular_default_converter
181#cd.primdec.implementation.minAss=min_ass_func2
182cd.primdec.implementation.minAss=singular.minAssGTZ#input_convert(output_convert(singular.minAssGTZ))
183
184cd.primdec.implementation.minAssGTZ=singular.minAssGTZ
185#input_convert(output_convert(singular.minAssGTZ))
186
187cd.primdec.implementation.primdecGTZ=singular.primdecGTZ#input_convert(output_convert(singular.primdecGTZ))
188cd.primdec.implementation.radical=singular.radical
189
190optimize(poly2OM)
191optimize(term2OM)
Note: See TracBrowser for help on using the repository browser.