From 34d50cb09cc91aa2358eebc416b9b1e7adf7a67f Mon Sep 17 00:00:00 2001 From: rahadi94 Date: Thu, 28 Aug 2025 10:40:28 +0200 Subject: [PATCH 1/9] adding interfaces for RL agents, a pricing adapter, and pricing services to decouple pricing agent from the operator class. --- ...pa_500_2_average_power_m_200_m_post_tuning | Bin 1078735 -> 1080568 bytes resources/configuration/configuration.py | 2 +- simulation/operations/agents_controller.py | 43 ++++ simulation/operations/operator.py | 135 ++-------- simulation/operations/pricing_service.py | 235 ++++++++++++++++++ .../rl_agents/adapters/pricing_adapter.py | 42 ++++ utilities/rl_agents/factory.py | 22 ++ utilities/rl_agents/interfaces.py | 24 ++ 8 files changed, 388 insertions(+), 115 deletions(-) create mode 100644 simulation/operations/agents_controller.py create mode 100644 simulation/operations/pricing_service.py create mode 100644 utilities/rl_agents/adapters/pricing_adapter.py create mode 100644 utilities/rl_agents/factory.py create mode 100644 utilities/rl_agents/interfaces.py diff --git a/data/output/actor_pricing_double_capa_500_2_average_power_m_200_m_post_tuning b/data/output/actor_pricing_double_capa_500_2_average_power_m_200_m_post_tuning index 63a06daab4aff95e7f956e245c25d1abb82459f2..5992c85322039171e2748d6ff8d3fcc8f3a69e60 100644 GIT binary patch literal 1080568 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