diff --git a/CMakeLists.txt b/CMakeLists.txt index b464331..afc421a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -24,6 +24,10 @@ add_executable(Sim_C__ src/config.h src/services/Cost/NetworkProvider.cpp src/services/Cost/NetworkProvider.h + src/services/Cost/BillCharge.cpp + src/services/Cost/BillCharge.h + src/services/CostHistory.cpp + src/services/CostHistory.h ) find_package(doctest CONFIG REQUIRED) find_package(spdlog CONFIG REQUIRED) diff --git a/src/model/Building.cpp b/src/model/Building.cpp index da330ba..31eec31 100644 --- a/src/model/Building.cpp +++ b/src/model/Building.cpp @@ -8,7 +8,7 @@ float Building::Metadata::special_rate_consumption() const { return SpecialRateConsumption; } -void Building::Metadata::set_special_rate_consumption(float special_rate_consumption) { +void Building::Metadata::set_special_rate_consumption(const float special_rate_consumption) { SpecialRateConsumption = special_rate_consumption; } @@ -16,10 +16,50 @@ float Building::Metadata::special_rate_generation() const { return SpecialRateGeneration; } -void Building::Metadata::set_special_rate_generation(float special_rate_generation) { +void Building::Metadata::set_special_rate_generation(const float special_rate_generation) { SpecialRateGeneration = special_rate_generation; } +short Building::Metadata::grid_level() const +{ + return GridLevel; +} + +void Building::Metadata::set_grid_level(const short value) +{ + GridLevel = value; +} + +std::string Building::Metadata::grid_operator() +{ + return GridOperator; +} + +void Building::Metadata::set_grid_operator(std::string value) +{ + GridOperator = std::move(value); +} + +float Building::Metadata::consumption_net_price() const +{ + return ConsumptionNetPrice; +} + +void Building::Metadata::set_consumption_net_price(const float value) +{ + ConsumptionNetPrice = value; +} + +float Building::Metadata::generation_net_price() const +{ + return GenerationNetPrice; +} + +void Building::Metadata::set_generation_net_price(const float value) +{ + GenerationNetPrice = value; +} + std::vector &Building::Simulation_Values::generation_after_community() { return GenerationAfterCommunity; } @@ -261,20 +301,20 @@ void Building::Base::set_cost(std::unique_ptr cost) { Cost = std::move(cost); } -std::unique_ptr &Building::Base::values() { +std::shared_ptr& Building::Base::values() { return Values; } -void Building::Base::set_values(std::unique_ptr values) { +void Building::Base::set_values(std::shared_ptr values) { Values = std::move(values); } -std::unique_ptr &Building::Base::metadata() { +std::shared_ptr &Building::Base::metadata() { return Metadata; } -void Building::Base::set_metadata(std::unique_ptr metadata) { - Metadata = std::move(metadata); +void Building::Base::set_metadata(const std::shared_ptr& metadata) { + Metadata = metadata; } diff --git a/src/model/Building.h b/src/model/Building.h index 0de36cc..a838ed5 100644 --- a/src/model/Building.h +++ b/src/model/Building.h @@ -9,38 +9,25 @@ #include "Model.h" #include "../Config.h" +#include "../services/CostHistory.h" -namespace Building { - class CostValues { +namespace Building +{ + + class Cost + { private: - float Consumption{0.0f}; - float Generation{0.0f}; - float ConsumptionWithCommunity{0.0f}; - float GenerationWithCommunity{0.0f}; + std::shared_ptr CostValuesWith{}; + std::shared_ptr CostValuesWithOut{}; public: - float consumption() { return Consumption; } - void set_consumption(const float consumption) { Consumption = consumption; } - float generation() { return Generation; } - void set_generation(const float generation) { Generation = generation; } - float consumption_with_community() { return ConsumptionWithCommunity; } - void set_consumption_with_community(const float consumption) { ConsumptionWithCommunity = consumption; } - float generation_with_community() { return Generation; } - void set_generation_with_community(const float generation) { GenerationWithCommunity = generation; } + std::shared_ptr& get_cost_values_with() { return CostValuesWith; } + std::shared_ptr& get_cost_values_without() { return CostValuesWithOut; } }; - class Cost { - private: - std::shared_ptr CostValuesWith{}; - std::shared_ptr CostValuesWithOut{}; - - public: - std::shared_ptr &get_cost_values_with() { return CostValuesWith; } - std::shared_ptr &get_cost_values_without() { return CostValuesWithOut; } - }; - - class Simulation_Values { + class Simulation_Values + { private: std::vector ConsumptionAfterOwnCoverage = std::vector(VALUE_COUNT, 0.0f); std::vector OwnUsage = std::vector(VALUE_COUNT, 0.0f); @@ -67,19 +54,19 @@ namespace Building { public: Simulation_Values() = default; - std::vector &consumption_after_own_coverage(); + std::vector& consumption_after_own_coverage(); void set_community_coverage(std::vector community_coverage); - std::vector &own_usage(); + std::vector& own_usage(); void set_own_usage(std::vector own_usage); - std::vector &needed_con(); + std::vector& needed_con(); void set_needed_con(std::vector needed_con); - std::vector &needed_gen(); + std::vector& needed_gen(); void set_needed_gen(std::vector needed_gen); @@ -91,21 +78,21 @@ namespace Building { void set_relativeSelfGeneration(float relativeSelfGeneration); - std::vector &generation_after_community(); + std::vector& generation_after_community(); - void generation_after_community(const std::vector &generation_after_community); + void generation_after_community(const std::vector& generation_after_community); - std::vector &consumption_after_community(); + std::vector& consumption_after_community(); - void consumption_after_community(const std::vector &consumption_after_community); + void consumption_after_community(const std::vector& consumption_after_community); - std::vector &generation_to_community(); + std::vector& generation_to_community(); - void generation_to_community(const std::vector &generation_to_community); + void generation_to_community(const std::vector& generation_to_community); - std::vector &consumption_from_community(); + std::vector& consumption_from_community(); - void consumption_from_community(const std::vector &consumption_from_community); + void consumption_from_community(const std::vector& consumption_from_community); float con_from_community_relative() const; @@ -133,7 +120,8 @@ namespace Building { void set_generation_to_community_sum(float values); }; - class Metadata { + class Metadata + { private: std::string Name{}; float AnnualConsumption{0.0f}; @@ -146,73 +134,79 @@ namespace Building { short GridPower{0}; float SpecialRateConsumption{0.0f}; float SpecialRateGeneration{0.0f}; + short GridLevel{0}; + std::string GridOperator; + float ConsumptionNetPrice{0.0f}; + float GenerationNetPrice{0.0f}; public: Metadata() = default; std::string name() const; - - void set_name(const std::string &name); + void set_name(const std::string& name); float annual_consumption() const; - void set_annual_consumption(float annual_consumption); float annual_generation() const; - void set_annual_generation(float annual_generation); - std::vector &consumption_profile(); - + std::vector& consumption_profile(); void set_consumption_profile(std::vector consumption_profile); - std::vector &generation_profile(); - + std::vector& generation_profile(); void set_generation_profile(std::vector generation_profile); std::string consumption_profile_name() const; - - void set_consumption_profile_name(const std::string &consumption_profile_name); + void set_consumption_profile_name(const std::string& consumption_profile_name); std::string generation_profile_name() const; - - void set_generation_profile_name(const std::string &generation_profile_name); + void set_generation_profile_name(const std::string& generation_profile_name); short connection_power() const; - void set_connection_power(short connection_power); short grid_power() const; - void set_grid_power(short grid_power); float special_rate_consumption() const; - void set_special_rate_consumption(float special_rate_consumption); float special_rate_generation() const; - void set_special_rate_generation(float special_rate_generation); + + short grid_level() const; + void set_grid_level(short value); + + std::string grid_operator(); + void set_grid_operator(std::string value); + + float consumption_net_price() const; + void set_consumption_net_price(float value); + + float generation_net_price() const; + void set_generation_net_price(float value); }; - class Base : public Model { + class Base : public Model + { private: std::unique_ptr Cost{}; - std::unique_ptr Values{}; - std::unique_ptr Metadata{}; + std::shared_ptr Values{}; + std::shared_ptr Metadata{}; public: - std::unique_ptr &cost(); + std::unique_ptr& cost(); void set_cost(std::unique_ptr cost); - std::unique_ptr &values(); + std::shared_ptr& values(); - void set_values(std::unique_ptr values); + void set_values(std::shared_ptr values); - std::unique_ptr &metadata(); + std::shared_ptr& metadata(); - void set_metadata(std::unique_ptr metadata); + void set_metadata(const std::shared_ptr& metadata); }; } diff --git a/src/model/Energy_Tariff.h b/src/model/Energy_Tariff.h index 7a77ea4..d1ac8ad 100644 --- a/src/model/Energy_Tariff.h +++ b/src/model/Energy_Tariff.h @@ -10,6 +10,7 @@ class Energy_Tariff { public: float consumption_tariff{0.0f}; float generation_tariff{0.0f}; + float bill_charge; }; diff --git a/src/services/Cost/BillCharge.cpp b/src/services/Cost/BillCharge.cpp new file mode 100644 index 0000000..abb073e --- /dev/null +++ b/src/services/Cost/BillCharge.cpp @@ -0,0 +1,11 @@ +// +// Created by stani on 3/12/2025. +// + +#include "BillCharge.h" + +void BillCharge::apply(std::unique_ptr& building, std::unique_ptr& community) +{ + const std::shared_ptr& valuesWith = building->cost()->get_cost_values_with(); + valuesWith->add_cost_point("Bill charge",1.0,community->energy_tariff().bill_charge); +} diff --git a/src/services/Cost/BillCharge.h b/src/services/Cost/BillCharge.h new file mode 100644 index 0000000..5f964b6 --- /dev/null +++ b/src/services/Cost/BillCharge.h @@ -0,0 +1,17 @@ +// +// Created by stani on 3/12/2025. +// + +#ifndef BILLCHARGE_H +#define BILLCHARGE_H +#include "../../interfaces/ICostComponent.h" + + +class BillCharge : public ICostComponent { +public: + void apply(std::unique_ptr& building, std::unique_ptr& community) override; +}; + + + +#endif //BILLCHARGE_H diff --git a/src/services/Cost/NetworkProvider.cpp b/src/services/Cost/NetworkProvider.cpp index 547bcc9..8dc4e3b 100644 --- a/src/services/Cost/NetworkProvider.cpp +++ b/src/services/Cost/NetworkProvider.cpp @@ -5,14 +5,19 @@ #include "NetworkProvider.h" -void NetworkProvider::apply(std::unique_ptr &building, std::unique_ptr &community) { - std::shared_ptr &valuesWith = building->cost()->get_cost_values_with(); - std::shared_ptr &valuesWithout = building->cost()->get_cost_values_without(); +void NetworkProvider::apply(std::unique_ptr& building, std::unique_ptr& community) +{ + const std::shared_ptr& valuesWith = building->cost()->get_cost_values_with(); + const std::shared_ptr& valuesWithout = building->cost()->get_cost_values_without(); + const std::shared_ptr& metadata = building->metadata(); + const std::shared_ptr& values = building->values(); + //With Community + valuesWith->add_cost_point("Net Consumption",metadata->consumption_net_price(),values->consumption_after_community_sum()); + valuesWith->add_cost_point("Net Generation",metadata->consumption_net_price(),values->consumption_after_community_sum()); + valuesWith->add_cost_point("Community Consumption", community->energy_tariff().consumption_tariff, values->consumption_after_community_sum()); + valuesWith->add_cost_point("Generation Consumption", -community->energy_tariff().generation_tariff, values->generation_after_community_sum()); - //Todo tariffs - valuesWithout->set_consumption(building->values()->needed_con_sum()*building->metadata()->special_rate_consumption()); - valuesWithout->set_generation(building->values()->needed_gen_sum()*-building->metadata()->special_rate_generation()); - - valuesWithout->set_consumption(building->values()->generation_to_community_sum()*-community->energy_tariff().consumption_tariff); - valuesWithout->set_generation(building->values()->consumption_from_community_sum()*-community->energy_tariff().generation_tariff); + //Without Community + valuesWithout->add_cost_point("Net Consumption",metadata->consumption_net_price(),values->needed_con_sum()); + valuesWithout->add_cost_point("Net Generation",metadata->generation_net_price(),values->needed_gen_sum()); } diff --git a/src/services/CostHistory.cpp b/src/services/CostHistory.cpp new file mode 100644 index 0000000..87bb45a --- /dev/null +++ b/src/services/CostHistory.cpp @@ -0,0 +1,5 @@ +// +// Created by stani on 3/12/2025. +// + +#include "CostHistory.h" diff --git a/src/services/CostHistory.h b/src/services/CostHistory.h new file mode 100644 index 0000000..b637e5a --- /dev/null +++ b/src/services/CostHistory.h @@ -0,0 +1,50 @@ +// +// Created by stani on 3/12/2025. +// + +#ifndef COSTHISTORY_H +#define COSTHISTORY_H +#include +#include +#include + + +class CostHistory { +public: + struct CostPoint { + std::string name; + double value; + double amount; + + CostPoint(std::string name, double value, double amount) + : name(std::move(name)), value(value), amount(amount) {} + + double total() const { + return value * amount; + } + }; + +private: + std::vector costPoints; + +public: + void add_cost_point(const std::string &name, double value, double amount) { + if (amount==0.0) return; + costPoints.emplace_back(name, value, amount); + } + + double total_cost() const { + return std::accumulate(costPoints.begin(), costPoints.end(), 0.0, + [](double sum, const CostPoint &point) { + return sum + point.total(); + }); + } + + const std::vector &get_cost_points() const { + return costPoints; + } +}; + + + +#endif //COSTHISTORY_H