Example #1
0
def write_model_inputs(scenario_directory, scenario_id, subscenarios, subproblem, stage, conn):
    """
    Get inputs from database and write out the model input .tab files.
    :param scenario_directory: string, the scenario directory
    :param subscenarios: SubScenarios object with all subscenario info
    :param subproblem:
    :param stage:
    :param conn: database connection
    :return:
    """
    c = conn.cursor()
    # Load in the required prm type modules
    required_prm_type_modules = get_required_prm_type_modules(
        c=c,
        project_portfolio_scenario_id
        =subscenarios.PROJECT_PORTFOLIO_SCENARIO_ID,
        project_prm_zone_scenario_id=subscenarios.PROJECT_PRM_ZONE_SCENARIO_ID,
        project_elcc_chars_scenario_id
        =subscenarios.PROJECT_ELCC_CHARS_SCENARIO_ID
    )
    imported_prm_modules = \
        load_prm_type_modules(required_prm_type_modules)

    # Write module-specific inputs
    for prm_m in required_prm_type_modules:
        if hasattr(imported_prm_modules[prm_m],
                   "write_module_specific_model_inputs"):
            imported_prm_modules[prm_m]. \
                write_module_specific_model_inputs(
                    scenario_directory, scenario_id, subscenarios, subproblem, stage, conn)
        else:
            pass
Example #2
0
def load_model_data(m, d, data_portal, scenario_directory, subproblem, stage):
    """

    :param m:
    :param d:
    :param data_portal:
    :param scenario_directory:
    :param subproblem:
    :param stage:
    :return:
    """
    project_df = pd.read_csv(
        os.path.join(scenario_directory, str(subproblem), str(stage),
                     "inputs", "projects.tab"),
        sep="\t",
        usecols=["project", "prm_type"]
    )
    required_prm_modules = [
        prm_type for prm_type in project_df.prm_type.unique() if
        prm_type != "."
    ]

    imported_prm_modules = load_prm_type_modules(required_prm_modules)

    for prm_m in required_prm_modules:
        if hasattr(imported_prm_modules[prm_m],
                   "load_module_specific_data"):
            imported_prm_modules[prm_m].load_module_specific_data(
                m, data_portal, scenario_directory, subproblem, stage)
        else:
            pass
Example #3
0
def validate_inputs(scenario_id, subscenarios, subproblem, stage, conn):
    """
    Get inputs from database and validate the inputs
    :param subscenarios: SubScenarios object with all subscenario info
    :param subproblem:
    :param stage:
    :param conn: database connection
    :return:
    """

    # Load in the required prm type modules
    c = conn.cursor()
    required_prm_type_modules = get_required_prm_type_modules(
        c=c,
        project_portfolio_scenario_id
        =subscenarios.PROJECT_PORTFOLIO_SCENARIO_ID,
        project_prm_zone_scenario_id=subscenarios.PROJECT_PRM_ZONE_SCENARIO_ID,
        project_elcc_chars_scenario_id
        =subscenarios.PROJECT_ELCC_CHARS_SCENARIO_ID
    )
    imported_prm_modules = \
        load_prm_type_modules(required_prm_type_modules)

    # Validate module-specific inputs
    for prm_m in required_prm_type_modules:
        if hasattr(imported_prm_modules[prm_m],
                   "validate_module_specific_inputs"):
            imported_prm_modules[prm_m]. \
                validate_module_specific_inputs(
                    scenario_id, subscenarios, subproblem, stage, conn)
        else:
            pass
Example #4
0
def add_model_components(m, d, scenario_directory, subproblem, stage):
    """

    :param m:
    :param d:
    :return:
    """

    m.PRM_COST_GROUPS = Set(
        initialize=lambda mod: join_sets(mod, getattr(d, prm_cost_group_sets)))

    def group_prm_type_init(mod, group):
        """
        Figure out the PRM type of each group
        :param mod:
        :param group:
        :return:
        """
        for group_set in getattr(d, prm_cost_group_sets):
            for element in getattr(mod, group_set):
                if element == group:
                    return getattr(d, prm_cost_group_prm_type)[group_set]

    m.group_prm_type = Param(
        m.PRM_COST_GROUPS,
        within=["energy_only_allowed"],
        initialize=lambda mod, g: group_prm_type_init(mod, g),
    )

    # Import all possible PRM modules
    project_df = pd.read_csv(
        os.path.join(scenario_directory, str(subproblem), str(stage), "inputs",
                     "projects.tab"),
        sep="\t",
        usecols=["project", "prm_type"],
    )
    required_prm_modules = [
        prm_type for prm_type in project_df.prm_type.unique()
        if prm_type != "."
    ]

    imported_prm_modules = load_prm_type_modules(required_prm_modules)

    # For each PRM project type, get the group costs
    def group_cost_rule(mod, group, p):
        prm_type = mod.group_prm_type[group]
        return imported_prm_modules[prm_type].group_cost_rule(mod, group, p)

    m.PRM_Group_Costs = Expression(m.PRM_COST_GROUPS,
                                   m.PERIODS,
                                   rule=group_cost_rule)
