From c4e5cf16290b91b465902a94e1ef5f95bb3e3608 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Thu, 8 Dec 2022 21:55:15 +0100 Subject: [PATCH] Refactor base proposal --- fimdlp/ccFImdlp.cc | 67 ++++--------------------- fimdlp/ccFImdlp.h | 7 +-- fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 123792 -> 122688 bytes 3 files changed, 11 insertions(+), 63 deletions(-) diff --git a/fimdlp/ccFImdlp.cc b/fimdlp/ccFImdlp.cc index cb5cc1f..629b762 100644 --- a/fimdlp/ccFImdlp.cc +++ b/fimdlp/ccFImdlp.cc @@ -27,82 +27,38 @@ namespace mdlp { } indices = sortIndices(X_); metrics.setData(y, indices); - computeCutPointsRecursive(0, X.size()); - //simulateCutPointsRecursive(); + computeCutPoints(0, X.size()); return *this; } - void CPPFImdlp::simulateCutPointsRecursive() + void CPPFImdlp::computeCutPoints(size_t start, size_t end) { - cutPoints_t jobs = cutPoints_t(); - jobs.push_back(cutPoint_t({ 0, X.size() })); - while (jobs.size() > 0) { - auto interval = jobs.back(); - jobs.pop_back(); - //cout << "start: " << interval.start << " end: " << interval.end << endl; - auto cut = getCandidateSimulate(interval.start, interval.end); - if (cut == -1 || !mdlp(interval.start, cut, interval.end)) { - if (interval.start != 0) - xCutPoints.push_back(xcutPoint_t({ interval.start, (X[indices[interval.start]] + X[indices[interval.start - 1]]) / 2 })); - if (interval.end != X.size()) - xCutPoints.push_back(xcutPoint_t({ interval.end, (X[indices[interval.end]] + X[indices[interval.end - 1]]) / 2 })); - continue; - } - jobs.push_back(cutPoint_t({ interval.start, size_t(cut) })); - jobs.push_back(cutPoint_t({ size_t(cut), interval.end })); - - } - } - void CPPFImdlp::computeCutPointsRecursive(size_t start, size_t end) - { - xcutPoint_t cut; - //cout << "start: " << start << " end: " << end << endl; + int cut; if (end - start < 2) return; cut = getCandidate(start, end); - if (cut.value == -1 || !mdlp(start, cut.index, end)) { + if (cut == -1 || !mdlp(start, cut, end)) { // cut.value == -1 means that there is no candidate in the interval // that enhances the information gain - //cout << "¡Ding! " << cut.value << " " << cut.index << endl; if (start != 0) xCutPoints.push_back(xcutPoint_t({ start, (X[indices[start]] + X[indices[start - 1]]) / 2 })); if (end != X.size()) xCutPoints.push_back(xcutPoint_t({ end, (X[indices[end]] + X[indices[end - 1]]) / 2 })); return; } - computeCutPointsRecursive(start, cut.index); - computeCutPointsRecursive(cut.index, end); + computeCutPoints(start, cut); + computeCutPoints(cut, end); } - xcutPoint_t CPPFImdlp::getCandidate(size_t start, size_t end) + long int CPPFImdlp::getCandidate(size_t start, size_t end) { - xcutPoint_t candidate; - int elements = end - start; - candidate.value = -1; - candidate.index = -1; + long int candidate = -1, elements = end - start; float entropy_left, entropy_right, minEntropy = numeric_limits::max(); for (auto idx = start + 1; idx < end; idx++) { + // Cutpoints are always on boudndaries if (y[indices[idx]] == y[indices[idx - 1]]) continue; entropy_left = float(idx - start) / elements * metrics.entropy(start, idx); entropy_right = float(end - idx) / elements * metrics.entropy(idx, end); if (entropy_left + entropy_right < minEntropy) { - minEntropy = entropy_left + entropy_right; - candidate.value = (X[indices[idx]] + X[indices[idx - 1]]) / 2; - candidate.index = idx; - } - } - return candidate; - } - int CPPFImdlp::getCandidateSimulate(size_t start, size_t end) - { - int candidate = -1; - int elements = end - start; - float entropy_left, entropy_right, minEntropy = numeric_limits::max(); - for (auto idx = start + 1; idx < end; idx++) { - if (y[indices[idx]] == y[indices[idx - 1]]) - continue; - entropy_left = float(idx - start) / elements * metrics.entropy(start, idx); - entropy_right = float(end - idx) / elements * metrics.entropy(idx, end); - if (minEntropy > entropy_left + entropy_right) { minEntropy = entropy_left + entropy_right; candidate = idx; } @@ -127,11 +83,6 @@ namespace mdlp { ig = metrics.informationGain(start, cut, end); delta = log2(pow(3, float(k)) - 2) - (float(k) * ent - float(k1) * ent1 - float(k2) * ent2); float term = 1 / N * (log2(N - 1) + delta); - if (debug) { - cout << "start: " << start << " cut: " << cut << " end: " << end << endl; - cout << "k=" << k << " k1=" << k1 << " k2=" << k2 << " ent=" << ent << " ent1=" << ent1 << " ent2=" << ent2 << endl; - cout << "ig=" << ig << " delta=" << delta << " N " << N << " term " << term << endl; - } return ig > term; } samples CPPFImdlp::getCutPointsx() diff --git a/fimdlp/ccFImdlp.h b/fimdlp/ccFImdlp.h index a35d53a..00f3f9f 100644 --- a/fimdlp/ccFImdlp.h +++ b/fimdlp/ccFImdlp.h @@ -17,17 +17,14 @@ namespace mdlp { xcutPoints_t xCutPoints; static indices_t sortIndices(samples&); - void computeCutPointsRecursive(size_t, size_t); - xcutPoint_t getCandidate(size_t, size_t); + void computeCutPoints(size_t, size_t); + long int getCandidate(size_t, size_t); bool mdlp(size_t, size_t, size_t); - void simulateCutPointsRecursive(); - int getCandidateSimulate(size_t, size_t); public: CPPFImdlp(); CPPFImdlp(bool, int, bool debug = false); ~CPPFImdlp(); - indices_t getIndices(); CPPFImdlp& fitx(samples&, labels&); samples getCutPointsx(); }; diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so index 6eea9998e5957f7e698dfbe3d5ef975b637d484f..681ead17e268209d6f7e105a6c214bac2814572b 100755 GIT binary patch delta 24828 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%0D&Vp5UEXd89 zlQ(zXk_CMe{WZjY