Modeling with Material/Operating Modes#

The follow example follows ‘Multiscale MILP’ and ‘Material and Emission Streams’

From ‘Multiscale MILP’#

Solar and Wind consumption is kept unbounded to refrain from adding unnecessary constraints

# !pip install energiapy # uncomment and run to install Energia, if not in environment
from energia import *

m = Model("design_scheduling")
m.scales = TemporalScales([1, 4], ["y", "q"])
m.usd = Currency()
m.gwp = Environ()
m.declare(Resource, ["power", "wind", "solar"])
m.solar.consume == True
m.wind.consume == True
m.power.release.prep(180) >= [0.6, 0.7, 0.8, 0.3]
⚖  Initiated solar balance in (l0, y)                                       ⏱ 0.0001 s
⚖  Initiated wind balance in (l0, y)                                        ⏱ 0.0001 s
⚖  Initiated power balance in (l0, q)                                       ⏱ 0.0001 s
🔗  Bound [≥] power release in (l0, q)                                       ⏱ 0.0007 s

Materials and Impact of Consumption#

Materials are declared and the Global Warming Potential arising from their consumption is set

m.declare(
    Material,
    [
        "lir",
        "lib",
        "steel",
        "concrete",
        "glass",
        "si_mono",
        "si_poly",
    ],
)

m.usd.spend(m.steel.consume) == 670

m.gwp.emit(m.steel.consume) == 2121.152427
m.gwp.emit(m.lir.consume) == 9600
m.gwp.emit(m.lib.consume) == 2800
m.gwp.emit(m.concrete.consume) == 120.0378
m.gwp.emit(m.glass.consume) == 1118.5
m.gwp.emit(m.si_mono.consume) == 122239.1
m.gwp.emit(m.si_poly.consume) == 98646.7
⚖  Initiated steel balance in (l0, y)                                       ⏱ 0.0001 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0002 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0002 s
⚖  Initiated lir balance in (l0, y)                                         ⏱ 0.0001 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0002 s
⚖  Initiated lib balance in (l0, y)                                         ⏱ 0.0001 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0003 s
⚖  Initiated concrete balance in (l0, y)                                    ⏱ 0.0001 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0003 s
⚖  Initiated glass balance in (l0, y)                                       ⏱ 0.0001 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0003 s
⚖  Initiated si_mono balance in (l0, y)                                     ⏱ 0.0002 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0003 s
⚖  Initiated si_poly balance in (l0, y)                                     ⏱ 0.0001 s
🔗  Bound [=] gwp emit in (l0, y)                                            ⏱ 0.0003 s

Processes and Material Requirements#

Let us consider the windfarm (WF) process

m.wf = Process()
m.wf.capacity.x <= 100
m.wf.capacity.x >= 10
m.wf.operate.prep(norm=True) <= [0.9, 0.8, 0.5, 0.7]
🔗  Bound [≤] wf capacity in (l0, y)                                         ⏱ 0.0003 s
🔗  Bound [≥] wf capacity in (l0, y)                                         ⏱ 0.0002 s
🔗  Bound [≤] wf operate in (l0, q)                                          ⏱ 0.0003 s

Material Modes#

These represent a ‘recipe’ of constructing a process on a per unit basis

m.wf.construction == [
    -109.9 * m.steel - 398.7 * m.concrete,
    -249.605 * m.steel - 12.4 * m.concrete,
]
η_PWL(wf, _y0)

For example, the above equation, generates two material modes This indicates two discrete options for building a WF:

  1. Use -109.9 steel + 398.7 concrete

  2. Use -249.605 steel + 12.4 concrete

All units are of the form:

\(\frac{\text{Unit of Material}}{\text{Unit of basis Resource of Process}}\)

Modes Generation#

Modes are generated internally and can be accessed using the naming scheme is “_ + name of period set + nth of mode of period set”. It is easier to access them from the Conversion for which they were made.

m.wf.construction.modes
_y0

Referring to Modes#

Other parameters can now be provided such that it corresponds to the modes generated for ‘construction’ In the example below, the efficiency of WF depends on the Material Mode adopted:

m.wf(m.power) == {
    m.wf.construction.modes[0]: -2.857 * m.wind,
    m.wf.construction.modes[1]: -2.3255 * m.wind,
}
η_PWL(wf, _y0)

The material modes are also set on the Model and can be accessed directly for more complex interactions. The statement below, provides costing as a function of the choice of Modes.

m.usd.spend(m.wf.capacity, m.wf.construction.modes) == [
    1292000 + 29200,
    3192734 + 101498,
]
m.usd.show(True)
🧭  Mapped modes for spend (usd, l0, y, capacity, wf, _y0) ⟺ (usd, l0, y, capacity, wf) ⏱ 0.0004 s
🧭  Mapped modes for capacity (wf, l0, y, _y0) ⟺ (wf, l0, y)                 ⏱ 0.0002 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0021 s
\[\displaystyle [11]\text{ }{\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cons}}},{steel}} - 670.0 \cdot {\mathbf{{cons}}}_{{steel},{l0},{{{y}_{0}}}} = 0\]
\[\displaystyle [31]\text{ }{\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cap}}},{wf}} - ({\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} + {\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}}) = 0\]
\[\displaystyle [33]\text{ }{\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} - 1321200.0 \cdot {\mathbf{{cap}}}_{{wf},{l0},{{{y}_{0}}},{{{\_y0}_{0}}}} = 0\]
\[\displaystyle [34]\text{ }{\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}} - 3294232.0 \cdot {\mathbf{{cap}}}_{{wf},{l0},{{{y}_{0}}},{{{\_y0}_{1}}}} = 0\]

