Output functions

    collect_results

    MacroEnergy.collect_resultsFunction
    collect_results(system::System, model::Model, settings::NamedTuple, period_index::Int64=1, scaling::Float64=1.0)

    Returns a DataFrame with all the results after the optimization is performed.

    Arguments

    • system::System: The system object containing the case inputs.
    • model::Model: The model being optimized.
    • settings::NamedTuple: The settings for the system, including output configurations.
    • period_index::Int64: The index of the period to collect results for (default is 1).
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A `DataFrame containing all the outputs from a system.

    Example

    collect_results(system, model)
    198534×12 DataFrame
        Row │ case_name  commodity    commodity_subtype  zone        resource_id                component_id                       type              variable  segment  time   value
            │ Missing    Symbol       Symbol             Symbol      Symbol                     Symbol                             Symbol            Symbol    Int64    Int64  Float64
    ────────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          1 │   missing  Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      1  0.0
          2 │   missing  Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      2  0.0
          3 │   missing  Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      3  0.0
          ...
    source

    get_optimal_capacity

    MacroEnergy.get_optimal_capacityFunction
    get_optimal_capacity(system::System; scaling::Float64=1.0)

    Get the optimal capacity values for all assets/edges in a system.

    Arguments

    • system::System: The system containing the assets/edges to analyze
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A dataframe containing the optimal capacity values for all assets/edges, with missing columns removed

    Example

    get_optimal_capacity(system)
    153×8 DataFrame
     Row │ commodity    commodity_subtype  zone           resource_id                        component_id                       type              variable  value    
         │ Symbol       Symbol             Symbol         Symbol                             Symbol                             Symbol            Symbol    Float64 
    ─────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1 │ Electricity  capacity           elec_SE        existing_solar_SE                  existing_solar_SE_edge             VRE               capacity   8.5022
       2 │ Electricity  capacity           elec_NE        existing_solar_NE                  existing_solar_NE_edge             VRE               capacity   0.0   
       3 │ Electricity  capacity           elec_NE        existing_wind_NE                   existing_wind_NE_edge              VRE               capacity   3.6545
    source

    get_optimal_discounted_costs

    get_optimal_flow

    MacroEnergy.get_optimal_flowFunction
    get_optimal_flow(
        system::System; 
        scaling::Float64=1.0, 
        commodity::Union{AbstractString,Vector{<:AbstractString},Nothing}=nothing, 
        asset_type::Union{AbstractString,Vector{<:AbstractString},Nothing}=nothing
    )

    Get the optimal flow values for all edges in a system.

    Filtering

    Results can be filtered by:

    • commodity: Specific commodity type(s)
    • asset_type: Specific asset type(s)

    Pattern Matching

    Two types of pattern matching are supported:

    1. Parameter-free matching:

      • "ThermalPower" matches any ThermalPower{...} type (i.e. no need to specify parameters inside {})
    2. Wildcards using "*":

      • "ThermalPower*" matches ThermalPower{Fuel}, ThermalPowerCCS{Fuel}, etc.
      • "CO2*" matches CO2, CO2Captured, etc.

    Arguments

    • system::System: The system containing the all edges to output
    • scaling::Float64: The scaling factor for the results.
    • commodity::Union{AbstractString,Vector{<:AbstractString},Nothing}: The commodity to filter by
    • asset_type::Union{AbstractString,Vector{<:AbstractString},Nothing}: The asset type to filter by

    Returns

    • DataFrame: A dataframe containing the optimal flow values for all edges, with missing columns removed

    Example

    get_optimal_flow(system)
    186984×11 DataFrame
        Row │ commodity    commodity_subtype  zone        resource_id                component_id                       type              variable  segment  time   value     
            │ Symbol       Symbol             Symbol      Symbol                     Symbol                             Symbol            Symbol    Int64    Int64  Float64
    ────────┼──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
          1 │ Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      1  0.0    
          2 │ Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      2  0.0    
          3 │ Biomass      flow               bioherb_SE  SE_BECCS_Electricity_Herb  SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  flow            1      3  0.0    
          ...
    # Filter by commodity
    get_optimal_flow(system, commodity="Electricity")
    # Filter by commodity and asset type using parameter-free matching
    get_optimal_flow(system, commodity="Electricity", asset_type="ThermalPower") # only ThermalPower{Fuel} will be returned
    # Filter by commodity and asset type using wildcard matching
    get_optimal_flow(system, commodity="Electricity", asset_type="ThermalPower*") # all types starting with ThermalPower (e.g., ThermalPower{Fuel}, ThermalPowerCCS{Fuel}) will be returned)
    source
    get_optimal_flow(asset::AbstractAsset, scaling::Float64=1.0)

    Get the optimal flow values for all edges in an asset.

    Arguments

    • asset::AbstractAsset: The asset containing the edges to analyze
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A dataframe containing the optimal flow values for all edges, with missing columns removed

    Example

    asset = get_asset_by_id(system, :elec_SE)
    get_optimal_flow(asset)
    source
    get_optimal_flow(edge::AbstractEdge, scaling::Float64=1.0)

    Get the optimal flow values for an edge.

    Arguments

    • edge::AbstractEdge: The edge to analyze
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A dataframe containing the optimal flow values for the edge, with missing columns removed

    Example

    asset = get_asset_by_id(system, :elec_SE)
    elec_edge = asset.elec_edge
    get_optimal_flow(elec_edge)
    source

    get_optimal_new_capacity

    MacroEnergy.get_optimal_new_capacityFunction
    get_optimal_new_capacity(system::System; scaling::Float64=1.0)

    Get the optimal new capacity values for all assets/edges in a system.

    Arguments

    • system::System: The system containing the assets/edges to analyze
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A dataframe containing the optimal new capacity values for all assets/edges, with missing columns removed

    Example

    get_optimal_new_capacity(system)
    153×8 DataFrame
     Row │ commodity    commodity_subtype  zone           resource_id                        component_id                       type              variable      value  
         │ Symbol       Symbol             Symbol         Symbol                             Symbol                             Symbol            Symbol        Float64
    ─────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1 │ Biomass      capacity           bioherb_SE     SE_BECCS_Electricity_Herb          SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  new_capacity      0.0
       2 │ Biomass      capacity           bioherb_MIDAT  MIDAT_BECCS_Electricity_Herb       MIDAT_BECCS_Electricity_Herb_bio…  BECCSElectricity  new_capacity      0.0
       3 │ Biomass      capacity           bioherb_NE     NE_BECCS_Electricity_Herb          NE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  new_capacity      0.0
    source

    get_optimal_retired_capacity

    MacroEnergy.get_optimal_retired_capacityFunction
    get_optimal_retired_capacity(system::System; scaling::Float64=1.0)

    Get the optimal retired capacity values for all assets/edges in a system.

    Arguments

    • system::System: The system containing the assets/edges to analyze
    • scaling::Float64: The scaling factor for the results.

    Returns

    • DataFrame: A dataframe containing the optimal retired capacity values for all assets/edges, with missing columns removed

    Example

    get_optimal_retired_capacity(system)
    153×8 DataFrame
     Row │ commodity    commodity_subtype  zone           resource_id                        component_id                       type              variable      value    
         │ Symbol       Symbol             Symbol         Symbol                             Symbol                             Symbol            Symbol        Float64  
    ─────┼─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
       1 │ Biomass      capacity           bioherb_SE     SE_BECCS_Electricity_Herb          SE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  retired_capacity  0.0
       2 │ Biomass      capacity           bioherb_MIDAT  MIDAT_BECCS_Electricity_Herb       MIDAT_BECCS_Electricity_Herb_bio…  BECCSElectricity  retired_capacity  0.0
       3 │ Biomass      capacity           bioherb_NE     NE_BECCS_Electricity_Herb          NE_BECCS_Electricity_Herb_biomas…  BECCSElectricity  retired_capacity  0.0
    source

    write_capacity

    MacroEnergy.write_capacityFunction
    write_capacity(
        file_path::AbstractString, 
        system::System; 
        scaling::Float64=1.0, 
        drop_cols::Vector{AbstractString}=String[], 
        commodity::Union{AbstractString,Vector{AbstractString},Nothing}=nothing, 
        asset_type::Union{AbstractString,Vector{AbstractString},Nothing}=nothing
    )

    Write the optimal capacity results for all assets/edges in a system to a file. The extension of the file determines the format of the file. Capacity, NewCapacity, and RetiredCapacity are first concatenated and then written to the file.

    Filtering

    Results can be filtered by:

    • commodity: Specific commodity type(s)
    • asset_type: Specific asset type(s)

    Pattern Matching

    Two types of pattern matching are supported:

    1. Parameter-free matching:

      • "ThermalPower" matches any ThermalPower{...} type (i.e. no need to specify parameters inside {})
    2. Wildcards using "*":

      • "ThermalPower*" matches ThermalPower{Fuel}, ThermalPowerCCS{Fuel}, etc.
      • "CO2*" matches CO2, CO2Captured, etc.

    Arguments

    • file_path::AbstractString: The path to the file where the results will be written
    • system::System: The system containing the assets/edges to analyze as well as the settings for the output
    • scaling::Float64: The scaling factor for the results
    • drop_cols::Vector{AbstractString}: Columns to drop from the DataFrame
    • commodity::Union{AbstractString,Vector{AbstractString},Nothing}: The commodity to filter by
    • asset_type::Union{AbstractString,Vector{AbstractString},Nothing}: The asset type to filter by

    Returns

    • nothing: The function returns nothing, but writes the results to the file

    Example

    write_capacity("capacity.csv", system)
    # Filter by commodity
    write_capacity("capacity.csv", system, commodity="Electricity")
    # Filter by commodity and asset type using parameter-free matching
    write_capacity("capacity.csv", system, asset_type="ThermalPower")
    # Filter by asset type using wildcard matching
    write_capacity("capacity.csv", system, asset_type="ThermalPower*")
    # Filter by commodity and asset type
    write_capacity("capacity.csv", system, commodity="Electricity", asset_type=["ThermalPower", "Battery"])
    source

    write_costs

    MacroEnergy.write_costsFunction
    write_costs(
        file_path::AbstractString, 
        system::System, 
        model::Union{Model,NamedTuple}; 
        scaling::Float64=1.0, 
        drop_cols::Vector{<:AbstractString}=String[]
    )

    Write the optimal costs for the system to a file. The extension of the file determines the format of the file.

    Arguments

    • file_path::AbstractString: The path to the file where the results will be written
    • system::System: The system containing the assets/edges to analyze as well as the settings for the output
    • model::Union{Model,NamedTuple}: The optimal model after the optimization
    • scaling::Float64: The scaling factor for the results
    • drop_cols::Vector{<:AbstractString}: Columns to drop from the DataFrame

    Returns

    • nothing: The function returns nothing, but writes the results to the file
    source

    write_flow

    MacroEnergy.write_flowFunction
    write_flow(
        file_path::AbstractString, 
        system::System; 
        scaling::Float64=1.0, 
        drop_cols::Vector{<:AbstractString}=String[],
        commodity::Union{AbstractString,Vector{<:AbstractString},Nothing}=nothing,
        asset_type::Union{AbstractString,Vector{<:AbstractString},Nothing}=nothing
    )

    Write the optimal flow results for the system to a file. The extension of the file determines the format of the file.

    Filtering

    Results can be filtered by:

    • commodity: Specific commodity type(s)
    • asset_type: Specific asset type(s)

    Pattern Matching

    Two types of pattern matching are supported:

    1. Parameter-free matching:

      • "ThermalPower" matches any ThermalPower{...} type (i.e. no need to specify parameters inside {})
    2. Wildcards using "*":

      • "ThermalPower*" matches ThermalPower{Fuel}, ThermalPowerCCS{Fuel}, etc.
      • "CO2*" matches CO2, CO2Captured, etc.

    Arguments

    • file_path::AbstractString: The path to the file where the results will be written
    • system::System: The system containing the edges to analyze as well as the settings for the output
    • scaling::Float64: The scaling factor for the results
    • drop_cols::Vector{<:AbstractString}: Columns to drop from the DataFrame
    • commodity::Union{AbstractString,Vector{<:AbstractString},Nothing}: The commodity to filter by
    • asset_type::Union{AbstractString,Vector{<:AbstractString},Nothing}: The asset type to filter by

    Returns

    • nothing: The function returns nothing, but writes the results to the file

    Example

    write_flow("flow.csv", system)
    # Filter by commodity
    write_flow("flow.csv", system, commodity="Electricity")
    # Filter by commodity and asset type using parameter-free matching
    write_flow("flow.csv", system, commodity="Electricity", asset_type="ThermalPower")
    # Filter by commodity and asset type using wildcard matching
    write_flow("flow.csv", system, commodity="Electricity", asset_type="ThermalPower*")
    source

    write_dataframe

    MacroEnergy.write_dataframeFunction
    write_dataframe(
        file_path::AbstractString, 
        df::AbstractDataFrame, 
        drop_cols::Vector{<:AbstractString}=String[]
    )

    Write a DataFrame to a file in the appropriate format based on file extension. Supported formats: .csv, .csv.gz, .parquet

    Arguments

    • file_path::AbstractString: Path where to save the file
    • df::AbstractDataFrame: DataFrame to write
    • drop_cols::Vector{<:AbstractString}: Columns to drop from the DataFrame
    source

    write_results

    MacroEnergy.write_resultsFunction
    write_results(file_path::AbstractString, system::System, model::Model, settings::NamedTuple, period_index::Int64=1)

    Collects all the results as a DataFrame and then writes them to disk after the optimization is performed.

    Arguments

    • file_path::AbstractString: full path of the file to export.
    • system::System: The system object containing the case inputs.
    • model::Model: The model being optimized.
    • period_index::Int64: The index of the period to collect results for (default is 1).
    • settings::NamedTuple: The settings for the system, including output configurations.

    Returns

    Example

    write_results(case_path * "results.csv", system, model) # CSV
    write_results(case_path * "results.csv.gz", system, model)  # GZIP
    write_results(case_path * "results.parquet", system, model) # PARQUET
    source

    MacroEnergy.write_outputs

    MacroEnergy.write_outputsFunction

    Write results when using Monolithic as solution algorithm.

    source

    Write results when using Myopic as solution algorithm.

    source

    Write results when using Benders as solution algorithm.

    source