source: git/Singular/cnf2ideal.py @ d420d9

spielwiese
Last change on this file since d420d9 was d420d9, checked in by Michael Brickenstein <bricken@…>, 18 years ago
*bricken: much enhanced git-svn-id: file:///usr/local/Singular/svn/trunk@9344 2c84dea3-7e68-4137-9b89-c4e89433aadc
  • Property mode set to 100644
File size: 5.1 KB
Line 
1import re
2import sys
3from probstat import Cartesian
4from optparse import OptionParser
5from itertools import repeat
6from string import Template
7from re import sub
8parser = OptionParser()
9PB="PB"
10SING="SING"
11ALL="all"
12parser.add_option("-f", "--format",
13                  action="store", dest="format", type="string", default=ALL,
14                  help="select format from SING/PB")
15#parser.add_option("-c", "--cnf",
16#                  action="store", dest="cnf", type="string", default=None,
17#                  help="select input cnf")
18parser.add_option("-i", "--invert",
19                  action="store_true", dest="invert", default=False,
20                  help="invert mapping to true/false")
21
22def iscomment(line):
23    return re.match("^c",line)
24
25def isheader(line):
26    return re.match("^p",line)
27
28
29def process_input(source):
30    global vars
31    global clauses
32    input_numbers=[]
33    for line in source:
34        if (not(iscomment(line) or isheader(line))):
35            if (re.match("^%",line)):
36                break
37            line=re.sub("\n","", line)
38            line=re.sub("^\s+","",line)
39
40            ind=[int(s) for s in line.split()]
41
42            input_numbers+=ind
43           
44        else:
45            if(isheader(line)):
46                m=re.match("^p cnf\s+(?P<vars>\d+)\s+(?P<clauses>\d+)\s*\n",line)
47                assert(m)
48                #print "vars=", m.group("vars")
49                #print "clauses=",m.group("clauses")
50                vars=int(m.group("vars"))
51                clauses=int(m.group("clauses"))
52    return input_numbers
53
54
55def gen_clauses(input_numbers):
56    i=0
57    erg=[]
58    act=[]
59    for i in input_numbers:
60        if (i==0):
61            if act:
62                erg.append(act)
63                act=[]
64        else:
65            act.append(i)
66    return erg
67   
68def xor(a,b):
69    return (a and not b) or (b and not a)
70def gen_poly_Singular(clause):
71    def num2factor(f):
72        assert(f!=0)
73        if (f>0):
74            return "".join(["x(",str(f),")"])
75        else:
76            return "".join(["(1-x(",str(-f),"))"])
77    if clause:
78        return("*".join( [num2factor(f) for f in clause]))
79
80def gen_Singular(clauses):
81    ring_def="".join(["ring r=2,x(1..",str(vars),"),lp;"])
82    polys=[gen_poly_Singular(c) for c in clauses]
83    polys.extend(["".join(["x(",str(i),")*(x(",str(i)+")-1)"]) for i in xrange(1,vars+1)])
84    ideal="".join(["ideal i=",",\n".join(polys),";"])
85    #command='LIB "digimult.lib";\n option(prot);\n satisfiable(i);'
86    command='option(redTail);\noption(prot);\nstd(i);\n'
87    return "\n".join([ring_def,ideal,command,"$;\n"])
88   
89def gen_poly_PB(clause):
90    def term2string(t):
91        if len(t)==0:
92            return "1"
93        return "*".join(["x("+str(v) +")" for v in t])
94   
95    vars=tuple([v for v in clause if v>0])
96    negated_vars=tuple([-v for v in clause if v<0])
97    if len(negated_vars)>0:
98        terms=[tuple([negated_vars[i] for (i,j) in enumerate(combination) if j==1])\
99            + vars for combination\
100            in Cartesian(list(repeat([0,1],len(negated_vars))))]
101    else:
102        terms=[vars]
103    res="+".join([term2string(t) for t in terms])
104    return res
105    #add_vars=[negated_var[i] for (i,j) in enumerate(combination) if j==1]
106   
107def gen_PB(clauses):
108    start_str=Template("""from PyPolyBoRi import *
109r=Ring($vars)
110def x(i):
111    return Monomial(Variable(i))
112ideal=\
113[
114""")
115    start_str=start_str.substitute(vars=vars)
116   
117   
118
119    poly_str=",\\\n   ".join([gen_poly_PB(c) for c in clauses])
120    end_str="""]
121ideal=[Polynomial(p) for p in ideal]
122"""
123    return start_str+poly_str+end_str
124
125from re import sub
126def  convert_file_PB(cnf,invert):
127    clauses=gen_clauses(process_input(open(cnf)))
128    #clauses=gen_clauses(process_input(sys.stdin))
129    if invert:
130        clauses=[[-i for i in c] for c in clauses]
131    #
132#    print clauses
133    #print gen_Singular(clauses)
134    out_file_name=cnf[:-3]+"py"
135    if invert:
136        out_file_name=out_file_name[:-3]+"Inverted.py"
137    out_file_name=sub("-","_",out_file_name)
138    out=open(out_file_name,"w")
139    out.write(gen_PB(clauses))
140    out.close()
141def  convert_file_Singular(cnf,invert):
142    clauses=gen_clauses(process_input(open(cnf)))
143   
144    #clauses=gen_clauses(process_input(sys.stdin))
145    if invert:
146        clauses=[[-i for i in c] for c in clauses]
147    #
148#    print clauses
149    #print gen_Singular(clauses)
150    out_file_name=cnf[:-3]+"sing"
151    if invert:
152        out_file_name=out_file_name[:-5]+"Inverted.sing"
153    out=open(out_file_name,"w")
154    out.write(gen_Singular(clauses))
155    out.close()
156   
157   
158if __name__=='__main__':
159    (options, args) = parser.parse_args()
160    #clauses=gen_clauses(process_input(open(options.cnf)))
161    #clauses=gen_clauses(process_input(sys.stdin))
162    #if options.invert:
163    #    clauses=[[-i for i in c] for c in clauses]
164    #
165#    print clauses
166    #print gen_Singular(clauses)
167    #out_file_name=options.cnf[:-3]+"py"
168    #if options.invert:
169    #    out_file_name=out_file_name[:-3]+"Inverted.py"
170    #out=open(out_file_name,"w")
171    #out.write(gen_PB(clauses))
172    #out.close()
173    for a in args:
174        if options.format==ALL:
175            convert_file_PB(a, options.invert)
176            convert_file_Singular(a, options.invert)
177           
Note: See TracBrowser for help on using the repository browser.