14 VNode node = hcube[idx];
21 string sChild1(sChild0);
24 VIndex idx0(sChild0), idx1(sChild1);
38 s.resize(m_iDim,
'0');
44 if (m_arrIndex[idx.
GetIndex()].uiAction == 0)
47 for (
size_t i = 1; i < 128; i++)
48 if (m_arrIndex[idx.
GetIndex()].uiAction[i - 1])
49 std::cout << i <<
",";
52 std::cout <<
"------------------------\n";
55 for (
size_t iNumIndifference = 1; iNumIndifference <= m_iDim; iNumIndifference++) {
57 std::cout << iNumIndifference <<
" " << std::flush;
60 std::vector<size_t> arrPosIndifference(iNumIndifference);
62 for (
size_t i = 0; i < iNumIndifference; i++) {
63 arrPosIndifference[i] = iPos;
67 std::vector<
unsigned long long> arrProb(iNumIndifference);
68 std::vector<
unsigned long long> arrGain(iNumIndifference);
69 std::vector<unsigned> arrNEq(iNumIndifference);
75 s.resize(m_iDim,
'0');
76 for (
size_t i = 0; i < iNumIndifference; i++)
77 s[arrPosIndifference[i]] =
'-';
83 for (
size_t i = 0; i < iNumIndifference; i++) {
85 std::string sChild1(sChild0);
86 sChild0[arrPosIndifference[i]] =
'0';
87 sChild1[arrPosIndifference[i]] =
'1';
88 VIndex idx0(sChild0), idx1(sChild1);
89 VNode node0(m_arrIndex[idx0.GetIndex()]), node1(m_arrIndex[idx1.
GetIndex()]);
92 auto uiIntersezione = node0.uiAction & node1.
uiAction;
94 m_arrIndex[idx.
GetIndex()].uiAction = uiIntersezione;
95 arrProb[i] = node0.uiProb + node1.
uiProb;
96 arrGain[i] = node0.uiGain + node1.
uiGain;
97 arrNEq[i] = node0.neq * node1.
neq;
99 if (uiIntersezione != 0) {
100 arrGain[i] += arrProb[i];
104 unsigned long long uiMaxGain(0);
105 unsigned long long uiMaxGainProb(0);
106 size_t uiMaxGainIndex(0);
108 for (
size_t i = 0; i < iNumIndifference; i++) {
109 if (uiMaxGain <= arrGain[i]) {
110 if (uiMaxGain < arrGain[i])
114 uiMaxGain = arrGain[i];
115 uiMaxGainProb = arrProb[i];
116 uiMaxGainIndex = arrPosIndifference[i];
119 m_arrIndex[idx.
GetIndex()].uiGain = uiMaxGain;
120 m_arrIndex[idx.
GetIndex()].uiProb = uiMaxGainProb;
121 m_arrIndex[idx.
GetIndex()].uiMaxGainIndex =
static_cast<::
byte>(uiMaxGainIndex);
122 m_arrIndex[idx.
GetIndex()].neq = std::max(uiNEq, 1u);
126 if (m_arrIndex[idx.
GetIndex()].uiAction == 0)
129 for (
unsigned j = 1; j < 32; j++)
130 if (m_arrIndex[idx.
GetIndex()].uiAction[j - 1])
131 std::cout << j <<
",";
134 for (
size_t i = 0; i < iNumIndifference; i++) {
135 std::cout << arrGain[i];
136 if (arrPosIndifference[i] == uiMaxGainIndex)
138 else if (arrGain[i] == uiMaxGain)
143 std::cout << m_arrIndex[idx.
GetIndex()].neq <<
"\n";
151 for (
int i =
int(iNumIndifference) -1; i >= 0; i--) {
152 arrPosIndifference[i]++;
154 if (arrPosIndifference[i] < m_iDim) {
156 if (m_iDim - 1 - arrPosIndifference[i] >= iNumIndifference - 1 - i) {
159 iPos = int(arrPosIndifference[i]) + 1;
160 for (
size_t j = i + 1; j < iNumIndifference; j++) {
161 arrPosIndifference[j] = iPos;
171 std::cout <<
"------------------------\n";
180 TLOG(
"Allocating hypercube",
184 TLOG(
"Optimizing rules",
185 auto t = hcube.optimize(
false);
node * make_root()
Creates a new root updating the roots_ vector.
node * make_node(Args &&... args)
Creates and returns a new node updating the nodes_ vector.
bool WriteConactTree(const BinaryDrag< conact > &t, const string &filename)
bool LoadConactTree(BinaryDrag< conact > &t, const string &filename)
BinaryDrag< conact > GetOdt(const rule_set &rs, bool force_generation)
Returns the optimal (or pseudo optimal) decision tree generated from the given rule set.
BinaryDrag< conact > GenerateOdt(const rule_set &rs)
void CreateTree_rec(BinaryDrag< conact > &t, BinaryDrag< conact >::node *n, const rule_set &rs, const VHyperCube &hcube, const VIndex &idx)
BinaryDrag< conact > GetOdtWithFileSuffix(const rule_set &rs, const string &file_suffix, bool force_generation)
std::filesystem::path GetCustomOdtPath(const std::string &custom_suffix) const
std::filesystem::path odt_path_
bool force_odt_generation_
BinaryDrag< conact > optimize(bool bVerbose=false)
std::string GetIndexString() const
unsigned GetIndex() const
bool SetIndex(const std::string &s)
unsigned long long uiProb
unsigned long long uiGain
std::bitset< 131 > uiAction
std::vector< std::string > conditions
#define TLOG(message, instructions)