vectors_in_intervals.certifying_inequalities

Certifying solvability of linear inequality systems using elementary vectors

Given is a system of linear inequalities. We are interested whether the system has a solution. Further, we want to certify the result using an elementary vector (support-minimal vector).

Many of the results are derived from theorems in [Ben00].

Ben00

A. Ben-Israel. Motzkin’s transposition theorem, and the related theorems of Farkas, Gordan and Stiemke. 2000.

Homogeneous systems

There is also a homogeneous version of Motzkin’s transposition theorem. Here, we have three matrices \(A\), \(B\) and \(C\) and deal with the system \(A x > 0, B x \geq 0, C x = 0\):

sage: from vectors_in_intervals import *
sage: A = matrix([[1, 2], [0, 1]])
sage: B = matrix([[2, 3]])
sage: C = matrix([[-1, 0]])
sage: S = AlternativesHomogeneous(A, B, C)
sage: S.one.matrix
[ 1  2]
[ 0  1]
[-----]
[ 2  3]
[-----]
[-1  0]
sage: S.one.get_intervals()
[(0, +oo), (0, +oo), [0, +oo), {0}]
sage: exists_vector(S.one.matrix, S.one.get_intervals())
True

The certify the result, we consider the alternative system which consists of a single matrix and intervals:

sage: S.two.matrix
[ 1  1  0  0]
[-----------]
[ 1  0  0  0]
[ 0  1  0  0]
[ 0  0  1  0]
[-----------]
[ 1  0  2 -1]
[ 2  1  3  0]
sage: S.two.get_intervals()
[(0, +oo), [0, +oo), [0, +oo), [0, +oo), {0}, {0}]
sage: exists_vector(S.two.matrix, S.two.get_intervals())
False
sage: exists_vector(S.two.matrix, S.two.get_intervals(), certify=True)
(-1, -1, 0, -3, 0, 1)

There is a single command for certification:

sage: S.certify()
(True, (-1, -1, 0, -3, 0, 1), 2)

We can also use elementary vectors to construct a solution:

sage: S.one.solve()
(0, 1)

We consider another example:

sage: A = matrix([[1, 0], [0, 1]])
sage: B = matrix([[2, -3]])
sage: C = matrix([[-1, -1]])
sage: S = AlternativesHomogeneous(A, B, C)
sage: S.certify()
(False, (0, -5, -1, -2), 1)
sage: S.one.certify()
(False, (1, 1, 0, 1))

In some cases, it is faster to randomly generate elementary vectors to certify:

sage: S.certify(random=True) # random
(False, (0, -5, -1, -2), 2)

Parallel computation is also supported:

sage: S.certify(number_parallel=4) # random
(False, (0, -5, -1, -2), 2)

A solution for the second system is:

sage: S.two.solve()
(0, 5, 1, 2)

Inhomogeneous systems

We deal with linear inequality systems given in the form \(A x \leq b, B x < c\) with matrices \(A\), \(B\) and vectors \(b\), \(c\). We are interested whether the system has a solution \(x\). This can be checked using vectors_in_intervals.existence.exists_vector(). If no solution exists, this function can be used to certify the result.

To demonstrate this, consider the following example:

sage: from vectors_in_intervals import *
sage: A = matrix([[1, 2], [0, 1]])
sage: B = matrix([[2, 3]])
sage: b = vector([1, -1])
sage: c = vector([2])
sage: S = AlternativesInhomogeneous(A, B, b, c)
sage: S.one.matrix
[1 2]
[0 1]
[---]
[2 3]
sage: S.one.get_intervals()
[(-oo, 1], (-oo, -1], (-oo, 2)]
sage: exists_vector(S.one.matrix, S.one.get_intervals())
True

However, to certify existence of a solution, we need to consider the alternative system. This system can be described by two matrices and two lists of intervals:

sage: S.two.matrix
[ 0  0  1  1]
[-----------]
[ 1  0  0  0]
[ 0  1  0  0]
[ 0  0  1  0]
[ 0  0  0  1]
[-----------]
[ 1  0  2  0]
[ 2  1  3  0]
[-1  1 -2 -1]
sage: S.two.get_intervals()
[(0, +oo), [0, +oo), [0, +oo), [0, +oo), [0, +oo), {0}, {0}, {0}]
sage: exists_vector(S.two.matrix, S.two.get_intervals())
False
sage: exists_vector(S.two.matrix, S.two.get_intervals(), certify=True)
(1, 3, 0, 4, 0, 0, -1, 1)

