Analysis Workflow
In this section we will look at the analysis workflow and data-handling in more detail, explaining what you need to go from raw data to analysis results.
Workflow overview
Here is a snapshot overview of a regular workflow:

Workflow explanation (follow the boxes):
- External source: The first thing that you need, and hopefully have, is data. Currently, Tulipa does not provide any public data sources, so you need to load all required data.
 - Create connection: Tulipa uses a DuckDB database to store the input data, the representation of variables, constraints, and other internal tables, as well as the output. This database is linked through the 
connectionargument in various parts of the API. Most notably,run_scenarioandEnergyProblemreceive theconnectionas the main argument to create the model (and various internal tables).- DuckDB connection: This area (yellow) shows which tables are created in DuckDB throughout the workflow.
 
 - Load data: Whether you have CSV/Excel/Parquet files or a separate Database containing your data, you need to load it into the DuckDB connection, i.e., create tables (or table views) with the data that you will process for Tulipa.
- DuckDB connection: These are the 
Sourcestables. This data can be in whatever format you want, but you will need to transform it into the Tulipa format later. 
 - DuckDB connection: These are the 
 - Process data into an instance (1 model run) with DuckDB/TulipaIO: Now you need to prepare the data for clustering. Even if you don't want to cluster your data, you still need to run 
TulipaClustering.dummy_cluster!to generate Tulipa's required tables. Since your data in now inside theconnection, you can useDuckDB's SQL and/orTulipaIO's convenience functions to manipulate it. Another method is to use Julia/Python/Excel to create the data externally (from the source files or DuckDB) and load it back into DuckDB. The important thing is you need to satisfy the TulipaClustering format.- DuckDB connection: These are the 
Instance datatables, but it can also be loaded with theSources. 
 - DuckDB connection: These are the 
 - Cluster into representative periods using TulipaClustering: Run TulipaClustering to compute the representative periods and create the necessary tables.
- DuckDB connection: These are the 
Time datatables. The tables created in this step are part of the cluster group (see Groups of tables below) 
 - DuckDB connection: These are the 
 - Prepare data for TulipaEnergyModel's format: Process your data (using 
TulipaIO,DuckDBor whatever method you choose) into the Tulipa Format, following the schema. Since the format is quite extensive, you might want to use thepopulate_with_defaults!function to generate all columns and work from there. See Minimum data and using defaults for more details.- DuckDB connection: TulipaEnergyModel expects the 
Time datatables from the previous step and theseTulipa formattables. In rare instances, your data will be complete, but most likely you will need to fill-out your tables with default values for columns that are not important for your problem. The tables prepared in this step are part of theinputgroup of tables. 
 - DuckDB connection: TulipaEnergyModel expects the 
 - Create internal tables for the model indices: Finally, you're ready to use TulipaEnergyModel! There are multiple ways to create and solve the model, but the idea is the same. The first interaction with Tulipa will create the tables to store the variables, constraints, and expressions indices, as well as other necessary internal tables. Data validation also checks that the tables follow the expected requirements.
- DuckDB connection: These are the 
Internal datatables. Notably, the variables and constraints indices tables are created in their respective groups:variablesandconstraints. See the Groups of tables section for more details. 
 - DuckDB connection: These are the 
 - Create model: This is most of the heavy-lifting of the workflow, apart from solving the model. This step creates all the Julia/JuMP structures using the tables from the previous step. For instance, a JuMP variable is created for each row of each variable table.
- DuckDB connection: Very little data is created in DuckDB in this step. Some expressions that could not have been created before are created in the 
expressionsgroup. A lot of Julia/JuMP-specific things are created, but they cannot be stored in the DuckDB connection. 
 - DuckDB connection: Very little data is created in DuckDB in this step. Some expressions that could not have been created before are created in the 
 - Solve model: Finally, send the model to the solver and wait for a result.
 - Store primal and dual solutions: This step computes the dual variables and then loads the values of the primals and duals into the 
variablesandconstraintstables.- DuckDB connection: Technically, no new tables are created in this step. Instead, new columns are attached to the 
variablesandconstraintstables. 
 - DuckDB connection: Technically, no new tables are created in this step. Instead, new columns are attached to the 
 - Process output for plots and dashboard: Now prepare the output that you need, once again using DuckDB/TulipaIO. You can also export the data from 