Nevertheless, it is not compulsory to map all parameters individually to Modes.

m.usd.spend(m.wf.operate) == 49
m.operate.show()
🧭  Mapped time for operate (wf, l0, q) ⟺ (wf, l0, y)                        ⏱ 0.0002 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0004 s
\[\displaystyle [26]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{opr}}},{wf}} - 49 \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y}} = 0\]
\[\displaystyle [25]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf}, {l0}, {y}, i} = 0\]
\[\displaystyle [21]\text{ }{\mathbf{{\mathbf{{opr}}}}}_{{wf},{l0},{y},{q}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{cap}}}}}_{{wf},{l0},{y}} \leq 0\]

Note that the Streams resulting from both construction and production will be added once the process is located later.

m.pv = Process()
m.pv.construction == [-70 * m.glass - 7 * m.si_mono, -70 * m.glass - 7 * m.si_poly]

m.pv(m.power) == {
    m.pv.construction.modes[0]: -5 * m.solar,
    m.pv.construction.modes[1]: -6.67 * m.solar,
}
m.pv.capacity.x <= 100
m.pv.capacity.x >= 10
m.pv.operate.prep(norm=True) <= [0.6, 0.8, 0.9, 0.7]
m.usd.spend(m.pv.capacity) == 567000 + 872046
m.usd.spend(m.pv.operate) == 90000
🔗  Bound [≤] pv capacity in (l0, y)                                         ⏱ 0.0004 s
🔗  Bound [≥] pv capacity in (l0, y)                                         ⏱ 0.0002 s
🔗  Bound [≤] pv operate in (l0, q)                                          ⏱ 0.0004 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0004 s
🧭  Mapped time for operate (pv, l0, q) ⟺ (pv, l0, y)                        ⏱ 0.0003 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0004 s

Remaining Operations#

Storages can have Material requirements as well. Note that unless explicitly assigned to Charging or Discharging Processes, all values assigned to Storages scale with the inventory capacity (invcapacity)

m.lii = Storage()
m.lii(m.power) == 0.9
m.lii.construction == [
    -0.137 * m.lib - 1.165 * m.steel,
    -0.137 * m.lir - 1.165 * m.steel,
]
m.lii.capacity.x <= 100
m.lii.capacity.x >= 10
m.usd.spend(m.lii.capacity) == 1302182 + 41432
m.usd.spend(m.lii.inventory) == 2000
🔗  Bound [≤] lii.stored invcapacity in (l0, y)                              ⏱ 0.0003 s
🔗  Bound [≥] lii.stored invcapacity in (l0, y)                              ⏱ 0.0002 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0004 s
🔗  Bound [=] usd spend in (l0, y)                                           ⏱ 0.0004 s

Constraints Generated#

Lets take a gander at the mode-based constraints generated

m.wf.construction.modes.show()
\[\displaystyle [22]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf}} - ({\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} + {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}}) = 0\]
\[\displaystyle [23]\text{ }{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y}} - ({\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} + {\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}}) = 0\]
\[\displaystyle [24]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{\_y0}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{\_y0}} = 0\]

Locate and Optimize!#

The model first optimizes for cost and them for emissions (both minimization).

