Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Integrate new Set rewrite into Pyomo #1319

Merged
merged 85 commits into from
Mar 31, 2020
Merged
Show file tree
Hide file tree
Changes from 74 commits
Commits
Show all changes
85 commits
Select commit Hold shift + click to select a range
5e312d2
Adding bounds,filter, and validate support to RangeSet
jsiirola Dec 21, 2019
7fde844
More aggressive Set immediate construction.
jsiirola Dec 24, 2019
a4fc1a2
Add a Set.get() method to standardize index mapping
jsiirola Dec 24, 2019
d689d9f
Rename flatten_cross_product to subsets and make a standard Set method
jsiirola Dec 24, 2019
719caea
Correct reference to class attribute
jsiirola Dec 24, 2019
b59f79d
Improved handling of deprecated Set attributes/methods
jsiirola Dec 24, 2019
2db0bd9
Set the ordered keywoard for OrderedSimpleSet and SortedSimpleSet
jsiirola Dec 24, 2019
983c663
Make SetOperator a public base class
jsiirola Dec 24, 2019
25c7d46
Add legacy support for Set.add(*args)
jsiirola Dec 24, 2019
ec40b68
Fix exge cases for @simple_set_rule
jsiirola Jan 23, 2020
89d794a
Clean up deprecation of set_options
jsiirola Jan 23, 2020
f57e0e9
Adding TuplizeValuesInitializer to convert lists to lists of tuples
jsiirola Jan 25, 2020
f5e79b7
Removing dependence on pyutilib's flatten_tuple
jsiirola Jan 25, 2020
0bd4d2a
Raise AttributeError when iterating over non-finite Sets
jsiirola Jan 27, 2020
096a9ef
Add Set.domain and (deprecated) filter attributes
jsiirola Jan 27, 2020
6d7537c
Fix isdisjoint/issubset/issuperset/__eq__ to match set
jsiirola Jan 28, 2020
5007efc
Fixing typos in documentation and exception messages
jsiirola Jan 28, 2020
2c526b0
Special case: abstract Sets with constant dimen have known dimen
jsiirola Feb 2, 2020
45bebbc
Improve error message for non-iterable Set initializers
jsiirola Feb 2, 2020
5531dbe
Improved automatic detection of non-finite range sets.
jsiirola Feb 3, 2020
7b7e9e3
Improving RangeSet initialization
jsiirola Feb 3, 2020
a69657a
Merge branch 'master' into set-merge
jsiirola Feb 3, 2020
0ca6a67
Deprecate (but allow) passing data to SetOperator.construct()
jsiirola Feb 3, 2020
05f3abe
Revising global sets and reimplementing RealInterval, IntegerInterval
jsiirola Feb 7, 2020
5c4363b
Reimplementing (and deprecating) using "in" for issubset()
jsiirola Feb 7, 2020
0789100
Casting Set bounds() to int, if possible
jsiirola Feb 7, 2020
26dc604
Update implicit component names when constructing.
jsiirola Feb 7, 2020
3632ef2
Adding _EmptySet class, missing Any methods
jsiirola Feb 7, 2020
11a0a9e
Fixing len/iter exceptions; comparing empty infinite RangeSets
jsiirola Feb 8, 2020
1925e8b
Adding missing RangeSet API methods
jsiirola Feb 8, 2020
e26d7bf
Consistent naming: prefer _block over parent
jsiirola Feb 8, 2020
a423e5a
Ensure initialization sets are routed through process_setarg
jsiirola Feb 8, 2020
7925500
Fixing SetProduct with an empty subset
jsiirola Feb 18, 2020
d725f38
Correcting tests for IndexedSet without a rule
jsiirola Feb 18, 2020
59856f1
Adding missing import
jsiirola Feb 18, 2020
e2b09d8
Test automatic construction of non-native, non-numvalue RangeSet args
jsiirola Feb 18, 2020
1021e85
Resolve RangeSet.name for named floating instances
jsiirola Feb 18, 2020
3f4bacf
SetProduct fix for tuples with extra values
jsiirola Feb 18, 2020
b636253
Update tests to reflect RangeSet naming
jsiirola Feb 18, 2020
e4ca8d9
Adding index_set() (from IndexedComponent) to RangeSet
jsiirola Feb 18, 2020
c69121b
Register new Set/RangeSet with the ModelComponentFactory
jsiirola Feb 18, 2020
862901c
Remove UnindexedComponent_set as a GlobalSet (circular references)
jsiirola Feb 18, 2020
5464a53
Fixing Set.Skip and deepcopy of set expressions
jsiirola Feb 18, 2020
c4e38db
Renaming RangeSetInitializer to bounds initializer; setting default_s…
jsiirola Feb 18, 2020
bb17d16
Adding tests: subsets() and set_tuple
jsiirola Feb 18, 2020
b84b088
Resolving edge cases for DeclareGlobalSet
jsiirola Feb 18, 2020
cdaba06
Fixing (and testing) AnyWithNone
jsiirola Feb 18, 2020
f87e0b1
Checking check_values() on indexed Sets
jsiirola Feb 18, 2020
df24669
Removing unreachable code
jsiirola Feb 18, 2020
3eb65bf
Adding initializer tests
jsiirola Feb 18, 2020
2cad904
Adding proess_setarg tests
jsiirola Feb 19, 2020
7aa3987
Merge branch 'master' into set-merge
jsiirola Feb 19, 2020
655c8f4
Python 2.x fix for the model viewer
jsiirola Feb 22, 2020
1f1b21d
Support +/-inf for NumericRange bounds. Additional testing.
jsiirola Feb 22, 2020
ca3308b
Remove debugging
jsiirola Feb 24, 2020
089cb1c
Merge branch 'master' into set-merge
jsiirola Feb 25, 2020
a6164a2
Raise exception when deepcopying uncopyable attributes on abstract co…
jsiirola Feb 26, 2020
c1812ee
Integrating the Set rewrite into Pyomo
jsiirola Feb 26, 2020
cf7dd4c
Adding documentation
jsiirola Feb 27, 2020
21682d9
Attach component index/domain set objects to model & construct them
jsiirola Feb 29, 2020
a8db3c0
Merge branch 'master' into set-merge
jsiirola Mar 2, 2020
14be3ec
Update flatten_dae_variables() for set rewrite
jsiirola Mar 2, 2020
b308ce9
Updating network test baseline after set rewrite merge
jsiirola Mar 2, 2020
7fafbe4
removing debugging
jsiirola Mar 2, 2020
0dd8dad
satsolver updates for set-merge
jsiirola Mar 2, 2020
ea230bd
Fixing doctest failures
jsiirola Mar 2, 2020
07c1336
Additional doctests fixes
jsiirola Mar 2, 2020
5d9003e
Fixing additional doctests
jsiirola Mar 2, 2020
e08319c
Making deprecation tests more robust
jsiirola Mar 2, 2020
5e10b90
Additional fixes for PySP with the new Sets
jsiirola Mar 2, 2020
490cbdc
Deprecation messages now include the caller file/lineno
jsiirola Mar 2, 2020
1182dc2
Fix for generator initializers [segfault in pypy3]
jsiirola Mar 3, 2020
b2c406b
Resolving use of generators in Set initialization
jsiirola Mar 3, 2020
cc3c924
Merge branch 'master' into set-merge
jsiirola Mar 3, 2020
754c43c
Updating documentation
jsiirola Mar 8, 2020
ed07907
Fix calling construct() on a constructed ContinuousSet
jsiirola Mar 10, 2020
bf89dae
Don't extract the entire stack to get the caller's frame
jsiirola Mar 11, 2020
dc8095f
Merge branch 'master' into set-merge
jsiirola Mar 12, 2020
c1ff124
Merge branch 'master' into set-merge
jsiirola Mar 20, 2020
350784c
Fixing _ImplicitAny for new set system
jsiirola Mar 20, 2020
2838805
Addressing typos and review comments
jsiirola Mar 24, 2020
a0d54b9
Propagating optimization from is_continuous to is_binary, is_integer
jsiirola Mar 24, 2020
9b5b439
Updating the ContinuousSet docstring to match new behavior of enforci…
blnicho Mar 24, 2020
185cfbf
Removing unnecessary code
jsiirola Mar 25, 2020
a47ae0c
Adding AML GlobalSets to pyomo.kernel
jsiirola Mar 25, 2020
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 9 additions & 6 deletions doc/OnlineDocs/pyomo_modeling_components/Sets.rst
Original file line number Diff line number Diff line change
Expand Up @@ -106,14 +106,17 @@ Note that the element number starts with 1 and not 0:
.. doctest::