DuckDBand continue your analysis with other tools.- DuckDB connection: You might create new 
Analysistables. They can be used for the next steps or for a possible dashboard connected to the DuckDB connection. 
 - DuckDB connection: You might create new 
 - Create plots: Optionally create plots.
 - Export solution: Optionally export all the tables from the DuckDB connection to files, and/or create and save plots.
- Output files: External. Whatever outputs you have produced and want to export to other formats. For instance, CSV/Parquet files with the full variables and constraints tables can be exported from the corresponding DuckDB tables.
 
 - Dashboard: A possible dashboard connecting directly to the DuckDB connection.
 
Minimum data and using defaults
Since TulipaEnergyModel is at a late stage in the workflow, its input data requirements are stricter. Therefore, the input data required by the Tulipa model must follow the schema in the follow section.
Dealing with defaults is hard. A missing value might represent two different things to different people. That is why we require the tables to be complete. However, we also understand that it is not reasonable to expect people to fill a lot of things that they don't need for their models. Therefore, we have created the function populate_with_defaults! to fill the remaining columns of your tables with default values.
To know the defaults, check the Table Schemas below.
When data is missing and you automatically fill it with defaults, beware of your assumptions on what that means. For instance, maybe you expect the default capacity to be "unlimited", or maybe you expect it to be 0. Check what are the default values and decide if you want to use them or not. If you think a default does not make sense, open an issue, or a discussion thread.
Example of using populate_with_defaults!
Below we have the minimum amount of data (essentially, nothing), that is necessary to start Tulipa.
using TulipaEnergyModel, TulipaIO, DuckDB, DataFrames
data = Dict(
    # Basic asset data
    "asset" => DataFrame(
        :asset => ["some_producer", "some_consumer"],
        :type => ["producer", "consumer"],
    ),
    "asset_both" => DataFrame(
        :asset => ["some_producer", "some_consumer"],
        :commission_year => [2030, 2030],
        :milestone_year => [2030, 2030],
    ),
    "asset_commission" => DataFrame(
        :asset => ["some_producer", "some_consumer"],
        :commission_year => [2030, 2030],
    ),
    "asset_milestone" => DataFrame(
        :asset => ["some_producer", "some_consumer"],
        :milestone_year => [2030, 2030],
    ),
    # Basic flow data
    "flow" => DataFrame(:from_asset => ["some_producer"], :to_asset => ["some_consumer"]),
    "flow_both" => DataFrame(
        :from_asset => String[],
        :to_asset => String[],
        :commission_year => Int[],
        :milestone_year => Int[],
    ),
    "flow_commission" => DataFrame(
        :from_asset => ["some_producer"],
        :to_asset => ["some_consumer"],
        :commission_year => [2030],
    ),
    "flow_milestone" => DataFrame(
        :from_asset => ["some_producer"],
        :to_asset => ["some_consumer"],
        :milestone_year => [2030],
    ),
    # Basic time information
    "year_data" => DataFrame(:year => [2030]),
    "rep_periods_data" => DataFrame(:year => [2030, 2030], :rep_period => [1, 2]),
    "timeframe_data" => DataFrame(:year => 2030, :period => 1:365),
    "rep_periods_mapping" =>
        DataFrame(:year => 2030, :period => 1:365, :rep_period => mod1.(1:365, 2)),
)Dict{String, DataFrames.DataFrame} with 12 entries:
  "asset_both"          => 2×3 DataFrame…
  "flow_milestone"      => 1×3 DataFrame…
  "year_data"           => 1×1 DataFrame…
  "asset_milestone"     => 2×2 DataFrame…
  "flow_both"           => 0×4 DataFrame…
  "asset_commission"    => 2×2 DataFrame…
  "rep_periods_mapping" => 365×3 DataFrame…
  "rep_periods_data"    => 2×2 DataFrame…
  "asset"               => 2×2 DataFrame…
  "flow"                => 1×2 DataFrame…
  "flow_commission"     => 1×3 DataFrame…
  "timeframe_data"      => 365×2 DataFrame…And here we load this data into a DuckDB connection.