m.network.locate(m.wf, m.pv, m.lii)
m.usd.spend.opt()
m.gwp.emit.opt()
💡  Assumed wf capacity unbounded in (l0, y)                                 ⏱ 0.0001 s
💡  Assumed wf operate bounded by capacity in (l0, q)                        ⏱ 0.0001 s
⚖  Updated power balance with produce(power, l0, q, operate, wf)            ⏱ 0.0001 s
🧭  Mapped modes for produce (power, l0, q, operate, wf, _y0[0]) ⟺ (power, l0, q, operate, wf) ⏱ 0.0008 s
🧭  Mapped time for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, y, _y0[0])        ⏱ 0.0002 s
🧭  Mapped modes for operate (wf, l0, y, _y0[0]) ⟺ (wf, l0, y)               ⏱ 0.0019 s
🧭  Mapped time for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, y, _y0[0])        ⏱ 0.0035 s
🧭  Mapped modes for operate (wf, l0, q, _y0[0]) ⟺ (wf, l0, q)               ⏱ 0.0001 s
🔗  Bound [=] power produce in (l0, q)                                       ⏱ 0.0060 s
⚖  Updated wind balance with expend(wind, l0, y, operate, wf)               ⏱ 0.0001 s
🧭  Mapped modes for expend (wind, l0, y, operate, wf, _y0[0]) ⟺ (wind, l0, y, operate, wf) ⏱ 0.0006 s
🔗  Bound [=] wind expend in (l0, y)                                         ⏱ 0.0012 s
🧭  Mapped modes for produce (power, l0, q, operate, wf, _y0[1]) ⟺ (power, l0, q, operate, wf) ⏱ 0.0002 s
🧭  Mapped time for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, y, _y0[1])        ⏱ 0.0002 s
🧭  Mapped modes for operate (wf, l0, y, _y0[1]) ⟺ (wf, l0, y)               ⏱ 0.0001 s
🧭  Mapped time for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, y, _y0[1])        ⏱ 0.0012 s
🧭  Mapped modes for operate (wf, l0, q, _y0[1]) ⟺ (wf, l0, q)               ⏱ 0.0002 s
🔗  Bound [=] power produce in (l0, q)                                       ⏱ 0.0032 s
🧭  Mapped modes for expend (wind, l0, y, operate, wf, _y0[1]) ⟺ (wind, l0, y, operate, wf) ⏱ 0.0001 s
🔗  Bound [=] wind expend in (l0, y)                                         ⏱ 0.0009 s
🏭  Operating streams introduced for wf in l0                                ⏱ 0.0129 s
⚖  Updated steel balance with use(steel, l0, y, capacity, wf)               ⏱ 0.0001 s
🧭  Mapped modes for use (steel, l0, y, capacity, wf, _y0[0]) ⟺ (steel, l0, y, capacity, wf) ⏱ 0.0007 s
🔗  Bound [=] steel use in (l0, y)                                           ⏱ 0.0017 s
⚖  Updated concrete balance with use(concrete, l0, y, capacity, wf)         ⏱ 0.0001 s
🧭  Mapped modes for use (concrete, l0, y, capacity, wf, _y0[0]) ⟺ (concrete, l0, y, capacity, wf) ⏱ 0.0007 s
🔗  Bound [=] concrete use in (l0, y)                                        ⏱ 0.0015 s
🧭  Mapped modes for use (steel, l0, y, capacity, wf, _y0[1]) ⟺ (steel, l0, y, capacity, wf) ⏱ 0.0001 s
🔗  Bound [=] steel use in (l0, y)                                           ⏱ 0.0011 s
🧭  Mapped modes for use (concrete, l0, y, capacity, wf, _y0[1]) ⟺ (concrete, l0, y, capacity, wf) ⏱ 0.0001 s
🔗  Bound [=] concrete use in (l0, y)                                        ⏱ 0.0010 s
🏗  Construction streams introduced for wf in l0                             ⏱ 0.0066 s
🌍  Located wf in l0                                                         ⏱ 0.0213 s
💡  Assumed pv capacity unbounded in (l0, y)                                 ⏱ 0.0001 s
💡  Assumed pv operate bounded by capacity in (l0, q)                        ⏱ 0.0001 s
⚖  Updated power balance with produce(power, l0, q, operate, pv)            ⏱ 0.0001 s
🧭  Mapped modes for produce (power, l0, q, operate, pv, _y1[0]) ⟺ (power, l0, q, operate, pv) ⏱ 0.0007 s
🧭  Mapped time for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, y, _y1[0])        ⏱ 0.0002 s
🧭  Mapped modes for operate (pv, l0, y, _y1[0]) ⟺ (pv, l0, y)               ⏱ 0.0001 s
🧭  Mapped time for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, y, _y1[0])        ⏱ 0.0011 s
🧭  Mapped modes for operate (pv, l0, q, _y1[0]) ⟺ (pv, l0, q)               ⏱ 0.0002 s
🔗  Bound [=] power produce in (l0, q)                                       ⏱ 0.0034 s
⚖  Updated solar balance with expend(solar, l0, y, operate, pv)             ⏱ 0.0001 s
🧭  Mapped modes for expend (solar, l0, y, operate, pv, _y1[0]) ⟺ (solar, l0, y, operate, pv) ⏱ 0.0007 s
🔗  Bound [=] solar expend in (l0, y)                                        ⏱ 0.0014 s
🧭  Mapped modes for produce (power, l0, q, operate, pv, _y1[1]) ⟺ (power, l0, q, operate, pv) ⏱ 0.0002 s
🧭  Mapped time for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, y, _y1[1])        ⏱ 0.0002 s
🧭  Mapped modes for operate (pv, l0, y, _y1[1]) ⟺ (pv, l0, y)               ⏱ 0.0001 s
🧭  Mapped time for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, y, _y1[1])        ⏱ 0.0016 s
🧭  Mapped modes for operate (pv, l0, q, _y1[1]) ⟺ (pv, l0, q)               ⏱ 0.0002 s
🔗  Bound [=] power produce in (l0, q)                                       ⏱ 0.0037 s
🧭  Mapped modes for expend (solar, l0, y, operate, pv, _y1[1]) ⟺ (solar, l0, y, operate, pv) ⏱ 0.0001 s
🔗  Bound [=] solar expend in (l0, y)                                        ⏱ 0.0010 s
🏭  Operating streams introduced for pv in l0                                ⏱ 0.0110 s
⚖  Updated glass balance with use(glass, l0, y, capacity, pv)               ⏱ 0.0001 s
🧭  Mapped modes for use (glass, l0, y, capacity, pv, _y1[0]) ⟺ (glass, l0, y, capacity, pv) ⏱ 0.0008 s
🧭  Mapped modes for capacity (pv, l0, y, _y1[0]) ⟺ (pv, l0, y)              ⏱ 0.0001 s
🔗  Bound [=] glass use in (l0, y)                                           ⏱ 0.0024 s
⚖  Updated si_mono balance with use(si_mono, l0, y, capacity, pv)           ⏱ 0.0001 s
🧭  Mapped modes for use (si_mono, l0, y, capacity, pv, _y1[0]) ⟺ (si_mono, l0, y, capacity, pv) ⏱ 0.0008 s
🔗  Bound [=] si_mono use in (l0, y)                                         ⏱ 0.0015 s
🧭  Mapped modes for use (glass, l0, y, capacity, pv, _y1[1]) ⟺ (glass, l0, y, capacity, pv) ⏱ 0.0001 s
🧭  Mapped modes for capacity (pv, l0, y, _y1[1]) ⟺ (pv, l0, y)              ⏱ 0.0001 s
🔗  Bound [=] glass use in (l0, y)                                           ⏱ 0.0017 s
⚖  Updated si_poly balance with use(si_poly, l0, y, capacity, pv)           ⏱ 0.0001 s
🧭  Mapped modes for use (si_poly, l0, y, capacity, pv, _y1[1]) ⟺ (si_poly, l0, y, capacity, pv) ⏱ 0.0009 s
🔗  Bound [=] si_poly use in (l0, y)                                         ⏱ 0.0018 s
🏗  Construction streams introduced for pv in l0                             ⏱ 0.0090 s
🌍  Located pv in l0                                                         ⏱ 0.0212 s
💡  Assumed lii capacity unbounded in (l0, y)                                ⏱ 0.0001 s
🧭  Mapped time for inventory (lii.stored, l0, q) ⟺ (lii.stored, l0, y)      ⏱ 0.0002 s
⚖  Initiated lii.stored balance in (l0, q)                                  ⏱ 0.0003 s
🔗  Bound [≤] lii.stored inventory in (l0, q)                                ⏱ 0.0015 s
💡  Assumed lii inventory bounded by capacity in (l0, q)                     ⏱ 0.0018 s
💡  Assumed lii.charge capacity unbounded in (l0, y)                         ⏱ 0.0004 s
🔗  Bound [≤] lii.charge operate in (l0, y)                                  ⏱ 0.0004 s
💡  Assumed lii.charge operate bounded by capacity in (l0, y)                ⏱ 0.0007 s
🧭  Mapped time for operate (lii.charge, l0, q) ⟺ (lii.charge, l0, y)        ⏱ 0.0001 s
⚖  Updated lii.stored balance with produce(lii.stored, l0, q, operate, lii.charge) ⏱ 0.0001 s
🔗  Bound [=] lii.stored produce in (l0, q)                                  ⏱ 0.0009 s
⚖  Updated power balance with expend(power, l0, q, operate, lii.charge)     ⏱ 0.0001 s
🔗  Bound [=] power expend in (l0, q)                                        ⏱ 0.0009 s
🏭  Operating streams introduced for lii.charge in l0                        ⏱ 0.0032 s
🏗  Construction streams introduced for lii.charge in l0                     ⏱ 0.0000 s
🌍  Located lii.charge in l0                                                 ⏱ 0.0052 s
💡  Assumed lii.discharge capacity unbounded in (l0, y)                      ⏱ 0.0004 s
🔗  Bound [≤] lii.discharge operate in (l0, y)                               ⏱ 0.0005 s
💡  Assumed lii.discharge operate bounded by capacity in (l0, y)             ⏱ 0.0008 s
🧭  Mapped time for operate (lii.discharge, l0, q) ⟺ (lii.discharge, l0, y)  ⏱ 0.0003 s
⚖  Updated power balance with produce(power, l0, q, operate, lii.discharge) ⏱ 0.0001 s
🔗  Bound [=] power produce in (l0, q)                                       ⏱ 0.0009 s
⚖  Updated lii.stored balance with expend(lii.stored, l0, q, operate, lii.discharge) ⏱ 0.0001 s
🔗  Bound [=] lii.stored expend in (l0, q)                                   ⏱ 0.0012 s
🏭  Operating streams introduced for lii.discharge in l0                     ⏱ 0.0037 s
🏗  Construction streams introduced for lii.discharge in l0                  ⏱ 0.0000 s
🌍  Located lii.discharge in l0                                              ⏱ 0.0058 s
⚖  Updated lib balance with use(lib, l0, y, invcapacity, lii.stored)        ⏱ 0.0001 s
🧭  Mapped modes for use (lib, l0, y, invcapacity, lii.stored, _y2[0]) ⟺ (lib, l0, y, invcapacity, lii.stored) ⏱ 0.0009 s
🧭  Mapped modes for invcapacity (lii.stored, l0, y, _y2[0]) ⟺ (lii.stored, l0, y) ⏱ 0.0001 s
🔗  Bound [=] lib use in (l0, y)                                             ⏱ 0.0025 s
⚖  Updated steel balance with use(steel, l0, y, invcapacity, lii.stored)    ⏱ 0.0001 s
🧭  Mapped modes for use (steel, l0, y, invcapacity, lii.stored, _y2[0]) ⟺ (steel, l0, y, invcapacity, lii.stored) ⏱ 0.0009 s
🔗  Bound [=] steel use in (l0, y)                                           ⏱ 0.0021 s
⚖  Updated lir balance with use(lir, l0, y, invcapacity, lii.stored)        ⏱ 0.0001 s
🧭  Mapped modes for use (lir, l0, y, invcapacity, lii.stored, _y2[1]) ⟺ (lir, l0, y, invcapacity, lii.stored) ⏱ 0.0010 s
🧭  Mapped modes for invcapacity (lii.stored, l0, y, _y2[1]) ⟺ (lii.stored, l0, y) ⏱ 0.0001 s
🔗  Bound [=] lir use in (l0, y)                                             ⏱ 0.0028 s
🧭  Mapped modes for use (steel, l0, y, invcapacity, lii.stored, _y2[1]) ⟺ (steel, l0, y, invcapacity, lii.stored) ⏱ 0.0001 s
🔗  Bound [=] steel use in (l0, y)                                           ⏱ 0.0012 s
🏗  Construction streams introduced for lii in l0                            ⏱ 0.0101 s
🌍  Located lii in l0                                                        ⏱ 0.0241 s
🧭  Mapped samples for spend (usd, l0, y, consume, steel) ⟺ (usd, l0, y)     ⏱ 0.0001 s
🧭  Mapped samples for spend (usd, l0, y, capacity, wf) ⟺ (usd, l0, y)       ⏱ 0.0002 s
🧭  Mapped samples for spend (usd, l0, y, operate, wf) ⟺ (usd, l0, y)        ⏱ 0.0001 s
🧭  Mapped samples for spend (usd, l0, y, capacity, pv) ⟺ (usd, l0, y)       ⏱ 0.0002 s
🧭  Mapped samples for spend (usd, l0, y, operate, pv) ⟺ (usd, l0, y)        ⏱ 0.0001 s
🧭  Mapped samples for spend (usd, l0, y, invcapacity, lii.stored) ⟺ (usd, l0, y) ⏱ 0.0001 s
🧭  Mapped samples for spend (usd, l0, y, inventory, lii.stored) ⟺ (usd, l0, y) ⏱ 0.0002 s
📝  Generated Program(design_scheduling).mps                                 ⏱ 0.0062 s
Set parameter Username
Academic license - for non-commercial use only - expires 2026-08-01
Read MPS format model from file Program(design_scheduling).mps
Reading time = 0.00 seconds
PROGRAM(DESIGN_SCHEDULING): 146 rows, 155 columns, 369 nonzeros
📝  Generated gurobipy model. See .formulation                               ⏱ 0.0101 s
Gurobi Optimizer version 12.0.3 build v12.0.3rc0 (win64 - Windows 11.0 (26100.2))