The package offers a single function that certifies existence of a solution:

sage: S.certify()
(True, (2, 2, 0, 0, 0, 4, -2, 2), 12)

The alternatives for the inhomogeneous case can be formulated using two systems. The resulting systems yield different certificates:

sage: S = AlternativesInhomogeneous(A, B, b, c, two_double_system=True)
sage: S.certify()
(True, [(-2, 0, -1, 0, 0, 1, 0), (-2, -1, 0, 0, -5, 2)], 5)

A solution is:

sage: S.one.solve()
(7/2, -2)

We consider another example:

sage: A = matrix([[1, 0], [1, 1]])
sage: B = matrix([[-1, -1]])
sage: b = vector([1, 0])
sage: c = vector([0])
sage: S = AlternativesInhomogeneous(A, B, b, c)
sage: S.certify()
(False, (0, 1, 1), 1)

We can homogenized the first alternative yielding a different system:

sage: S = AlternativesInhomogeneous(A, B, b, c, one_homogenized=True)
sage: S.certify()
(False, (0, 1, 0, 1), 1)

A solution is:

sage: S.two.solve()
(0, 1, 1, 0)

General systems

By translating systems of the form M x in I into inhomogeneous systems, we can certify general systems:

sage: from vectors_in_intervals import *
sage: M = matrix([[1, 0], [0, 1], [1, 1], [0, 1]])
sage: lower_bounds = [2, 5, 0, -oo]
sage: upper_bounds = [5, oo, 8, 5]
sage: lower_bounds_closed = [True, True, False, False]
sage: upper_bounds_closed = [False, False, False, True]
sage: I = Intervals.from_bounds(lower_bounds, upper_bounds, lower_bounds_closed, upper_bounds_closed)
sage: exists_vector(M, I) # no certificate
True
sage: S = AlternativesGeneral(M, I)
sage: S.one.matrix
[1 0]
[0 1]
[1 1]
[0 1]
sage: S.one.get_intervals()
[2, 5) x [5, +oo) x (0, 8) x (-oo, 5]
sage: S.two.matrix
[ 0  0  0  1  1  1  1]
[--------------------]
[ 1  0  0  0  0  0  0]
[ 0  1  0  0  0  0  0]
[ 0  0  1  0  0  0  0]
[ 0  0  0  1  0  0  0]
[ 0  0  0  0  1  0  0]
[ 0  0  0  0  0  1  0]
[ 0  0  0  0  0  0  1]
[--------------------]
[-1  0  0  1 -1  1  0]
[ 0 -1  1  0 -1  1  0]
[ 2  5 -5 -5  0 -8 -1]
sage: S.two.get_intervals()
[(0, +oo), [0, +oo), [0, +oo), [0, +oo), [0, +oo), [0, +oo), [0, +oo), [0, +oo), {0}, {0}, {0}]
sage: S.certify()
(True, (1, 0, 0, 0, 2, 6, 0, 0, 2, 5, 1), 3)

We compute a solution using elementary vectors:

sage: S.one.solve()
(5/2, 5)

Functions

inhomogeneous_alternative1(system)

A standard inhomogeneous linear inequality system.

inhomogeneous_alternative1_homogenized(system)

Homogenization of a standard inhomogeneous linear inequality system.

inhomogeneous_alternative2(system)

Alternative of a standard inhomogeneous linear inequality system.

inhomogeneous_alternative2_system1(system)

Alternative of a standard inhomogeneous linear inequality system given by two systems.

inhomogeneous_alternative2_system2(system)

Alternative of a standard inhomogeneous linear inequality system given by two systems.

Classes

Alternatives

An abstract class for certifying linear inequality systems.

AlternativesGeneral(M, I)

Alternatives for a general system M x in I.

AlternativesHomogeneous(A, B, C)

A class for certifying homogeneous linear inequality systems.

AlternativesInhomogeneous(A, B, b, c[, ...])

A class for certifying inhomogeneous linear inequality systems.

class vectors_in_intervals.certifying_inequalities.Alternatives

An abstract class for certifying linear inequality systems.

category(self)

File: sage/structure/sage_object.pyx (starting at line 484)