>>> model.X.pprint()
X : Dim=0, Dimen=1, Size=10, Domain=None, Ordered=False, Bounds=(1, 19)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
X : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 10 : {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
Comment on lines +109 to +111
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having the "size" listed twice here is a little confusing for "singleton" sets. I realize that they are referring to two different things but because they are being called the same name it's not obvious which value would get returned if I asked for the length of the set.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I agree that it is confusing. I am open to options for renaming the table entry (the header should probably remain the same for consistency with other IndexedComponents)

>>> model.Y.pprint()
Y : Dim=0, Dimen=1, Size=10, Domain=None, Ordered=False, Bounds=(1, 19)
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
Y : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 10 : {1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
>>> model.Z.pprint()
Z : Dim=0, Dimen=1, Size=10, Domain=None, Ordered=False, Bounds=(3, 21)
[3, 5, 7, 9, 11, 13, 15, 17, 19, 21]
Z : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 10 : {3, 5, 7, 9, 11, 13, 15, 17, 19, 21}

Additional information about iterators for set initialization is in the
[PyomoBookII]_ book.
Expand Down
10 changes: 6 additions & 4 deletions doc/OnlineDocs/working_abstractmodels/data/raw_dicts.rst
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,12 @@ components, the required data dictionary maps the implicit index
>>> i = m.create_instance(data)
>>> i.pprint()
2 Set Declarations
I : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
r_index : Dim=0, Dimen=2, Size=9, Domain=None, Ordered=False, Bounds=None
Virtual
I : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {1, 2, 3}
r_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : I*I : 9 : {(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3), (3, 1), (3, 2), (3, 3)}
<BLANKLINE>
3 Param Declarations
p : Size=1, Index=None, Domain=Any, Default=None, Mutable=False
Expand Down
12 changes: 7 additions & 5 deletions doc/OnlineDocs/working_abstractmodels/instantiating_models.rst
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ is "empty":

>>> model.pprint()
1 Set Declarations
I : Dim=0, Dimen=1, Size=0, Domain=None, Ordered=False, Bounds=None
I : Size=0, Index=None, Ordered=Insertion
Not constructed
<BLANKLINE>
1 Param Declarations
Expand Down Expand Up @@ -66,8 +66,9 @@ abstract ``model`` is left untouched.
True
>>> instance.pprint()
1 Set Declarations
I : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
I : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {1, 2, 3}
<BLANKLINE>
1 Param Declarations
p : Size=1, Index=None, Domain=Any, Default=None, Mutable=False
Expand Down Expand Up @@ -102,8 +103,9 @@ several sources, including using a :ref:`dict <page-data-from-dict>`,
>>> instance2 = model.create_instance({None: {'I': {None: [4,5]}}})
>>> instance2.pprint()
1 Set Declarations
I : Dim=0, Dimen=1, Size=2, Domain=None, Ordered=False, Bounds=(4, 5)
[4, 5]
I : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 2 : {4, 5}
<BLANKLINE>
1 Param Declarations
p : Size=1, Index=None, Domain=Any, Default=None, Mutable=False
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ A : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
s : Size=3, Index=A
Key : Lower : Value : Upper : Fixed : Stale : Domain
1 : 1 : None : 2 : False : True : IntegerInterval(1, 2)
2 : 2 : None : 3 : False : True : IntegerInterval(2, 3)
3 : 3 : None : 4 : False : True : IntegerInterval(3, 4)
1 : 1 : None : 2 : False : True : [1:2]
blnicho marked this conversation as resolved.
Show resolved Hide resolved
2 : 2 : None : 3 : False : True : [2:3]
3 : 3 : None : 4 : False : True : [3:4]
A : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
0.0
Expand Down
15 changes: 8 additions & 7 deletions examples/kernel/variables.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,15 @@
import pyomo.kernel as pmo
import pyomo.environ as pe
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm hoping to keep pyomo.kernel as self contained as possible until the two modeling layers are compatible. Is this import necessary?

Copy link
Member Author

@jsiirola jsiirola Mar 25, 2020

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Unfortunately, for this example., yes: Reals is a proper Pyomo Set. The alternative was to change all the Reals in the example to RealSet from kernel, and I wasn't exactly clear as to what you were trying to highlight in the example.


#
# Continuous variables
#

v = pmo.variable()

v = pmo.variable(domain=pmo.Reals)
v = pmo.variable(domain=pe.Reals)

v = pmo.variable(domain=pmo.NonNegativeReals,
v = pmo.variable(domain=pe.NonNegativeReals,
ub=10)

v = pmo.variable(domain_type=pmo.RealSet,
Expand All @@ -22,11 +23,11 @@
# Discrete variables
#

v = pmo.variable(domain=pmo.Binary)
v = pmo.variable(domain=pe.Binary)

v = pmo.variable(domain=pmo.Integers)
v = pmo.variable(domain=pe.Integers)

v = pmo.variable(domain=pmo.NonNegativeIntegers,
v = pmo.variable(domain=pe.NonNegativeIntegers,
ub=10)

v = pmo.variable(domain_type=pmo.IntegerSet,
Expand Down Expand Up @@ -59,11 +60,11 @@
assert v.ub == 20

# set the domain (always overwrites bounds, even if infinite)
v.domain = pmo.Reals
v.domain = pe.Reals
assert v.lb == None
assert v.ub == None
assert v.domain_type == pmo.RealSet
v.domain = pmo.Binary
v.domain = pe.Binary
assert v.lb == 0
assert v.ub == 1
assert v.domain_type == pmo.IntegerSet
Expand Down
6 changes: 3 additions & 3 deletions examples/pyomo/benders/subproblem.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,15 +29,15 @@

# derived set containing all valid week indices and subsets of interest.
def weeks_rule(model):
return set(sequence(model.T()))
return list(sequence(model.T()))
model.WEEKS = Set(initialize=weeks_rule, within=PositiveIntegers)

def two_plus_weeks_rule(model):
return set(sequence(2, model.T()))
return list(sequence(2, model.T()))
model.TWOPLUSWEEKS = Set(initialize=two_plus_weeks_rule, within=PositiveIntegers)

def three_plus_weeks_rule(model):
return set(sequence(3, model.T()))
return list(sequence(3, model.T()))
model.THREEPLUSWEEKS = Set(initialize=three_plus_weeks_rule, within=PositiveIntegers)

# tons per hour produced
Expand Down
104 changes: 61 additions & 43 deletions examples/pyomo/tutorials/data.out
Original file line number Diff line number Diff line change
@@ -1,47 +1,65 @@
20 Set Declarations
A : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
['A1', 'A2', 'A3']
B : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=(1, 3)
[1, 2, 3]
C : Dim=0, Dimen=2, Size=9, Domain=None, Ordered=False, Bounds=None
Virtual
D : Dim=0, Dimen=2, Size=3, Domain=D_domain, Ordered=False, Bounds=None
[('A1', 1), ('A2', 2), ('A3', 3)]
D_domain : Dim=0, Dimen=2, Size=9, Domain=None, Ordered=False, Bounds=None
Virtual
E : Dim=0, Dimen=3, Size=6, Domain=E_domain, Ordered=False, Bounds=None
[('A1', 1, 'A1'), ('A1', 1, 'A2'), ('A2', 2, 'A2'), ('A2', 2, 'A3'), ('A3', 3, 'A1'), ('A3', 3, 'A3')]
E_domain : Dim=0, Dimen=3, Size=27, Domain=None, Ordered=False, Bounds=None
Virtual
E_domain_index_0 : Dim=0, Dimen=2, Size=9, Domain=None, Ordered=False, Bounds=None
Virtual
F : Dim=1, Dimen=1, Size=9, Domain=None, ArraySize=3, Ordered=False, Bounds=None
Key : Members
A1 : [1, 3, 5]
A2 : [2, 4, 6]
A3 : [3, 5, 7]
G : Dim=2, Dimen=1, Size=0, Domain=None, ArraySize=0, Ordered=False, Bounds=None
Key : Members
G_index : Dim=0, Dimen=2, Size=9, Domain=None, Ordered=False, Bounds=None
Virtual
H : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
['H1', 'H2', 'H3']
I : Dim=0, Dimen=1, Size=4, Domain=None, Ordered=False, Bounds=None
['I1', 'I2', 'I3', 'I4']
J : Dim=0, Dimen=2, Size=3, Domain=None, Ordered=False, Bounds=None
[('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')]
K : Dim=0, Dimen=2, Size=3, Domain=None, Ordered=False, Bounds=None
[('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')]
T_index : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
Virtual
U_index : Dim=0, Dimen=2, Size=12, Domain=None, Ordered=False, Bounds=None
Virtual
x : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
['A1', 'A2', 'A3']
y : Dim=0, Dimen=1, Size=3, Domain=None, Ordered=False, Bounds=None
['A1', 'A2', 'A3']
z : Dim=0, Dimen=2, Size=3, Domain=None, Ordered=False, Bounds=None
[('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')]
A : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'A1', 'A2', 'A3'}
B : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {1, 2, 3}
C : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : A*B : 9 : {('A1', 1), ('A1', 2), ('A1', 3), ('A2', 1), ('A2', 2), ('A2', 3), ('A3', 1), ('A3', 2), ('A3', 3)}
D : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 2 : D_domain : 3 : {('A1', 1), ('A2', 2), ('A3', 3)}
D_domain : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : A*B : 9 : {('A1', 1), ('A1', 2), ('A1', 3), ('A2', 1), ('A2', 2), ('A2', 3), ('A3', 1), ('A3', 2), ('A3', 3)}
E : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 3 : E_domain : 6 : {('A1', 1, 'A1'), ('A1', 1, 'A2'), ('A2', 2, 'A2'), ('A2', 2, 'A3'), ('A3', 3, 'A1'), ('A3', 3, 'A3')}
E_domain : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 3 : E_domain_index_0*A : 27 : {('A1', 1, 'A1'), ('A1', 1, 'A2'), ('A1', 1, 'A3'), ('A1', 2, 'A1'), ('A1', 2, 'A2'), ('A1', 2, 'A3'), ('A1', 3, 'A1'), ('A1', 3, 'A2'), ('A1', 3, 'A3'), ('A2', 1, 'A1'), ('A2', 1, 'A2'), ('A2', 1, 'A3'), ('A2', 2, 'A1'), ('A2', 2, 'A2'), ('A2', 2, 'A3'), ('A2', 3, 'A1'), ('A2', 3, 'A2'), ('A2', 3, 'A3'), ('A3', 1, 'A1'), ('A3', 1, 'A2'), ('A3', 1, 'A3'), ('A3', 2, 'A1'), ('A3', 2, 'A2'), ('A3', 2, 'A3'), ('A3', 3, 'A1'), ('A3', 3, 'A2'), ('A3', 3, 'A3')}
E_domain_index_0 : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : A*B : 9 : {('A1', 1), ('A1', 2), ('A1', 3), ('A2', 1), ('A2', 2), ('A2', 3), ('A3', 1), ('A3', 2), ('A3', 3)}
F : Size=3, Index=A, Ordered=Insertion
Key : Dimen : Domain : Size : Members
A1 : 1 : Any : 3 : {1, 3, 5}
A2 : 1 : Any : 3 : {2, 4, 6}
A3 : 1 : Any : 3 : {3, 5, 7}
G : Size=0, Index=G_index, Ordered=Insertion
Key : Dimen : Domain : Size : Members
G_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : A*B : 9 : {('A1', 1), ('A1', 2), ('A1', 3), ('A2', 1), ('A2', 2), ('A2', 3), ('A3', 1), ('A3', 2), ('A3', 3)}
H : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'H1', 'H2', 'H3'}
I : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 4 : {'I1', 'I2', 'I3', 'I4'}
J : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 2 : Any : 3 : {('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')}
K : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 2 : Any : 3 : {('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')}
T_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : A*I : 12 : {('A1', 'I1'), ('A1', 'I2'), ('A1', 'I3'), ('A1', 'I4'), ('A2', 'I1'), ('A2', 'I2'), ('A2', 'I3'), ('A2', 'I4'), ('A3', 'I1'), ('A3', 'I2'), ('A3', 'I3'), ('A3', 'I4')}
U_index : Size=1, Index=None, Ordered=True
Key : Dimen : Domain : Size : Members
None : 2 : I*A : 12 : {('I1', 'A1'), ('I1', 'A2'), ('I1', 'A3'), ('I2', 'A1'), ('I2', 'A2'), ('I2', 'A3'), ('I3', 'A1'), ('I3', 'A2'), ('I3', 'A3'), ('I4', 'A1'), ('I4', 'A2'), ('I4', 'A3')}
x : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'A1', 'A2', 'A3'}
y : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 1 : Any : 3 : {'A1', 'A2', 'A3'}
z : Size=1, Index=None, Ordered=Insertion
Key : Dimen : Domain : Size : Members
None : 2 : Any : 3 : {('A1', 'B1'), ('A2', 'B2'), ('A3', 'B3')}

18 Param Declarations
M : Size=3, Index=K, Domain=Reals, Default=None, Mutable=False
Expand Down
Loading