Example #5
0
def import_results_into_database(
        scenario_id, subproblem, stage, c, db, results_directory, quiet
):
    """

    :param scenario_id:
    :param c:
    :param db:
    :param results_directory:
    :param quiet:
    :return:
    """

    (project_portfolio_scenario_id, project_prm_zone_scenario_id,
     project_elcc_chars_scenario_id) = c.execute("""
        SELECT project_portfolio_scenario_id, project_prm_zone_scenario_id, 
        project_elcc_chars_scenario_id
        FROM scenarios
        WHERE scenario_id = {}
        """.format(scenario_id)
    ).fetchone()

    # Required modules are the unique set of generator PRM types in
    # the scenario's portfolio
    # This list will be used to know which PRM type modules to load
    required_prm_type_modules = get_required_prm_type_modules(
        c=c,
        project_portfolio_scenario_id=project_portfolio_scenario_id,
        project_prm_zone_scenario_id=project_prm_zone_scenario_id,
        project_elcc_chars_scenario_id=project_elcc_chars_scenario_id
    )

    # Import module-specific results
    # Load in the required operational modules
    imported_prm_modules = \
        load_prm_type_modules(required_prm_type_modules)

    for prm_m in required_prm_type_modules:
        if hasattr(imported_prm_modules[prm_m],
                   "import_module_specific_results_into_database"):
            imported_prm_modules[prm_m]. \
                import_module_specific_results_into_database(
                scenario_id, subproblem, stage, c, db, results_directory, quiet
            )
        else:
            pass
Example #6
0
def export_results(scenario_directory, subproblem, stage, m, d):
    """
    Export operations results.
    :param scenario_directory:
    :param subproblem:
    :param stage:
    :param m:
    The Pyomo abstract model
    :param d:
    Dynamic components
    :return:
    Nothing
    """

    # Export module-specific results
    # Operational type modules
    project_df = pd.read_csv(
        os.path.join(scenario_directory, str(subproblem), str(stage), "inputs",
                     "projects.tab"),
        sep="\t",
        usecols=["project", "prm_type"],
    )
    required_prm_modules = [
        prm_type for prm_type in project_df.prm_type.unique()
        if prm_type != "."
    ]

    imported_prm_modules = load_prm_type_modules(required_prm_modules)

    for prm_m in required_prm_modules:
        if hasattr(imported_prm_modules[prm_m], "export_results"):
            imported_prm_modules[prm_m].export_results(
                m,
                d,
                scenario_directory,
                subproblem,
                stage,
            )
        else:
            pass
Example #7
0
def add_model_components(m, d, scenario_directory, subproblem, stage):
    """

    :param m:
    :param d:
    :return:
    """
    # Import needed PRM modules
    project_df = pd.read_csv(
        os.path.join(scenario_directory, str(subproblem), str(stage),
                     "inputs", "projects.tab"),
        sep="\t",
        usecols=["project", "prm_type"]
    )
    required_prm_modules = [
        prm_type for prm_type in project_df.prm_type.unique() if
        prm_type != "."
    ]

    imported_prm_modules = load_prm_type_modules(required_prm_modules)

    # Add any components specific to the PRM modules
    for prm_m in required_prm_modules:
        imp_prm_m = imported_prm_modules[prm_m]
        if hasattr(imp_prm_m, "add_model_components"):
            imp_prm_m.add_model_components(m, d, scenario_directory, subproblem, stage)

    # For each PRM project, get the ELCC-eligible capacity
    def elcc_eligible_capacity_rule(mod, g, p):
        prm_type = mod.prm_type[g]
        return imported_prm_modules[prm_type]. \
            elcc_eligible_capacity_rule(mod, g, p)

    m.ELCC_Eligible_Capacity_MW = Expression(
        m.PRM_PRJ_OPR_PRDS,
        rule=elcc_eligible_capacity_rule
    )
Example #8
0
def process_results(db, c, scenario_id, subscenarios, quiet):
    """

    :param db:
    :param c:
    :param subscenarios:
    :param quiet:
    :return:
    """
    # Required modules are the unique set of generator PRM types in
    # the scenario's portfolio
    # This list will be used to know which PRM type modules to load
    required_prm_type_modules = get_required_prm_type_modules(
        c=c,
        project_portfolio_scenario_id
        =subscenarios.PROJECT_PORTFOLIO_SCENARIO_ID,
        project_prm_zone_scenario_id=subscenarios.PROJECT_PRM_ZONE_SCENARIO_ID,
        project_elcc_chars_scenario_id
        =subscenarios.PROJECT_ELCC_CHARS_SCENARIO_ID
    )

    # Import module-specific results
    # Load in the required operational modules
    imported_prm_modules = \
        load_prm_type_modules(required_prm_type_modules)

    for prm_m in required_prm_type_modules:
        if hasattr(imported_prm_modules[prm_m],
                   "process_module_specific_results"):
            imported_prm_modules[prm_m]. \
                process_module_specific_results(
                db=db, c=c, scenario_id=scenario_id,
                subscenarios=subscenarios, quiet=quiet
            )
        else:
            pass