diff --git a/pyproject.toml b/pyproject.toml index 67a40add..2220150b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,6 +61,7 @@ dev-dependencies = [ "mkdocs-material>=9.6.9", "mkdocs>=1.6.1", "mkdocstrings[python]>=0.29.0", + "plexosdb>=1.3.4", ] [tool.hatch.metadata] diff --git a/scripts/extract_plexos_constraints.py b/scripts/extract_plexos_constraints.py new file mode 100644 index 00000000..56cc391e --- /dev/null +++ b/scripts/extract_plexos_constraints.py @@ -0,0 +1,935 @@ +"""Extract custom-constraint definitions from an AEMO PLEXOS XML model. + +Run manually after AEMO publishes a new PLEXOS model. The output CSVs land +in ``src/ispypsa/templater/plexos//`` and are consumed by the +ISPyPSA templater at template time. + +Usage: + uv run python scripts/extract_plexos_constraints.py path/to/model.xml --version 7.5 + +The PLEXOS XML model is published by AEMO alongside each ISP and can be +downloaded from their website -- pass the path to that file as the first +argument. + + +The PLEXOS data model +===================== + +A PLEXOS XML file is a dump of a relational database. Everything in the model +is an *object*; objects are wired together by *memberships*; and numeric +*data* values hang off those memberships. Seven tables matter here -- only +the columns this script uses are listed: + + t_class The catalogue of object types -- Generator, Battery, Line, + Node, Constraint, System, ... One row per type. + class_id, name + + t_object Every object in the model: each generator, each battery, + each constraint, the single System object, ... + object_id, class_id, name + + t_membership A directed link joining a parent object to a child object. + This is how PLEXOS records "X participates in Y". + membership_id, parent_object_id, child_object_id + + t_property The catalogue of value types -- "Generation Sent Out + Coefficient", "RHS", "Sense", "Penalty Price", ... + property_id, name + + t_data A single numeric value: "on membership M, property P has + value V". One membership can carry many t_data rows. + data_id, membership_id, property_id, value + + t_date_from Optional sidecars to t_data. Mark a value as effective only + t_date_to from / until a given date. Absent for always-on values. + data_id, date + + t_tag Optional sidecar to t_data. Attaches a tag object to a + value. PLEXOS uses tags for scenario / timeslice scoping; + here the tags are the demand-condition timeslices. + data_id, object_id + + +How a constraint is represented +=============================== + +A constraint is just an object whose class is "Constraint". Each thing that +participates in it -- every LHS generator / battery / line, plus the System +object that carries the right-hand side and the sense -- is joined to the +constraint by a membership in which the constraint is the *child* and the +participant is the *parent*: + + t_membership.parent_object_id -> the participant (Generator, System, ...) + t_membership.child_object_id -> the constraint + +The coefficients, RHS and sense are t_data rows hanging off those memberships. + +Worked example -- a constraint "ExportGroup_SWQLD1" that reads, in part, +``0.14 * KINGASF1 <= 3000``: + + t_class + class_id name + 2 Generator + 78 Constraint + 1 System + + t_object + object_id class_id name + 10 2 KINGASF1 + 20 78 ExportGroup_SWQLD1 + 30 1 NEM + + t_membership + membership_id parent_object_id child_object_id + 500 10 20 + 501 30 20 + + t_property + property_id name + 44 Generation Sent Out Coefficient + 12 RHS + 13 Sense + + t_data + data_id membership_id property_id value + 900 500 44 0.14 + 901 501 12 3000 + 902 501 13 -1 + + -> Membership 500 wires generator KINGASF1 into the constraint; its + t_data row 900 is the 0.14 coefficient. Membership 501 wires in the + System object; its t_data rows carry the RHS (3000) and the Sense + (-1, meaning "<="). Sense encoding: -1 "<=", 0 "=", +1 ">=". + + +The extraction pipeline +======================= + +The script resolves the constraints by name, then walks outward one step at a +time -- each step scoped by the ids found in the step before: + + 1. names -> constraint objects (_query_constraint_objects) + 2. constraint ids -> their memberships (_query_memberships) + 3. membership ids -> the data values on them (_query_data_points) + 4. membership ids -> effective dates (_query_dates) + 5. membership ids -> tags (_query_tags) + +Steps 1-3 are the spine (one row per value); steps 4-5 enrich it. The five +result frames are stitched into one long table by ``_merge_into_long_table``, +then split into the three output CSVs by ``_split_into_tables``. + + +Validation +========== + +Before the tables are written, the extraction asserts a battery of structural +invariants against the *real* model. Each is a small ``_assert_*`` / +``_check_*`` function whose docstring states the assumption it tests and how. +Together they cover name resolution, structural completeness (a Sense, an RHS +and LHS terms per constraint), reference integrity, value sanity, tag scoping, +and the absence of bands or duplicated data points. Most run on the merged +table, gathered by ``_validate_constraint_rows``; a few need the database and +run earlier, in ``_query_constraint_rows``. + +These are deliberately not unit tests on synthetic data -- a synthetic +fixture can only encode the schema assumptions we are trying to test. The +invariants instead check properties that must hold *if* our model of the +PLEXOS schema is correct, so a violation means the model is wrong (or a new +AEMO model has broken an assumption), and the run fails loudly rather than +emitting wrong or incomplete CSVs. + + +Output schema +============= + +Three output tables, all long format: + +* ``constraints.csv`` -- the constraint-level properties: every + System-membership property other than ``RHS`` -- ``Sense``, + ``Penalty Price`` and ``Include in LT Plan``: + ``constraint_name, property, value, date_from, date_to, tags`` + (``Sense`` is PLEXOS native: ``-1`` ``<=``, ``0`` ``=``, ``+1`` ``>=``.) + +* ``lhs_terms.csv`` -- one row per LHS data point (the non-System + memberships -- Generator / Battery / Line / Node coefficients): + ``constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags`` + +* ``rhs_values.csv`` -- one row per RHS data point. ``RHS`` is a + System-membership property too, but gets its own table because it is the + timeslice-varying bound (one tagged row per demand condition): + ``constraint_name, value, date_from, date_to, tags`` + +PLEXOS object names, property names, sense encoding, and tags are preserved +verbatim from the XML. The templater is responsible for translating these +into ISPyPSA conventions (timeslice mapping, IASR ID lookup, term-type +classification, etc.). +""" + +import argparse +from pathlib import Path + +import pandas as pd +import plexosdb.xml_handler +from plexosdb import PlexosDB + +# The 15 custom constraints we extract. Fourteen are REZ / sub-region +# export-limit constraints (PLEXOS names them "ExportGroup_"); the +# last is a gas-powered-generation constraint. The list is hardcoded +# deliberately -- the set ISPyPSA needs is small and fixed, and is clearer +# stated explicitly than inferred from the model. Revisit if a new PLEXOS +# model changes the set. +CONSTRAINT_NAMES = [ + "ExportGroup_NQ1", + "ExportGroup_CQ1", + "ExportGroup_SQ1", + "ExportGroup_SEVIC1", + "ExportGroup_SWV1", + "ExportGroup_MN1", + "ExportGroup_NSA1", + "ExportGroup_NET1", + "ExportGroup_SWNSW2", + "ExportGroup_WV1", + "ExportGroup_CNSW1", + "ExportGroup_SWQLD1", + "ExportGroup_WNV1", + "ExportGroup_SWNSW1", + "CNSW-SNW South GPG", +] + +# Structural invariants asserted against the real model -- see the module +# docstring's "Validation" section and ``_validate_constraint_rows``. +_KNOWN_PROPERTIES = { + "Generation Sent Out Coefficient", # Generator LHS coefficient + "Generation Coefficient", # Battery LHS coefficient + "Load Coefficient", # Battery / Node LHS coefficient + "Flow Coefficient", # Line LHS coefficient + "Installed Capacity Coefficient", # network-expansion decision variable + "RHS", # System: the constraint bound + "Sense", # System: the inequality direction + "Penalty Price", # System: solver setting + "Include in LT Plan", # System: solver setting +} +_KNOWN_PARENT_CLASSES = {"Generator", "Battery", "Line", "Node", "Purchaser", "System"} +_VALID_SENSE_VALUES = {-1, 0, 1} + + +def main(): + args = _parse_args() + db = _load_plexos_db(args.xml_path) + rows = _query_constraint_rows(db, CONSTRAINT_NAMES) + constraints, lhs, rhs = _split_into_tables(rows) + _write_csvs(args.out_dir / args.version, constraints, lhs, rhs) + + +def _parse_args(): + p = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + p.add_argument("xml_path", help="Path to the PLEXOS XML model file.") + p.add_argument( + "--version", + required=True, + help="Workbook version label for the output subdirectory (e.g. 7.5).", + ) + p.add_argument( + "--out-dir", + type=Path, + default=Path("src/ispypsa/templater/plexos"), + help="Parent output directory (default: src/ispypsa/templater/plexos).", + ) + return p.parse_args() + + +def _load_plexos_db(xml_path: str) -> PlexosDB: + """Load a PLEXOS XML model into an in-memory SQLite database via plexosdb. + + Installs a workaround for AEMO's 20-digit ``t_data.uid`` values, which + exceed SQLite's 64-bit signed integer range. Without it, + ``PlexosDB.from_xml`` raises ``OverflowError`` on AEMO files. Reported + upstream as plexosdb issue #135. + """ + _install_big_int_workaround() + return PlexosDB.from_xml(xml_path) + + +def _install_big_int_workaround() -> None: + """Patch plexosdb so ``t_data.uid`` values too large for SQLite become strings. + + plexosdb's ``validate_string`` coerces numeric-looking XML text to ``int``. + AEMO's ``uid`` values have ~20 digits, overflowing SQLite's signed 64-bit + integer column. We wrap ``validate_string`` to keep such values as strings. + ``uid`` is not read by this script, so stringifying it is harmless. + """ + original = plexosdb.xml_handler.validate_string + + def patched(value): + result = original(value) + if isinstance(result, int) and abs(result) >= 2**63: + return str(result) + return result + + plexosdb.xml_handler.validate_string = patched + + +def _query_constraint_rows(db: PlexosDB, names: list[str]) -> pd.DataFrame: + """Build the long-format constraint table via the five-step query pipeline. + + See the module docstring ("The extraction pipeline") for the rationale. + Each step is scoped by ids carried over from the previous step, so the + SQL stays simple -- no query repeats the constraint-scoping joins. The + result is validated throughout (see the module docstring's "Validation" + section) before being returned. + + I/O Example: + names: ["ExportGroup_SWQLD1"] + + returns (abbreviated to three of ~80 rows): + constraint_name parent_class parent_name property value date_from date_to tags + ExportGroup_SWQLD1 Generator KINGASF1 Gen... 0.14 NaN NaN NaN + ExportGroup_SWQLD1 System NEM RHS 3000.0 NaN NaN QLD Hot Day + ExportGroup_SWQLD1 System NEM Sense -1.0 NaN NaN NaN + """ + constraints = _query_constraint_objects(db, names) + _check_constraints_resolved(constraints, names) + _assert_constraints_are_never_parents(db, constraints["constraint_object_id"]) + memberships = _query_memberships(db, constraints["constraint_object_id"]) + membership_ids = memberships["membership_id"] + _assert_no_banded_data_points(db, membership_ids) + data_points = _query_data_points(db, membership_ids) + dates = _query_dates(db, membership_ids) + tags = _query_tags(db, membership_ids) + rows = _merge_into_long_table(constraints, memberships, data_points, dates, tags) + _assert_merge_is_one_to_one(data_points, rows) + _validate_constraint_rows(rows) + return rows + + +def _placeholders(n: int) -> str: + """Return an SQL placeholder list ``"?,?,..."`` of length n for an IN clause.""" + return ",".join(["?"] * n) + + +def _query_constraint_objects(db: PlexosDB, names: list[str]) -> pd.DataFrame: + """Step 1 -- resolve constraint names to their ``t_object`` rows. + + PLEXOS identifies objects internally by ``object_id``; every later step + needs those ids, so we first look them up from the human-readable names. + + Reads: + t_object -- every object; we keep the ones whose name is in `names`. + t_class -- joined only to require the object's class is 'Constraint', + so a same-named object of another class can't slip in. + + I/O Example: + names: ["ExportGroup_SWQLD1"] + + t_object: + object_id class_id name + 20 78 ExportGroup_SWQLD1 + + t_class: + class_id name + 78 Constraint + + returns: + constraint_object_id constraint_name + 20 ExportGroup_SWQLD1 + """ + sql = f""" + SELECT obj.object_id AS constraint_object_id, obj.name AS constraint_name + FROM t_object AS obj + JOIN t_class AS cls ON obj.class_id = cls.class_id + WHERE cls.name = 'Constraint' + AND obj.name IN ({_placeholders(len(names))}) + """ + cols = ["constraint_object_id", "constraint_name"] + return pd.DataFrame(db.query(sql, tuple(names)), columns=cols) + + +def _query_memberships(db: PlexosDB, constraint_object_ids) -> pd.DataFrame: + """Step 2 -- list every membership wiring an entity into our constraints. + + A constraint's participants are exactly the memberships whose *child* is + one of the constraint objects from step 1. The *parent* of each such + membership is a participating entity: an LHS Generator / Battery / Line / + Node, or the System object that carries the RHS and sense. + + Reads: + t_membership -- the links; kept where child_object_id is a constraint. + t_object -- LEFT-joined on the parent side for the parent's name. + t_class -- LEFT-joined on the parent side for the parent class. + + The object and class joins are LEFT joins on purpose: a broken reference + then surfaces as a NaN (caught by ``_assert_no_unresolved_references``) + instead of silently dropping the membership row. The returned + ``membership_id`` column is the scope for steps 3-5. + + I/O Example: + constraint_object_ids: [20] # ExportGroup_SWQLD1 + + t_membership: + membership_id parent_object_id child_object_id + 500 10 20 + 501 30 20 + + t_object: + object_id class_id name + 10 2 KINGASF1 + 30 1 NEM + + t_class: + class_id name + 2 Generator + 1 System + + returns: + membership_id constraint_object_id parent_class parent_name + 500 20 Generator KINGASF1 + 501 20 System NEM + """ + ids = list(constraint_object_ids) + sql = f""" + SELECT mem.membership_id, + mem.child_object_id AS constraint_object_id, + parent_cls.name AS parent_class, + parent.name AS parent_name + FROM t_membership AS mem + LEFT JOIN t_object AS parent ON mem.parent_object_id = parent.object_id + LEFT JOIN t_class AS parent_cls ON parent.class_id = parent_cls.class_id + WHERE mem.child_object_id IN ({_placeholders(len(ids))}) + """ + cols = ["membership_id", "constraint_object_id", "parent_class", "parent_name"] + return pd.DataFrame(db.query(sql, tuple(ids)), columns=cols) + + +def _query_data_points(db: PlexosDB, membership_ids) -> pd.DataFrame: + """Step 3 -- collect every numeric value attached to the given memberships. + + Each ``t_data`` row is one value -- a coefficient, an RHS, a sense, a + penalty price. A membership can carry several: the System membership + carries RHS + Sense + Penalty Price, and a time-varying coefficient adds + one ``t_data`` row per effective date. + + Reads: + t_data -- the values; kept where membership_id is one of ours. + t_property -- LEFT-joined to turn property_id into a readable name; + LEFT so a dangling property_id surfaces as a NaN + (caught by ``_assert_no_unresolved_references``) rather + than dropping the data row. + + I/O Example: + membership_ids: [500, 501] + + t_data: + data_id membership_id property_id value + 900 500 44 0.14 + 901 501 12 3000 + 902 501 13 -1 + + t_property: + property_id name + 44 Generation Sent Out Coefficient + 12 RHS + 13 Sense + + returns: + data_id membership_id property value + 900 500 Generation Sent Out Coefficient 0.14 + 901 501 RHS 3000 + 902 501 Sense -1 + """ + ids = list(membership_ids) + sql = f""" + SELECT data.data_id, data.membership_id, prop.name AS property, data.value + FROM t_data AS data + LEFT JOIN t_property AS prop ON data.property_id = prop.property_id + WHERE data.membership_id IN ({_placeholders(len(ids))}) + """ + cols = ["data_id", "membership_id", "property", "value"] + return pd.DataFrame(db.query(sql, tuple(ids)), columns=cols) + + +def _query_dates(db: PlexosDB, membership_ids) -> pd.DataFrame: + """Step 4 -- find effective-date overrides for values on the given memberships. + + Most values are always-effective and have no row in ``t_date_from`` / + ``t_date_to``. A time-varying value -- e.g. a coefficient that changes + when a project comes online -- gets a ``t_date_from`` row; ``t_date_to`` + is rarer. Values with neither are excluded here (the WHERE clause) and + surface as NaN dates after the final merge. + + Reads: + t_data -- the spine, so the filter can be by membership_id. + t_date_from -- left-joined; supplies date_from where present. + t_date_to -- left-joined; supplies date_to where present. + + I/O Example: + membership_ids: [501] + + t_data: + data_id membership_id + 901 501 + 902 501 + + t_date_from: + data_id date + 901 2037-07-01T00:00:00 + + t_date_to: + (no matching rows) + + returns: + data_id date_from date_to + 901 2037-07-01T00:00:00 None + + Data point 902 has no row in either date table, so the WHERE clause + drops it; it surfaces as NaN dates after the final merge. (In the + real model ExportGroup_SWQLD1's values are all always-effective -- + this example is illustrative.) + """ + ids = list(membership_ids) + sql = f""" + SELECT data.data_id, dfrom.date AS date_from, dto.date AS date_to + FROM t_data AS data + LEFT JOIN t_date_from AS dfrom ON data.data_id = dfrom.data_id + LEFT JOIN t_date_to AS dto ON data.data_id = dto.data_id + WHERE data.membership_id IN ({_placeholders(len(ids))}) + AND (dfrom.date IS NOT NULL OR dto.date IS NOT NULL) + """ + cols = ["data_id", "date_from", "date_to"] + return pd.DataFrame(db.query(sql, tuple(ids)), columns=cols) + + +def _query_tags(db: PlexosDB, membership_ids) -> pd.DataFrame: + """Step 5 -- find the tags on the values attached to the given memberships. + + A tag links a ``t_data`` value to a tag *object* (a row in ``t_object``). + PLEXOS uses tags for scenario / timeslice scoping; for these constraints + the tags are the demand-condition timeslices -- "QLD Hot Day", + "QLD Typical Summer", "QLD Winter" and the NSW / VIC / SA / TAS + equivalents -- one on each region's RHS rows. A value can in principle + carry more than one tag, so the tag names are ``GROUP_CONCAT``-ed into a + single '|'-separated string. Values with no tags are excluded and surface + as NaN after the final merge. + + Reads: + t_tag -- the value <-> tag-object links. + t_data -- joined as the spine, so the filter can be by membership_id. + t_object -- joined to turn the tag's object_id into its name. + + I/O Example: + membership_ids: [501] + + t_tag: + data_id object_id + 901 700 + + t_data: + data_id membership_id + 901 501 + + t_object: + object_id name + 700 QLD Hot Day + + returns: + data_id tags + 901 QLD Hot Day + """ + ids = list(membership_ids) + sql = f""" + SELECT data.data_id, GROUP_CONCAT(tag_obj.name, '|') AS tags + FROM t_tag AS tag + JOIN t_data AS data ON tag.data_id = data.data_id + JOIN t_object AS tag_obj ON tag.object_id = tag_obj.object_id + WHERE data.membership_id IN ({_placeholders(len(ids))}) + GROUP BY data.data_id + """ + return pd.DataFrame(db.query(sql, tuple(ids)), columns=["data_id", "tags"]) + + +def _check_constraints_resolved(constraints: pd.DataFrame, names: list[str]) -> None: + """Each requested name resolves to exactly one Constraint object. + + Two failure modes break this: a name matching no Constraint object (a typo, + or a constraint renamed in a new model), and a name matching more than one + -- a name collision -- which would silently double every row for it. + Tested against the names ``_query_constraint_objects`` resolved. + """ + resolved = constraints["constraint_name"] + missing = sorted(set(names) - set(resolved)) + if missing: + raise ValueError(f"Constraint names not found in the PLEXOS model: {missing}") + collisions = sorted(resolved[resolved.duplicated()].unique()) + if collisions: + raise ValueError( + f"Constraint names matching more than one object: {collisions}" + ) + + +def _merge_into_long_table( + constraints: pd.DataFrame, + memberships: pd.DataFrame, + data_points: pd.DataFrame, + dates: pd.DataFrame, + tags: pd.DataFrame, +) -> pd.DataFrame: + """Stitch the five query slices into one row per ``t_data`` entry. + + ``data_points`` is the spine -- one row per value. Each value is joined + out to its membership (parent entity), to its constraint (name), and then + left-joined to its optional dates and tags. + + I/O Example: + data_points: + data_id membership_id property value + 900 500 Gen... 0.14 + + memberships: + membership_id constraint_object_id parent_class parent_name + 500 20 Generator KINGASF1 + + constraints: + constraint_object_id constraint_name + 20 ExportGroup_SWQLD1 + + dates: + (no matching rows -- value 900 is always-effective) + + tags: + (no matching rows -- value 900 is untagged) + + returns: + constraint_name parent_class parent_name property value date_from date_to tags + ExportGroup_SWQLD1 Generator KINGASF1 Gen... 0.14 NaN NaN NaN + """ + return ( + data_points.merge(memberships, on="membership_id", how="left") + .merge(constraints, on="constraint_object_id", how="left") + .merge(dates, on="data_id", how="left") + .merge(tags, on="data_id", how="left") + .drop(columns=["membership_id", "data_id", "constraint_object_id"]) + .loc[ + :, + [ + "constraint_name", + "parent_class", + "parent_name", + "property", + "value", + "date_from", + "date_to", + "tags", + ], + ] + .sort_values( + ["constraint_name", "parent_class", "parent_name", "property", "date_from"], + na_position="first", + ) + .reset_index(drop=True) + ) + + +# --- structural validation --- +# +# Each function below asserts one assumption the extraction makes about the +# PLEXOS schema, checked against the real model. Its docstring states the +# assumption and how it is tested; a failure halts the run. + + +def _validate_constraint_rows(rows: pd.DataFrame) -> None: + """Run every invariant that can be checked on the assembled long table. + + Two further checks need the database and so run earlier, inside + ``_query_constraint_rows``: ``_assert_constraints_are_never_parents`` and + ``_assert_no_banded_data_points``. See the module docstring's "Validation" + section for why these invariants are not circular. + """ + # Nothing was structurally lost or left unresolved. + _assert_no_unresolved_references(rows) + # Every constraint is complete: a direction, a bound, and LHS terms. + _assert_one_sense_per_constraint(rows) + _assert_every_constraint_has_rhs(rows) + _assert_every_constraint_has_lhs(rows) + # Every property and participant is one the extraction knows. + _assert_properties_are_known(rows) + _assert_parent_classes_are_known(rows) + # Every value makes sense for its kind. + _assert_sense_values_are_valid(rows) + _assert_values_are_numeric(rows) + # Tags behave as the demand-condition timeslices we take them to be. + _assert_tags_only_on_rhs(rows) + _assert_one_tag_per_rhs(rows) + # No two rows describe the same logical data point. + _assert_no_duplicate_data_points(rows) + + +def _assert_no_unresolved_references(rows: pd.DataFrame) -> None: + """Every membership resolves to a parent object and class, and every data + point to a property. + + ``_query_memberships`` and ``_query_data_points`` LEFT-join those lookups, + so a PLEXOS reference pointing at nothing surfaces here as a NaN instead + of silently dropping the row. Tested by requiring no nulls in the four + structural columns. + """ + structural = ["constraint_name", "parent_class", "parent_name", "property"] + unresolved = sorted(col for col in structural if rows[col].isna().any()) + if unresolved: + raise ValueError( + f"Rows with unresolved {unresolved} -- a PLEXOS reference is broken." + ) + + +def _assert_one_sense_per_constraint(rows: pd.DataFrame) -> None: + """Each constraint carries exactly one Sense value -- its direction. + + Tested by counting Sense rows per constraint. A count of zero or more than + one means the System membership was not found, or was found more than once. + """ + counts = rows.loc[rows["property"] == "Sense", "constraint_name"].value_counts() + bad = sorted(c for c in set(rows["constraint_name"]) if counts.get(c, 0) != 1) + if bad: + raise ValueError(f"Constraints without exactly one Sense row: {bad}") + + +def _assert_every_constraint_has_rhs(rows: pd.DataFrame) -> None: + """Each constraint carries at least one RHS value -- its bound. + + Tested by set difference: every constraint name must appear among the + names on RHS rows. A miss could mean the RHS is inherited from a category + default, which this direct extraction does not follow. + """ + with_rhs = set(rows.loc[rows["property"] == "RHS", "constraint_name"]) + missing = sorted(set(rows["constraint_name"]) - with_rhs) + if missing: + raise ValueError(f"Constraints with no RHS row: {missing}") + + +def _assert_every_constraint_has_lhs(rows: pd.DataFrame) -> None: + """Each constraint carries at least one LHS term -- a non-System row. + + Tested by set difference against the names on non-System rows. A + constraint with no LHS terms binds nothing, and almost certainly means + memberships were missed. + """ + with_lhs = set(rows.loc[rows["parent_class"] != "System", "constraint_name"]) + missing = sorted(set(rows["constraint_name"]) - with_lhs) + if missing: + raise ValueError(f"Constraints with no LHS terms: {missing}") + + +def _assert_properties_are_known(rows: pd.DataFrame) -> None: + """Every property is one the extraction recognises and routes. + + Tested against ``_KNOWN_PROPERTIES``. An unrecognised property is a new + kind of value the templater has no handling for -- better to stop than + route it silently into the wrong table. + """ + unknown = sorted(set(rows["property"]) - _KNOWN_PROPERTIES) + if unknown: + raise ValueError( + f"Unrecognised PLEXOS properties on the constraints: {unknown}" + ) + + +def _assert_parent_classes_are_known(rows: pd.DataFrame) -> None: + """Every participant belongs to a class the extraction handles. + + Tested against ``_KNOWN_PARENT_CLASSES``. An unrecognised class is a new + kind of LHS participant the templater would not know how to translate. + """ + unknown = sorted(set(rows["parent_class"]) - _KNOWN_PARENT_CLASSES) + if unknown: + raise ValueError( + f"Unrecognised participant classes on the constraints: {unknown}" + ) + + +def _assert_sense_values_are_valid(rows: pd.DataFrame) -> None: + """Sense encodes a direction: -1 (<=), 0 (=) or +1 (>=). + + Tested against ``_VALID_SENSE_VALUES``; any other value would not map to a + constraint direction downstream. + """ + seen = set(rows.loc[rows["property"] == "Sense", "value"]) + invalid = sorted(seen - _VALID_SENSE_VALUES) + if invalid: + raise ValueError(f"Unexpected Sense values (want -1, 0 or +1): {invalid}") + + +def _assert_values_are_numeric(rows: pd.DataFrame) -> None: + """Every data point has a plain numeric value. + + PLEXOS can also store text- or expression-valued data, which would fail in + the templater far from its cause. Tested by requiring no null values and + that every value parses as a number. + """ + if rows["value"].isna().any(): + raise ValueError("Some constraint data points have a null value.") + non_numeric = pd.to_numeric(rows["value"], errors="coerce").isna() + if non_numeric.any(): + bad = sorted(set(rows.loc[non_numeric, "property"])) + raise ValueError(f"Non-numeric values found on properties: {bad}") + + +def _assert_tags_only_on_rhs(rows: pd.DataFrame) -> None: + """Tags appear only on RHS rows. + + We read every tag as a demand-condition timeslice, and PLEXOS attaches + those only to the RHS -- the bound varies by demand condition; the + coefficients and Sense do not. Tested by requiring every tagged row to be + an RHS row; a tag elsewhere would be a different kind of tag, e.g. a + scenario. + """ + tagged = rows[rows["tags"].notna()] + non_rhs = sorted(set(tagged.loc[tagged["property"] != "RHS", "property"])) + if non_rhs: + raise ValueError(f"Tags found on non-RHS rows (scenario tags?): {non_rhs}") + + +def _assert_one_tag_per_rhs(rows: pd.DataFrame) -> None: + """Each RHS value is scoped to exactly one timeslice. + + The templater maps an RHS row's ``tags`` straight to a timeslice, so a + missing tag, or several joined by '|' (how ``_query_tags`` concatenates + multiple tags), would break that mapping. Tested over every RHS row. + """ + rhs_tags = rows.loc[rows["property"] == "RHS", "tags"] + untagged = int(rhs_tags.isna().sum()) + multi = int(rhs_tags.fillna("").str.contains("|", regex=False).sum()) + if untagged or multi: + raise ValueError( + f"RHS rows not scoped to exactly one timeslice: " + f"{untagged} untagged, {multi} with multiple tags." + ) + + +def _assert_no_duplicate_data_points(rows: pd.DataFrame) -> None: + """No two rows describe the same logical data point. + + A duplicate of the natural key -- constraint, participant, property, + effective date, tag -- means PLEXOS stored more than one value for it, + which happens with bands or scenarios. This extraction handles neither, so + a duplicate signals data being silently merged or dropped. + """ + key = [ + "constraint_name", + "parent_class", + "parent_name", + "property", + "date_from", + "date_to", + "tags", + ] + dups = rows[rows.duplicated(subset=key, keep=False)] + if not dups.empty: + where = sorted( + set(zip(dups["constraint_name"], dups["parent_name"], dups["property"])) + ) + raise ValueError(f"Duplicate data points (bands or scenarios?): {where}") + + +def _assert_merge_is_one_to_one(data_points: pd.DataFrame, rows: pd.DataFrame) -> None: + """The merge produces exactly one output row per t_data value. + + ``data_points`` is the merge spine, so a left merge cannot drop a row -- + but it *fans out* if a joined frame has a duplicated key (e.g. a data + point with two ``t_date_from`` entries). Tested by comparing the row count + before and after the merge. + """ + if len(rows) != len(data_points): + raise ValueError( + f"Merge changed the row count: {len(data_points)} data points " + f"became {len(rows)} rows -- a joined frame has a duplicated key." + ) + + +def _assert_constraints_are_never_parents(db: PlexosDB, constraint_object_ids) -> None: + """No constraint object sits on the *parent* side of a membership. + + The extraction finds participants by taking the memberships where a + constraint is the *child* (see ``_query_memberships``). If a constraint + were ever a parent instead, that membership -- and any data on it -- + would be silently missed. Tested with a direct count over ``t_membership``. + """ + ids = list(constraint_object_ids) + sql = f""" + SELECT COUNT(*) FROM t_membership + WHERE parent_object_id IN ({_placeholders(len(ids))}) + """ + (count,) = db.query(sql, tuple(ids))[0] + if count: + raise ValueError( + f"{count} membership(s) have a constraint as the parent object; " + "the extraction assumes a constraint is always the membership child." + ) + + +def _assert_no_banded_data_points(db: PlexosDB, membership_ids) -> None: + """None of our data points are split across bands. + + Each value is read as a single ``t_data`` row. PLEXOS can also split a + value across bands (the ``t_band`` table); the model uses bands elsewhere + but not on these constraints, and a banded point here would be silently + reduced to one band. Tested by counting ``t_band`` rows that join to a + ``t_data`` row on one of our memberships. + """ + ids = list(membership_ids) + sql = f""" + SELECT COUNT(*) + FROM t_band + JOIN t_data ON t_band.data_id = t_data.data_id + WHERE t_data.membership_id IN ({_placeholders(len(ids))}) + """ + (count,) = db.query(sql, tuple(ids))[0] + if count: + raise ValueError( + f"{count} data point(s) on these constraints are banded (t_band); " + "the extraction reads one value per point and does not handle bands." + ) + + +def _split_into_tables(rows: pd.DataFrame): + """Route the long table's rows to the three output tables. + + Every non-System row is an LHS coefficient. System-parent rows hold the + constraint-level properties: ``RHS`` -- the timeslice-varying bound -- + gets its own table; everything else on the System membership (``Sense``, + ``Penalty Price``, ``Include in LT Plan``) describes the constraint + itself and goes to the constraints table. + + Returns: + A 3-tuple ``(constraints, lhs, rhs)`` -- one DataFrame per output + CSV, in that order. See the module docstring's "Output schema" + section for each table's columns. + """ + is_system = rows["parent_class"] == "System" + is_rhs = rows["property"] == "RHS" + + lhs = rows[~is_system].reset_index(drop=True) + + rhs = ( + rows[is_system & is_rhs] + .drop(columns=["parent_class", "parent_name", "property"]) + .reset_index(drop=True) + ) + + constraints = ( + rows[is_system & ~is_rhs] + .drop(columns=["parent_class", "parent_name"]) + .reset_index(drop=True) + ) + return constraints, lhs, rhs + + +def _write_csvs(out_dir, constraints, lhs, rhs): + out_dir.mkdir(parents=True, exist_ok=True) + constraints.to_csv(out_dir / "constraints.csv", index=False) + lhs.to_csv(out_dir / "lhs_terms.csv", index=False) + rhs.to_csv(out_dir / "rhs_values.csv", index=False) + print(f"Wrote: {out_dir / 'constraints.csv'} ({len(constraints)} rows)") + print(f"Wrote: {out_dir / 'lhs_terms.csv'} ({len(lhs)} rows)") + print(f"Wrote: {out_dir / 'rhs_values.csv'} ({len(rhs)} rows)") + + +if __name__ == "__main__": + main() diff --git a/src/ispypsa/templater/plexos/7.5/constraints.csv b/src/ispypsa/templater/plexos/7.5/constraints.csv new file mode 100644 index 00000000..1e7e454c --- /dev/null +++ b/src/ispypsa/templater/plexos/7.5/constraints.csv @@ -0,0 +1,46 @@ +constraint_name,property,value,date_from,date_to,tags +CNSW-SNW South GPG,Include in LT Plan,-1.0,,, +CNSW-SNW South GPG,Penalty Price,-1.0,,, +CNSW-SNW South GPG,Sense,-1.0,,, +ExportGroup_CNSW1,Include in LT Plan,-1.0,,, +ExportGroup_CNSW1,Penalty Price,-1.0,,, +ExportGroup_CNSW1,Sense,-1.0,,, +ExportGroup_CQ1,Include in LT Plan,-1.0,,, +ExportGroup_CQ1,Penalty Price,-1.0,,, +ExportGroup_CQ1,Sense,-1.0,,, +ExportGroup_MN1,Include in LT Plan,-1.0,,, +ExportGroup_MN1,Penalty Price,-1.0,,, +ExportGroup_MN1,Sense,-1.0,,, +ExportGroup_NET1,Include in LT Plan,-1.0,,, +ExportGroup_NET1,Penalty Price,-1.0,,, +ExportGroup_NET1,Sense,-1.0,,, +ExportGroup_NQ1,Include in LT Plan,-1.0,,, +ExportGroup_NQ1,Penalty Price,-1.0,,, +ExportGroup_NQ1,Sense,-1.0,,, +ExportGroup_NSA1,Include in LT Plan,-1.0,,, +ExportGroup_NSA1,Penalty Price,-1.0,,, +ExportGroup_NSA1,Sense,-1.0,,, +ExportGroup_SEVIC1,Include in LT Plan,-1.0,,, +ExportGroup_SEVIC1,Penalty Price,-1.0,,, +ExportGroup_SEVIC1,Sense,-1.0,,, +ExportGroup_SQ1,Include in LT Plan,-1.0,,, +ExportGroup_SQ1,Penalty Price,-1.0,,, +ExportGroup_SQ1,Sense,-1.0,,, +ExportGroup_SWNSW1,Include in LT Plan,-1.0,,, +ExportGroup_SWNSW1,Penalty Price,-1.0,,, +ExportGroup_SWNSW1,Sense,-1.0,,, +ExportGroup_SWNSW2,Include in LT Plan,-1.0,,, +ExportGroup_SWNSW2,Penalty Price,-1.0,,, +ExportGroup_SWNSW2,Sense,-1.0,,, +ExportGroup_SWQLD1,Include in LT Plan,-1.0,,, +ExportGroup_SWQLD1,Penalty Price,-1.0,,, +ExportGroup_SWQLD1,Sense,-1.0,,, +ExportGroup_SWV1,Include in LT Plan,-1.0,,, +ExportGroup_SWV1,Penalty Price,-1.0,,, +ExportGroup_SWV1,Sense,-1.0,,, +ExportGroup_WNV1,Include in LT Plan,-1.0,,, +ExportGroup_WNV1,Penalty Price,-1.0,,, +ExportGroup_WNV1,Sense,-1.0,,, +ExportGroup_WV1,Include in LT Plan,-1.0,,, +ExportGroup_WV1,Penalty Price,-1.0,,, +ExportGroup_WV1,Sense,-1.0,,, diff --git a/src/ispypsa/templater/plexos/7.5/lhs_terms.csv b/src/ispypsa/templater/plexos/7.5/lhs_terms.csv new file mode 100644 index 00000000..ffab8628 --- /dev/null +++ b/src/ispypsa/templater/plexos/7.5/lhs_terms.csv @@ -0,0 +1,1203 @@ +constraint_name,parent_class,parent_name,property,value,date_from,date_to,tags +CNSW-SNW South GPG,Battery,CNSW Battery - 1h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - 1h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 1h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 1h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 1h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 2h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - 2h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 2h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 2h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 2h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 4h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - 4h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 4h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 4h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 4h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 8h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - 8h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 8h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 8h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - 8h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Coordinated CER Storages Area1,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - Coordinated CER Storages Area1,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Coordinated CER Storages Area1,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Coordinated CER Storages Area1,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Coordinated CER Storages Area1,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Distributed Resources Area1,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Battery - Distributed Resources Area1,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Distributed Resources Area1,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Distributed Resources Area1,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Battery - Distributed Resources Area1,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 10h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 10h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 10h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 10h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 10h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 24h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 24h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 24h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 24h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 24h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 48h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 48h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 48h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 48h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW Pumped Hydro - 48h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW V2G Area1,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,CNSW V2G Area1,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW V2G Area1,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW V2G Area1,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,CNSW V2G Area1,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 4h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 4h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 4h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 4h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 4h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 2h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 2h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 2h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 2h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 2h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 4h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 4h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 4h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 4h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 4h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 8h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 8h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 8h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 8h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,DN3 Marulan Battery - 8h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Glanmire Solar Farm BESS,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,Glanmire Solar Farm BESS,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,Glanmire Solar Farm BESS,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,Glanmire Solar Farm BESS,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Glanmire Solar Farm BESS,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Goulburn River BESS,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,Goulburn River BESS,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,Goulburn River BESS,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,Goulburn River BESS,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Goulburn River BESS,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Liddell BESS,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,Liddell BESS,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,Liddell BESS,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,Liddell BESS,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Liddell BESS,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Maryvale Solar Farm BESS,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,Maryvale Solar Farm BESS,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,Maryvale Solar Farm BESS,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,Maryvale Solar Farm BESS,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Maryvale Solar Farm BESS,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 2h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,N3 Battery - 2h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 2h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 2h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 2h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 8h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,N3 Battery - 8h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 8h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 8h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N3 Battery - 8h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 2h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,N9 Battery - 2h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 2h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 2h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 2h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 8h,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,N9 Battery - 8h,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 8h,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 8h,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,N9 Battery - 8h,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,ORANA,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,ORANA,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,ORANA,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,ORANA,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,ORANA,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Phoenix Pumped Hydro Project,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,Phoenix Pumped Hydro Project,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,Phoenix Pumped Hydro Project,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,Phoenix Pumped Hydro Project,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,Phoenix Pumped Hydro Project,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,QPBESS,Generation Coefficient,0.33,,, +CNSW-SNW South GPG,Battery,QPBESS,Generation Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Battery,QPBESS,Generation Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Battery,QPBESS,Generation Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Battery,QPBESS,Generation Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BERYLSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,BERYLSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BERYLSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BERYLSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BERYLSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BODWF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,BODWF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BODWF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BODWF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BODWF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW01,Generation Sent Out Coefficient,0.2,,, +CNSW-SNW South GPG,Generator,BW01,Generation Sent Out Coefficient,0.2,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW01,Generation Sent Out Coefficient,0.15,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BW01,Generation Sent Out Coefficient,0.13,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW01,Generation Sent Out Coefficient,0.17,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW02,Generation Sent Out Coefficient,0.2,,, +CNSW-SNW South GPG,Generator,BW02,Generation Sent Out Coefficient,0.2,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW02,Generation Sent Out Coefficient,0.15,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BW02,Generation Sent Out Coefficient,0.13,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW02,Generation Sent Out Coefficient,0.17,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW03,Generation Sent Out Coefficient,0.2,,, +CNSW-SNW South GPG,Generator,BW03,Generation Sent Out Coefficient,0.2,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW03,Generation Sent Out Coefficient,0.15,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BW03,Generation Sent Out Coefficient,0.13,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW03,Generation Sent Out Coefficient,0.17,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW04,Generation Sent Out Coefficient,0.2,,, +CNSW-SNW South GPG,Generator,BW04,Generation Sent Out Coefficient,0.2,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW04,Generation Sent Out Coefficient,0.15,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,BW04,Generation Sent Out Coefficient,0.13,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,BW04,Generation Sent Out Coefficient,0.17,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW Biomass,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,CNSW Biomass,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW Biomass,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW Biomass,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW Biomass,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT,Generation Sent Out Coefficient,0.66,,, +CNSW-SNW South GPG,Generator,CNSW CCGT,Generation Sent Out Coefficient,0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT,Generation Sent Out Coefficient,0.66,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT,Generation Sent Out Coefficient,0.66,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT,Generation Sent Out Coefficient,0.83,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT with CCS,Generation Sent Out Coefficient,0.66,,, +CNSW-SNW South GPG,Generator,CNSW CCGT with CCS,Generation Sent Out Coefficient,0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT with CCS,Generation Sent Out Coefficient,0.66,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT with CCS,Generation Sent Out Coefficient,0.66,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW CCGT with CCS,Generation Sent Out Coefficient,0.83,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Large,Generation Sent Out Coefficient,0.66,,, +CNSW-SNW South GPG,Generator,CNSW OCGT Large,Generation Sent Out Coefficient,0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Large,Generation Sent Out Coefficient,0.66,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Large,Generation Sent Out Coefficient,0.66,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Large,Generation Sent Out Coefficient,0.83,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Small,Generation Sent Out Coefficient,0.66,,, +CNSW-SNW South GPG,Generator,CNSW OCGT Small,Generation Sent Out Coefficient,0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Small,Generation Sent Out Coefficient,0.66,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Small,Generation Sent Out Coefficient,0.66,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW OCGT Small,Generation Sent Out Coefficient,0.83,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW SAT - Distributed Resources Area1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,CNSW SAT - Distributed Resources Area1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW SAT - Distributed Resources Area1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW SAT - Distributed Resources Area1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CNSW SAT - Distributed Resources Area1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CRURWF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,CRURWF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,CRURWF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,CRURWF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,CRURWF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_SAT_Marulan,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,DN3_SAT_Marulan,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_SAT_Marulan,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_SAT_Marulan,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_SAT_Marulan,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_WH_Marulan,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,DN3_WH_Marulan,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_WH_Marulan,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_WH_Marulan,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,DN3_WH_Marulan,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,FLYCRKWF,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,FLYCRKWF,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,FLYCRKWF,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,FLYCRKWF,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,FLYCRKWF,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,GOONSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,GOONSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,GOONSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,GOONSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,GOONSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Glanmire Solar Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Glanmire Solar Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Glanmire Solar Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Glanmire Solar Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Glanmire Solar Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Goulburn River Solar Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Goulburn River Solar Farm,Generation Sent Out Coefficient,0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Goulburn River Solar Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Goulburn River Solar Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Goulburn River Solar Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,JEMALNG1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,JEMALNG1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,JEMALNG1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,JEMALNG1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,JEMALNG1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MANSLR1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,MANSLR1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,MANSLR1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,MANSLR1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MANSLR1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MOLNGSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,MOLNGSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,MOLNGSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,MOLNGSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MOLNGSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,MP1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,MP1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP2,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,MP2,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP2,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,MP2,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,MP2,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Maryvale Solar Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Maryvale Solar Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Maryvale Solar Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Maryvale Solar Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Maryvale Solar Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_CST_NSW,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N0_CST_NSW,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_CST_NSW,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N0_CST_NSW,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_CST_NSW,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_SAT_NSW,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N0_SAT_NSW,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_SAT_NSW,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N0_SAT_NSW,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_SAT_NSW,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WH_NSW,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N0_WH_NSW,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WH_NSW,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WH_NSW,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WH_NSW,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WM_NSW,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N0_WM_NSW,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WM_NSW,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WM_NSW,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N0_WM_NSW,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_CST_Central-West Orana,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N3_CST_Central-West Orana,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_CST_Central-West Orana,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N3_CST_Central-West Orana,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_CST_Central-West Orana,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_SAT_Central-West Orana,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N3_SAT_Central-West Orana,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_SAT_Central-West Orana,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N3_SAT_Central-West Orana,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_SAT_Central-West Orana,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WH_Central-West Orana,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N3_WH_Central-West Orana,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WH_Central-West Orana,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WH_Central-West Orana,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WH_Central-West Orana,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WM_Central-West Orana,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N3_WM_Central-West Orana,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WM_Central-West Orana,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WM_Central-West Orana,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N3_WM_Central-West Orana,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_CST_Hunter-Central Coast,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N9_CST_Hunter-Central Coast,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_CST_Hunter-Central Coast,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N9_CST_Hunter-Central Coast,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_CST_Hunter-Central Coast,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_SAT_Hunter-Central Coast,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N9_SAT_Hunter-Central Coast,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_SAT_Hunter-Central Coast,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N9_SAT_Hunter-Central Coast,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_SAT_Hunter-Central Coast,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WH_Hunter-Central Coast,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N9_WH_Hunter-Central Coast,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WH_Hunter-Central Coast,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WH_Hunter-Central Coast,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WH_Hunter-Central Coast,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WM_Hunter-Central Coast,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,N9_WM_Hunter-Central Coast,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WM_Hunter-Central Coast,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WM_Hunter-Central Coast,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,N9_WM_Hunter-Central Coast,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,NEVERSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,NEVERSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,NEVERSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,NEVERSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,NEVERSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,NYNGAN1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,NYNGAN1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,NYNGAN1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,NYNGAN1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,NYNGAN1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,PARSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,PARSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,PARSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,PARSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,PARSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,PV CNSW Area1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,PV CNSW Area1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,PV CNSW Area1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,PV CNSW Area1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,PV CNSW Area1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,QPSF,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,QPSF,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,QPSF,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,QPSF,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,QPSF,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN01,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,SHGEN01,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN01,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN01,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN01,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN02,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,SHGEN02,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN02,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN02,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN02,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN03,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,SHGEN03,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN03,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN03,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN03,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN04,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,SHGEN04,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN04,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN04,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SHGEN04,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SUNTPSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,SUNTPSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,SUNTPSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,SUNTPSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,SUNTPSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Sandy Creek Solar Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Sandy Creek Solar Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Sandy Creek Solar Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Sandy Creek Solar Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Sandy Creek Solar Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Spicers Creek Wind Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Spicers Creek Wind Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Spicers Creek Wind Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Spicers Creek Wind Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Spicers Creek Wind Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Stubbo Solar Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Stubbo Solar Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Stubbo Solar Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Stubbo Solar Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Stubbo Solar Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,TALWA1,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,TALWA1,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,TALWA1,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,TALWA1,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,TALWA1,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,TARALGA1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,TARALGA1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,TARALGA1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,TARALGA1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,TARALGA1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Tallawarra B,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,Tallawarra B,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Tallawarra B,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Tallawarra B,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Tallawarra B,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Uungula Wind Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Uungula Wind Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Uungula Wind Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Uungula Wind Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Uungula Wind Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Valley of the Winds Wind Farm,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,Valley of the Winds Wind Farm,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,Valley of the Winds Wind Farm,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,Valley of the Winds Wind Farm,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,Valley of the Winds Wind Farm,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELLSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,WELLSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELLSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WELLSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELLSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELNSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,WELNSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELNSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WELNSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WELNSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOLARSF1,Generation Sent Out Coefficient,0.33,,, +CNSW-SNW South GPG,Generator,WOLARSF1,Generation Sent Out Coefficient,0.34,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOLARSF1,Generation Sent Out Coefficient,0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WOLARSF1,Generation Sent Out Coefficient,0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOLARSF1,Generation Sent Out Coefficient,0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,WOO CCGT,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT with CCS,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,WOO CCGT with CCS,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT with CCS,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT with CCS,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO CCGT with CCS,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Large,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,WOO OCGT Large,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Large,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Large,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Large,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Small,Generation Sent Out Coefficient,0.51,,, +CNSW-SNW South GPG,Generator,WOO OCGT Small,Generation Sent Out Coefficient,0.51,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Small,Generation Sent Out Coefficient,0.51,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Small,Generation Sent Out Coefficient,0.51,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Generator,WOO OCGT Small,Generation Sent Out Coefficient,0.51,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Line,CNSW-NNSW,Flow Coefficient,-0.2,,, +CNSW-SNW South GPG,Line,CNSW-NNSW,Flow Coefficient,-0.2,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Line,CNSW-NNSW,Flow Coefficient,-0.15,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Line,CNSW-NNSW,Flow Coefficient,-0.13,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Line,CNSW-NNSW,Flow Coefficient,-0.17,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Line,SNSW-CNSW,Flow Coefficient,0.7,,, +CNSW-SNW South GPG,Line,SNSW-CNSW,Flow Coefficient,0.7,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Line,SNSW-CNSW,Flow Coefficient,0.6,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Line,SNSW-CNSW,Flow Coefficient,0.57,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Line,SNSW-CNSW,Flow Coefficient,0.76,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Node,CNSW,Load Coefficient,-0.33,,, +CNSW-SNW South GPG,Node,CNSW,Load Coefficient,-0.66,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Node,CNSW,Load Coefficient,-0.25,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Node,CNSW,Load Coefficient,-0.2,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Node,CNSW,Load Coefficient,-0.35,2037-07-01T00:00:00,, +CNSW-SNW South GPG,Node,SNW,Load Coefficient,-0.03213,,, +CNSW-SNW South GPG,Node,SNW,Load Coefficient,-0.03213,2028-12-01T00:00:00,, +CNSW-SNW South GPG,Node,SNW,Load Coefficient,-0.03213,2029-11-30T00:00:00,, +CNSW-SNW South GPG,Node,SNW,Load Coefficient,-0.03213,2030-07-01T00:00:00,, +CNSW-SNW South GPG,Node,SNW,Load Coefficient,-0.03213,2037-07-01T00:00:00,, +ExportGroup_CNSW1,Battery,DN1 Dubbo Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_CNSW1,Battery,DN1 Dubbo Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_CNSW1,Battery,DN1 Dubbo Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_CNSW1,Battery,DN1 Dubbo Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_CNSW1,Generator,BERYLSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,BODWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,CNSW1_DN1 Option 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CNSW1,Generator,CNSW1_DN1 Option 2a,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CNSW1,Generator,CNSW1_DN1 Option 2b,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CNSW1,Generator,CNSW1_DN1 Option 3,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CNSW1,Generator,CRURWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,DN1_SAT_Dubbo,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,DN1_WH_Dubbo,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,FLYCRKWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,GOONSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,JEMALNG1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,MANSLR1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,MOLNGSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,NEVERSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,NYNGAN1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,PARSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,SUNTPSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CNSW1,Generator,WELLSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Battery,Broadsound BESS,Generation Coefficient,1.0,,, +ExportGroup_CQ1,Battery,Broadsound BESS,Load Coefficient,-1.0,,, +ExportGroup_CQ1,Battery,Q4 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_CQ1,Battery,Q4 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_CQ1,Battery,Q4 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_CQ1,Battery,Q4 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_CQ1,Generator,Broadsound Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,CLERMSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,CLRKCWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,CLRKCWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,CQ1_CQ-NQ Option 3 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CQ1,Generator,CQ1_CQ-NQ Option 4 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CQ1,Generator,CQ1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CQ1,Generator,CQ1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_CQ1,Generator,CSPVPS1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,DAYDSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,LILYSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,Lotus Creek Wind Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,MIDDLSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,Q4_CST_Isaac,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,Q4_SAT_Isaac,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,Q4_WH_Isaac,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Generator,Q4_WM_Isaac,Generation Sent Out Coefficient,1.0,,, +ExportGroup_CQ1,Line,CQ-NQ,Flow Coefficient,-1.0,,, +ExportGroup_CQ1,Purchaser,Q4 in CQ Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_CQ1,Purchaser,Q4 to CQ Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_CQ1,Purchaser,Q4 to GG Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,BLYTHB1,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,BLYTHB1,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,Bungama BESS,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,Bungama BESS,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,Bungama Solar BESS,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,Bungama Solar BESS,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,Clements Gap BESS,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,Clements Gap BESS,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,DALNTH1,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,DALNTH1,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,HPR1,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,HPR1,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,Hallett BESS,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,Hallett BESS,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,MN1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,MN1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,MN1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,MN1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,S3 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,S3 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,S3 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,S3 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,S4 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,S4 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,S4 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,S4 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_MN1,Battery,Templers BESS,Generation Coefficient,1.0,,, +ExportGroup_MN1,Battery,Templers BESS,Load Coefficient,-1.0,,, +ExportGroup_MN1,Generator,BLUFF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,CLEMGPWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,GSWF1A,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,GSWF1B,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,Goyder North Wind Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,HALLWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,HALLWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,HDWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,HDWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,HDWF3,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,MN1_CSA-NSA Option 1 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_CSA-NSA Option 2 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_CSA-NSA Option 3 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_CSA-NSA Option 4 Stage 1 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_CSA-NSA Option 4 Stage 2 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,MN1_MN1 Option 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_MN1,Generator,NBHWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S3_CST_Mid-North SA,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S3_SAT_Mid-North SA,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S3_WH_Mid-North SA,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S3_WM_Mid-North SA,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S4_CST_Yorke Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S4_SAT_Yorke Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S4_WH_Yorke Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,S4_WM_Yorke Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,SNOWNTH1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,SNOWSTH1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,SNOWTWN1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,WATERLWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Generator,WGWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_MN1,Line,CSA-NSA,Flow Coefficient,-1.0,,, +ExportGroup_MN1,Line,EnergyConnect,Flow Coefficient,0.2,,, +ExportGroup_MN1,Purchaser,S3 in CSA Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_MN1,Purchaser,S3 to CSA Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_MN1,Purchaser,S3 to NSA Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_NET1,Battery,NET1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NET1,Battery,NET1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NET1,Battery,NET1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NET1,Battery,NET1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NET1,Battery,T1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NET1,Battery,T1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NET1,Battery,T1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NET1,Battery,T1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NET1,Generator,NET1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NET1,Generator,NET1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NET1,Generator,T1_CST_North East TAS,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Generator,T1_SAT_North East TAS,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Generator,T1_WH_North East TAS,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Generator,T1_WM_North East TAS,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Generator,T4_WFL_North Tasmania Coast,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Generator,T4_WFX_North Tasmania Coast,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NET1,Purchaser,T1 in TAS Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_NET1,Purchaser,T1 to TAS Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_NET1,Purchaser,T1 to TAS Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,GBBATT1,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,GBBATT1,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Ganymirra Solar Power Station BESS,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Ganymirra Solar Power Station BESS,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Majors Creek Solar Power Station BESS,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Majors Creek Solar Power Station BESS,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Mt Fox BESS,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Mt Fox BESS,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q2 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q2 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q2 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q2 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q3 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q3 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Battery,Q3 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NQ1,Battery,Q3 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Generator,CLARESF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,EMERASF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,GBWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Ganymirra Solar Power Station,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,HAUGHT11,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,HUGSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Haughton Solar Farm Stage 2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,KABANWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,KEPSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,KEPWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,KSP1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,MEWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Majors Creek Solar Power Station,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,NQ1_CQ-NQ Option 1 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NQ1,Generator,NQ1_CQ-NQ Option 2 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NQ1,Generator,NQ1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NQ1,Generator,NQ1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NQ1,Generator,Q1_CST_Far North QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q1_SAT_Far North QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q1_WH_Far North QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q1_WM_Far North QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q2_CST_North QLD Clean Energy Hub,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q2_SAT_North QLD Clean Energy Hub,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q2_WH_North QLD Clean Energy Hub,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q2_WM_North QLD Clean Energy Hub,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q3_CST_Northern QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q3_SAT_Northern QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q3_WH_Northern QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,Q3_WM_Northern QLD,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,RRSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Generator,SMCSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NQ1,Purchaser,Q1 in NQ Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Purchaser,Q1 to GG Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_NQ1,Purchaser,Q1 to NQ Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,LGAPBS1,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,LGAPBS1,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,NSA1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,NSA1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,NSA1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,NSA1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,S5 Battery - 2h,Generation Coefficient,0.75,,, +ExportGroup_NSA1,Battery,S5 Battery - 2h,Load Coefficient,-0.75,,, +ExportGroup_NSA1,Battery,S5 Battery - 8h,Generation Coefficient,0.75,,, +ExportGroup_NSA1,Battery,S5 Battery - 8h,Load Coefficient,-0.75,,, +ExportGroup_NSA1,Battery,S7 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,S7 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,S7 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,S7 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,S8 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,S8 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Battery,S8 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_NSA1,Battery,S8 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Generator,CATHROCK,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,Cultana Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,LGAPWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,LGAPWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,MTMILLAR,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,NSA1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_NSA1,Generator,POR01-1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,POR01-2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,POR01-3,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S5_CST_Northern SA,Generation Sent Out Coefficient,0.75,,, +ExportGroup_NSA1,Generator,S5_SAT_Northern SA,Generation Sent Out Coefficient,0.75,,, +ExportGroup_NSA1,Generator,S5_WH_Northern SA,Generation Sent Out Coefficient,0.75,,, +ExportGroup_NSA1,Generator,S5_WM_Northern SA,Generation Sent Out Coefficient,0.75,,, +ExportGroup_NSA1,Generator,S7_CST_Eastern Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S7_SAT_Eastern Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S7_WH_Eastern Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S7_WM_Eastern Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S8_CST_Western Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S8_SAT_Western Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S8_WH_Western Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,S8_WM_Western Eyre Peninsula,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,SA Hydrogen Turbine,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Generator,WPWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_NSA1,Node,NSA,Load Coefficient,-0.1,,, +ExportGroup_NSA1,Purchaser,S7 in NSA Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Purchaser,S7 to NSA Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_NSA1,Purchaser,S7 to NSA Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_SEVIC1,Battery,SEVIC1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SEVIC1,Battery,SEVIC1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SEVIC1,Battery,SEVIC1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SEVIC1,Battery,SEVIC1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SEVIC1,Generator,LOYYB1,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LOYYB1,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LOYYB2,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LOYYB2,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA1,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA1,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA2,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA2,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA3,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA3,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA4,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,LYA4,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,SEVIC1_SEVIC1 Option 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SEVIC1,Generator,SEVIC1_V8 Option 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SEVIC1,Generator,V8_WFL_Gippsland Offshore,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,V8_WFL_Gippsland Offshore,Generation Sent Out Coefficient,0.5,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,V8_WFX_Gippsland Offshore,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,V8_WFX_Gippsland Offshore,Generation Sent Out Coefficient,0.5,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS1,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS1,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS2,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS2,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS3,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS3,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS4,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS4,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS5,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS5,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS6,Generation Sent Out Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Generator,VPGS6,Generation Sent Out Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Line,Marinus,Flow Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Line,Marinus,Flow Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SEVIC1,Line,T-V-MNSP1,Flow Coefficient,1.0,2031-07-01T00:00:00,, +ExportGroup_SEVIC1,Line,T-V-MNSP1,Flow Coefficient,1.0,2034-07-01T00:00:00,, +ExportGroup_SQ1,Battery,CHBESSG1,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,CHBESSG1,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q7 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SQ1,Battery,Q7 Battery - 2h,Generation Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q7 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Battery,Q7 Battery - 2h,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q7 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SQ1,Battery,Q7 Battery - 8h,Generation Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q7 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Battery,Q7 Battery - 8h,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q8 Battery - 2h,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q8 Battery - 2h,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q8 Battery - 8h,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Q8 Battery - 8h,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,QEJP - Borumba,Generation Coefficient,0.27,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,QEJP - Borumba,Load Coefficient,-0.27,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,SQ1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SQ1,Battery,SQ1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Battery,SQ1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SQ1,Battery,SQ1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Battery,Tarong BESS,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Tarong BESS,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,ULBESS,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,ULBESS,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,WANDB1,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,WANDB1,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,WDBESS1,Generation Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,WDBESS1,Load Coefficient,-0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Woolooga BESS,Generation Coefficient,1.0,,, +ExportGroup_SQ1,Battery,Woolooga BESS,Generation Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Battery,Woolooga BESS,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Battery,Woolooga BESS,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Aramara Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Aramara Solar Farm,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BLUEGSF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR2,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR3,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR5,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR6,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,BRAEMAR7,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Banksia Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Banksia Solar Farm,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Bullyard Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Bullyard Solar Farm,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,CHILDSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,CHILDSF1,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,COLUMSF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,COOPGWF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,CPSA_GT1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,CPSA_GT2,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,CPSA_ST,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DDPS1_GT1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DDPS1_GT2,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DDPS1_GT3,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DDPS1_ST,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DDSF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,DULAWF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,EDENVSF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,GANGARR1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Hopeland Solar Farm,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,KINGASF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,KPP_1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Kogan Gas,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,MPP_1,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,MPP_2,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Munna Creek Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Munna Creek Solar Farm,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Punch's Creek Renewable Energy Solar Farm,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q7_CST_Wide Bay,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Q7_CST_Wide Bay,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q7_SAT_Wide Bay,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Q7_SAT_Wide Bay,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q7_WH_Wide Bay,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Q7_WH_Wide Bay,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q7_WM_Wide Bay,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,Q7_WM_Wide Bay,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8a_CST_Darling Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8a_SAT_Darling Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8a_WH_Darling Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8a_WM_Darling Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8b_CST_Southern Downs,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8b_SAT_Southern Downs,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8b_WH_Southern Downs,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8b_WM_Southern Downs,Generation Sent Out Coefficient,0.12,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8c_CST_Western Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8c_SAT_Western Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8c_WH_Western Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Q8c_WM_Western Downs,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,ROMA_7,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,ROMA_8,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,SQ1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SQ1,Generator,SQ1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SQ1,Generator,SQ1_SQ-CQ Option 5 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SQ1,Generator,SQ1_SQ-CQ Option 6 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SQ1,Generator,SRSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,SRSF1,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,TARONG#1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,TARONG#2,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,TARONG#3,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,TARONG#4,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,TNPS1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,WANDSF1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,WDGPH1,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,WOOLGSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SQ1,Generator,WOOLGSF1,Generation Sent Out Coefficient,1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Generator,Wambo Wind Farm,Generation Sent Out Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Line,NSW1-QLD1,Flow Coefficient,0.15,2035-12-01T00:00:00,, +ExportGroup_SQ1,Line,SQ-CQ,Flow Coefficient,-0.5,,, +ExportGroup_SQ1,Line,SQ-CQ,Flow Coefficient,-0.57,2035-12-01T00:00:00,, +ExportGroup_SQ1,Purchaser,Q7 in SQ Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Purchaser,Q7 in SQ Baseload for Electrolyser,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Purchaser,Q7 to GG Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Purchaser,Q7 to GG Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SQ1,Purchaser,Q7 to SQ Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_SQ1,Purchaser,Q7 to SQ Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,2035-12-01T00:00:00,, +ExportGroup_SWNSW1,Battery,BHBG1,Generation Coefficient,1.0,,, +ExportGroup_SWNSW1,Battery,BHBG1,Load Coefficient,-1.0,,, +ExportGroup_SWNSW1,Battery,DPNTB1,Generation Coefficient,1.0,,, +ExportGroup_SWNSW1,Battery,DPNTB1,Load Coefficient,-1.0,,, +ExportGroup_SWNSW1,Battery,RESS1G,Generation Coefficient,1.0,,, +ExportGroup_SWNSW1,Battery,RESS1G,Load Coefficient,-1.0,,, +ExportGroup_SWNSW1,Battery,RIVNB2,Generation Coefficient,1.0,,, +ExportGroup_SWNSW1,Battery,RIVNB2,Load Coefficient,-1.0,,, +ExportGroup_SWNSW1,Battery,Silver City Energy Storage,Generation Coefficient,1.0,,, +ExportGroup_SWNSW1,Battery,Silver City Energy Storage,Load Coefficient,-1.0,,, +ExportGroup_SWNSW1,Generator,BROKENH1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,COLEASF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,DARLSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,FINLYSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,HILLSTN1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,LIMOSF11,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,LIMOSF21,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,STWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,SUNRSF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWNSW1,Generator,SWNSW1_Project EnergyConnect Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWNSW1,Generator,SWNSW1_SWNSW1 Option 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWNSW2,Battery,BHBG1,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,BHBG1,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,DPNTB1,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,DPNTB1,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,Limondale BESS,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,Limondale BESS,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N13 Battery - 2h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N13 Battery - 2h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N13 Battery - 8h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N13 Battery - 8h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N4 Battery - 2h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N4 Battery - 2h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N4 Battery - 8h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N4 Battery - 8h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N5 Battery - 2h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N5 Battery - 2h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N5 Battery - 8h,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,N5 Battery - 8h,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,RESS1G,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,RESS1G,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,RIVNB2,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,RIVNB2,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,Silver City Energy Storage,Generation Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Battery,Silver City Energy Storage,Load Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,BROKENH1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,COLEASF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,CRWASF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,DARLSF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,FINLYSF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,HILLSTN1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,LIMOSF11,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,LIMOSF21,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N13_CST_South Cobar,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N13_SAT_South Cobar,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N13_WH_South Cobar,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N13_WM_South Cobar,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N4_CST_Broken Hill,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N4_SAT_Broken Hill,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N4_WH_Broken Hill,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N4_WM_Broken Hill,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N5_CST_South West NSW,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N5_SAT_South West NSW,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N5_WH_South West NSW,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,N5_WM_South West NSW,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,STWF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,SUNRSF1,Generation Sent Out Coefficient,1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Generator,SWNSW2_SNSW-CNSW Option 3 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWNSW2,Generator,SWNSW2_SNSW-CNSW Option 4 Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWNSW2,Line,EnergyConnect,Flow Coefficient,-1.0,2031-11-30T00:00:00,, +ExportGroup_SWNSW2,Line,VIC1-NSW1,Flow Coefficient,0.8,2031-11-30T00:00:00,, +ExportGroup_SWQLD1,Battery,CHBESSG1,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,CHBESSG1,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Battery,Q8 Battery - 2h,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,Q8 Battery - 2h,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Battery,Q8 Battery - 8h,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,Q8 Battery - 8h,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Battery,QEJP - Borumba,Generation Coefficient,0.14,,, +ExportGroup_SWQLD1,Battery,QEJP - Borumba,Load Coefficient,-0.14,,, +ExportGroup_SWQLD1,Battery,SWQLD1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SWQLD1,Battery,SWQLD1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SWQLD1,Battery,SWQLD1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SWQLD1,Battery,SWQLD1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SWQLD1,Battery,Tarong BESS,Generation Coefficient,0.14,,, +ExportGroup_SWQLD1,Battery,Tarong BESS,Load Coefficient,-0.14,,, +ExportGroup_SWQLD1,Battery,ULBESS,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,ULBESS,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Battery,WANDB1,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,WANDB1,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Battery,WDBESS1,Generation Coefficient,0.43,,, +ExportGroup_SWQLD1,Battery,WDBESS1,Load Coefficient,-0.43,,, +ExportGroup_SWQLD1,Generator,BLUEGSF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR2,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR3,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR5,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR6,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,BRAEMAR7,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,COLUMSF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,COOPGWF1,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,CPSA_GT1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,CPSA_GT2,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,CPSA_ST,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DDPS1_GT1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DDPS1_GT2,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DDPS1_GT3,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DDPS1_ST,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DDSF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,DULAWF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,EDENVSF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,GANGARR1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Hopeland Solar Farm,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,KINGASF1,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,KPP_1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Kogan Gas,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,MPP_1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,MPP_2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Punch's Creek Renewable Energy Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Q8a_CST_Darling Downs,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Q8a_SAT_Darling Downs,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Q8a_WH_Darling Downs,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Q8a_WM_Darling Downs,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Q8b_CST_Southern Downs,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Q8b_SAT_Southern Downs,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Q8b_WH_Southern Downs,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Q8b_WM_Southern Downs,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWQLD1,Generator,Q8c_CST_Western Downs,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,Q8c_SAT_Western Downs,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,Q8c_WH_Western Downs,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,Q8c_WM_Western Downs,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,ROMA_7,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,ROMA_8,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,SWQLD1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWQLD1,Generator,SWQLD1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWQLD1,Generator,TARONG#1,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,TARONG#2,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,TARONG#3,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,TARONG#4,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,TNPS1,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Generator,WANDSF1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,WDGPH1,Generation Sent Out Coefficient,0.43,,, +ExportGroup_SWQLD1,Generator,Wambo Wind Farm,Generation Sent Out Coefficient,0.14,,, +ExportGroup_SWQLD1,Line,NSW1-QLD1,Flow Coefficient,0.84,,, +ExportGroup_SWQLD1,Line,SQ-CQ,Flow Coefficient,-0.11,,, +ExportGroup_SWV1,Battery,Gnarwarre BESS,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,Gnarwarre BESS,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,Mortlake Battery,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,Mortlake Battery,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,Mortlake Energy Hub BESS,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,Mortlake Energy Hub BESS,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,SWV1 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,SWV1 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,SWV1 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,SWV1 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,TRGBESS,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,TRGBESS,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,V5 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,V5 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Battery,V5 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_SWV1,Battery,V5 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Generator,BRYB1WF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,BRYB2WF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,DUNDWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,DUNDWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,DUNDWF3,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,GPWFEST1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,GPWFEST2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,GPWFEST3,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,Golden Plains West Wind Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,HD1WF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,MACARTH1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,MLWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,MRTLSWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,MTGELWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,Mortlake Energy Hub Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,OAKLAND1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,PORTWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,RYANCWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,SALTCRK1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,STOCKYD1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,SWV1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWV1,Generator,SWV1_Linear Augmentation 2,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWV1,Generator,SWV1_SWV1 Option 1A,Installed Capacity Coefficient,-1.0,,, +ExportGroup_SWV1,Generator,V5_CST_South West VIC,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,V5_SAT_South West VIC,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,V5_WH_South West VIC,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,V5_WM_South West VIC,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,V9_WFL_Southern Ocean,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,V9_WFX_Southern Ocean,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,Woolsthorpe Wind Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Generator,YAMBUKWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_SWV1,Line,V-SA,Flow Coefficient,-1.0,,, +ExportGroup_SWV1,Purchaser,V5 in WNV Baseload for Electrolyser,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Purchaser,V5 to WNV Flexible Electrolyser Purchaser Domestic,Load Coefficient,-1.0,,, +ExportGroup_SWV1,Purchaser,V5 to WNV Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-1.0,,, +ExportGroup_WNV1,Battery,Barnawartha Solar Farm BESS,Generation Coefficient,0.78,,, +ExportGroup_WNV1,Battery,Barnawartha Solar Farm BESS,Generation Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,Barnawartha Solar Farm BESS,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Battery,Barnawartha Solar Farm BESS,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,Pine Lodge BESS,Generation Coefficient,0.78,,, +ExportGroup_WNV1,Battery,Pine Lodge BESS,Generation Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,Pine Lodge BESS,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Battery,Pine Lodge BESS,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,V7 Battery - 2h,Generation Coefficient,0.78,,, +ExportGroup_WNV1,Battery,V7 Battery - 2h,Generation Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,V7 Battery - 2h,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Battery,V7 Battery - 2h,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,V7 Battery - 8h,Generation Coefficient,0.78,,, +ExportGroup_WNV1,Battery,V7 Battery - 8h,Generation Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,V7 Battery - 8h,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Battery,V7 Battery - 8h,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,West Mokoan Solar Farm BESS,Generation Coefficient,0.78,,, +ExportGroup_WNV1,Battery,West Mokoan Solar Farm BESS,Generation Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Battery,West Mokoan Solar Farm BESS,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Battery,West Mokoan Solar Farm BESS,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,BOGONG1,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,BOGONG1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,BOGONG2,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,BOGONG2,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,Barnawartha Solar Farm,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,Barnawartha Solar Farm,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,DARTM1,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,DARTM1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,EILDON1,Generation Sent Out Coefficient,0.95,,, +ExportGroup_WNV1,Generator,EILDON1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,EILDON2,Generation Sent Out Coefficient,0.95,,, +ExportGroup_WNV1,Generator,EILDON2,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,GIRGSF,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,GIRGSF,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,GLENSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,GLENSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,GLRWNSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,GLRWNSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,Goorambat East Solar Farm,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,Goorambat East Solar Farm,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,Lancaster Solar Farm,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,Lancaster Solar Farm,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY11,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY11,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY12,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY12,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY13,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY13,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY14,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY14,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY15,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY15,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MCKAY16,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,MCKAY16,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MOKOSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,MOKOSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY01,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY01,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY02,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY02,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY03,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY03,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY04,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY04,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY05,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY05,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY06,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY06,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY07,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY07,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY08,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY08,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY09,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY09,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY10,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY10,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY11,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY11,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY12,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY12,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY13,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY13,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,MURRAY14,Generation Sent Out Coefficient,0.73,,, +ExportGroup_WNV1,Generator,MURRAY14,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,NUMURSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,NUMURSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,V7_CST_Central North VIC,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,V7_CST_Central North VIC,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,V7_SAT_Central North VIC,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,V7_SAT_Central North VIC,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,V7_WH_Central North VIC,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,V7_WH_Central North VIC,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,V7_WM_Central North VIC,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,V7_WM_Central North VIC,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WINTSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,WINTSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WKIEWA1_1,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,WKIEWA1_1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WKIEWA1_2,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,WKIEWA1_2,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WKIEWA2_1,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,WKIEWA2_1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WKIEWA2_2,Generation Sent Out Coefficient,0.81,,, +ExportGroup_WNV1,Generator,WKIEWA2_2,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,WUNUSF1,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,WUNUSF1,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Generator,West Mokoan Solar Farm,Generation Sent Out Coefficient,0.78,,, +ExportGroup_WNV1,Generator,West Mokoan Solar Farm,Generation Sent Out Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Line,VIC1-NSW1,Flow Coefficient,-0.81,,, +ExportGroup_WNV1,Line,VIC1-NSW1,Flow Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Purchaser,V7 in WNV Baseload for Electrolyser,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Purchaser,V7 in WNV Baseload for Electrolyser,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Purchaser,V7 to WNV Flexible Electrolyser Purchaser Domestic,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Purchaser,V7 to WNV Flexible Electrolyser Purchaser Domestic,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WNV1,Purchaser,V7 to WNV Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,-0.78,,, +ExportGroup_WNV1,Purchaser,V7 to WNV Flexible Electrolyser Purchaser Green Commodities,Load Coefficient,0.0,2031-11-30T00:00:00,, +ExportGroup_WV1,Battery,BULBES1,Generation Coefficient,1.0,,, +ExportGroup_WV1,Battery,BULBES1,Load Coefficient,-1.0,,, +ExportGroup_WV1,Battery,Horsham Solar Farm BESS,Generation Coefficient,1.0,,, +ExportGroup_WV1,Battery,Horsham Solar Farm BESS,Load Coefficient,-1.0,,, +ExportGroup_WV1,Battery,V4 Battery - 2h,Generation Coefficient,1.0,,, +ExportGroup_WV1,Battery,V4 Battery - 2h,Load Coefficient,-1.0,,, +ExportGroup_WV1,Battery,V4 Battery - 8h,Generation Coefficient,1.0,,, +ExportGroup_WV1,Battery,V4 Battery - 8h,Load Coefficient,-1.0,,, +ExportGroup_WV1,Generator,ARWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,BULGANA1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,CHALLHWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,CROWLWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,Horsham Solar Farm,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,KIATAWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,MUWAWF1,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,MUWAWF2,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V3_CST_Wimmera Grampians,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V3_SAT_Wimmera Grampians,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V3_WH_Wimmera Grampians,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V3_WM_Wimmera Grampians,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V4_CST_Wimmera Southern Mallee,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V4_SAT_Wimmera Southern Mallee,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V4_WH_Wimmera Southern Mallee,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,V4_WM_Wimmera Southern Mallee,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,WAUBRAWF,Generation Sent Out Coefficient,1.0,,, +ExportGroup_WV1,Generator,WV1_Linear Augmentation 1,Installed Capacity Coefficient,-1.0,,, +ExportGroup_WV1,Generator,WV1_WNV-SNSW Option 1 - VNI West (excluding N5 option 1) Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_WV1,Generator,WV1_WNV-SNSW Option 1 - VNI West Augmentation,Installed Capacity Coefficient,-1.0,,, +ExportGroup_WV1,Generator,WV1_Western Renewables Link,Installed Capacity Coefficient,-1.0,,, diff --git a/src/ispypsa/templater/plexos/7.5/rhs_values.csv b/src/ispypsa/templater/plexos/7.5/rhs_values.csv new file mode 100644 index 00000000..573aac43 --- /dev/null +++ b/src/ispypsa/templater/plexos/7.5/rhs_values.csv @@ -0,0 +1,49 @@ +constraint_name,value,date_from,date_to,tags +CNSW-SNW South GPG,2790.0,,,NSW Typical Summer +CNSW-SNW South GPG,2790.0,,,NSW Hot Day +CNSW-SNW South GPG,2790.0,,,NSW Winter +CNSW-SNW South GPG,6390.0,2037-07-01T00:00:00,,NSW Hot Day +CNSW-SNW South GPG,6390.0,2037-07-01T00:00:00,,NSW Winter +CNSW-SNW South GPG,6390.0,2037-07-01T00:00:00,,NSW Typical Summer +ExportGroup_CNSW1,815.0,,,NSW Hot Day +ExportGroup_CNSW1,815.0,,,NSW Typical Summer +ExportGroup_CNSW1,815.0,,,NSW Winter +ExportGroup_CQ1,1700.0,,,QLD Typical Summer +ExportGroup_CQ1,1700.0,,,QLD Hot Day +ExportGroup_CQ1,2070.0,,,QLD Winter +ExportGroup_MN1,1630.0,,,SA Typical Summer +ExportGroup_MN1,1860.0,,,SA Winter +ExportGroup_MN1,1630.0,,,SA Hot Day +ExportGroup_NET1,1600.0,,,TAS Winter +ExportGroup_NET1,1600.0,,,TAS Typical Summer +ExportGroup_NET1,1600.0,,,TAS Hot Day +ExportGroup_NQ1,2420.0,,,QLD Hot Day +ExportGroup_NQ1,2420.0,,,QLD Typical Summer +ExportGroup_NQ1,2650.0,,,QLD Winter +ExportGroup_NSA1,585.0,,,SA Winter +ExportGroup_NSA1,585.0,,,SA Typical Summer +ExportGroup_NSA1,585.0,,,SA Hot Day +ExportGroup_SEVIC1,4200.0,,,VIC Typical Summer +ExportGroup_SEVIC1,4200.0,,,VIC Winter +ExportGroup_SEVIC1,4200.0,,,VIC Hot Day +ExportGroup_SQ1,1400.0,,,QLD Hot Day +ExportGroup_SQ1,1400.0,,,QLD Winter +ExportGroup_SQ1,1400.0,,,QLD Typical Summer +ExportGroup_SWNSW1,1200.0,,,NSW Typical Summer +ExportGroup_SWNSW1,1200.0,,,NSW Winter +ExportGroup_SWNSW1,1200.0,,,NSW Hot Day +ExportGroup_SWNSW2,4400.0,,,NSW Hot Day +ExportGroup_SWNSW2,4400.0,,,NSW Typical Summer +ExportGroup_SWNSW2,4400.0,,,NSW Winter +ExportGroup_SWQLD1,3000.0,,,QLD Hot Day +ExportGroup_SWQLD1,3000.0,,,QLD Typical Summer +ExportGroup_SWQLD1,3000.0,,,QLD Winter +ExportGroup_SWV1,2495.0,,,VIC Winter +ExportGroup_SWV1,2495.0,,,VIC Hot Day +ExportGroup_SWV1,2495.0,,,VIC Typical Summer +ExportGroup_WNV1,2040.0,,,VIC Typical Summer +ExportGroup_WNV1,2040.0,,,VIC Hot Day +ExportGroup_WNV1,3195.0,,,VIC Winter +ExportGroup_WV1,780.0,,,VIC Hot Day +ExportGroup_WV1,780.0,,,VIC Typical Summer +ExportGroup_WV1,980.0,,,VIC Winter diff --git a/tests/test_scripts/__init__.py b/tests/test_scripts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/test_scripts/conftest.py b/tests/test_scripts/conftest.py new file mode 100644 index 00000000..9189b7e8 --- /dev/null +++ b/tests/test_scripts/conftest.py @@ -0,0 +1,13 @@ +"""Make the standalone ``scripts/`` directory importable for these tests. + +``extract_plexos_constraints.py`` is a run-locally script, not part of the +installed ``ispypsa`` package, so its directory is not on the import path by +default. +""" + +import sys +from pathlib import Path + +_SCRIPTS_DIR = Path(__file__).parents[2] / "scripts" +if str(_SCRIPTS_DIR) not in sys.path: + sys.path.insert(0, str(_SCRIPTS_DIR)) diff --git a/tests/test_scripts/test_extract_plexos_constraints.py b/tests/test_scripts/test_extract_plexos_constraints.py new file mode 100644 index 00000000..e2f74bdd --- /dev/null +++ b/tests/test_scripts/test_extract_plexos_constraints.py @@ -0,0 +1,286 @@ +"""Unit tests for the pure helpers of ``scripts/extract_plexos_constraints.py``. + +The query and database-level functions need a loaded PLEXOS database and are +not unit-tested here; they are covered instead by the script's own structural- +invariant checks, which run against the real model on every extraction. +""" + +import pandas as pd +import pytest +from extract_plexos_constraints import ( + _assert_every_constraint_has_lhs, + _assert_every_constraint_has_rhs, + _assert_merge_is_one_to_one, + _assert_no_duplicate_data_points, + _assert_no_unresolved_references, + _assert_one_sense_per_constraint, + _assert_one_tag_per_rhs, + _assert_parent_classes_are_known, + _assert_properties_are_known, + _assert_sense_values_are_valid, + _assert_tags_only_on_rhs, + _assert_values_are_numeric, + _check_constraints_resolved, + _merge_into_long_table, + _placeholders, + _split_into_tables, + _validate_constraint_rows, +) + + +@pytest.fixture +def valid_rows(csv_str_to_df): + """A minimal long table that satisfies every structural invariant.""" + return csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags + C1, Generator, GEN_A, Generation__Sent__Out__Coefficient, 0.5, , , + C1, System, NEM, RHS, 100, , , Hot__Day + C1, System, NEM, Sense, -1, , , + """) + + +# --- _placeholders --- + + +def test_placeholders(): + assert _placeholders(1) == "?" + assert _placeholders(3) == "?,?,?" + + +# --- _merge_into_long_table --- + + +def test_merge_into_long_table(csv_str_to_df): + constraints = csv_str_to_df(""" + constraint_object_id, constraint_name + 20, C1 + """) + memberships = csv_str_to_df(""" + membership_id, constraint_object_id, parent_class, parent_name + 500, 20, Generator, GEN_A + 501, 20, System, NEM + """) + data_points = csv_str_to_df(""" + data_id, membership_id, property, value + 900, 500, Coef, 0.5 + 903, 500, Coef, 0.6 + 901, 501, RHS, 100 + """) + dates = csv_str_to_df(""" + data_id, date_from, date_to + 903, 2030-01-01T00:00:00, + """) + tags = csv_str_to_df(""" + data_id, tags + 901, Hot__Day + """) + + result = _merge_into_long_table(constraints, memberships, data_points, dates, tags) + + # The undated coefficient (900) sorts before the dated one (903) because + # the merge sorts date_from with na_position="first". + expected = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags + C1, Generator, GEN_A, Coef, 0.5, , , + C1, Generator, GEN_A, Coef, 0.6, 2030-01-01T00:00:00, , + C1, System, NEM, RHS, 100, , , Hot__Day + """) + pd.testing.assert_frame_equal(result, expected, check_dtype=False) + + +# --- _split_into_tables --- + + +def test_split_into_tables(csv_str_to_df): + rows = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags + C1, Generator, GEN_A, Coef, 0.5, , , + C1, System, NEM, RHS, 100, , , Hot__Day + C1, System, NEM, Sense, -1, , , + C1, System, NEM, Penalty__Price, -1, , , + """) + + constraints, lhs, rhs = _split_into_tables(rows) + + expected_constraints = csv_str_to_df(""" + constraint_name, property, value, date_from, date_to, tags + C1, Sense, -1, , , + C1, Penalty__Price, -1, , , + """) + pd.testing.assert_frame_equal(constraints, expected_constraints, check_dtype=False) + + expected_lhs = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags + C1, Generator, GEN_A, Coef, 0.5, , , + """) + pd.testing.assert_frame_equal(lhs, expected_lhs, check_dtype=False) + + expected_rhs = csv_str_to_df(""" + constraint_name, value, date_from, date_to, tags + C1, 100, , , Hot__Day + """) + pd.testing.assert_frame_equal(rhs, expected_rhs, check_dtype=False) + + +# --- _check_constraints_resolved --- + + +def test_check_constraints_resolved_accepts_resolved_names(): + constraints = pd.DataFrame({"constraint_name": ["C1", "C2"]}) + _check_constraints_resolved(constraints, ["C1", "C2"]) # must not raise + + +def test_check_constraints_resolved_raises_on_missing_name(): + constraints = pd.DataFrame({"constraint_name": ["C1"]}) + with pytest.raises(ValueError, match="not found"): + _check_constraints_resolved(constraints, ["C1", "C2"]) + + +def test_check_constraints_resolved_raises_on_name_collision(): + constraints = pd.DataFrame({"constraint_name": ["C1", "C1"]}) + with pytest.raises(ValueError, match="matching more than one"): + _check_constraints_resolved(constraints, ["C1"]) + + +# --- _validate_constraint_rows (orchestrator) --- + + +def test_validate_constraint_rows_accepts_a_valid_table(valid_rows): + _validate_constraint_rows(valid_rows) # must not raise + + +def test_validate_constraint_rows_raises_on_a_broken_table(csv_str_to_df): + # C1 has a Sense and an LHS term but no RHS row. + rows = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, value, date_from, date_to, tags + C1, Generator, GEN_A, Generation__Sent__Out__Coefficient, 0.5, , , + C1, System, NEM, Sense, -1, , , + """) + with pytest.raises(ValueError, match="no RHS"): + _validate_constraint_rows(rows) + + +# --- individual structural invariants: each must fire on a broken table --- + + +def test_assert_no_unresolved_references_raises_on_null(csv_str_to_df): + # The second row's property did not resolve (a broken PLEXOS reference). + rows = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property + C1, System, NEM, Sense + C1, Generator, GEN_A, + """) + with pytest.raises(ValueError, match="unresolved"): + _assert_no_unresolved_references(rows) + + +def test_assert_one_sense_per_constraint_raises_on_two_senses(csv_str_to_df): + rows = csv_str_to_df(""" + constraint_name, property + C1, Sense + C1, Sense + """) + with pytest.raises(ValueError, match="exactly one Sense"): + _assert_one_sense_per_constraint(rows) + + +def test_assert_every_constraint_has_rhs_raises_when_missing(csv_str_to_df): + rows = csv_str_to_df(""" + constraint_name, property + C1, Sense + """) + with pytest.raises(ValueError, match="no RHS"): + _assert_every_constraint_has_rhs(rows) + + +def test_assert_every_constraint_has_lhs_raises_when_missing(csv_str_to_df): + rows = csv_str_to_df(""" + constraint_name, parent_class + C1, System + """) + with pytest.raises(ValueError, match="no LHS"): + _assert_every_constraint_has_lhs(rows) + + +def test_assert_properties_are_known_raises_on_unknown(): + rows = pd.DataFrame({"property": ["RHS", "Bogus Property"]}) + with pytest.raises(ValueError, match="Unrecognised PLEXOS properties"): + _assert_properties_are_known(rows) + + +def test_assert_parent_classes_are_known_raises_on_unknown(): + rows = pd.DataFrame({"parent_class": ["Generator", "Bogus Class"]}) + with pytest.raises(ValueError, match="Unrecognised participant classes"): + _assert_parent_classes_are_known(rows) + + +def test_assert_sense_values_are_valid_raises_on_bad_value(): + rows = pd.DataFrame({"property": ["Sense"], "value": [5]}) + with pytest.raises(ValueError, match="Unexpected Sense values"): + _assert_sense_values_are_valid(rows) + + +def test_assert_values_are_numeric_raises_on_null(): + rows = pd.DataFrame({"property": ["RHS", "Sense"], "value": [100, None]}) + with pytest.raises(ValueError, match="null value"): + _assert_values_are_numeric(rows) + + +def test_assert_values_are_numeric_raises_on_non_numeric(): + rows = pd.DataFrame({"property": ["RHS", "Sense"], "value": [100, "not a number"]}) + with pytest.raises(ValueError, match="Non-numeric"): + _assert_values_are_numeric(rows) + + +def test_assert_tags_only_on_rhs_raises_when_tag_on_other_row(csv_str_to_df): + rows = csv_str_to_df(""" + property, tags + RHS, Hot__Day + Coef, Winter + """) + with pytest.raises(ValueError, match="Tags found on non-RHS"): + _assert_tags_only_on_rhs(rows) + + +def test_assert_one_tag_per_rhs_raises_when_untagged(csv_str_to_df): + rows = csv_str_to_df(""" + property, tags + RHS, + """) + with pytest.raises(ValueError, match="not scoped to exactly one timeslice"): + _assert_one_tag_per_rhs(rows) + + +def test_assert_one_tag_per_rhs_raises_when_multiple_tags(csv_str_to_df): + rows = csv_str_to_df(""" + property, tags + RHS, Hot__Day|Winter + """) + with pytest.raises(ValueError, match="not scoped to exactly one timeslice"): + _assert_one_tag_per_rhs(rows) + + +def test_assert_no_duplicate_data_points_raises_on_duplicate(csv_str_to_df): + rows = csv_str_to_df(""" + constraint_name, parent_class, parent_name, property, date_from, date_to, tags + C1, Generator, GEN_A, Coef, , , + C1, Generator, GEN_A, Coef, , , + """) + with pytest.raises(ValueError, match="Duplicate data points"): + _assert_no_duplicate_data_points(rows) + + +# --- _assert_merge_is_one_to_one --- + + +def test_assert_merge_is_one_to_one_accepts_equal_lengths(): + data_points = pd.DataFrame({"data_id": [1, 2, 3]}) + rows = pd.DataFrame({"value": [1, 2, 3]}) + _assert_merge_is_one_to_one(data_points, rows) # must not raise + + +def test_assert_merge_is_one_to_one_raises_on_row_count_mismatch(): + data_points = pd.DataFrame({"data_id": [1, 2, 3]}) + rows = pd.DataFrame({"value": [1, 2, 3, 4]}) + with pytest.raises(ValueError, match="Merge changed the row count"): + _assert_merge_is_one_to_one(data_points, rows) diff --git a/uv.lock b/uv.lock index fada3a54..32ee3951 100644 --- a/uv.lock +++ b/uv.lock @@ -1266,6 +1266,7 @@ dev = [ { name = "mkdocstrings", extra = ["python"] }, { name = "myst-nb" }, { name = "myst-parser" }, + { name = "plexosdb" }, { name = "pre-commit" }, { name = "pytest" }, { name = "pytest-cov" }, @@ -1310,6 +1311,7 @@ dev = [ { name = "mkdocstrings", extras = ["python"], specifier = ">=0.29.0" }, { name = "myst-nb", specifier = ">=1.1.1" }, { name = "myst-parser", specifier = ">=3.0.1" }, + { name = "plexosdb", specifier = ">=1.3.4" }, { name = "pre-commit", specifier = ">=3.8.0" }, { name = "pytest", specifier = ">=8.3.2" }, { name = "pytest-cov", specifier = ">=5.0.0" }, @@ -1634,6 +1636,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/db/bc/83e112abc66cd466c6b83f99118035867cecd41802f8d044638aa78a106e/locket-1.0.0-py2.py3-none-any.whl", hash = "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3", size = 4398, upload-time = "2022-04-20T22:04:42.23Z" }, ] +[[package]] +name = "loguru" +version = "0.7.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "win32-setctime", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/05/a1dae3dffd1116099471c643b8924f5aa6524411dc6c63fdae648c4f1aca/loguru-0.7.3.tar.gz", hash = "sha256:19480589e77d47b8d85b2c827ad95d49bf31b0dcde16593892eb51dd18706eb6", size = 63559, upload-time = "2024-12-06T11:20:56.608Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/29/0348de65b8cc732daa3e33e67806420b2ae89bdce2b04af740289c5c6c8c/loguru-0.7.3-py3-none-any.whl", hash = "sha256:31a33c10c8e1e10422bfd431aeb5d351c7cf7fa671e3c4df004162264b28220c", size = 61595, upload-time = "2024-12-06T11:20:54.538Z" }, +] + [[package]] name = "markdown" version = "3.10" @@ -2437,6 +2452,18 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, ] +[[package]] +name = "plexosdb" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "loguru" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e6/d0/28327bb8c46911fdb01675500fc21660255d58112c9b4b3396785961cc15/plexosdb-1.3.4.tar.gz", hash = "sha256:0d2b1811558440ba5da38f6138cde1a995eed2353d347f1595bfbe77c6107328", size = 51881, upload-time = "2026-03-27T05:38:22.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/82/79ca218dcdc1afd00efdd52c28c16dbb2ec6a7726cc7764a9f820f93ca69/plexosdb-1.3.4-py3-none-any.whl", hash = "sha256:91074d43d20e34d9f6a43f4d0b0841a1bbb66ddde9c1c96822a123659e2bd857", size = 55799, upload-time = "2026-03-27T05:38:21.039Z" }, +] + [[package]] name = "plotly" version = "6.5.0" @@ -4181,6 +4208,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, ] +[[package]] +name = "win32-setctime" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b3/8f/705086c9d734d3b663af0e9bb3d4de6578d08f46b1b101c2442fd9aecaa2/win32_setctime-1.2.0.tar.gz", hash = "sha256:ae1fdf948f5640aae05c511ade119313fb6a30d7eabe25fef9764dca5873c4c0", size = 4867, upload-time = "2024-12-07T15:28:28.314Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/07/c6fe3ad3e685340704d314d765b7912993bcb8dc198f0e7a89382d37974b/win32_setctime-1.2.0-py3-none-any.whl", hash = "sha256:95d644c4e708aba81dc3704a116d8cbc974d70b3bdb8be1d150e36be6e9d1390", size = 4083, upload-time = "2024-12-07T15:28:26.465Z" }, +] + [[package]] name = "xarray" version = "2025.11.0"