certify(reverse: bool = True, random: bool = False, number_parallel: int = 1) tuple

Certify whether the first alternative has a solution.

  • reverse – reverses the order of elementary vectors

  • random – randomizes computed elementary vectors (repetition possible)

  • number_parallel – number of parallel computations

OUTPUT: A boolean, a vector certifying the result, and the number of needed iterations.

dump(self, filename, compress=True)

File: sage/structure/sage_object.pyx (starting at line 445)

Same as self.save(filename, compress)

dumps(self, compress=True)

File: sage/structure/sage_object.pyx (starting at line 451)

Dump self to a string s, which can later be reconstituted as self using loads(s).

There is an optional boolean argument compress which defaults to True.

EXAMPLES:

sage: from sage.misc.persist import comp
sage: O = SageObject()
sage: p_comp = O.dumps()
sage: p_uncomp = O.dumps(compress=False)
sage: comp.decompress(p_comp) == p_uncomp
True
sage: import pickletools
sage: pickletools.dis(p_uncomp)
    0: \x80 PROTO      2
    2: c    GLOBAL     'sage.structure.sage_object SageObject'
   41: q    BINPUT     ...
   43: )    EMPTY_TUPLE
   44: \x81 NEWOBJ
   45: q    BINPUT     ...
   47: .    STOP
highest protocol among opcodes = 2
parent(self)

File: sage/structure/sage_object.pyx (starting at line 518)

Return the type of self to support the coercion framework.

EXAMPLES:

sage: t = log(sqrt(2) - 1) + log(sqrt(2) + 1); t
log(sqrt(2) + 1) + log(sqrt(2) - 1)
sage: u = t.maxima_methods()
sage: u.parent()
<class 'sage.symbolic.maxima_wrapper.MaximaWrapper'>
rename(self, x=None)

File: sage/structure/sage_object.pyx (starting at line 68)

Change self so it prints as x, where x is a string.

Note

This is only supported for Python classes that derive from SageObject.

EXAMPLES:

sage: x = PolynomialRing(QQ, 'x', sparse=True).gen()
sage: g = x^3 + x - 5
sage: g
x^3 + x - 5
sage: g.rename('a polynomial')
sage: g
a polynomial
sage: g + x
x^3 + 2*x - 5
sage: h = g^100
sage: str(h)[:20]
'x^300 + 100*x^298 - '
sage: h.rename('x^300 + ...')
sage: h
x^300 + ...

Real numbers are not Python classes, so rename is not supported:

sage: a = 3.14
sage: type(a)
<... 'sage.rings.real_mpfr.RealLiteral'>
sage: a.rename('pi')
Traceback (most recent call last):
...
NotImplementedError: object does not support renaming: 3.14000000000000

Note

The reason C-extension types are not supported by default is if they were then every single one would have to carry around an extra attribute, which would be slower and waste a lot of memory.

To support them for a specific class, add a cdef public __custom_name attribute.

reset_name(self)

File: sage/structure/sage_object.pyx (starting at line 125)

Remove the custom name of an object.

EXAMPLES:

sage: P.<x> = QQ[]
sage: P
Univariate Polynomial Ring in x over Rational Field
sage: P.rename('A polynomial ring')
sage: P
A polynomial ring
sage: P.reset_name()
sage: P
Univariate Polynomial Ring in x over Rational Field
save(self, filename=None, compress=True)

File: sage/structure/sage_object.pyx (starting at line 420)

Save self to the given filename.

EXAMPLES:

sage: f = x^3 + 5
sage: f.save(os.path.join(SAGE_TMP, 'file'))
sage: load(os.path.join(SAGE_TMP, 'file.sobj'))
x^3 + 5
class vectors_in_intervals.certifying_inequalities.AlternativesGeneral(M, I)

Alternatives for a general system M x in I.

category(self)

File: sage/structure/sage_object.pyx (starting at line 484)

certify(reverse: bool = True, random: bool = False, number_parallel: int = 1) tuple

Certify whether the first alternative has a solution.

  • reverse – reverses the order of elementary vectors

  • random – randomizes computed elementary vectors (repetition possible)

  • number_parallel – number of parallel computations

OUTPUT: A boolean, a vector certifying the result, and the number of needed iterations.

dump(self, filename, compress=True)