CPU model: 13th Gen Intel(R) Core(TM) i7-13700, instruction set [SSE2|AVX|AVX2]
Thread count: 16 physical cores, 24 logical processors, using up to 24 threads

Optimize a model with 146 rows, 155 columns and 369 nonzeros
Model fingerprint: 0x0e5433e1
Variable types: 152 continuous, 3 integer (3 binary)
Coefficient statistics:
  Matrix range     [1e-01, 3e+06]
  Objective range  [1e+00, 1e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [7e+01, 2e+02]
Presolve removed 135 rows and 144 columns
Presolve time: 0.00s
Presolved: 11 rows, 11 columns, 32 nonzeros
Variable types: 11 continuous, 0 integer (0 binary)

Root relaxation: objective 3.374395e+08, 10 iterations, 0.00 seconds (0.00 work units)

    Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

*    0     0               0    3.374395e+08 3.3744e+08  0.00%     -    0s

Explored 1 nodes (10 simplex iterations) in 0.01 seconds (0.00 work units)
Thread count was 24 (of 24 available processors)

Solution count 1: 3.3744e+08 

Optimal solution found (tolerance 1.00e-04)
Best objective 3.374395259804e+08, best bound 3.374395259804e+08, gap 0.0000%
📝  Generated Solution object for Program(design_scheduling). See .solution  ⏱ 0.0009 s
✅  Program(design_scheduling) optimized using gurobi. Display using .output() ⏱ 0.0213 s
🧭  Mapped samples for emit (gwp, l0, y, consume, steel) ⟺ (gwp, l0, y)      ⏱ 0.0001 s
🧭  Mapped samples for emit (gwp, l0, y, consume, lir) ⟺ (gwp, l0, y)        ⏱ 0.0002 s
🧭  Mapped samples for emit (gwp, l0, y, consume, lib) ⟺ (gwp, l0, y)        ⏱ 0.0001 s
🧭  Mapped samples for emit (gwp, l0, y, consume, concrete) ⟺ (gwp, l0, y)   ⏱ 0.0001 s
🧭  Mapped samples for emit (gwp, l0, y, consume, glass) ⟺ (gwp, l0, y)      ⏱ 0.0001 s
🧭  Mapped samples for emit (gwp, l0, y, consume, si_mono) ⟺ (gwp, l0, y)    ⏱ 0.0001 s
🧭  Mapped samples for emit (gwp, l0, y, consume, si_poly) ⟺ (gwp, l0, y)    ⏱ 0.0001 s
📝  Generated Program(design_scheduling).mps                                 ⏱ 0.0058 s
Warning: row name O0 in column section at line 528 not defined.
Read MPS format model from file Program(design_scheduling).mps
Reading time = 0.00 seconds
PROGRAM(DESIGN_SCHEDULING): 147 rows, 156 columns, 377 nonzeros
📝  Generated gurobipy model. See .formulation                               ⏱ 0.0079 s
Gurobi Optimizer version 12.0.3 build v12.0.3rc0 (win64 - Windows 11.0 (26100.2))

CPU model: 13th Gen Intel(R) Core(TM) i7-13700, instruction set [SSE2|AVX|AVX2]
Thread count: 16 physical cores, 24 logical processors, using up to 24 threads

Optimize a model with 147 rows, 156 columns and 377 nonzeros
Model fingerprint: 0xc4ffb22f
Variable types: 153 continuous, 3 integer (3 binary)
Coefficient statistics:
  Matrix range     [1e-01, 3e+06]
  Objective range  [1e+00, 1e+00]
  Bounds range     [1e+00, 1e+00]
  RHS range        [7e+01, 2e+02]
Presolve removed 142 rows and 150 columns
Presolve time: 0.00s
Presolved: 5 rows, 6 columns, 18 nonzeros
Variable types: 6 continuous, 0 integer (0 binary)

Root relaxation: objective 9.794116e+07, 2 iterations, 0.00 seconds (0.00 work units)

    Nodes    |    Current Node    |     Objective Bounds      |     Work
 Expl Unexpl |  Obj  Depth IntInf | Incumbent    BestBd   Gap | It/Node Time

*    0     0               0    9.794116e+07 9.7941e+07  0.00%     -    0s

Explored 1 nodes (2 simplex iterations) in 0.00 seconds (0.00 work units)
Thread count was 24 (of 24 available processors)

Solution count 1: 9.79412e+07 

Optimal solution found (tolerance 1.00e-04)
Best objective 9.794116189200e+07, best bound 9.794116189200e+07, gap 0.0000%
📝  Generated Solution object for Program(design_scheduling). See .solution  ⏱ 0.0010 s
✅  Program(design_scheduling) optimized using gurobi. Display using .output() ⏱ 0.0184 s

Comparing the solution#

The choice of material mode for PV changes based on the object, which highlights the trade-off between the two options!

m.capacity.output(compare=True)
\[\displaystyle {\mathbf{{cap}}}_{{wf},{l0},{{{y}_{0}}}}=90.11083743842364, 100.0\]
\[\displaystyle {\mathbf{{cap}}}_{{wf},{l0},{{{y}_{0}}},{{{\_y0}_{0}}}}=90.11083743842364, 100.0\]
\[\displaystyle {\mathbf{{cap}}}_{{wf},{l0},{{{y}_{0}}},{{{\_y0}_{1}}}}=0.0, 0.0\]
\[\displaystyle {\mathbf{{cap}}}_{{pv},{l0},{{{y}_{0}}}}=100.0, 90.70601851851849\]
\[\displaystyle {\mathbf{{cap}}}_{{pv},{l0},{{{y}_{0}}},{{{\_y1}_{0}}}}=100.0, 0.0\]
\[\displaystyle {\mathbf{{cap}}}_{{pv},{l0},{{{y}_{0}}},{{{\_y1}_{1}}}}=0.0, 90.70601851851849\]
\[\displaystyle {\mathbf{{cap}}}_{{lii.charge},{l0},{{{y}_{0}}}}=33.26491516146689, 37.48713991769547\]
\[\displaystyle {\mathbf{{cap}}}_{{lii.discharge},{l0},{{{y}_{0}}}}=29.938423645320196, 33.738425925925924\]
m.show()

Mathematical Program for Program(design_scheduling)



Index Sets

\[\displaystyle {currencies} = \{ {{usd}} \}\]
\[\displaystyle {resources} = \{ {{power}, {wind}, {solar}, {lii.stored}} \}\]
\[\displaystyle {locations} = \{ {{l0}} \}\]
\[\displaystyle {y} = \{ {{{{y}_{0}}}} \}\]
\[\displaystyle {q} = \{ {{{{q}_{0}}}, {{{q}_{1}}}, {{{q}_{2}}}, {{{q}_{3}}}} \}\]
\[\displaystyle {materials} = \{ {{lir}, \dots ,{si\_poly}} \}\]
\[\displaystyle {processes} = \{ {{wf}, {pv}, {lii.charge}, {lii.discharge}} \}\]
\[\displaystyle {\_y0} = \{ {{{{\_y0}_{0}}}, {{{\_y0}_{1}}}} \}\]
\[\displaystyle {storages} = \{ {{lii}} \}\]
\[\displaystyle {\_y1} = \{ {{{{\_y1}_{0}}}, {{{\_y1}_{1}}}} \}\]
\[\displaystyle {\_y2} = \{ {{{{\_y2}_{0}}}, {{{\_y2}_{1}}}} \}\]



Objective

\[\displaystyle min \hspace{0.2cm} {\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}}}\]
\[\displaystyle min \hspace{0.2cm} {\mathbf{emit}}_{{gwp},{l0},{{{y}_{0}}}}\]