connection = DBInterface.connect(DuckDB.DB)
# Loading the minimum data in the connection
for (table_name, table) in data
    DuckDB.register_data_frame(connection, table, table_name)
end
# Table `asset`:
DuckDB.query(connection, "FROM asset") |> DataFrame| Row | asset | type | 
|---|---|---|
| String | String | |
| 1 | some_producer | producer | 
| 2 | some_consumer | consumer | 
Now we run populate_with_defaults! to fill the remaining columns with default values:
TulipaEnergyModel.populate_with_defaults!(connection)
DuckDB.query(connection, "FROM asset") |> DataFrame| Row | asset | type | capacity | capacity_storage_energy | consumer_balance_sense | discount_rate | economic_lifetime | energy_to_power_ratio | group | investment_integer | investment_integer_storage_energy | investment_method | is_seasonal | max_ramp_down | max_ramp_up | min_operating_point | ramping | storage_method_energy | technical_lifetime | unit_commitment | unit_commitment_integer | unit_commitment_method | use_binary_storage_method | 
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| String | String | Float64 | Float64 | String | Float64 | Int32 | Float64 | String? | Bool | Bool | String | Bool | Float64 | Float64 | Float64 | Bool | Bool | Int32 | Bool | Bool | String? | String? | |
| 1 | some_producer | producer | 0.0 | 0.0 | == | 0.0 | 1 | 0.0 | missing | false | false | none | false | 0.0 | 0.0 | 0.0 | false | false | 1 | false | false | missing | missing | 
| 2 | some_consumer | consumer | 0.0 | 0.0 | == | 0.0 | 1 | 0.0 | missing | false | false | none | false | 0.0 | 0.0 | 0.0 | false | false | 1 | false | false | missing | missing | 
You can see that the table above has been modified to include many more columns.
Finally, the problem can be solved:
energy_problem = TulipaEnergyModel.run_scenario(
    connection;
    output_folder = mktempdir(),
    show_log = false,
)
DuckDB.query(connection, "FROM var_flow LIMIT 5") |> DataFrame| Row | id | from_asset | to_asset | year | rep_period | capacity_coefficient | conversion_coefficient | time_block_start | time_block_end | solution | 
|---|---|---|---|---|---|---|---|---|---|---|
| Int64 | String | String | Int32 | Int32 | Float64 | Float64 | Int32 | Int32 | Float64 | |
| 1 | 1 | some_producer | some_consumer | 2030 | 1 | 1.0 | 1.0 | 1 | 1 | 0.0 | 
| 2 | 2 | some_producer | some_consumer | 2030 | 1 | 1.0 | 1.0 | 2 | 2 | 0.0 | 
| 3 | 3 | some_producer | some_consumer | 2030 | 1 | 1.0 | 1.0 | 3 | 3 | 0.0 | 
| 4 | 4 | some_producer | some_consumer | 2030 | 1 | 1.0 | 1.0 | 4 | 4 | 0.0 | 
| 5 | 5 | some_producer | some_consumer | 2030 | 1 | 1.0 | 1.0 | 5 | 5 | 0.0 | 
Groups of tables
After creating a connection and loading data in a way that follows the schema (see the previous section on minimum data), then Tulipa will create tables to handle the model data and various internal tables. There are different groups of tables, which we explain below. See the Workflow overview to see where they pop up.
- Required by TulipaEnergyModel. These are described in the Table Schemas.
cluster: Tables created byTulipaClustering.input: Tables expected byTulipaEnergyModel.
 - Created by TulipaEnergyModel.
variables: Variable indices. These tables are prefixed byvar_in the DuckDB connection.constraints: Constraints indices. These tables are prefixed bycons_in the DuckDB connection.expressions: Expressions indices. These tables are prefixed byexpr_in the DuckDB connection.resolution: Unrolled partition blocks of assets and flows. These tables are prefixed by eitherasset_time_resolution_orflow_time_resolution_.
 
