2. A Canonical Use Case¶
Important
First consider reading the Configuration section prior to any code execution.
2.1. Project layer¶
Any project, be it related to scientific modeling or not, has to be structured a certain way.
_
Which functions should go into which modules? How does data flow through the project? What features and functions can be grouped together and isolated? By answering questions like these you can begin to plan, in a broad sense, what your finished product will look like. Kenneth Reitz
Actually, the project layer that “derives” from using iamax is so simple that it hardly qualifies as such. It is articulated around three objects.
2.1.1. A datafile¶
2.1.2. A worker¶
2.1.3. A library¶
_
The library is a Python script whose name must be library.py. It is the corner stone of any modeling run since it contains the specifications related to how, e.g. prices form, entities such as firms and consumers behave and (potentially) aggregate to form larger-scale accounting ones. The next sections heavily detail this point and explain what should be defined and how.
In summary, if your working directory is named mrun, a typical iamax’s project layer looks like
.
└── mrun
├── data.xlsx
├── worker.py
└── library.py
The package contains an example folder that certainly is a good project layer starting point. So let’s start from it by copying this folder locally, naming it KLEM in passing.
.
└── KLEM
├── ut(KLEM-BRICS-202006).xlsx # the datafile
├── ut(KLEM-BRICS-202006).py # the "worker"
└── library.py
Note
The above copy is performed using DSpace’s copy_example() method, e.g. under Windows
>echo import iamax as im; im.DSpace.copy_example('KLEM') | python
Folder copied to 'KLEM'
or under Linux and macOS.
$ python -c 'import iamax as im; im.DSpace.copy_example("KLEM")'
Folder copied to 'KLEM'
Both approaches are equivalent to the following in Python’s IDLE.
>>> im.DSpace.copy_example('KLEM')
Folder copied to 'KLEM'
There is no risk to overwrite (and lose) the changes you would have brought to your local copy since copy_example() will refuse to copy twice into the same existing directory.
In passing, such “project creation” will soon be doable the standard way.
2.2. Users’ definitions¶
As just outlined, users can define their own production/preference/dynamic functions simply by editing their own version of library.py. To do so, it is necessary to comply with a minimal set of rules – a priori simple and intuitive –, regarding how these functions are specified.
2.2.1. Inputs¶
_
Any library’s function takes a set of inputs, also known as arguments. In the scope of iamax, these arguments will necessarily be related to the technico-economical variables that are defined at the core of the code. The list of these variables is reported in the collapsible table below.
Eligible operands |
Shape |
|---|---|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times |\mcI| \times 1\) |
|
|
\(|\mcL| \times |\mcI| \times 1\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times 1 \times |\mcI|\) |
|
|
\(|\mcL| \times 1 \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
\(|\mcL| \times |\mcI| \times |\mcI|\) |
|
|
\(|\mcL| \times |\mcI| \times |\mcI|\) |
… |
… |
\(|\mcI| \times 1\) |
|
\(|\mcI| \times 1\) |
|
\(|\mcI| \times 1\) |
|
\(|\mcI| \times 1\) |
|
\(|\mcI| \times 1\) |
|
|
\(|\mcI| \times 1\) |
\(|\mcI| \times 1\) |
|
\(|\mcI| \times 1\) |
|
|
\(|\mcI| \times |\mcI|\) |
\(|\mcI| \times |\mcI|\) |
|
\(|\mcI| \times |\mcI|\) |
|
|
\(|\mcI| \times |\mcI|\) |
|
\(|\mcI| \times |\mcI|\) |
\(|\mcI| \times 1\) |
|
|
\(|\mcI| \times 1\) |
|
\(1 \times |\mcI|\) |
|
\(1 \times |\mcI|\) |
|
\(|\mcI| \times 1\) |
|
\(1 \times |\mcI|\) |
|
\(|\mcI| \times |\mcI|\) |
|
\(|\mcI| \times |\mcI|\) |
|
\(|\mcI| \times 1\) |
|
\(1 \times |\mcI|\) |
… |
… |
\(0\) |
|
\(0\) |
**With sets \(\mcI\) and \(\mcL\) being defined in Eq.1 and Eq.2 respectively.
_
These variables — also referred to as operands — have various shapes. On the one hand, we have variables that consist in temporally organized height-\(|\mcL|\) stacks of arrays, e.g.
input_pricesis a stack of \(|\mcI| \times |\mcI|\) (square) matrices,
aggregated_input_volumesis a stack of \(|\mcI| \times 1\) (column) vectors,
output_pricesis a stack of \(1 \times |\mcI|\) (row) vectors,
On the other hand, we have (ancillary) variables that are defined as time-invariant, e.g.
ones_matrixis a \(|\mcI| \times |\mcI|\) (square) matrix,
ones_vectoris a \(|\mcI| \times 1\) (column) vector,
ones_vector_transposeis a \(1 \times |\mcI|\) (row) vector.
Thus, on that matter, the rule is simple: you can define the functions you want as long as they mobilize names among those listed. Also, keep in mind that these names can be used in their singular form, e.g. producer_net_price can be used instead of producer_net_prices.
Note
The above list can easily (and has vocation to) be enriched with new variables. Do not hesitate to contact a core developer.
Important
By (clicking on and) reading about the arguments listed above, you may have noticed that they all consist of pandas.DataFrame instances (t and delta_year excepted). The important point is that matrix-like objects will be provided to your functions as relevantly sliced jax.numpy.ndarray instances.
_
What is meant by relevantly sliced ?
The fact is that it is highly unlikely that you will need the entirety of each variable when working with or on them. Only a slice of them will matter, specifically the one related to the entities you want to put at stack. More about this in due time.
2.2.2. Outputs¶
_
To specify which values are to be modified/overwritten by the functions defined in library, iamax relies on a specific naming convention. This naming convention is rather simple ; it consists in suffixing with _computer (or _λ) the name of the variable you want to update, chosen among those enumerated, e.g. input_volumes_computer. Here as well, singular form can be employed, e.g. output_price_computer instead of output_prices_computer. In case you want your user-defined function to instead be a zero-finder, suffix the name of the variable to be ‘zeroed’ by _rooter (or _ζ).
Note
You may want a user-defined function to be ran at calibration only (just as calibrand computers are). In such a case, the suffixes to be used are _ccomputer (or _cλ) and _crooter (or _cζ).
That being explained, this naming convention is not mandatory. Once again, the rule on that matter is simple: any function that possesses a name that mirrors nothing in the variables list will be considered to work in place, with warnings though. More about this follows.
Note
If you want a function not to be considered externally, just make it (semi-) private. It turns out that you are forced to do so if your function involves unrecognized arguments; a NameError is raised otherwise, which halts the program execution.
Important
Zero-finders must be i) once differentiable everywhere and ii) dimensionless, i.e. -1 + running_value / target_value. The only exception allowed to the latter rule relates to target values equal to 0, in which case returning running_value suffices.
2.3. Abstractions¶
So far, the word function has been used for the sake of familiarization. But it is stricto sensu methods and classes, by the same token, that have to be defined.
User-defined classes have vocation to enrich library, a module that already contains a few classes, whose names are arbitrary, but whose methods and arguments (unsurprisingly) comply with the precited two rules [cf. [1] and [2]].
These classes can be used as template to start from to define new ones, be that related to how these are meaningfully named, how special methods and attributes are defined (e.g. __init__) and, especially, how docstring are structured and fed with LaTeX equations, etc.
2.3.1. Instantiation¶
_
By having a look at the code of, say, HicksianCES — documentation-stripped, simplified and reported by chunk below —, you will have noticed that (it indeed complies with the precited rules [cf. [1] and [2]] and that) it possesses a special method named __init__().
class HicksianCES:
__slots__ = (
'calibrand_0', 'sigma', 'rho',
)
def __init__(self, sigma: float):
self.sigma = sigma
self.rho = (sigma - 1)/sigma
# [...]
Nothing is iamax-specific here. The __init__ method is just how objects are created from classes in Python. It serves no purpose other than making sigma (and rho) available everywhere within the scope of the class instance.
Note
As its name suggests, HicksianCES is a class that aggregates a bunch of methods whose definitions derive from a utility maximization program formulated à la Hicks. This logically has consequences on how optimal inputs demands and output price are defined/resolved.
Remains the arbitrary choice of how the distribution parameters of the underlying CES are calibrated.
2.3.2. Calibrators¶
_
In the case of (this simplified version of)
HicksianCES, it has been chosen to calibrate the distribution parameters by rearranging the maximization program’s first order conditions, leading to the very definition ofcompute_calibrand_0(). The part of the method that does something is only five-line long.# [...] def compute_calibrand_0( self, *, output_volume: np.float_, input_volumes: np.ndarray, input_values: np.ndarray, ) -> None: self.calibrand_0 = ( input_values / input_values.sum() * np.power( output_volume / input_volumes, self.rho ) ) # [...]
If we had more than one vector of parameters to be calibrated, say, two, we would (or could) then have defined another method templated as compute_calibrand_<i>, more concretely compute_calibrand_1.
Note
This naming/templating convention is actually the third rule to comply with, i.e. calibrators have to be named as compute_calibrand_<i> where <i> stands for the calibrator’s number. So-named methods are only mobilized during the calibration stage. Keep in mind that no rule prevents from giving the name one wants to the attribute being defined within calibrators. In the current example, it was given the name calibrand_0 to associate it with the function compute_calibrand_0 in the reader’s mind. However, a more descriptive name like distribution_parameters would have been more talking.
Another thing you may have noticed is that compute_calibrand_0() returns nothing, i.e. it works in place by internally modifying the state of calibrand_0, a class attribute just like any other (e.g. sigma, rho), mobilized within the other methods of the class. Let’s see which ones, and how, in the next section.
2.3.3. Operators¶
_
These calibrands have necessarily been calculated to serve a purpose. As explained just previously, they are intended to be used in the other methods of HicksianCES, namely input_volumes_computer() and output_price_computer(). Check for yourself via the following chunk of code.
# [...]
def input_volumes_computer(
self, *, output_volume: np.float_,
input_prices: np.ndarray
) -> np.ndarray:
sigma = self.sigma
_1_sigma = 1 - sigma
distpars = self.calibrand_0 # ←--------
return (
output_volume
* np.power(distpars / input_prices, sigma)
* np.power(
np.sum(
np.power(distpars, sigma)
* np.power(input_prices, _1_sigma)
),
sigma/_1_sigma
)
)
def output_price_computer(
self, *, input_prices: np.ndarray,
) -> np.float_:
sigma = self.sigma
_1_sigma = 1 - sigma
return np.power(
np.sum(
np.power(self.calibrand_0, sigma) # ←--------
* np.power(input_prices, _1_sigma)
),
1/_1_sigma
)
# [...]
Yet another thing you may have noticed is that the above two methods do not work in place, i.e. they both return something to be hosted by the (core-system’s) variables input_volumes for the former and output_prices for the latter.
2.3.4. Operands¶
_
When the algorithm provides HicksianCES.output_price_computer() with argument input_prices, it is not the entire \(|\mcL| \times |\mcI| \times |\mcI|\) cuboid of input prices that is served, but only a slice of it. The required slice is constituted in 3 steps, as follows:
The algorithm observes that the year-targeting integer
tis not among the method’s arguments and, for \(t \in \mcL\), subsequently only considers the \(t^{\text{th}}\)input_prices’s \(|\mcI| \times |\mcI|\) cross-section,It then locates, within this cross-section, the \(j^{\text{th}}\) column of the good whose
output_priceis to be computed,Based on its knowledge of \(\mcI_j \subseteq \mcI\) it ultimately forms a tailored \(1 \times |\mcI_j|\) version of
input_pricesover the relevant scalars.
It is worth nuancing this enumeration right away:
If the algorithm had observed the presence of the year-targeting integer
tamong the method’s arguments, it would have instead built a rectangular \(|\mcL| \times |\mcI_j|\) version ofinput_prices,If
input_priceswere instead \(|\mcL| \times 1 \times |\mcI|\) — which e.g.output_volumesactually is — we would rather have \(\mcI_j = \{j\}\), i.e. the only row’s index that can possibly exist within a row vector.
The same applies to the to-be-modified variables. Concretely, this means that HicksianCES.output_price_computer() has to return a scalar output_price, which the algorithm will store at position \((t, \ 1, \ j)\) within output_prices. Yet another example with HicksianCES.input_volumes_computer() ; the method has to return a \(1 \times |\mcI_j|\) vector that the algorithm will store at positions \(\left((t, \ k, \ j)\right)_{k \in \mcI_j}\) within input_volumes.
It is therefore with these few considerations in mind that we were able to define HicksianCES, fully operational and mobilizable by iamax on a per-entity basis.
_
But how is such mobilization performed? How to let the algorithm know \(\mcI_j \ \forall \ j \in \mcI\) ? I.e. how do you tell the algorithm that a given object’s property is to be derived from such other objects’ properties ? Yet an even more illustrative formulation : how do you tell the algorithm that a given good is to be produced from such and such other goods ?
In two words: through data. This is explained in the following section.
2.4. Data-driven settings¶
As outlined in Introduction, iamax vertues the idea of externalizing as much as possible the modeling exercises’ settings via input data – of arbitrary dimensionality –, the model agnostically doing its job to articulate, understand and compute the results.
2.4.1. Data input files¶
_
All data files are assumed to be XLSX. There can be as many tabs as required to specify the modeling exercise, with one type of data per tab.
See also
Cf. DSpace’s display_legal_sheets_names() method to know the currently implemented list of sheets names that can be provided to the model.
All data must be provided following the input-output (IO) convention, which is indeed a very widespread and consensual approach when dealing with values or volumes: the point is that iamax generalizes this idea to any type of quantity, e.g. prices, taxes, excises, exonerations, etc.
Tables can be reduced at their maximum, i.e. they do not have to share the same number of rows and/or columns. The names of tabs and scalars are totally arbitrary, i.e. they can be in english, arabic, chinese or french, or else: the only requirement is that things must be named consistently and identically in the entire workbook. In the GIF above, although containing values of different natures, all tabs’ tables exhibit the exact same i) dimensionality and ii) rows/columns’ names.
Remains one exception to this IO-rule: the tab whose content specifies the production/preference/dynamic functions per sector/entity/market. Indeed, it follows a transpose version of the precited IO-rule, let’s call it “OI-rule”. Incidentally, a good name for the illustrated sheet below could be ‘technologies’ or ‘entities’.
Compared to other tabs, the data are very sparse and hosted within merged cells. But, above all, they are of qualitative nature and echo the names of classes that have been defined in library, accompanied with instantiation arguments.
Attention
You may have noticed that we never relied on the structure of the arguments that were provided to our library’s methods. The implicit point is that you should avoid to do so unless you have good reasons. Otherwise, you will have to enter a rather dark forest.
_
What is meant by structure of vector (or matrix) arguments ?
Consider the following example, based (in the above illustration) on how the (N, Z, O-KL) good is produced. For the sake of convenience, let’s alias (N, Z, O-KL), (N, D, K) and (N, D, L₁) respectively by KL, K and L prior to going further.
When the HicksianCES’s methods are put at stake in order to compute the properties of the KL good, the mobilized argument vectors will be formed exactly as horizontally exposed in the OI-table, i.e. all vectors’ first element will be related to K and second element to L. To be more concrete, say that instead of HicksianCES, KL was produced according to a toy-class named C, defined as follows
class C:
@staticmethod
def x_computer(y, z):
return y + z
Let’s assume that i) x, y and z belong to the list of eligible variables and ii) KL only depends on K and L, enumerated in this order within the OI-table.
Under assumptions i) and ii), the algorithm would be instructed to provide C().x_computer with a y vector of length \(2\), whose first component would be the scalar y_K property, followed by that of L, i.e. y would consists of an array that would look like [y_K, y_L]. If assumption ii) were modified by reverting the enumeration order of K and L, then C().x_computer would be provided with a y vector whose components’ order would reflect this modification, i.e. [y_L, y_K]. That being explained, there are two is one exceptions to this component-ordering rule.
[Exception 1 : scalar self-dependence] Imagine now that instead of only depending on L and K, KL was also depending on itself, i.e. that we had, say, L, KL and K enumerated in this exact order within the OI-table. Then, C().x_computer would be provided with a y vector of length \(3\) but with the y_KL scalar property as first component of y (!), followed by that of L and K, i.e. y would look like [y_KL, y_L, y_K]. Of course, such ordering change would have been transparent if we had written KL, L and K from the beginning within the OI-table.
[Exception 2 : time-series] Let’s now consider an alternative version of C().x_computer that invokes the year-targeting integer t, as follows
class C:
@staticmethod
def x_computer(y, z, t):
return y[t] + z[0]
In such case, the rule is even simpler : the sole fact of having t mobilized by C().x_computer, tells the algorithm that the method is to be provided with arrays whose first component relate to the object whose property is being defined, i.e. y will always look like [y_KL(∀ t) , y_L(∀ t), y_K(∀ t)], be KL defined in terms of itself or not within the OI-table.
2.4.2. System’s Unknowns¶
_
Be that for the calibration or the subsequent resolutions, iamax’s optimizer needs to be informed about the characteristics of the resolution space.
To do so, users must use a predefined set of symbols within their XLSX file. Three symbols are available.
As shown above, these symbols can be specified i) directly as cell’s value or ii) as cell’s note.
Note
Any non-numeric symbol (such as the hyphen above) is considered meaningless and will leave room for any value that would emerge endogenously.
Finally, CUNK_0D_SYM, RUNK_0D_SYM and RUNK_1D_SYM are to be specified in the most upstream (and hence exogenous) variables of the system, i.e. those not being explained/backed-up by any equation:
Any sheet related to driving rates, i.e. whose name ends with <>_drates, can also host such symbols.
Note
The above list changes according to the states of configuration parameters such as e.g. EXOGENOUS_MRENTS, …, RELATIVE_TRAMGS or DETAILED_TRAMGS.
2.5. In a nutshell¶
What follows is an overview of the main rules outlined in this page.
2.5.1. A 3-file project layer …¶
_
Any project layer contains (at least) three file objects:
a (XLSX) datafile that vertues at the maximum the IO format — OI-ed in a specific case — and exhibits the system’s unknowns,
a worker whose sole job is to launch the modeling exercises as such and
the library.py script that embodies (on the python side) the analytical description that any model is supposed to be the subject of.
2.5.2. involving operands …¶
2.5.3. or not …¶
_
Any method whose name mirrors nothing will be considered to work in place. Calibrators work in place anyway and have to comply with another naming convention, i.e. compute_calibrand_<i>, so as to only be mobilized during the calibration stage. Any unrecognized public method’s argument will raise an error.
2.5.4. but whose shapes matter …¶
2.5.5. while their structure shouldn’t …¶
_
The orders of components over which cross-sections or time-series are formed strictly follow the ones specified within the so-called OI-table, with one exception.
Which concludes this tutorial. Keep in mind that it is a living document that evolves with feedback and use. If you have any questions or suggestions, please don’t hesitate to reach out. Your questions cannot be of no interest.