Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

Random errors when using Singular via Sage

Hello everyone,

I'd like to use Singulars capabilities in solving systems of polynomial equations, however I regularly obtain errors of Singular not recognizing the ring, that is created when executing the solve() command from the solve.lib Singular package. It seems somehow random to me, because the error only appears at about 30% of the time running to programm, so just giving it another try (without making any changes to the code) results in the desired result most of the time.

Here is my code:

C.<x, y> = PolynomialRing(QQ)
f = x^2 +y^2
epsilon = 1
# suggested by "rburning" to my question 'Passing functions to Singular'
# because I need to split f=f1+i*f2 in real and imaginary part
S.<x_1,x_2,y_1,y_2,i> = PolynomialRing(QQ)
F = f.subs({x: x_1 + i*x_2, y: y_1 + i*y_2}).reduce([i^2+1])
f1, f2 = F.polynomial(i).coefficients()
R = singular.ring(0,'(x_1,x_2,y_1,y_2)', 'lp')
g1 = singular.new(str(f1))
g2 = singular.new(str(f2))
g3 = singular.new('x_1^2 + x_2^2 +y_1^2+y_2^2 -' + str(epsilon) + '^2')
# creating the first ideal
I = singular.ideal(g1, g2, g3)
singular.lib("primdec.lib")
singular.lib("solve.lib")
# obtain the simplified components of the solution
components = I.primdecGTZ()
k1_1 = components[1][2][1]
k1_2 = components[1][2][2]
k1_3 = components[1][2][3]
singular.setring(R)
# creating a new ideal containing only the first component
H = singular.ideal(str(k1_1),str(k1_2),str(k1_3))
singular.setring(R)
# I now add another constraint to get two real solutions
# sphere around a point close to the solution
J = singular.ideal(H, '(x_1-0)^2 + (x_2+985/1393)^2 +(y_1-985/1393)^2+(y_2-0)^2 -1/10^2')
T = singular.solve(J)
singular.setring(T)
print(singular.eval('SOL'))

It might seem complicated to create that many Ideals but it is necessary because some of them are needed more often. Executing it 10 times results in 2 to 3 errors of the following kind:

SingularError                             Traceback (most recent call last)
<ipython-input-55-da8b511c4e72> in <module>()
    28 J = singular.ideal(H, '(x_1-0)^2 + (x_2+985/1393)^2 +(y_1-985/1393)^2+(y_2-0)^2 -1/10^2')
    29 T = singular.solve(J)
->  30 singular.setring(T)
    31 print(singular.eval('SOL'))

 /opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/interfaces/singular.py in set_ring(self, R)
    1097         if not isinstance(R, SingularElement):
    1098             raise TypeError("R must be a singular ring")
->  1099         self.eval("setring %s; short=0"%R.name(), allow_semicolon=True)
    1100 
    1101     setring = set_ring

/opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/interfaces/singular.py in eval(self, x, allow_semicolon,      strip, **kwds)
    657         # Singular actually does use that string
    658         if s.find("error occurred") != -1 or s.find("Segment fault") != -1:
 -> 659             raise SingularError('Singular error:\n%s'%s)
    660 
    661         if get_verbose() > 0:

SingularError: Singular error:
   ? sage2437 is no name of a ring/qring
   ? error occurred in or before STDIN line 746: `setring sage2437; short=0;

Thanks for your help! Greetings Paul

Random errors when using Singular via Sage

Hello everyone,

I'd like to use Singulars capabilities in solving systems of polynomial equations, however I regularly obtain errors of Singular not recognizing the ring, that is created when executing the solve() command from the solve.lib Singular package. It seems somehow random to me, because the error only appears at about 30% of the time running to programm, so just giving it another try (without making any changes to the code) results in the desired result most of the time.

Here is my code:

C.<x, y> = PolynomialRing(QQ)
f = x^2 +y^2
epsilon = 1
# suggested by "rburning" "rburing" to my question 'Passing functions to Singular'
# because I need to split f=f1+i*f2 in real and imaginary part
S.<x_1,x_2,y_1,y_2,i> = PolynomialRing(QQ)
F = f.subs({x: x_1 + i*x_2, y: y_1 + i*y_2}).reduce([i^2+1])
f1, f2 = F.polynomial(i).coefficients()
R = singular.ring(0,'(x_1,x_2,y_1,y_2)', 'lp')
g1 = singular.new(str(f1))
g2 = singular.new(str(f2))
g3 = singular.new('x_1^2 + x_2^2 +y_1^2+y_2^2 -' + str(epsilon) + '^2')
# creating the first ideal
I = singular.ideal(g1, g2, g3)
singular.lib("primdec.lib")
singular.lib("solve.lib")
# obtain the simplified components of the solution
components = I.primdecGTZ()
k1_1 = components[1][2][1]
k1_2 = components[1][2][2]
k1_3 = components[1][2][3]
singular.setring(R)
# creating a new ideal containing only the first component
H = singular.ideal(str(k1_1),str(k1_2),str(k1_3))
singular.setring(R)
# I now add another constraint to get two real solutions
# sphere around a point close to the solution
J = singular.ideal(H, '(x_1-0)^2 + (x_2+985/1393)^2 +(y_1-985/1393)^2+(y_2-0)^2 -1/10^2')
T = singular.solve(J)
singular.setring(T)
print(singular.eval('SOL'))

It might seem complicated to create that many Ideals but it is necessary because some of them are needed more often. Executing it 10 times results in 2 to 3 errors of the following kind:

SingularError                             Traceback (most recent call last)
<ipython-input-55-da8b511c4e72> in <module>()
    28 J = singular.ideal(H, '(x_1-0)^2 + (x_2+985/1393)^2 +(y_1-985/1393)^2+(y_2-0)^2 -1/10^2')
    29 T = singular.solve(J)
->  30 singular.setring(T)
    31 print(singular.eval('SOL'))

 /opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/interfaces/singular.py in set_ring(self, R)
    1097         if not isinstance(R, SingularElement):
    1098             raise TypeError("R must be a singular ring")
->  1099         self.eval("setring %s; short=0"%R.name(), allow_semicolon=True)
    1100 
    1101     setring = set_ring

/opt/sagemath-9.0/local/lib/python3.7/site-packages/sage/interfaces/singular.py in eval(self, x, allow_semicolon,      strip, **kwds)
    657         # Singular actually does use that string
    658         if s.find("error occurred") != -1 or s.find("Segment fault") != -1:
 -> 659             raise SingularError('Singular error:\n%s'%s)
    660 
    661         if get_verbose() > 0:

SingularError: Singular error:
   ? sage2437 is no name of a ring/qring
   ? error occurred in or before STDIN line 746: `setring sage2437; short=0;

Thanks for your help! Greetings Paul