s.t.

Balance Constraint Sets

\[\displaystyle [0]\text{ }{\mathbf{{\mathbf{{cons}}}}}_{{solar},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv}} = 0\]
\[\displaystyle [1]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{wind},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf}} = 0\]
\[\displaystyle [2]\text{ }-{\mathbf{{\mathbf{{rlse}}}}}_{{power},{l0},{y},{q}} + {\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf}} + {\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{lii.charge}} + {\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{lii.discharge}} = 0\]
\[\displaystyle [4]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{steel},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored}} = 0\]
\[\displaystyle [7]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{lir},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lir},{l0},{y},{\mathbf{{icap}}},{lii.stored}} = 0\]
\[\displaystyle [9]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{lib},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lib},{l0},{y},{\mathbf{{icap}}},{lii.stored}} = 0\]
\[\displaystyle [11]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{concrete},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf}} = 0\]
\[\displaystyle [13]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{glass},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv}} = 0\]
\[\displaystyle [15]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{si\_mono},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_mono},{l0},{y},{\mathbf{{cap}}},{pv}} = 0\]
\[\displaystyle [17]\text{ }{\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{si\_poly},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_poly},{l0},{y},{\mathbf{{cap}}},{pv}} = 0\]
\[\displaystyle [72]\text{ }-{\mathbf{{\mathbf{{\mathbf{{\mathbf{{inv}}}}}}}}}_{{lii.stored},{l0},{y},{q}} + {\mathbf{{\mathbf{{\mathbf{{\mathbf{{inv}}}}}}}}}_{{lii.stored},{l0},{y},{{q}-1}} + {\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{lii.stored},{l0},{y},{q},{\mathbf{{opr}}},{lii.charge}} - {\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{lii.stored},{l0},{y},{q},{\mathbf{{opr}}},{lii.discharge}} = 0\]