File: sage/structure/sage_object.pyx (starting at line 445)

Same as self.save(filename, compress)

dumps(self, compress=True)

File: sage/structure/sage_object.pyx (starting at line 451)

Dump self to a string s, which can later be reconstituted as self using loads(s).

There is an optional boolean argument compress which defaults to True.

EXAMPLES:

sage: from sage.misc.persist import comp
sage: O = SageObject()
sage: p_comp = O.dumps()
sage: p_uncomp = O.dumps(compress=False)
sage: comp.decompress(p_comp) == p_uncomp
True
sage: import pickletools
sage: pickletools.dis(p_uncomp)
    0: \x80 PROTO      2
    2: c    GLOBAL     'sage.structure.sage_object SageObject'
   41: q    BINPUT     ...
   43: )    EMPTY_TUPLE
   44: \x81 NEWOBJ
   45: q    BINPUT     ...
   47: .    STOP
highest protocol among opcodes = 2
parent(self)

File: sage/structure/sage_object.pyx (starting at line 518)

Return the type of self to support the coercion framework.

EXAMPLES:

sage: t = log(sqrt(2) - 1) + log(sqrt(2) + 1); t
log(sqrt(2) + 1) + log(sqrt(2) - 1)
sage: u = t.maxima_methods()
sage: u.parent()
<class 'sage.symbolic.maxima_wrapper.MaximaWrapper'>
rename(self, x=None)

File: sage/structure/sage_object.pyx (starting at line 68)

Change self so it prints as x, where x is a string.

Note

This is only supported for Python classes that derive from SageObject.

EXAMPLES:

sage: x = PolynomialRing(QQ, 'x', sparse=True).gen()
sage: g = x^3 + x - 5
sage: g
x^3 + x - 5
sage: g.rename('a polynomial')
sage: g
a polynomial
sage: g + x
x^3 + 2*x - 5
sage: h = g^100
sage: str(h)[:20]
'x^300 + 100*x^298 - '
sage: h.rename('x^300 + ...')
sage: h
x^300 + ...

Real numbers are not Python classes, so rename is not supported:

sage: a = 3.14
sage: type(a)
<... 'sage.rings.real_mpfr.RealLiteral'>
sage: a.rename('pi')
Traceback (most recent call last):
...
NotImplementedError: object does not support renaming: 3.14000000000000

Note

The reason C-extension types are not supported by default is if they were then every single one would have to carry around an extra attribute, which would be slower and waste a lot of memory.

To support them for a specific class, add a cdef public __custom_name attribute.

reset_name(self)

File: sage/structure/sage_object.pyx (starting at line 125)

Remove the custom name of an object.

EXAMPLES:

sage: P.<x> = QQ[]
sage: P
Univariate Polynomial Ring in x over Rational Field
sage: P.rename('A polynomial ring')
sage: P
A polynomial ring
sage: P.reset_name()
sage: P
Univariate Polynomial Ring in x over Rational Field
save(self, filename=None, compress=True)

File: sage/structure/sage_object.pyx (starting at line 420)

Save self to the given filename.

EXAMPLES:

sage: f = x^3 + 5
sage: f.save(os.path.join(SAGE_TMP, 'file'))
sage: load(os.path.join(SAGE_TMP, 'file.sobj'))
x^3 + 5
class vectors_in_intervals.certifying_inequalities.AlternativesHomogeneous(A, B, C)

A class for certifying homogeneous linear inequality systems.

A x > 0, B x >= 0, C x = 0

category(self)

File: sage/structure/sage_object.pyx (starting at line 484)

certify(reverse: bool = True, random: bool = False, number_parallel: int = 1) tuple

Certify whether the first alternative has a solution.

  • reverse – reverses the order of elementary vectors

  • random – randomizes computed elementary vectors (repetition possible)

  • number_parallel – number of parallel computations

OUTPUT: A boolean, a vector certifying the result, and the number of needed iterations.

dump(self, filename, compress=True)

File: sage/structure/sage_object.pyx (starting at line 445)

Same as self.save(filename, compress)

dumps(self, compress=True)

File: sage/structure/sage_object.pyx (starting at line 451)

Dump self to a string s, which can later be reconstituted as self using loads(s).

There is an optional boolean argument compress which defaults to True.

EXAMPLES:

