idol
A C++ Framework for Optimization
Loading...
Searching...
No Matches
PenaltyUpdates.h
1//
2// Created by henri on 19.09.24.
3//
4
5#ifndef IDOL_PENALTYUPDATES_H
6#define IDOL_PENALTYUPDATES_H
7
8#include <list>
9#include <vector>
10#include <ostream>
11#include "Formulation.h"
12
13namespace idol {
14 class PenaltyUpdate;
15
16 namespace PenaltyUpdates {
17 class Additive;
18 class Multiplicative;
19 class Adaptive;
20 }
21
22 std::ostream &operator<<(std::ostream &t_os, const PenaltyUpdate &t_penalty_update);
23}
24
26public:
27 virtual ~PenaltyUpdate() = default;
28
29 virtual double operator()(double t_current_penalty) = 0;
30
31 virtual void operator()(std::list<ADM::Formulation::CurrentPenalty>& t_current_penalties);
32
33 virtual bool diversify() { return false; }
34
35 virtual std::ostream &describe(std::ostream &t_os) const = 0;
36
37 [[nodiscard]] virtual PenaltyUpdate* clone() const = 0;
38};
39
41 double m_increment;
42public:
43 explicit Additive(double t_increment) : m_increment(t_increment) {}
44
45 double operator()(double t_current_penalty) override {
46 return t_current_penalty + m_increment;
47 }
48
49 std::ostream &describe(std::ostream &t_os) const override {
50 return t_os << "Additive(" << m_increment << ")";
51 }
52
53 [[nodiscard]] PenaltyUpdate* clone() const override {
54 return new Additive(*this);
55 }
56};
57
59 std::vector<double> m_factor;
60 unsigned int m_current_factor_index = 0;
61 bool m_normalized;
62public:
63 explicit Multiplicative(double t_factor, bool t_normalized = false) : m_factor({ t_factor }), m_normalized(t_normalized) {}
64
65 explicit Multiplicative(std::vector<double> t_factor, bool t_normalized = false) : m_factor(std::move(t_factor)), m_normalized(t_normalized) {}
66
67 double operator()(double t_current_penalty) override {
68 return t_current_penalty * m_factor[m_current_factor_index];
69 }
70
71 void operator()(std::list<ADM::Formulation::CurrentPenalty> &t_current_penalties) override;
72
73 bool diversify() override;
74
75 std::ostream &describe(std::ostream &t_os) const override;
76
77 [[nodiscard]] PenaltyUpdate* clone() const override {
78 return new Multiplicative(*this);
79 }
80};
81
83 std::vector<std::unique_ptr<PenaltyUpdate>> m_penalty_updates;
84 unsigned int m_current_penalty_update_index = 0;
85public:
86 explicit Adaptive(const std::vector<PenaltyUpdate*>& t_penalty_updates);
87
88 Adaptive(const Adaptive& t_src);
89
90 double operator()(double t_current_penalty) override {
91 return m_penalty_updates[m_current_penalty_update_index]->operator()(t_current_penalty);
92 }
93
94 void operator()(std::list<ADM::Formulation::CurrentPenalty> &t_current_penalties) override {
95 m_penalty_updates[m_current_penalty_update_index]->operator()(t_current_penalties);
96 }
97
98 bool diversify() override;
99
100 std::ostream &describe(std::ostream &t_os) const override;
101
102 [[nodiscard]] PenaltyUpdate* clone() const override {
103 return new Adaptive(*this);
104 }
105};
106
107
108#endif //IDOL_PENALTYUPDATES_H