Additionally, we create various temporary tables, which are prefixed by t_.
The tables created by TulipaEnergyModel might change in name or prefix unless explicitly noted. Once Tulipa 1.0 is released, we might change this policy.
You probably don't have to navigate these tables yourself, but if you want more information, you can list them all from DuckDB using the duckdb_tables() table. Here are 10 random tables:
DuckDB.query(
    connection,
    "SELECT table_name
    FROM duckdb_tables()
    WHERE table_name NOT LIKE 't_%'
    ORDER BY random() LIMIT 10"
) |> DataFrame| Row | table_name | 
|---|---|
| String | |
| 1 | cons_capacity_outgoing_simple_method_investable_storage_with_binary | 
| 2 | cons_capacity_outgoing_semi_compact_method | 
| 3 | var_units_on | 
| 4 | flows_profiles | 
| 5 | expr_available_asset_units_compact_method | 
| 6 | var_vintage_flow | 
| 7 | cons_max_ramp_without_unit_commitment | 
| 8 | merged_out_flows_conversion_balance | 
| 9 | cons_min_output_flow_with_unit_commitment | 
| 10 | expr_available_energy_units_simple_method | 
Table Schemas
The optimization model parameters with the input data must follow the schema below for each table.
The schemas below are in input-schemas.json. You can also view the schemas after loading the package by typing TulipaEnergyModel.schema in the Julia console. Here is the complete list of model parameters in the schemas per table (or CSV file):
The following tables/files are allowed to be missing: "assets_rep_periods_partitions", "assets_timeframe_partitions", "assets_timeframe_profiles", "flows_rep_periods_partitions", "group_asset", "profiles_timeframe".
- For the partitions tables/files, the default value are 
specification = uniformandpartition = 1for each asset/flow and year - For the profiles tables/files, the default value is a flat profile of value 1.0 p.u.
 - If no group table/file is available there will be no group constraints in the model
 