sage: from sage.misc.persist import comp
sage: O = SageObject()
sage: p_comp = O.dumps()
sage: p_uncomp = O.dumps(compress=False)
sage: comp.decompress(p_comp) == p_uncomp
True
sage: import pickletools
sage: pickletools.dis(p_uncomp)
    0: \x80 PROTO      2
    2: c    GLOBAL     'sage.structure.sage_object SageObject'
   41: q    BINPUT     ...
   43: )    EMPTY_TUPLE
   44: \x81 NEWOBJ
   45: q    BINPUT     ...
   47: .    STOP
highest protocol among opcodes = 2
parent(self)

File: sage/structure/sage_object.pyx (starting at line 518)

Return the type of self to support the coercion framework.

EXAMPLES:

sage: t = log(sqrt(2) - 1) + log(sqrt(2) + 1); t
log(sqrt(2) + 1) + log(sqrt(2) - 1)
sage: u = t.maxima_methods()
sage: u.parent()
<class 'sage.symbolic.maxima_wrapper.MaximaWrapper'>
rename(self, x=None)

File: sage/structure/sage_object.pyx (starting at line 68)

Change self so it prints as x, where x is a string.

Note

This is only supported for Python classes that derive from SageObject.

EXAMPLES:

sage: x = PolynomialRing(QQ, 'x', sparse=True).gen()
sage: g = x^3 + x - 5
sage: g
x^3 + x - 5
sage: g.rename('a polynomial')
sage: g
a polynomial
sage: g + x
x^3 + 2*x - 5
sage: h = g^100
sage: str(h)[:20]
'x^300 + 100*x^298 - '
sage: h.rename('x^300 + ...')
sage: h
x^300 + ...

Real numbers are not Python classes, so rename is not supported:

sage: a = 3.14
sage: type(a)
<... 'sage.rings.real_mpfr.RealLiteral'>
sage: a.rename('pi')
Traceback (most recent call last):
...
NotImplementedError: object does not support renaming: 3.14000000000000

Note

The reason C-extension types are not supported by default is if they were then every single one would have to carry around an extra attribute, which would be slower and waste a lot of memory.

To support them for a specific class, add a cdef public __custom_name attribute.

reset_name(self)

File: sage/structure/sage_object.pyx (starting at line 125)

Remove the custom name of an object.

EXAMPLES:

sage: P.<x> = QQ[]
sage: P
Univariate Polynomial Ring in x over Rational Field
sage: P.rename('A polynomial ring')
sage: P
A polynomial ring
sage: P.reset_name()
sage: P
Univariate Polynomial Ring in x over Rational Field
save(self, filename=None, compress=True)

File: sage/structure/sage_object.pyx (starting at line 420)

Save self to the given filename.

EXAMPLES:

sage: f = x^3 + 5
sage: f.save(os.path.join(SAGE_TMP, 'file'))
sage: load(os.path.join(SAGE_TMP, 'file.sobj'))
x^3 + 5
class vectors_in_intervals.certifying_inequalities.AlternativesInhomogeneous(A, B, b, c, one_homogenized=False, two_double_system=False)

A class for certifying inhomogeneous linear inequality systems.

A x <= b, B x < c

INPUT:

  • To use a homogenized representation of the first alternative, pass one_homogenized=True.

  • To use two systems for the second alternative instead of a homogenized system, pass two_double_system=True.

TESTS:

sage: from vectors_in_intervals import *
sage: A = matrix([[1]])
sage: B = matrix(0, 1)
sage: b = vector([1])
sage: c = vector([])
sage: S = AlternativesInhomogeneous(A, B, b, c)
sage: S.certify()
(True, (-1, 0, 0, -1, -1), 2)
sage: S.certify(random=True)[0]
True
category(self)

File: sage/structure/sage_object.pyx (starting at line 484)

certify(reverse: bool = True, random: bool = False, number_parallel: int = 1) tuple

Certify whether the first alternative has a solution.

OUTPUT: A boolean, vectors certifying the result, and the number of needed iterations.

dump(self, filename, compress=True)

File: sage/structure/sage_object.pyx (starting at line 445)

Same as self.save(filename, compress)

dumps(self, compress=True)

File: sage/structure/sage_object.pyx (starting at line 451)

Dump self to a string s, which can later be reconstituted as self using loads(s).

There is an optional boolean argument compress which defaults to True.

