# RELOG: Composition Format ## Input Data Format (JSON) ## Glossary of types | Type | Description | Example | | --------------------- | -------------------------------------------------------- | ------------------------ | | `int` | An integer number. | `1` | | `float` | A real number. | `3.1415` | | `str` | A string. | `"Euclidean"` | | `vec(int)` | A vector of integer numbers, with any length. | `[1, 2, 3]` | | `vec(int, 5)` | A vector of integer numbers, with 5 elements. | `[1, 2, 3, 4, 5]` | | `mat(float, 2, 3, 4)` | A matrix of floating point numbers with shape (2, 3, 5). | `rand(Float64, 2, 3, 4)` | | `dict(str, int)` | A dictionary mapping strings to integer numbers. | `Dict("A" => 1)` | ### Parameters | Key | Type | Description | | :------------------------ | ---------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `time horizon (years)` | `int` | Number of years in the simulation. | | `building period (years)` | `vec(int)` | List of years in which we are allowed to open new plants. For example, if this parameter is set to `[1,2,3]`, we can only open plants during the first three years. By default, this equals `[1]`; that is, plants can only be opened during the first year. | | `distance metric` | `str` | Metric used to compute distances between pairs of locations. Valid options are: `"Euclidean"`, for the straight-line distance between points; or `"driving"` for an approximated driving distance. If not specified, defaults to `"Euclidean"`. | #### Example ```json { "parameters": { "time horizon (years)": 4, "building period (years)": [1], "distance metric": "driving" } } ``` ### Products | Key | Type | Description | | :------------------------------------------ | :------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | `transportation cost ($/km/tonne)` | `vec(float, T)` | The cost (in dollars) to transport one tonne of the product over one kilometer at time $t$. | | `transportation energy (J/km/tonne)` | `vec(float, T)` | The energy (in J) required to transport this product at time $t$. | | `transportation emissions (tonne/km/tonne)` | `dict(str, vec(float, T))` | A dictionary mapping the name of each greenhouse gas (produced during the transportation of one tonne of this product along one kilometer at time $t$) to the amount of gas produced (in tonnes). | | `components` | `vec(str)` | List of components for the product. | #### Example ```json { "products": { "P1": { "transportation cost ($/km/tonne)": [0.015, 0.015, 0.015, 0.015], "transportation energy (J/km/tonne)": [0.12, 0.12, 0.12, 0.12], "transportation emissions (tonne/km/tonne)": { "CO2": [0.052, 0.052, 0.052, 0.052], "CH4": [0.003, 0.003, 0.003, 0.003] }, "components": ["P1a", "P1b", "P1c"] } } } ``` ### Centers | Key | Type | Description | | :------------------------------ | ------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `latitude (deg)` | `float` | The latitude of the center. | | `longitude (deg)` | `float` | The longitude of the center. | | `input` | `str` | The name of the product this center takes as input. May be `null` if the center accept no input product. | | `outputs` | `vec(str)` | List of output products collected by the center. May be `[]` if none. | | `fixed output (tonne)` | `dict(str, mat(float, T, C))` | Dictionary mapping the name of each output product $p$ to a matrix $M$, where $M_{t,c}$ is the amount (in tonne) of output product component $c$ produced by the center at time $t$, regardless of how much input material the center received. | | `variable output (tonne/tonne)` | `dict(str,mat(float, T, M, N))` | Dictionary mapping the name of each output product $p$ to a $(T \times m \times n)$ matrix $M$ that describes the amount (in tonnes) of output product component produced by the center, depending on how much input material the center received in prior years, where $T$ is the number of years, $m$ is the number of components of $p$ and $n$ is the number of components of the input product. | | `revenue ($/tonne)` | `vec(float, T)` | Revenue generated by each tonne of input material sent to the center. If the center accepts no input, this should be `null` | | `collection cost ($/tonne)` | `dict(str,vec(float,T))` | Dictionary mapping the name of each output product to the cost of collecting one tonne of the product. | | `operating cost ($)` | `vec(float,T)` | Fixed cost to operate the center for one year, regardless of amount of product received or generated. | | `disposal limit (tonne)` | `dict(str,vec(float,T))` | Dictionary mapping the name of each output product to the maximum disposal amount allower per year of the product at the center. Entry may be `null` if unlimited. | | `disposal cost ($/tonne)` | `dict(str,vec(float,T))` | Dictionary mapping the name of each output product to the cost to dispose one tonne of the product at the center. | ```json { "centers": { "C1": { "latitude (deg)": 41.881, "longitude (deg)": -87.623, "input": "P1", "outputs": ["P2", "P3"], "fixed output (tonne)": { "P2": [ [50, 20, 10], [5, 2, 1], [0, 0, 0], [0, 0, 0] ], "P3": [ [20, 10], [10, 5], [0, 0], [0, 0] ] }, "variable output (tonne/tonne)": { "P2": [ [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ] ], "P3": [ [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ], [ [1, 0, 0], [0, 1, 1] ] ] }, "revenue ($/tonne)": [12.0, 12.0, 12.0, 12.0], "collection cost ($/tonne)": { "P2": [0.25, 0.25, 0.25, 0.25], "P3": [0.37, 0.37, 0.37, 0.37] }, "operating cost ($)": [150.0, 150.0, 150.0, 150.0], "disposal limit (tonne)": { "P2": [0, 0, 0, 0], "P3": [null, null, null, null] }, "disposal cost ($/tonne)": { "P2": [0.23, 0.23, 0.23, 0.23], "P3": [1.0, 1.0, 1.0, 1.0] } }, "C2": { "latitude (deg)": 41.881, "longitude (deg)": -87.623, "input": null, "outputs": ["P4"], "fixed output (tonne)": { "P4": [ [50, 5], [60, 6], [70, 7], [80, 8] ] }, "revenue ($/tonne)": null, "collection cost ($/tonne)": { "P4": [0.25, 0.25, 0.25, 0.25] }, "operating cost ($)": [150.0, 150.0, 150.0, 150.0], "disposal limit (tonne)": { "P4": [null, null, null, null] }, "disposal cost ($/tonne)": { "P4": [0, 0, 0, 0] } }, "C3": { "latitude (deg)": 41.881, "longitude (deg)": -87.623, "input": "P1", "outputs": [], "variable output (tonne/tonne)": {}, "constant output (tonne)": {}, "revenue ($/tonne)": [12.0, 12.0, 12.0, 12.0], "collection cost ($/tonne)": {}, "operating cost ($)": [150.0, 150.0, 150.0, 150.0], "disposal limit (tonne)": {}, "disposal cost ($/tonne)": {} } } } ``` ### Plants | Key | | Description | | :----------------------------- | ----------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------- | | `latitude (deg)` | `float` | The latitude of the plant, in degrees. | | `longitude (deg)` | `float` | The longitude of the plant, in degrees. | | `input mix (%)` | `dict(str,float)` | Dictionary mapping the name of each input product to the amount required (as a percentage). Must sum to 100%. | | `output (tonne/tonne)` | `dict(str,dict(str,mat(float, T, M, N)))` | Dictionary of matrices describing the component outputs. | | `processing emissions (tonne)` | `dict(str,vec(float,T))` | A dictionary mapping the name of each greenhouse gas, produced to process each tonne of input, to the amount of gas produced (in tonne). | | `storage cost ($/tonne)` | `dict(str,vec(float,T))` | Dictionary mapping the name of each input product to the cost of storing the product for one year at the plant for later processing. | | `storage limit (tonne)` | | Dictionary mapping the name of each input product to the maximum amount allowed in storage at any time. May be `null` if unlimited. | | `disposal cost ($/tonne)` | | Dictionary mapping the name of each output product to the cost of disposing it at the plant. | | `disposal limit (tonne)` | | Dictionary mapping the name of each output product to the maximum amount allowed to be disposed of at the plant. May be `null` if unlimited. | | `capacities` | | List describing what plant sizes are allowed, and their characteristics. | The entries in the `capacities` list should be dictionaries with the following keys: | Key | Description | | :---------------------------------- | :-------------------------------------------------------------------------------------------------- | | `size (tonne)` | The size of the plant. | | `opening cost ($)` | The cost to open a plant of this size. | | `fixed operating cost ($)` | The cost to keep the plant open, even if the plant doesn't process anything. Must be a time series. | | `variable operating cost ($/tonne)` | The cost that the plant incurs to process each tonne of input. Must be a time series. | | `initial capacity (tonne)` | Capacity already available. If the plant has not been built yet, this should be `0`. | ```json { "plants": { "L1": { "latitude (deg)": 41.881, "longitude (deg)": -87.623, "input mix (%)": { "P1": 95.3, "P2": 4.7 }, "output (tonne/tonne)": { "P3": { "P1": [ [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]] ], "P2": [ [[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 1], [1, 0]] ] }, "P4": { "P1": [ [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]], [[1, 0, 0], [0, 1, 1]] ], "P2": [ [[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 1], [1, 0]], [[0, 1], [1, 0]] ] }, "P5": { "P1": [[1, 0, 0], [0, 1, 1]], "P2": [[0, 1], [1, 0]], } }, "processing emissions (tonne)": { "CO2": 0.1 }, "storage cost ($/tonne)": { "P1": 0.1, "P2": 0.1 }, "storage limit (tonne)": { "P1": 100, "P2": null }, "disposal cost ($/tonne)": { "P3": 0, "P4": 0.86, "P5": 0.25, }, "disposal limit (tonne)": { "P3": null, "P4": 1000.0, "P5": 1000.0 }, "capacities": [ { "size": 100, "opening cost ($)": 500, "fixed operating cost ($)": 300, "variable operating cost ($/tonne)": 5.0 }, { "size": 500, "opening cost ($)": 1000.0, "fixed operating cost ($)": 400.0, "variable operating cost ($/tonne)": 5.0. } ], "initial capacity (tonne)": 0, } } } ```