From e99852c5d5ff3141db6d3998e64459cdc020bb95 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Sat, 3 Dec 2022 01:52:00 +0100 Subject: [PATCH] Fix test apply cutpoints --- fimdlp/CPPFImdlp.cpp | 34 +++++------ fimdlp/CPPFImdlp.h | 2 + fimdlp/cfimdlp.pyx | 3 - fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 124968 -> 123832 bytes fimdlp/testcpp/FImdlp_unittest.cc | 37 +++++++++--- sample.py | 80 ++++++++++++++----------- 6 files changed, 91 insertions(+), 65 deletions(-) diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index 5bd7829..3e21d38 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -63,20 +63,6 @@ namespace mdlp { applyCutPoints(); return xDiscretized; } - void CPPFImdlp::debugPoints(samples& X_, labels& y_) - { - std::cout << "+++++++++++++++++++++++" << std::endl; - // for (auto i : sortIndices(X)) - indices_t indices_n = sortIndices(X); - for (size_t i = 0; i < indices_n.size(); i++) { - printf("(%3lu, %3lu) -> (%3.1f, %d)\n", i, indices_n[i], X_[indices_n[i]], y_[indices_n[i]]); - } - std::cout << "+++++++++++++++++++++++" << std::endl; - fit(X_, y_); - for (auto item : cutPoints) { - std::cout << item.start << " X_[" << item.end << "]=" << X_[item.end] << std::endl; - } - } void CPPFImdlp::applyCutPoints() { for (auto cut : cutPoints) { @@ -128,6 +114,7 @@ namespace mdlp { if (debug) std::cout << "Accepted" << std::endl; if (lastReject) { + //Try to merge rejected intervals if (first) { item.fromValue = std::numeric_limits::lowest(); item.start = indices[0]; @@ -141,6 +128,7 @@ namespace mdlp { filtered.push_back(item); first = false; rest.start = item.end; + lastReject = false; } else { if (debug) std::cout << "Rejected" << std::endl; @@ -153,7 +141,6 @@ namespace mdlp { } else { filtered.push_back(rest); } - cutPoints = filtered; } void CPPFImdlp::computeCutPointsProposed() @@ -190,7 +177,7 @@ namespace mdlp { while (idx < numElements && xCur == xPivot); if (yPivot == -1 || yPrev != yCur) { cutPoint.start = start; - cutPoint.end = idx - 1; + cutPoint.end = idx; start = idx; cutPoint.fromValue = firstCutPoint ? std::numeric_limits::lowest() : cutPts.back().toValue; cutPoint.toValue = (xPrev + xCur) / 2; @@ -214,8 +201,9 @@ namespace mdlp { printf("Final Cutpoint idx=%lu Cur(%3.1f, %d) Prev(%3.1f, %d) Pivot(%3.1f, %d) = (%3.1g, %3.1g] \n", idx, xCur, yCur, xPrev, yPrev, xPivot, yPivot, cutPoint.fromValue, cutPoint.toValue); cutPts.push_back(cutPoint); } - for (auto cutPt : cutPts) - std::cout << "Cut point: " << cutPt; + if (debug) + for (auto cutPt : cutPts) + std::cout << "Proposed: Cut point: " << cutPt; cutPoints = cutPts; } void CPPFImdlp::computeCutPointsOriginal() @@ -260,7 +248,7 @@ namespace mdlp { cutPts.back().end = X.size(); if (debug) for (auto cutPt : cutPts) - std::cout << "-Cut point: " << cutPt; + std::cout << "Original: Cut point: " << cutPt; cutPoints = cutPts; } // Argsort from https://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes @@ -273,4 +261,12 @@ namespace mdlp { { return X_[i1] < X_[i2]; }); return idx; } + void CPPFImdlp::setCutPoints(cutPoints_t cutPoints_) + { + cutPoints = cutPoints_; + } + indices_t CPPFImdlp::getIndices() + { + return indices; + } } diff --git a/fimdlp/CPPFImdlp.h b/fimdlp/CPPFImdlp.h index 08ac0ff..97d7c35 100644 --- a/fimdlp/CPPFImdlp.h +++ b/fimdlp/CPPFImdlp.h @@ -17,6 +17,7 @@ namespace mdlp { cutPoints_t cutPoints; protected: + void setCutPoints(cutPoints_t); static indices_t sortIndices(samples&); void computeCutPointsOriginal(); void computeCutPointsProposed(); @@ -29,6 +30,7 @@ namespace mdlp { CPPFImdlp(bool, int, bool debug = false); ~CPPFImdlp(); cutPoints_t getCutPoints(); + indices_t getIndices(); labels getDiscretizedValues(); void debugPoints(samples&, labels&); CPPFImdlp& fit(samples&, labels&); diff --git a/fimdlp/cfimdlp.pyx b/fimdlp/cfimdlp.pyx index b4d553b..5093f96 100644 --- a/fimdlp/cfimdlp.pyx +++ b/fimdlp/cfimdlp.pyx @@ -15,7 +15,6 @@ cdef extern from "CPPFImdlp.h" namespace "mdlp": vector[int] transform(vector[float]&) vector[int] getDiscretizedValues() vector[CutPointBody] getCutPoints() - void debugPoints(vector[float]&, vector[int]&) class PcutPoint_t: @@ -41,6 +40,4 @@ cdef class CFImdlp: return self.thisptr.getDiscretizedValues() def get_cut_points(self): return self.thisptr.getCutPoints() - def debug_points(self, X, y): - return self.thisptr.debugPoints(X, y) \ No newline at end of file diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so index 4cef9e907a51b04880225ebb1c4c589ba65f19ed..2ec680b8d87e60d26639cd4ac2b825e3e8a73390 100755 GIT binary patch delta 33516 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ℜ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 ({item['fromValue']:3.1f}, {item['toValue']:3.1f}]" -# ) -print(test.get_discretized_values()) - +for proposed in [True, False]: + X = data.data + y = data.target + print("*** Proposed: ", proposed) + test = CFImdlp(debug=False, proposed=proposed) + test.fit(X[:, 0], y) + result = test.get_cut_points() + for item in result: + print( + f"Class={item['classNumber']} - ({item['start']:3d}, {item['end']:3d})" + f" -> ({item['fromValue']:3.1f}, {item['toValue']:3.1f}]" + ) + print(test.get_discretized_values()) + print("+" * 40) + X = np.array( + [ + [5.1, 3.5, 1.4, 0.2], + [5.2, 3.0, 1.4, 0.2], + [5.3, 3.2, 1.3, 0.2], + [5.4, 3.1, 1.5, 0.2], + ] + ) + y = np.array([0, 0, 0, 1]) + print(test.fit(X[:, 0], y).transform(X[:, 0])) + result = test.get_cut_points() + for item in result: + print( + f"Class={item['classNumber']} - ({item['start']:3d}, {item['end']:3d})" + f" -> ({item['fromValue']:3.1f}, {item['toValue']:3.1f}]" + ) + print("*" * 40) # print(Xs, ys) # print("**********************") # test = [(0, 3), (4, 4), (5, 5), (6, 8), (9, 9)] @@ -102,13 +108,17 @@ print(test.get_discretized_values()) # print(indices) # print(np.array(X)[indices]) -X = np.array( - [ - [5.1, 3.5, 1.4, 0.2], - [5.2, 3.0, 1.4, 0.2], - [5.3, 3.2, 1.3, 0.2], - [5.3, 3.1, 1.5, 0.2], - ] -) -y = np.array([0, 0, 0, 1]) -print(test.fit(X[:, 0], y).transform(X[:, 0])) + +# # k = test.cut_points(X[:, 0], y) +# # print(k) +# # k = test.cut_points_ant(X[:, 0], y) +# # print(k) +# # test.debug_points(X[:, 0], y) +X = [5.7, 5.3, 5.2, 5.1, 5.0, 5.6, 5.1, 6.0, 5.1, 5.9] +indices = [4, 3, 6, 8, 2, 1, 5, 0, 9, 7] +# y = [1, 1, 1, 1, 1, 2, 2, 2, 2, 2] +# # To check +# indices2 = np.argsort(X) + Xs = np.array(X)[indices2] + ys = np.array(y)[indices2] +