diff --git a/src/demoses_distibuted_optimization/solve_generator_agent.py b/src/demoses_distibuted_optimization/solve_generator_agent.py new file mode 100644 index 0000000000000000000000000000000000000000..6a2fec60e10ce131e76e14a625db28eef148a974 --- /dev/null +++ b/src/demoses_distibuted_optimization/solve_generator_agent.py @@ -0,0 +1,84 @@ +import numpy as np +import pyomo.environ as pyo +from typing import Dict +from build_generator_agent import build_generator_agent + + +def solve_generator_agent(model: pyo.AbstractModel, data: Dict, instance_data: Dict = None) -> pyo.ConcreteModel: + """Solve generator agent's optimization problem.""" + number_of_timesteps = data["General"]["nTimesteps"] + # First delete existing model components if they were previously instantiated + if hasattr(model, 'var_g'): + model.del_component(model.var_g) + if hasattr(model, 'objective_function'): + model.del_component(model.objective_function) + if hasattr(model, 'capacity_limit'): + model.del_component(model.capacity_limit) + # Default instance data + default_instance_data = { + None: { + 'λ_EOM': dict(enumerate(np.zeros(number_of_timesteps))), + 'g_bar': dict(enumerate(np.zeros(number_of_timesteps))), + 'Ï_EOM': {None: data["ADMM"]["rho_EOM"]}, + } + } + # Use default instance data if none is provided + if instance_data is None: + instance_data = default_instance_data + # Reconstruct and instantiate model for next round of solving + model = build_generator_agent(model) + model_instance = model.create_instance(data=instance_data) + solver = pyo.SolverFactory('gurobi') + solver.solve(model_instance) + + return model_instance + + +# # Example usage +# import yaml +# import pandas as pd +# from define_common_parameters import define_common_parameters +# from define_generator_parameters import define_generator_parameters + + +# def read_config(config_file): +# with open(config_file, 'r') as file: +# config = yaml.safe_load(file) +# return config + +# data = read_config('config.yaml') +# generator_agents = [id for id in data['Generators'].keys()] +# ts = pd.read_csv('timeseries.csv', delimiter=';') +# mdict = {m: define_common_parameters(m, data) for m in generator_agents} + +# instance_data_1 = { +# None: { +# 'λ_EOM': dict(enumerate(np.ones(24)*10)), +# 'g_bar': dict(enumerate(np.ones(24)*150)), +# 'Ï_EOM': {None: 1}, +# } +# } + +# instance_data_2 = { +# None: { +# 'λ_EOM': dict(enumerate(np.ones(24)*50)), +# 'g_bar': dict(enumerate(np.ones(24)*300)), +# 'Ï_EOM': {None: 1}, +# } +# } + +# for agent, model in mdict.items(): +# model = define_generator_parameters(agent, model, data, ts) +# zero_model_instance = solve_generator_agent(model, data) +# print(zero_model_instance.name) +# print() +# zero_model_instance.objective_function.display() +# first_model_instance = solve_generator_agent(model, data, instance_data_1) +# print(first_model_instance.name) +# print() +# first_model_instance.objective_function.display() +# print() +# second_model_instance = solve_generator_agent(model, data, instance_data_2) +# print(second_model_instance.name) +# print() +# second_model_instance.objective_function.display() \ No newline at end of file