A class for working with sets of linear constraints and extreme points.
Bases: NumberTypeable
Parameters: |
|
---|
Warning
With the fraction number type, beware when using floats:
>>> print(cdd.Matrix([[1.12]], number_type='fraction')[0][0])
1261007895663739/1125899906842624
If the float represents a fraction, it is better to pass it as a string, so it gets automatically converted to its exact fraction representation:
>>> print(cdd.Matrix([['1.12']])[0][0])
28/25
Of course, for the float number type, both 1.12 and '1.12' will yield the same result, namely the float 1.12.
Return a row, or a slice of rows, of the matrix.
Parameters: | key (int or slice) – The row number, or slice of row numbers, to get. |
---|---|
Return type: | tuple of NumberType, or tuple of tuple of NumberType |
Transform to canonical representation by recognizing all implicit linearities and all redundancies. These are returned as a pair of sets of row indices.
Make a copy of the matrix and return that copy.
Append rows to self (this corresponds to the dd_MatrixAppendTo function in cdd; to emulate the effect of dd_MatrixAppend, first call copy and then call extend on the copy).
The column size must be equal in the two input matrices. It raises a ValueError if the input rows are not appropriate.
Parameters: |
|
---|
Number of rows.
Number of columns.
A frozenset containing the rows of linearity (generators of linearity space for V-representation, and equations for H-representation).
A tuple containing the linear programming objective function.
Note that the following examples presume:
>>> import cdd
>>> from fractions import Fraction
>>> cdd.Matrix([[1.5,2]]).number_type
'float'
>>> cdd.Matrix([['1.5',2]]).number_type
'float'
>>> cdd.Matrix([[Fraction(3, 2),2]]).number_type
'float'
>>> cdd.Matrix([['1.5','2']]).number_type
'fraction'
>>> cdd.Matrix([[Fraction(3, 2), Fraction(2, 1)]]).number_type
'fraction'
Declaring matrices, and checking some attributes:
>>> mat1 = cdd.Matrix([['1','2'],['3','4']])
>>> mat1.NumberType
<class 'fractions.Fraction'>
>>> print(mat1)
begin
2 2 rational
1 2
3 4
end
>>> mat1.row_size
2
>>> mat1.col_size
2
>>> print(mat1[0])
(1, 2)
>>> print(mat1[1])
(3, 4)
>>> print(mat1[2])
Traceback (most recent call last):
...
IndexError: row index out of range
>>> mat1.extend([[5,6]]) # keeps number type!
>>> mat1.row_size
3
>>> print(mat1)
begin
3 2 rational
1 2
3 4
5 6
end
>>> print(mat1[0])
(1, 2)
>>> print(mat1[1])
(3, 4)
>>> print(mat1[2])
(5, 6)
>>> mat1[1:3]
((3, 4), (5, 6))
>>> mat1[:-1]
((1, 2), (3, 4))
Canonicalizing:
>>> mat = cdd.Matrix([[2, 1, 2, 3], [0, 1, 2, 3], [3, 0, 1, 2], [0, -2, -4, -6]], number_type='fraction')
>>> mat.canonicalize()
(frozenset({1, 3}), frozenset({0}))
>>> print(mat)
linearity 1 1
begin
2 4 rational
0 1 2 3
3 0 1 2
end
Large number tests:
>>> print(cdd.Matrix([[10 ** 100]], number_type='fraction'))
begin
1 1 rational
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
end
>>> print(cdd.Matrix([[Fraction(10 ** 100, 13 ** 102)]], number_type='fraction'))
begin
1 1 rational
10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/419007633753249358163371317520192208024352885070865054318259957799640820272617869666750277036856988452476999386169
end
>>> cdd.Matrix([['10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000']], number_type='fraction')[0][0]
Fraction(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 1)
>>> cdd.Matrix([['10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/419007633753249358163371317520192208024352885070865054318259957799640820272617869666750277036856988452476999386169']], number_type='fraction')[0][0]
Fraction(10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000, 419007633753249358163371317520192208024352885070865054318259957799640820272617869666750277036856988452476999386169)
Declaring matrices, and checking some attributes:
>>> mat1 = cdd.Matrix([[1,2],[3,4]])
>>> mat1.NumberType
<class 'float'>
>>> print(mat1)
begin
2 2 real
1 2
3 4
end
>>> mat1.row_size
2
>>> mat1.col_size
2
>>> print(mat1[0])
(1.0, 2.0)
>>> print(mat1[1])
(3.0, 4.0)
>>> print(mat1[2])
Traceback (most recent call last):
...
IndexError: row index out of range
>>> mat1.extend([[5,6]])
>>> mat1.row_size
3
>>> print(mat1)
begin
3 2 real
1 2
3 4
5 6
end
>>> print(mat1[0])
(1.0, 2.0)
>>> print(mat1[1])
(3.0, 4.0)
>>> print(mat1[2])
(5.0, 6.0)
>>> mat1[1:3]
((3.0, 4.0), (5.0, 6.0))
>>> mat1[:-1]
((1.0, 2.0), (3.0, 4.0))
Canonicalizing:
>>> mat = cdd.Matrix([[2, 1, 2, 3], [0, 1, 2, 3], [3, 0, 1, 2], [0, -2, -4, -6]])
>>> mat.canonicalize()
(frozenset({1, 3}), frozenset({0}))
>>> print(mat)
linearity 1 1
begin
2 4 real
0 1 2 3
3 0 1 2
end
Large number tests:
>>> print(cdd.Matrix([[10 ** 100]]))
begin
1 1 real
1.000000000E+100
end
>>> print(cdd.Matrix([[Fraction(10 ** 100, 13 ** 90)]], number_type='float'))
begin
1 1 real
5.5603...E-001
end
>>> cdd.Matrix([['10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000']], number_type='float')[0][0]
1e+100
>>> cdd.Matrix([['10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000/17984638288961211871838956989189665890197130672912829203311075745019255958028927299020895173379216649']], number_type='float')[0][0]
0.55603...
Some regression tests:
>>> cdd.Matrix([[1], [1, 2]])
Traceback (most recent call last):
...
ValueError: rows have different lengths
>>> mat = cdd.Matrix([[1], [2]])
>>> mat.obj_func = (0, 0)
Traceback (most recent call last):
...
ValueError: objective function does not match matrix column size