EXAMPLES:

sage: from sage.misc.persist import comp
sage: O = SageObject()
sage: p_comp = O.dumps()
sage: p_uncomp = O.dumps(compress=False)
sage: comp.decompress(p_comp) == p_uncomp
True
sage: import pickletools
sage: pickletools.dis(p_uncomp)
    0: \x80 PROTO      2
    2: c    GLOBAL     'sage.structure.sage_object SageObject'
   41: q    BINPUT     ...
   43: )    EMPTY_TUPLE
   44: \x81 NEWOBJ
   45: q    BINPUT     ...
   47: .    STOP
highest protocol among opcodes = 2
parent(self)

File: sage/structure/sage_object.pyx (starting at line 518)

Return the type of self to support the coercion framework.

EXAMPLES:

sage: t = log(sqrt(2) - 1) + log(sqrt(2) + 1); t
log(sqrt(2) + 1) + log(sqrt(2) - 1)
sage: u = t.maxima_methods()
sage: u.parent()
<class 'sage.symbolic.maxima_wrapper.MaximaWrapper'>
rename(self, x=None)

File: sage/structure/sage_object.pyx (starting at line 68)

Change self so it prints as x, where x is a string.

Note

This is only supported for Python classes that derive from SageObject.

EXAMPLES:

sage: x = PolynomialRing(QQ, 'x', sparse=True).gen()
sage: g = x^3 + x - 5
sage: g
x^3 + x - 5
sage: g.rename('a polynomial')
sage: g
a polynomial
sage: g + x
x^3 + 2*x - 5
sage: h = g^100
sage: str(h)[:20]
'x^300 + 100*x^298 - '
sage: h.rename('x^300 + ...')
sage: h
x^300 + ...

Real numbers are not Python classes, so rename is not supported:

sage: a = 3.14
sage: type(a)
<... 'sage.rings.real_mpfr.RealLiteral'>
sage: a.rename('pi')
Traceback (most recent call last):
...
NotImplementedError: object does not support renaming: 3.14000000000000

Note

The reason C-extension types are not supported by default is if they were then every single one would have to carry around an extra attribute, which would be slower and waste a lot of memory.

To support them for a specific class, add a cdef public __custom_name attribute.

reset_name(self)

File: sage/structure/sage_object.pyx (starting at line 125)

Remove the custom name of an object.

EXAMPLES:

sage: P.<x> = QQ[]
sage: P
Univariate Polynomial Ring in x over Rational Field
sage: P.rename('A polynomial ring')
sage: P
A polynomial ring
sage: P.reset_name()
sage: P
Univariate Polynomial Ring in x over Rational Field
save(self, filename=None, compress=True)

File: sage/structure/sage_object.pyx (starting at line 420)

Save self to the given filename.

EXAMPLES:

sage: f = x^3 + 5
sage: f.save(os.path.join(SAGE_TMP, 'file'))
sage: load(os.path.join(SAGE_TMP, 'file.sobj'))
x^3 + 5
vectors_in_intervals.certifying_inequalities.inhomogeneous_alternative1(system: vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem) vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem

A standard inhomogeneous linear inequality system.

A x <= b, B x < c

vectors_in_intervals.certifying_inequalities.inhomogeneous_alternative1_homogenized(system: vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem) vectors_in_intervals.linear_inequality_systems.HomogeneousSystem

Homogenization of a standard inhomogeneous linear inequality system.

The system has this form:

[A -b]
[B -c] x in [0, oo)^p x (0, oo)^(q + 1)
[0 -1]
vectors_in_intervals.certifying_inequalities.inhomogeneous_alternative2(system: vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem) vectors_in_intervals.linear_inequality_systems.HomogeneousSystem

Alternative of a standard inhomogeneous linear inequality system.

vectors_in_intervals.certifying_inequalities.inhomogeneous_alternative2_system1(system: vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem) vectors_in_intervals.linear_inequality_systems.HomogeneousSystem

Alternative of a standard inhomogeneous linear inequality system given by two systems.

vectors_in_intervals.certifying_inequalities.inhomogeneous_alternative2_system2(system: vectors_in_intervals.linear_inequality_systems.InhomogeneousSystem) vectors_in_intervals.linear_inequality_systems.HomogeneousSystem

Alternative of a standard inhomogeneous linear inequality system given by two systems.