Binds Constraint Sets

\[\displaystyle [3]\text{ }-{\mathbf{{\mathbf{{rlse}}}}}_{{power},{l0},{y},{q}} + {\mathrm{φ}}_{{}} \leq 0\]
\[\displaystyle [19]\text{ }{\mathbf{{\mathbf{{cap}}}}}_{{wf},{l0},{y}} - 100 \cdot {\mathbf{{\mathbf{{\breve{{cap}}}}}}}_{{wf},{l0},{y}} \leq 0\]
\[\displaystyle [20]\text{ }10 \cdot {\mathbf{{\mathbf{{\breve{{cap}}}}}}}_{{wf},{l0},{y}} - {\mathbf{{\mathbf{{cap}}}}}_{{wf},{l0},{y}} \leq 0\]
\[\displaystyle [21]\text{ }{\mathbf{{\mathbf{{opr}}}}}_{{wf},{l0},{y},{q}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{cap}}}}}_{{wf},{l0},{y}} \leq 0\]
\[\displaystyle [27]\text{ }{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y}} - 100 \cdot {\mathbf{{\mathbf{{\mathbf{{\breve{{cap}}}}}}}}}_{{pv},{l0},{y}} \leq 0\]
\[\displaystyle [28]\text{ }10 \cdot {\mathbf{{\mathbf{{\mathbf{{\breve{{cap}}}}}}}}}_{{pv},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y}} \leq 0\]
\[\displaystyle [29]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{q}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y}} \leq 0\]
\[\displaystyle [33]\text{ }{\mathbf{{\mathbf{{icap}}}}}_{{lii.stored},{l0},{y}} - 100 \cdot {\mathbf{{\mathbf{{\breve{{icap}}}}}}}_{{lii.stored},{l0},{y}} \leq 0\]
\[\displaystyle [34]\text{ }10 \cdot {\mathbf{{\mathbf{{\breve{{icap}}}}}}}_{{lii.stored},{l0},{y}} - {\mathbf{{\mathbf{{icap}}}}}_{{lii.stored},{l0},{y}} \leq 0\]
\[\displaystyle [73]\text{ }{\mathbf{{\mathbf{{\mathbf{{inv}}}}}}}_{{lii.stored},{l0},{y},{q}} - {\mathbf{{\mathbf{{icap}}}}}_{{lii.stored},{l0},{y}} \leq 0\]
\[\displaystyle [74]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.charge},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{lii.charge},{l0},{y}} \leq 0\]
\[\displaystyle [78]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.discharge},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{lii.discharge},{l0},{y}} \leq 0\]