Table 1 : asset
asset
Description: Unique identifier with the name of the asset.
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
capacity
Description: Capacity for one unit of the asset (is therefore multiplied by number of existing plus number of invested assets).
Type:
DOUBLEUnit of measure:
MWDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
capacity_storage_energy
Description: Capacity of one storage unit.
Type:
DOUBLEUnit of measure:
MWhDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
consumer_balance_sense
Description: Is the sense of the consumer balance constraint, equal to, greater than or less than.
Type:
VARCHARUnit of measure:
No unitDefault:
==
| Constraints | Value | 
|---|---|
| oneOf | Any["==", ">=", "<="] | 
discount_rate
Description: e.g. 0.05 is 5 %. discount rate for the annuity calculation.
Type:
DOUBLEUnit of measure:
ratioDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
economic_lifetime
Description: Economic lifetime of the unit for annuity calculation.
Type:
INTEGERUnit of measure:
yearsDefault:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
energy_to_power_ratio
Description: Fixed ratio between the energy storage capacity [MWh] and the discharge/charge capacity [MW] for energy storage investments where
storage_method_energy = false.Type:
DOUBLEUnit of measure:
hDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
group
Description: Group to which the asset belongs to (null/empty/missing -> no group).
Type:
VARCHARUnit of measure:
No unitDefault:
nothingConstraints: No constraints
investment_integer
Description: Whether investment decisions are using integer variables.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
investment_integer_storage_energy
Description: Whether investment for storage energy is integer or continuous. It only applies for energy storage investments where
storage_method_energy = true.Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
investment_method
Description: How investments are treated.
Type:
VARCHARUnit of measure:
No unitDefault:
none
| Constraints | Value | 
|---|---|
| oneOf | Any["none", "simple", "semi-compact", "compact"] | 
is_seasonal
Description: Whether seasonal storage (e.g., hydro) or not (e.g., battery)
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
max_ramp_down
Description: Maximum ramping down rate as a portion of the capacity of asset.
Type:
DOUBLEUnit of measure:
p.u./hDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
max_ramp_up
Description: Maximum ramping up rate as a portion of the capacity of asset.
Type:
DOUBLEUnit of measure:
p.u./hDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
min_operating_point
Description: Minimum operating point or minimum stable generation level defined as a portion of the capacity of asset.
Type:
DOUBLEUnit of measure:
p.u.Default:
0
| Constraints | Value | 
|---|---|
| maximum | 1 | 
| minimum | 0 | 
ramping
Description: Whether asset has ramping constraints or not.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
storage_method_energy
Description: Whether there is independent investment on storage capacity or not. If false, the investment on storage capacity uses the energytopower_ratio as a constant fixed value.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
technical_lifetime
Description: Technical lifetime of the unit to determine for how long the capacity is considered from the commission year.
Type:
INTEGERUnit of measure:
yearsDefault:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
type
Description: Type of energy asset.
Type:
VARCHARUnit of measure:
No unitDefault:
No default
| Constraints | Value | 
|---|---|
| oneOf | Any["producer", "consumer", "storage", "conversion", "hub"] | 
unit_commitment
Description: Whether asset has unit commitment constraints or not
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
unit_commitment_integer
Description: Whether the unit commitment variables are integer or not.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
unit_commitment_method
Description: Which unit commitment method to use (null/empty/missing -> no unit commitment method).
Type:
VARCHARUnit of measure:
No unitDefault:
nothing
| Constraints | Value | 
|---|---|
| oneOf | Any[nothing, "basic", "3var"] | 
use_binary_storage_method
Description: Whether to use an extra binary variable for the storage assets to avoid charging and discharging simultaneously (null/empty/missing -> no binary).
Type:
VARCHARUnit of measure:
No unitDefault:
nothing
| Constraints | Value | 
|---|---|
| oneOf | Any[nothing, "binary", "relaxed_binary"] | 
Table 2 : asset_both
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
commission_year
Description: Year of commissioning
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
decommissionable
Description: Whether or not the asset can be decommissioned.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
initial_storage_units
Description: Number of existing storage units
Type:
DOUBLEUnit of measure:
numberDefault:
0Constraints: No constraints
initial_units
Description: Number of existing units
Type:
DOUBLEUnit of measure:
numberDefault:
0Constraints: No constraints
milestone_year
Description: Year of investment and operation decisions in the optimization.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 3 : asset_commission
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
commission_year
Description: Year of commissioning.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
efficiency
Description: Asset efficiency. Can be used for both producer and conversion assets.
Type:
DOUBLEUnit of measure:
ratioDefault:
1.0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
fixed_cost
Description: Fixed annual cost for the asset capacity.
Type:
DOUBLEUnit of measure:
CUR/MW/yearDefault:
0.0Constraints: No constraints
fixed_cost_storage_energy
Description: Fixed annual cost for the asset storage capacity
Type:
DOUBLEUnit of measure:
CUR/MWh/yearDefault:
0.0Constraints: No constraints
investment_cost
Description: Investment cost for the asset capacity.
Type:
DOUBLEUnit of measure:
CUR/MWDefault:
0.0Constraints: No constraints
investment_cost_storage_energy
Description: Investment cost for the asset energy storage capacity.
Type:
DOUBLEUnit of measure:
CUR/MWhDefault:
0.0Constraints: No constraints
investment_limit
Description: Maximum capacity for the asset investment. If the initial value is null, empty, or missing, it will be no limit.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothingConstraints: No constraints
investment_limit_storage_energy
Description: Maximum capacity for the asset storage investment. If the initial value is null, empty, or missing, it will be no limit.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothingConstraints: No constraints
storage_charging_efficiency
Description: Storage asset charging efficiency as a multiplier for the sum of all inputs of the asset.
Type:
DOUBLEUnit of measure:
ratioDefault:
1.0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
storage_discharging_efficiency
Description: Storage asset discharging efficiency as a multiplier for the sum of all outputs of the asset.
Type:
DOUBLEUnit of measure:
ratioDefault:
1.0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
storage_loss_from_stored_energy
Description: [e.g. 0.01 means 1% every hour] Loss of stored energy over time.
Type:
DOUBLEUnit of measure:
p.u./hDefault:
0Constraints: No constraints
Table 4 : asset_milestone
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
commodity_price
Description: Price of the commodity.
Type:
DOUBLEUnit of measure:
CUR/MWh or other units depending on the commodityDefault:
0Constraints: No constraints
initial_storage_level
Description: The initial storage level at the beginning of the optimization. The final storage level needs to be above this initial value. If the initial value is null, empty, or missing, it will be optimized using a cycling constraint that links the last period to the initial period.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothing
| Constraints | Value | 
|---|---|
| minimum | 0 | 
investable
Description: Whether there is an investment variable created for the asset or not.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
max_energy_timeframe_partition
Description: The maximum amount of energy across the timeframe (e.g., a year) that the asset must produce. If the initial value is null, empty, or missing, it will be no limit.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothing
| Constraints | Value | 
|---|---|
| minimum | 0 | 
milestone_year
Description: Year of investment and operation decisions in the optimization.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
min_energy_timeframe_partition
Description: The minimum amount of energy across the timeframe (e.g., a year) that the asset must produce. If the initial value is null, empty, or missing, it will be no limit.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothing
| Constraints | Value | 
|---|---|
| minimum | 0 | 
peak_demand
Description: Value that multiplies the demand profile time series.
Type:
DOUBLEUnit of measure:
MWDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
storage_inflows
Description: Value that multiplies the inflow profile time series.
Type:
DOUBLEUnit of measure:
MWh/yearDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
units_on_cost
Description: Cost of keeping unit online for one hour or the objective function coefficient on
units_onvariable. e.g., no_load cost or idling costType:
DOUBLEUnit of measure:
CUR/p.u./hDefault:
nothing
| Constraints | Value | 
|---|---|
| minimum | 0 | 
Table 5 : assets_profiles
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
commission_year
Description: Year of commissioning
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_name
Description: Name of profile, used to determine data inside the DuckDB table
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_type
Description: Type of profile, used to determine DuckDB table with source profile
Type:
VARCHARUnit of measure:
No unitDefault:
No default
| Constraints | Value | 
|---|---|
| oneOf | Any["availability", "demand", "inflows", "max_storage_level", "min_storage_level"] | 
Table 6 : assets_rep_periods_partitions
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
partition
Description: Partition or temporal resolution in the representative periods. For example, for a
uniformspecification1is hourly,2is every two hours.Type:
VARCHARUnit of measure:
No unitDefault:
1Constraints: No constraints
rep_period
Description: Number of the representative period
Type:
INTEGERUnit of measure:
numberDefault:
No defaultConstraints: No constraints
specification
Description: Partition (or temporal resolution) specification in the representative periods.
Type:
VARCHARUnit of measure:
No unitDefault:
uniform
| Constraints | Value | 
|---|---|
| oneOf | Any["uniform", "explicit", "math"] | 
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 7 : assets_timeframe_partitions
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
partition
Description: Partition or temporal resolution in the timeframe. For example, if a period is equivalent to a day then for a
uniformspecification1is per day,2is every two days.Type:
VARCHARUnit of measure:
No unitDefault:
1Constraints: No constraints
specification
Description: Partition (or temporal resolution) specification in the timeframe.
Type:
VARCHARUnit of measure:
No unitDefault:
uniform
| Constraints | Value | 
|---|---|
| oneOf | Any["uniform", "explicit", "math"] | 
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 8 : assets_timeframe_profiles
asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
commission_year
Description: Year of commissioning
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_name
Description: Name of profile, used to determine data inside the DuckDB table
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_type
Description: Type of profile, used to determine DuckDB table with source profile
Type:
VARCHARUnit of measure:
No unitDefault:
No default
| Constraints | Value | 
|---|---|
| oneOf | Any["max_storage_level", "min_storage_level", "max_energy", "min_energy"] | 
Table 9 : flow
capacity
Description: Capacity for one unit of the transport flow (is therefore multiplied by number of existing plus invested number of transport assets).
Type:
DOUBLEUnit of measure:
MWDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
carrier
Description: Energy carrier
Type:
VARCHARUnit of measure:
No unitDefault:
nothingConstraints: No constraints
discount_rate
Description: e.g. 0.05 is 5 %. discount rate for the annuity calculation.
Type:
DOUBLEUnit of measure:
ratioDefault:
0
| Constraints | Value | 
|---|---|
| minimum | 0 | 
economic_lifetime
Description: Economic lifetime of the transport asset for annuity calculation.
Type:
INTEGERUnit of measure:
yearsDefault:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
investment_integer
Description: Whether investment decisions are using integer variables.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
is_transport
Description: Whether a transport flow or not. Transport assets can have flows in both directions and can be invested in.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
technical_lifetime
Description: Technical lifetime of the transport asset to determine for how long the capacity is considered from the commission year.
Type:
INTEGERUnit of measure:
yearsDefault:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 10 : flow_both
commission_year
Description: Year of commissioning
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
decommissionable
Description: Whether the transport asset can be decomission or not.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
initial_export_units
Description: Number of existing units in
from_asset->to_assetdirectionType:
DOUBLEUnit of measure:
numberDefault:
0Constraints: No constraints
initial_import_units
Description: Number of existing units in
to_asset->from_assetdirectionType:
DOUBLEUnit of measure:
numberDefault:
0Constraints: No constraints
milestone_year
Description: Year of investment and operation decisions in the optimization.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 11 : flow_commission
capacity_coefficient
Description: Coefficient for the flow in the maximum capacity constraints.
Type:
DOUBLEUnit of measure:
p.u.Default:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
commission_year
Description: Year of commissioning
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
conversion_coefficient
Description: Multiplier between the flow and the conversion balance constraint of the asset.
Type:
DOUBLEUnit of measure:
p.u.Default:
1
| Constraints | Value | 
|---|---|
| minimum | 0 | 
fixed_cost
Description: Fixed annual cost for the transport asset capacity.
Type:
DOUBLEUnit of measure:
CUR/MW/yearDefault:
0.0Constraints: No constraints
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
investment_cost
Description: Investment cost for the transport asset capacity.
Type:
DOUBLEUnit of measure:
CUR/MWDefault:
0.0Constraints: No constraints
investment_limit
Description: Maximum capacity for the transport asset investment. If the initial value is null, empty, or missing, it will be no limit.
Type:
DOUBLEUnit of measure:
MWhDefault:
nothingConstraints: No constraints
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 12 : flow_milestone
dc_opf
Description: Whether a flow uses direct current optimal power flow (dc-opf) constraints or not. This method only applies to transport flows.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
investable
Description: Whether there is an investment variable created for the asset or not.
Type:
BOOLEANUnit of measure:
No unitDefault:
falseConstraints: No constraints
milestone_year
Description: Year of investment and operation decisions in the optimization.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
operational_cost
Description: Variable cost for the flow.
Type:
DOUBLEUnit of measure:
CUR/MWhDefault:
0Constraints: No constraints
reactance
Description: Reactance for the transport flow.
Type:
DOUBLEUnit of measure:
p.u.Default:
0.3Constraints: No constraints
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 13 : flows_profiles
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_name
Description: Name of profile, used to determine data inside the DuckDB table
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_type
Description: Type of profile, used to determine DuckDB table with source profile
Type:
VARCHARUnit of measure:
No unitDefault:
No default
| Constraints | Value | 
|---|---|
| oneOf | Any["availability"] | 
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 14 : flows_relationships
constant
Description: Constant
Cinflow_1 {==;>=;<=} C + A x flow_2relationship constraintType:
DOUBLEUnit of measure:
MWhDefault:
0Constraints: No constraints
flow_1_from_asset
Description: Name of the
from_assetof theflow_1inflow_1 {==;>=;<=} C + A x flow_2relationship constraint. Same as the one in theassettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
flow_1_to_asset
Description: Name of the
to_assetof theflow_1inflow_1 {==;>=;<=} C + A x flow_2relationship constraint. Same as the one in theassettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
flow_2_from_asset
Description: Name of the
from_assetof theflow_2inflow_1 {==;>=;<=} C + A x flow_2relationship constraint. Same as the one in theassettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
flow_2_to_asset
Description: Name of the
to_assetof theflow_2inflow_1 {==;>=;<=} C + A x flow_2relationship constraint. Same as the one in theassettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
milestone_year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
ratio
Description: Ratio
Ainflow_1 {==;>=;<=} C + A x flow_2relationship constraintType:
DOUBLEUnit of measure:
p.u.Default:
1Constraints: No constraints
sense
Description: Is the sense in
flow_1 {==;>=;<=} C + A x flow_2relationship constraint, equal to, greater than or less than.Type:
VARCHARUnit of measure:
No unitDefault:
==
| Constraints | Value | 
|---|---|
| oneOf | Any["==", ">=", "<="] | 
Table 15 : flows_rep_periods_partitions
from_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
partition
Description: Partition or temporal resolution in the representative periods. For example, for a
uniformspecification1is hourly,2is every two hours.Type:
VARCHARUnit of measure:
No unitDefault:
1Constraints: No constraints
rep_period
Description: Number of the representative period
Type:
INTEGERUnit of measure:
numberDefault:
No defaultConstraints: No constraints
specification
Description: Partition (or temporal resolution) specification in the representative periods.
Type:
VARCHARUnit of measure:
No unitDefault:
uniform
| Constraints | Value | 
|---|---|
| oneOf | Any["uniform", "explicit", "math"] | 
to_asset
Description: Name of the asset. Same as the one in the
assettable.Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 16 : group_asset
invest_method
Description: true -> activate group constraints; false -> no group investment constraints
Type:
BOOLEANUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
max_investment_limit
Description: MW (Missing -> no limit)
Type:
DOUBLEUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
milestone_year
Description: Year of investment and operation decisions in the optimization.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
min_investment_limit
Description: MW (Missing -> no limit)
Type:
DOUBLEUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
name
Description: Name of the Group
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 17 : profiles_rep_periods
profile_name
Description: Profile name.
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
rep_period
Description: Representative period number.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
scenario
Description: Stochastic scenario number.
Type:
INTEGERUnit of measure:
numberDefault:
1Constraints: No constraints
timestep
Description: Timestep number.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
value
Description: Value of the profile.
Type:
DOUBLEUnit of measure:
p.u.Default:
No defaultConstraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 18 : profiles_timeframe
period
Description: Period.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
profile_name
Description: Profile name.
Type:
VARCHARUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
value
Description: value of the profile.
Type:
DOUBLEUnit of measure:
p.u.Default:
No defaultConstraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 19 : rep_periods_data
num_timesteps
Description: Number of timesteps
Type:
INTEGERUnit of measure:
No unitDefault:
8760Constraints: No constraints
rep_period
Description: Representative period number.
Type:
INTEGERUnit of measure:
numberDefault:
No defaultConstraints: No constraints
resolution
Description: Duration of each timestep
Type:
DOUBLEUnit of measure:
hoursDefault:
1Constraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 20 : rep_periods_mapping
period
Description: Period number.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
rep_period
Description: Representative period number.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
weight
Description: Hours
Type:
DOUBLEUnit of measure:
No unitDefault:
1.0Constraints: No constraints
year
Description: Milestone year.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 21 : stochastic_scenario
description
Description: Description of the stochastic scenario. e.g., 'Weather year 1982'.
Type:
VARCHARUnit of measure:
No unitDefault: ``
Constraints: No constraints
probability
Description: Probability of the stochastic scenario.
Type:
DOUBLEUnit of measure:
ratioDefault:
1.0
| Constraints | Value | 
|---|---|
| maximum | 1 | 
| minimum | 0 | 
scenario
Description: Stochastic scenario number.
Type:
INTEGERUnit of measure:
numberDefault:
No defaultConstraints: No constraints
Table 22 : timeframe_data
num_timesteps
Description: Number of timesteps of the representative period.
Type:
INTEGERUnit of measure:
No unitDefault:
8760Constraints: No constraints
period
Description: Period.
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
year
Description: Unique identifier (currently, the year itself)
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints
Table 23 : year_data
is_milestone
Description: Whether the year is a milestone year or a vintage year
Type:
BOOLEANUnit of measure:
No unitDefault:
trueConstraints: No constraints
length
Description: How many hours in a year, e.g., 8760
Type:
INTEGERUnit of measure:
No unitDefault:
8760Constraints: No constraints
year
Description: Unique identifier (currently, the year itself)
Type:
INTEGERUnit of measure:
No unitDefault:
No defaultConstraints: No constraints