Loading...
Searching...
No Matches
CutFamily.h
1//
2// Created by Henri on 26/03/2026.
3//
4
5#ifndef IDOL_CUTFAMILY_H
6#define IDOL_CUTFAMILY_H
7
8#include "idol/general/optimizers/Timer.h"
9
10#include <memory>
11#include <list>
12
13namespace idol {
14 class TempCtr;
15 class CutFamily;
16}
17
18#ifdef IDOL_USE_CGL
19#include <CglCutGenerator.hpp>
20#else
21class OsiSolverInterface {};
23class OsiCuts {};
24#endif
25
27#ifdef IDOL_USE_CGL
28 std::unique_ptr<CglCutGenerator> m_cgl_generator;
29#endif
30 const std::string m_name;
31 unsigned int m_n_calls = 0;
32 unsigned int m_n_generated = 0;
33 unsigned int m_n_accepted = 0;
34 double m_sum_effectiveness = 0.;
35 double m_max_effectiveness = 0.;
36 Timer m_timer;
37public:
38 CutFamily(CglCutGenerator* t_cgl_generator, std::string t_name);
39
40 [[nodiscard]] const std::string& name() const { return m_name; }
41 [[nodiscard]] double score() const;
42 [[nodiscard]] unsigned int n_generated() const { return m_n_generated; }
43 [[nodiscard]] unsigned int n_accepted() const { return m_n_accepted; }
44 [[nodiscard]] double average_effectiveness() const { return m_sum_effectiveness / m_n_generated; }
45 [[nodiscard]] double maximum_effectiveness() const { return m_max_effectiveness; }
46 [[nodiscard]] double acceptance_ratio() const { return (double) m_n_accepted / m_n_generated; }
47 [[nodiscard]] double average_time_per_call() const { return m_timer.cumulative_count() / m_n_calls; }
48
49 void add_accepted_cut() { m_n_accepted++; }
50 void add_effectiveness_statistics(double t_effectiveness);
51
52 OsiCuts generate(OsiSolverInterface& t_osi_solver, int t_agressiveness);
53};
54
55#endif //IDOL_CUTFAMILY_H