Calculations Constraint Sets

\[\displaystyle [5]\text{ }{\mathbf{{\mathbf{spend}}}}_{{usd},{l0},{y},{\mathbf{{cons}}},{steel}} - 670 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{steel},{l0},{y}} = 0\]
\[\displaystyle [6]\text{ }{\mathbf{{\mathbf{emit}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{steel}} - 2121.152427 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{steel},{l0},{y}} = 0\]
\[\displaystyle [8]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{lir}} - 9600 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{lir},{l0},{y}} = 0\]
\[\displaystyle [10]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{lib}} - 2800 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{lib},{l0},{y}} = 0\]
\[\displaystyle [12]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{concrete}} - 120.0378 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{concrete},{l0},{y}} = 0\]
\[\displaystyle [14]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{glass}} - 1118.5 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{glass},{l0},{y}} = 0\]
\[\displaystyle [16]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{si\_mono}} - 122239.1 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{si\_mono},{l0},{y}} = 0\]
\[\displaystyle [18]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{si\_poly}} - 98646.7 \cdot {\mathbf{{\mathbf{{\mathbf{{cons}}}}}}}_{{si\_poly},{l0},{y}} = 0\]
\[\displaystyle [24]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{\_y0}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{\_y0}} = 0\]
\[\displaystyle [26]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{opr}}},{wf}} - 49 \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y}} = 0\]
\[\displaystyle [30]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{pv}} - 1439046 \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y}} = 0\]
\[\displaystyle [32]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{opr}}},{pv}} - 90000 \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y}} = 0\]
\[\displaystyle [35]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{icap}}},{lii.stored}} - 1343614 \cdot {\mathbf{{\mathbf{{icap}}}}}_{{lii.stored},{l0},{y}} = 0\]
\[\displaystyle [36]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{inv}}},{lii.stored}} - 2000 \cdot {\mathbf{{\mathbf{{inv}}}}}_{{lii.stored},{l0},{y}} = 0\]
\[\displaystyle [41]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf},{{{\_y0}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{q},{{{\_y0}_{0}}}} = 0\]
\[\displaystyle [43]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf},{{{\_y0}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} = 0\]
\[\displaystyle [45]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf},{{{\_y0}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{q},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [46]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf},{{{\_y0}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [48]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} = 0\]
\[\displaystyle [50]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} = 0\]
\[\displaystyle [51]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [52]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [57]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv},{{{\_y1}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{q},{{{\_y1}_{0}}}} = 0\]
\[\displaystyle [59]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv},{{{\_y1}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} = 0\]
\[\displaystyle [61]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv},{{{\_y1}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{q},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [62]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv},{{{\_y1}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [65]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} = 0\]
\[\displaystyle [67]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_mono},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} = 0\]
\[\displaystyle [68]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [70]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_poly},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [76]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{lii.stored},{l0},{y},{q},{\mathbf{{opr}}},{lii.charge}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.charge},{l0},{y},{q}} = 0\]
\[\displaystyle [77]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{lii.charge}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.charge},{l0},{y},{q}} = 0\]
\[\displaystyle [80]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{lii.discharge}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.discharge},{l0},{y},{q}} = 0\]
\[\displaystyle [81]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{lii.stored},{l0},{y},{q},{\mathbf{{opr}}},{lii.discharge}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.discharge},{l0},{y},{q}} = 0\]
\[\displaystyle [84]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lib},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{0}}}} = 0\]
\[\displaystyle [86]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{0}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{0}}}} = 0\]
\[\displaystyle [88]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lir},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{1}}}} = 0\]
\[\displaystyle [89]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{1}}}} - {\mathrm{φ}}_{{}} \cdot {\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{1}}}} = 0\]

Mapping Constraint Sets

\[\displaystyle [22]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf}} - ({\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} + {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}}) = 0\]
\[\displaystyle [23]\text{ }{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{wf},{l0},{y}} - ({\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} + {\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}}) = 0\]
\[\displaystyle [25]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf}, {l0}, {y}, i} = 0\]
\[\displaystyle [31]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv}, {l0}, {y}, i} = 0\]
\[\displaystyle [37]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{prod}}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{prod}}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{wf},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [38]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf}, {l0}, {y}, i, {{{\_y0}_{0}}}} = 0\]
\[\displaystyle [39]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [40]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{q}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{wf},{l0},{y},{q},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{wf},{l0},{y},{q},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [42]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}}}_{{wind},{l0},{y},{\mathbf{{opr}}},{wf},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [44]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf},{l0},{y},{{{\_y0}_{1}}}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{wf}, {l0}, {y}, i, {{{\_y0}_{1}}}} = 0\]
\[\displaystyle [47]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{steel},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [49]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{concrete},{l0},{y},{\mathbf{{cap}}},{wf},{{{\_y0}_{1}}}} = 0\]
\[\displaystyle [53]\text{ }{\mathbf{{\mathbf{{\mathbf{prod}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{prod}}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{prod}}}}}}}}_{{power},{l0},{y},{q},{\mathbf{{opr}}},{pv},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [54]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv}, {l0}, {y}, i, {{{\_y1}_{0}}}} = 0\]
\[\displaystyle [55]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [56]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{q}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{pv},{l0},{y},{q},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}}}_{{pv},{l0},{y},{q},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [58]\text{ }{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{expd}}}}}}}}}_{{solar},{l0},{y},{\mathbf{{opr}}},{pv},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [60]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{pv}, {l0}, {y}, i, {{{\_y1}_{1}}}} = 0\]
\[\displaystyle [63]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{glass},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [64]\text{ }{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}_{{pv},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{cap}}}}}}}}}_{{pv},{l0},{y},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [66]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_mono},{l0},{y},{\mathbf{{cap}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{si\_mono},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{0}}}} = 0\]
\[\displaystyle [69]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{si\_poly},{l0},{y},{\mathbf{{cap}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{si\_poly},{l0},{y},{\mathbf{{cap}}},{pv},{{{\_y1}_{1}}}} = 0\]
\[\displaystyle [71]\text{ }{\mathbf{{\mathbf{{\mathbf{{inv}}}}}}}_{{lii.stored},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{inv}}}}}}}_{{lii.stored}, {l0}, {y}, i} = 0\]
\[\displaystyle [75]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.charge},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.charge}, {l0}, {y}, i} = 0\]
\[\displaystyle [79]\text{ }{\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.discharge},{l0},{y}} - \sum_{i \in {q}} {\mathbf{{\mathbf{{\mathbf{{opr}}}}}}}_{{lii.discharge}, {l0}, {y}, i} = 0\]
\[\displaystyle [82]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lib},{l0},{y},{\mathbf{{icap}}},{lii.stored}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{lib},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{0}}}} = 0\]
\[\displaystyle [83]\text{ }{\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}_{{lii.stored},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{{icap}}}}}}}}}_{{lii.stored},{l0},{y},{{{\_y2}_{1}}}} = 0\]
\[\displaystyle [85]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{0}}}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{steel},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{1}}}} = 0\]
\[\displaystyle [87]\text{ }{\mathbf{{\mathbf{{\mathbf{use}}}}}}_{{lir},{l0},{y},{\mathbf{{icap}}},{lii.stored}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{use}}}}}}}}_{{lir},{l0},{y},{\mathbf{{icap}}},{lii.stored},{{{\_y2}_{1}}}} = 0\]
\[\displaystyle [90]\text{ }{\mathbf{{\mathbf{{\mathbf{spend}}}}}}_{{usd},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cons}}},{steel}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{opr}}},{wf}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{cap}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{opr}}},{pv}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{icap}}},{lii.stored}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{spend}}}}}}}}_{{usd},{l0},{y},{\mathbf{{inv}}},{lii.stored}} = 0\]
\[\displaystyle [91]\text{ }{\mathbf{{\mathbf{{\mathbf{emit}}}}}}_{{gwp},{l0},{y}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{steel}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{lir}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{lib}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{concrete}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{glass}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{si\_mono}} - {\mathbf{{\mathbf{{\mathbf{{\mathbf{emit}}}}}}}}_{{gwp},{l0},{y},{\mathbf{{cons}}},{si\_poly}} = 0\]

Function Sets

\[\displaystyle {\mathbf{spend}}_{{usd},{l0},{{{y}_{0}}}}\]
\[\displaystyle {\mathbf{emit}}_{{gwp},{l0},{{{y}_{0}}}}\]