From 97cd2243fa05f6b4e7b524b36decd8de1d47e27c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Fri, 2 Dec 2022 19:22:13 +0100 Subject: [PATCH] Enhance cutpoints computation --- .gitignore | 2 + Makefile | 2 +- fimdlp/CPPFImdlp.cpp | 115 ++++++++++++++++--------- fimdlp/CPPFImdlp.h | 15 ++-- fimdlp/Metrics.cpp | 2 +- fimdlp/cfimdlp.pyx | 9 +- fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 269628 -> 0 bytes fimdlp/mdlp.py | 30 +++++-- fimdlp/testcpp/FImdlp_unittest.cc | 12 +-- fimdlp/testcpp/test.sh | 12 --- fimdlp/typesFImdlp.h | 9 +- sample.py | 103 ++++++++++++++++++---- test1.xlsx | Bin 0 -> 17905 bytes 13 files changed, 207 insertions(+), 104 deletions(-) delete mode 100755 fimdlp/cppfimdlp.cpython-310-darwin.so delete mode 100755 fimdlp/testcpp/test.sh create mode 100644 test1.xlsx diff --git a/.gitignore b/.gitignore index 0318fe0..ceb5580 100644 --- a/.gitignore +++ b/.gitignore @@ -129,3 +129,5 @@ dmypy.json .pyre/ cfimdlp.cpp .vscode/* +**/.idea/* + diff --git a/Makefile b/Makefile index 529c057..342dcba 100644 --- a/Makefile +++ b/Makefile @@ -8,7 +8,7 @@ clean: ## Clean up if [ -f fimdlp/cppfimdlp.cpython-310-darwin.so ]; then rm fimdlp/cppfimdlp.cpython-310-darwin.so; fi; test: - cd fimdlp/testcpp && ./test.sh + cd fimdlp/testcpp && ./test lint: ## Lint and static-check black fimdlp diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index e1ed848..1238d5a 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -5,18 +5,26 @@ #include #include "Metrics.h" namespace mdlp { - CPPFImdlp::CPPFImdlp() : debug(false), precision(6) + std::ostream& operator << (std::ostream& os, const cutPoint_t& cut) + { + os << cut.classNumber << " -> (" << cut.start << ", " << cut.end << + ") - (" << cut.fromValue << ", " << cut.toValue << ") " + << std::endl; + return os; + + } + CPPFImdlp::CPPFImdlp() : proposed(true), precision(6), debug(false) { divider = pow(10, precision); } - CPPFImdlp::CPPFImdlp(int precision, bool debug) : debug(debug), precision(precision) + CPPFImdlp::CPPFImdlp(bool proposed, int precision, bool debug) : proposed(proposed), precision(precision), debug(debug) { divider = pow(10, precision); } CPPFImdlp::~CPPFImdlp() { } - std::vector CPPFImdlp::getCutPoints() + std::vector CPPFImdlp::getCutPoints() { return cutPoints; } @@ -32,7 +40,11 @@ namespace mdlp { this->xDiscretized = labels(X.size(), -1); this->numClasses = Metrics::numClasses(y, indices, 0, X.size()); - computeCutPoints(); + if (proposed) { + computeCutPointsProposed(); + } else { + computeCutPointsOriginal(); + } filterCutPoints(); applyCutPoints(); } @@ -64,7 +76,7 @@ namespace mdlp { } } } - bool CPPFImdlp::evaluateCutPoint(CutPoint_t rest, CutPoint_t candidate) + bool CPPFImdlp::evaluateCutPoint(cutPoint_t rest, cutPoint_t candidate) { int k, k1, k2; float ig, delta; @@ -73,7 +85,6 @@ namespace mdlp { if (N < 2) { return false; } - k = Metrics::numClasses(y, indices, rest.start, rest.end); k1 = Metrics::numClasses(y, indices, rest.start, candidate.end); k2 = Metrics::numClasses(y, indices, candidate.end, rest.end); @@ -83,15 +94,18 @@ namespace mdlp { ig = Metrics::informationGain(y, indices, rest.start, rest.end, candidate.end, numClasses); delta = log2(pow(3, k) - 2) - (k * ent - k1 * ent1 - k2 * ent2); float term = 1 / N * (log2(N - 1) + delta); - std::cout << candidate + if (debug) { + std::cout << "Rest: " << rest; + std::cout << "Candidate: " << candidate; std::cout << "k=" << k << " k1=" << k1 << " k2=" << k2 << " ent=" << ent << " ent1=" << ent1 << " ent2=" << ent2 << std::endl; - std::cout << "ig=" << ig << " delta=" << delta << " N " << N << " term " << term << std::endl; + std::cout << "ig=" << ig << " delta=" << delta << " N " << N << " term " << term << std::endl; + } return (ig > term); } void CPPFImdlp::filterCutPoints() { - std::vector filtered; - CutPoint_t rest; + cutPoints_t filtered; + cutPoint_t rest; int classNumber = 0; rest.start = 0; @@ -116,24 +130,25 @@ namespace mdlp { item.classNumber = classNumber++; filtered.push_back(item); first = false; + rest.start = item.end; } else { std::cout << "Rejected" << std::endl; lastReject = true; } } - if (!first) + if (!first) { filtered.back().toValue = std::numeric_limits::max(); - else { + filtered.back().end = X.size(); + } else { filtered.push_back(rest); } cutPoints = filtered; } - void CPPFImdlp::computeCutPoints() + void CPPFImdlp::computeCutPointsProposed() { - - std::vector cutPts; - CutPoint_t cutPoint; + cutPoints_t cutPts; + cutPoint_t cutPoint; indices_t cutIdx; float xPrev, xCur, xPivot; int yPrev, yCur, yPivot; @@ -196,38 +211,56 @@ namespace mdlp { } cutPoints = cutPts; } - void CPPFImdlp::computeCutPointsAnt() + void CPPFImdlp::computeCutPointsOriginal() { - samples cutPts; - labels cutIdx; - float xPrev, cutPoint; + cutPoints_t cutPts; + cutPoint_t cutPoint; + float xPrev = std::numeric_limits::lowest(); int yPrev; - size_t idxPrev; - xPrev = X.at(indices[0]); - yPrev = y.at(indices[0]); - idxPrev = indices[0]; - if (debug) { - std::cout << "Entropy: " << Metrics::entropy(y, indices, 0, y.size(), Metrics::numClasses(y, indices, 0, indices.size())) << std::endl; - } - for (auto index = indices.begin(); index != indices.end(); ++index) { + bool first = true; + // idxPrev is the index of the init instance of the cutPoint + size_t index, idxPrev = 0, idx = indices[0]; + xPrev = X[idx]; + yPrev = y[idx]; + for (index = 0; index < size_t(indices.size()) - 1; index++) { + idx = indices[index]; // Definition 2 Cut points are always on boundaries - if (y.at(*index) != yPrev && xPrev < X.at(*index)) { - cutPoint = round(divider * (X.at(*index) + xPrev) / 2) / divider; - if (debug) { - std::cout << "Cut point: " << (xPrev + X.at(*index)) / 2 << " //"; - std::cout << X.at(*index) << " -> " << y.at(*index) << " yPrev= " << yPrev; - std::cout << "* (" << X.at(*index) << ", " << xPrev << ")=" - << ((X.at(*index) + xPrev) / 2) << "idxPrev" - << idxPrev << std::endl; + if (y[idx] != yPrev && xPrev < X[idx]) { + if (first) { + first = false; + cutPoint.fromValue = std::numeric_limits::lowest(); + } else { + cutPoint.fromValue = cutPts.back().toValue; } + cutPoint.start = idxPrev; + cutPoint.end = index; + cutPoint.classNumber = -1; + cutPoint.toValue = round(divider * (X[idx] + xPrev) / 2) / divider; + if (debug) { + std::cout << "Cut point: " << cutPoint << " //"; + std::cout << X[idx] << " -> " << y[idx] << " yPrev= " + << yPrev << idxPrev << std::endl; + } + idxPrev = index; cutPts.push_back(cutPoint); - cutIdx.push_back(idxPrev); } - xPrev = X.at(*index); - yPrev = y.at(*index); - idxPrev = *index; + xPrev = X[idx]; + yPrev = y[idx]; } - // cutPoints = cutPts; + std::cout << "Came to here" << first << std::endl; + if (first) { + cutPoint.start = 0; + cutPoint.classNumber = -1; + cutPoint.fromValue = std::numeric_limits::lowest(); + cutPoint.toValue = std::numeric_limits::max(); + cutPoints.push_back(cutPoint); + } else + cutPts.back().toValue = std::numeric_limits::max(); + cutPts.back().end = X.size(); + if (debug) + for (auto cutPoint : cutPts) + std::cout << "Cut point: " << cutPoint << std::endl; + cutPoints = cutPts; } // Argsort from https://stackoverflow.com/questions/1577475/c-sorting-and-keeping-track-of-indexes indices_t CPPFImdlp::sortIndices(samples& X) diff --git a/fimdlp/CPPFImdlp.h b/fimdlp/CPPFImdlp.h index f0ebed9..f242eaf 100644 --- a/fimdlp/CPPFImdlp.h +++ b/fimdlp/CPPFImdlp.h @@ -5,29 +5,30 @@ namespace mdlp { class CPPFImdlp { private: - bool debug; + bool proposed; // proposed algorithm or original algorithm int precision; + bool debug; float divider; indices_t indices; // sorted indices to use with X and y samples X; labels y; labels xDiscretized; int numClasses; - std::vector cutPoints; + cutPoints_t cutPoints; protected: indices_t sortIndices(samples&); - void computeCutPointsAnt(); - void computeCutPoints(); - bool evaluateCutPoint(CutPoint_t, CutPoint_t); + void computeCutPointsOriginal(); + void computeCutPointsProposed(); + bool evaluateCutPoint(cutPoint_t, cutPoint_t); void filterCutPoints(); void applyCutPoints(); public: CPPFImdlp(); - CPPFImdlp(int, bool debug = false); + CPPFImdlp(bool, int, bool debug = false); ~CPPFImdlp(); - std::vector getCutPoints(); + cutPoints_t getCutPoints(); labels getDiscretizedValues(); void debugPoints(samples&, labels&); void fit(samples&, labels&); diff --git a/fimdlp/Metrics.cpp b/fimdlp/Metrics.cpp index 7f9b060..c26751f 100644 --- a/fimdlp/Metrics.cpp +++ b/fimdlp/Metrics.cpp @@ -41,7 +41,7 @@ namespace mdlp { entropy = Metrics::entropy(y, indices, start, end, nClasses); entropyLeft = Metrics::entropy(y, indices, start, cutPoint, nClassesLeft); entropyRight = Metrics::entropy(y, indices, cutPoint, end, nClassesRight); - iGain = entropy - (float)nElementsLeft / nElements * entropyLeft - (float)nElementsRight / nElements * entropyRight; + iGain = entropy - ((float)nElementsLeft * entropyLeft + (float)nElementsRight * entropyRight) / nElements; return iGain; } diff --git a/fimdlp/cfimdlp.pyx b/fimdlp/cfimdlp.pyx index ccce80f..61534df 100644 --- a/fimdlp/cfimdlp.pyx +++ b/fimdlp/cfimdlp.pyx @@ -10,7 +10,7 @@ cdef extern from "CPPFImdlp.h" namespace "mdlp": float fromValue, toValue; cdef cppclass CPPFImdlp: CPPFImdlp() except + - CPPFImdlp(int, bool) except + + CPPFImdlp(bool, int, bool) except + void fit(vector[float]&, vector[int]&) vector[int] transform(vector[float]&) vector[int] getDiscretizedValues() @@ -18,7 +18,7 @@ cdef extern from "CPPFImdlp.h" namespace "mdlp": void debugPoints(vector[float]&, vector[int]&) -class PCutPoint_t: +class PcutPoint_t: def __init__(self, start, end, fromValue, toValue): self.start = start self.end = end @@ -27,8 +27,9 @@ class PCutPoint_t: cdef class CFImdlp: cdef CPPFImdlp *thisptr - def __cinit__(self, precision=6, debug=False): - self.thisptr = new CPPFImdlp(precision, debug) + def __cinit__(self, precision=6, debug=False, proposed=True): + # Proposed or original algorithm + self.thisptr = new CPPFImdlp(proposed, precision, debug) def __dealloc__(self): del self.thisptr def fit(self, X, y): diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so deleted file mode 100755 index cccc05b2f82997ac2be169cfceb38aab77a5317a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 269628 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ℑ>U7aYAFF5oRP@l+UjzA-O+q6fKUHc1%lYh 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 diff --git a/fimdlp/mdlp.py b/fimdlp/mdlp.py index 12eb272..090766a 100644 --- a/fimdlp/mdlp.py +++ b/fimdlp/mdlp.py @@ -61,7 +61,7 @@ class FImdlp(TransformerMixin, BaseEstimator): self.n_features_ = X.shape[1] self.X_ = X self.y_ = y - self.discretizer_ = CFImdlp(debug=False) + self.discretizer_ = CFImdlp(debug=True, proposed=False) return self def transform(self, X): @@ -104,19 +104,31 @@ class FImdlp(TransformerMixin, BaseEstimator): print("Cuts calculados en python: ", cuts) print("Cuts calculados en C++") print("Cut points for each feature in Iris dataset:") - for i in range(0, self.n_features_): + for i in range(0, 1): # datax = self.X_[np.argsort(self.X_[:, i]), i] # y_ = self.y_[np.argsort(self.X_[:, i])] datax = self.X_[:, i] y_ = self.y_ - Xcutpoints = self.discretizer_.cut_points(datax, y_) + self.discretizer_.fit(datax, y_) + Xcutpoints = self.discretizer_.get_cut_points() print( f"New ({len(Xcutpoints)}):{self.features_[i]:20s}: " - f"{Xcutpoints}" - ) - Xcutpoints = self.discretizer_.cut_points_ant(datax, y_) - print( - f"Ant ({len(Xcutpoints)}):{self.features_[i]:20s}: " - f"{Xcutpoints}" + f"{[i['toValue'] for i in Xcutpoints]}" ) + X_translated = [ + f"{i['classNumber']} - ({i['start']}, {i['end']}) - " + f"({i['fromValue']}, {i['toValue']})" + for i in Xcutpoints + ] + print(X_translated) + print("*******************************") + print("Disretized values:") + print(self.discretizer_.transform(datax)) + print("*******************************") + print("indices:", np.argsort(X[:, 0])) + # Xcutpoints = self.discretizer_.cut_points_ant(datax, y_) + # print( + # f"Ant ({len(Xcutpoints)}):{self.features_[i]:20s}: " + # f"{Xcutpoints}" + # ) return X diff --git a/fimdlp/testcpp/FImdlp_unittest.cc b/fimdlp/testcpp/FImdlp_unittest.cc index 61d5260..bc7f226 100644 --- a/fimdlp/testcpp/FImdlp_unittest.cc +++ b/fimdlp/testcpp/FImdlp_unittest.cc @@ -30,7 +30,7 @@ namespace mdlp { prev = X[testSortedIndices[i]]; } } - std::vector testCutPoints(samples& X, indices_t& indices, labels& y) + std::vector testCutPoints(samples& X, indices_t& indices, labels& y) { this->X = X; this->y = y; @@ -56,7 +56,7 @@ namespace mdlp { } // TEST_F(TestMetrics, EvaluateCutPoint) // { - // CutPoint_t rest, candidate; + // cutPoint_t rest, candidate; // rest.start = 0; // rest.end = 10; // candidate.start = 0; @@ -64,13 +64,13 @@ namespace mdlp { // float computed = evaluateCutPoint(rest, candidate); // ASSERT_NEAR(0.468996, computed, precision_test); // } - TEST_F(TestMetrics, ComputeCutPoints) + TEST_F(TestMetrics, ComputeCutPointsOriginal) { - std::vector computed, expected; - computeCutPoints(); + std::vector computed, expected; + computeCutPointsOriginal(); computed = getCutPoints(); for (auto cut : computed) { - std::cout << "(" << cut.start << ", " << cut.end << ") -> (" << cut.fromValue << ", " << cut.toValue << ")" << std::endl; + std::cout << cut.classNumber << " -> (" << cut.start << ", " << cut.end << ") -> (" << cut.fromValue << ", " << cut.toValue << ")" << std::endl; } } } \ No newline at end of file diff --git a/fimdlp/testcpp/test.sh b/fimdlp/testcpp/test.sh deleted file mode 100755 index e27cdde..0000000 --- a/fimdlp/testcpp/test.sh +++ /dev/null @@ -1,12 +0,0 @@ -cmake -S . -B build -Wno-dev -if test $? -ne 0; then - echo "Error in creating build commands." - exit 1 -fi -cmake --build build -if test $? -ne 0; then - echo "Error in build command." - exit 1 -fi -cd build -ctest --output-on-failure diff --git a/fimdlp/typesFImdlp.h b/fimdlp/typesFImdlp.h index 7214ce9..2a0e72c 100644 --- a/fimdlp/typesFImdlp.h +++ b/fimdlp/typesFImdlp.h @@ -2,14 +2,15 @@ #define TYPES_H #include namespace mdlp { - typedef std::vector samples; - typedef std::vector labels; - typedef std::vector indices_t; struct CutPointBody { size_t start, end; // indices of the sorted vector int classNumber; // class assigned to the cut point float fromValue, toValue; }; - typedef CutPointBody CutPoint_t; + typedef CutPointBody cutPoint_t; + typedef std::vector samples; + typedef std::vector labels; + typedef std::vector indices_t; + typedef std::vector cutPoints_t; } #endif \ No newline at end of file diff --git a/sample.py b/sample.py index fd969bb..6f7285d 100644 --- a/sample.py +++ b/sample.py @@ -2,6 +2,59 @@ from sklearn.datasets import load_iris from fimdlp.mdlp import FImdlp from fimdlp.cppfimdlp import CFImdlp import numpy as np +from math import log + + +def entropy(y: np.array) -> float: + """Compute entropy of a labels set + + Parameters + ---------- + y : np.array + set of labels + + Returns + ------- + float + entropy + """ + n_labels = len(y) + if n_labels <= 1: + return 0 + counts = np.bincount(y) + proportions = counts / n_labels + n_classes = np.count_nonzero(proportions) + if n_classes <= 1: + return 0 + entropy = 0.0 + # Compute standard entropy. + for prop in proportions: + if prop != 0.0: + entropy -= prop * log(prop, 2) + return entropy + + +def information_gain( + labels: np.array, labels_up: np.array, labels_dn: np.array +) -> float: + imp_prev = entropy(labels) + card_up = card_dn = imp_up = imp_dn = 0 + if labels_up is not None: + card_up = labels_up.shape[0] + imp_up = entropy(labels_up) + if labels_dn is not None: + card_dn = labels_dn.shape[0] if labels_dn is not None else 0 + imp_dn = entropy(labels_dn) + samples = card_up + card_dn + if samples == 0: + return 0.0 + else: + result = ( + imp_prev + - (card_up / samples) * imp_up + - (card_dn / samples) * imp_dn + ) + return result data = load_iris() @@ -10,26 +63,38 @@ y = data.target features = data.feature_names test = FImdlp() test.fit(X, y, features=features) -# test.transform(X) +test.transform(X) -test = CFImdlp(debug=False) -# 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] -# test.fit(X[:, 0], y) -test.fit(X, 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()) +# test = CFImdlp(debug=False) +# # 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] +# # test.fit(X[:, 0], y) +# test.fit(X, 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(Xs, ys) +# print("**********************") +# test = [(0, 3), (4, 4), (5, 5), (6, 8), (9, 9)] +# print(ys) +# for start, end in test: +# print("Testing ", start, end, ys[:end], ys[end:]) +# print("Information gain: ", information_gain(ys, ys[:end], ys[end:])) # print(test.transform(X)) # print(X) # print(indices) diff --git a/test1.xlsx b/test1.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..2e6bcb2ad0c0294b3d0cf498e389419d3a927507 GIT binary patch literal 17905 zcmeIa^+Oy_@;|(|ySuwvaCetLaCdiiCup$X76|U{9w4~8I|O$L;k)GIeV4oE`3F9? zKg{k-SG`KQs;8%?Yn5cdz|jGa0B8UJKmyn}+<5N?0s!Pg003wJXi#lYdpj3XI~RRb zPX|+HT}BUE8{#kEpwzhlP$2#PKL3Y3P@XiR(8r7{elPV?beF+uwN?n4<1}axl~!4x zJBBJoZSWmo6TAOJzb^?oZk`$1V9mk0vANm6jP2J%1P|4D6PqMNO;E}vl{C`UO?$-+6^_0zVCnsdD-F0lLxg1V)P$<&@C*8v%^KXH_L!=QO z;MbrH=M3rbC=;!_YU&XVx-gZVD^a6wDkyQw|aRj$uauKV>sT#MRPxfs7-Yyo3U zC~`dblLlyrOp&7;UEXNmbF}|zG#_Gqws88j_!eTU&?}yYk6tXYDGxl2GyJYRtigoj zue{ZsfV}z1rWb|!krs5qUGEFktPZfBvuB$RI>A*3M#2l-is!ymThfpCh{@BV+TpXR zd_M)L5OwoE5^|w}5~1TiOK86k5R{PUW`<1G^TE`9%NWGueS`!6USGigO8=I&4Qk9} zH^5kw17;;0Fm3gnOl_Q*7~hWnOV|IyIr=ZAmnX<8_A$eUolE@;AG)7g`-Cha>n<$S zMxyE$Aiavz5R*@ix7J04kF1It3?}K{;rDZRWsNW9c!=a~o4q^=6`hx?(Y+!p<;l?% zik8ypvxH;$RzHf{-0j?5nxu>;wOdCVZCP`1p6vGxGKrZ>u^QwFMs-{mw6FMKnEYvh zS_AT$>qZZiAaf$`Pbcfi6DKnK7d{srAqYlr%biT8VGKDNnJ-oP4B3#}KH{pq zx8Sy{Hp+J5A@$TZvFW}R%jiOT@nKNN98w`=M}1(OkQ}7Qz4h0sXTKcD^6ck?=_?z$ z_#PBRRJ;zngZ*ccNMLkQfdX4Z!2keU05ph)4b$K9#NFP>+Q{DC`t9!akDLJk-r|6? z|F=Ko31e2kAwJ|hv@>|on}PQwFJ!1CNu<*D2_T}UP1$Htze3dI8=C6~-_!9xnySlw zT{CL;I^(_#2iCAoLtTpx&a+cC&jBkCTjf4M9MMqbazH?f9dDq&zJ9V^J%cY8ZwrMw z^(`KBgwN(HxpB=x(j$oO>a4&`dOmy%em(aQMwb?#=`ksc*VVM}ak?juEhI@d`t6x&T|a^IpZ|=Y zYsnn)dSLWO!vFwCz|a6j(7(n`x!Q`|&O2mZrb&OL&~{pK*E;fkJ*m$jxKfybJMzm# z0r7_s5sZxD-w=ad?h#GDOV5jMnf-t(+1k4p9mP4`9;u{lFsIa7pM9T|X{>API=|cQ zmwCMLp=9ewi_S7@rnY2B)!(qi#0otY^VZol&EH!i=bVs8HKZvf?cq8t zCF^N<#|?l~oJtj`L_f%6Z_V;M{|I6f?n zH2-3m(ZB~~QBUQ&E7%k935jHpU~rS291rGhR1FcSJmgvW!x_kkFBsWF(G;{)*@6t9 z=b1d+dDHB;E{cO`=~S;3cg?1ATE?_=wjrUB^?QrSqiRmTlFd>$$dv7u*c4{jP2(dA zw@=p%lR_^xaSgN{-kgUz3r>xNx-{y<7nd3U2i*-9bWmtYdI~g-WSjL_)En-H=Q^#E zngemL;f2p9Rk3i85Kyhb*g~>(0Rr_4s+d|-!zHnu4an%^w8X;J4_~-FLZ-!&Q}AvS z8gH5MvbGZu}Enx$~ubQ*9dR z=Z}6Fe=r6~`riNHIhPi_q2w12m7Y~ABg?jh2>i)nEXtDegaZTJtt0NEA?p!Mo_pq# zH%9Yq$A|j{hx{`wP^{)-HIFS#@MHLzA?ch>N4$uP1$y;Xs88a2Df(~aO%Zg8+G zB86&uJgyr2zB`|p3!4%4eK#A*aq^FeL&{D{_IaDH%~8+kumcMjMw&__>Op3T7b-fn zu43BAX97Om_xwvkm!viz;=B|khG<0fcrA@v{Uv*HQhbV;H!7C8CU6w0~j`&~gNb3MD+;n%H|tLygih>5FzN_Hz( zd*t@T&Fz*G&aW1kU)XU%uh>enR5}eEa#PfaOB=xS{m%qftt|gK37kW117}$Xe@k#@ z7f%~g=eJu!ftt2`1~a-}PW`LFV-~K(Py%%E=R&FE%%r9F>NM+fl72JkarUo&6eV3rcm5xwC*Jq*3OGYDg_-sr{ zquwl<`u(TA5IM(&dvc1krt-*wjzgP$4RgZdiCcbso;8SShJl##EVwb+mjV3D`eiCV z@`;#AS4$>9%3`7qsRfReq3?!7l8L1QXQ*j4-FMPqJKwF+$kMhfx*yM1GT8VlI!V>F ziD!)skMrk_0TwzVXb~6=I^H z5tD~H22O!fOL@!5rTP#8n#x>+ehu80VWK(%wIpk_po0MwzV5Kr8<`|T@8qI2xR2mr!O0%TRVxV&foYlbV}XEv2%gr zbDg>1n(H21Z}mR-ZoE@?#fz$p$MBX1@Ys-eWIu`w;_M^`$1P*6eV6ehd(2L9jo#(_iW6uwB~g^l0!rkSrtAp z_*^vjqSioH71_7bR&;+K=YLZ5>!r%S6SpdI=jiP6Wvy>!$I$}^WfB)gEZ)<1G@&4xMLhALPOEE`qJ?l_V@YT`z=gp(T{jY~D2QFWq z=8}=xu162|R}Zyz@24w|W&MUR7d0Qx_ScP+zN%}*fwC3O!RHmuq80tF%t%GW`?#V7 z@wSZC?fpVJy_bu@qk}I#&d#mA&R{HLPYd=rNc#8UFUF2*9U(VS{ERLBuT;Mz)$X1^ z1J_Pv2G-Reb)!CqidO}6mg!-x0SRgk-`BzF;aqs3dB|_J!CuVa`00dJA^6n6bb|OG zJa~nj7pgtXcdv8{qT#~&Hd%vgj9(bH!EWF^Y~lRiu4)6h;NN_9Hv3_P;m`cAL-`Zs z0qi22&95PQb!t=5@TXNJzVRzK@ahguSB3iNLFu{eoOfkp>3N{Mnxa3$qIJos{M>y_ zsk;qTNeYBGA=ViGT=^V@Zotq@o757W3$1r6=)*y6ReHlPi9s+?iFc@?tD-vKRp(x< z&CcKWVg(`X)Scl1Zw$NK;`be@f1e4Am@iUc)H}7bDm&(Ysn~DpHe~~ z)|$~PkAVA!t|*t!y+z~4Q<^smK^qmz6IpZTjV_qdAUQlyzqBqEcv2XJedy28t+T|- zMW?$lvl<3?f{)5c<~1916s3+$h2wj~8|!%NU7xe&Yu&yG8gtM2N|s1ArRV`;BSe9eZSe6rkDOn9qOlT?s43=wzhD0eZsSKK>|y7 zI)NA0r;CC;LVYXOJQ{ zw(8vnH6?)eI~CRP==(ajd}!zBHhAZcdOh<7_!*d8s%;pJHFk|Fn>cOnt1H&7>&;Kc zBl)Y`H^5dDK%KKp8delQCX8o#Q`2QbZCT$POmC*?6dFwEaIlplc<4EN`{3w++m(=} z6o_|lP>n5w_8I+xn?4fmI*5*S6s{7Rj;Z-ea{Fea`t~Nf9F=+$C?^MtdK3uzTmqqIeoxxQ*FIggoQA(k|g!=o;-mF8;PN~B1X(iO6MUO@xRsz{-nU=LJWxRO$$ zgq^s;4c)vlm+BSPMPug`C9ZhZ zwK1lE6A`@mknv+wUfC8Q3~JsHYL2X|%^shXdAjk@=t?OzwpP+Hpykd$%f~OLu*UQ1 z3(sPwMIFaGe&PD`<|VzqFX&6k;)h~}lhHss?o=%EJ_Xu7|Ke0GF|qtLPN~D_jh)^1 zhN8{H=QwhjZW^c%HWk~?Txu$yR+&JpT(ScdZC8bB#({t}B{R(hee9L|!^|;2#Rdqb zan;*|AQ8o#>{*D%#Eh;<>Z- z#YMW$Zyw!je$o8ok~+@{aKnVR7O{@8toW*%3z|}4nj{03@J?6aTPDy~j!%cOI|*bZ z4cxTb(S0*@UsB8#kPqMu>VWc3D6^rhu`yX zw^9z#$H|m-9%z<^GeWkTKT|%3bJWPW!|23=il^+|)+Dilw^st!rHPY^4i{NkxWC!g z!V5IMR5*Vp4?$pPrUOHBdNlUT!3^4$#s}8NYD*DuXE)rP+MGaOD|!GY`3M8)y*p$8 zj$k27XpRR!^1^6&S4Mx{*^57LMGf~;eYPT^wV9;523trcIudt+4j-cRezJVBlEd_(2+aO2#Fz9Yi)XIS_gAI|9L}PbGL3ZTG7$ud>=lrW5|RT0lle$mg{!T0w1r|<0|)`b z6g`%brN~Wt7-f`YWC)JaOYYSExG&9&nP@$6eG@$L0gPPc#kl4a+M=&U|D7=RGzj2?zu5FGr;)xkQQ@GPt)U6{nb7M97 zv$fVKnM%6Pmz*3%?(W1(dw4@7ozbrZJ%@7>41GOB+SJ8@P!m(;VA_vcTRLBX0Jq#@j8uk3 zeN18k4XQuE9K#egTK__U$c#qmd%+kcCCH@Js>uzfA`GE6Ga=oCT<`%Fc6tKt$?QiE zHX6Aet(B#*+^6MYi*SU9**=ev`g4Fh6`jGjfsa5kb^AiBakvi&QPpc!iQ+LRjY-~yuR`zr9twu(aZ@0MT!;BiQX;}vn7wp$swne6tJ-fkB?5n{&c;~ z1&a7Q-j5ugW)@{N9$h|&O=>RjK~bz)+^o=4&A?m)#6CVvYapH#`Kndi%<3aHnwVL7 z=-q?b12HM<%=Zgqqe%%fwvu#JaFnz$lL@iU&6sH=CTZV*X3IeG0d1beL*_Lpj5oy; zKKYcUj0ph~);n_vPW*$VR?j^X=SWWO6I(uVaA|y+ve%gTj6l5G&?t4soAdJNBU6c4 z*=&_#MsHYSO=O4CvX|t-sDO|+(*tiU!@V&;vKdS~Ww3^5vW<=hkaM8WMiG;qgdadj zLveR>6gFeCBnw*?>ZUR=(_l5;@Vn?^b2Mut4jLnrSwtT8xwv>Bk!pH7#A3M{j>OgKkjD7iwg@vFGpk_6)bE?M-n24DO2|l zlh&otvx&gNUh$B<$41+AmEb``VfO~q!u2Jhk4X$Q6zr!GFP5hSZKVZeM}mH-2fEqS zEJ+WTDiJC?qCt6F^VPaG@RvKV!op`bX=&I%yiwP;IO#=G8S@4N-|+B_Pm0nW;z)aM z(S)`Fz=>%nfIa1c%EI@45;d4>_#(tS61J;9WL#Po&| zjw4=3g-&J-RT79WmnP%8#~vzs^+OY6r8l6b9ZieSjEKcy%g}3)Pa)Mr{5i&Mp`JX!)hT<2 zmrom!Y;dKD1h?;ymSc5m$!!M%?~oIs0@6i_b^*JyZ!s<5usHS*e9oMNJ!jE*+g$mQ zs~85-iq8e(vy{0;f4a~?eBq~J@?t4aKE?H@Hh(`E^tdD(U5?7Dr9gjz47S+o6YFE@ zeGCuDY0P~BZ43lS-Tw11zk}n`*Z;ca^79+ouP)$P3p=ot>~Cu>Z|@VFElf>aod5oE z>h}rDKVMCS#ErrBzP*wOI!C^&hSqwC+EbTY1+s?m~etQp)uJ z0PO#;|1Zlk6E)+OnUM!K=x%w%{HQp$kPR`El{_ufT)p}5%mGncg^ew$w{7kxotbs^XY^*_Z@3Ls03O;fArw2};d21}7F2MYh4tUg77+ zO4`w9{I5x#=Am8KIR$V#cju%q<4Lnlwm#%gG5gOql0DS9Co-)QuOxCwkg&0u{Ebpt)zuBkgPFAhXPpow-OYf%qJuY#IGC}EW=8wOUuZWp! zJuS4?hvHiM^`xO@+;}D%{T!ciFurSnFJs2@qvMY3i{zimAV2jzqb{~M`2K`@i?rY2 z=8~x!i!X^7Qe|`qYGtPOic=dvV4I)wgdApQkmH8+*-+o#xz>EnyTBz=L`+uMeYe@hQggMejVm(gZJgFrRPnV0-G>6OeFv0r`2p8xTh!^KX9GPA-Hu zJLqW-|6#EEZk=bF-ajoCo2qA(cb|G?}jjD zioVE^+;k-&`N!7R@=){=Y};~Ab^-?K?nfqiUxJ&CX!I5QqC%1APj)W6pm9ephNYTJ^(Yt z>o17I=x9?|7k_W#cbxJ9wvhtcHdYbmRnd3&8D|tjgP5;ceZWQ;>&_ul9j8jcgtT}C zBIrAiU4Ph>#!kTn>YB~t8SWz8#xUE)Atiqor$dt}P}>LlE@#TBGXtsx@nlzN{S`F9 z{TfK++6-c*qvf8z@oD}G66uQEEvwvZ?KUg5C+7w{B%YWS zuNH(u6`lHHz^D07NZltHB|KpzJRfwjtD(Q)8N`yJZ$RfqaTyE%WdgqP)Cm|c^4Nhz zhDKq+0eITX2VJ{uyPtgLZt;XlaLabKzCOM)knT86fX!7URwLA7um}6lQda2%kl~O$ z)w%+8TX_O~SJ_$&piV|f4qu2`fyDJwLx57!TB1W5xwZ|C*-@iF6S5?!;A7(8`{nb? zKklWm=fl~uRs%uO=L(tY=^_!ZD;G7-Wgcn<)a3oIe4$~DthA7LH_Bsrj@}=I^FSDy zOEJr>zv^1o8+cm^=LI^w=BiXzV&K;0EbFN#S>yr)i&4w1LkCVA8dFfwaj8Ed(SrY2 zmPzcdk_&vH08cXub#*T00pu3=0^z|z3rD)$lyDY#sipP5dVUwm3k=Q=F6~|ymVTr~ zDC=I=zc|gM1>}gSHqsXKx`nEf&ye()h#t3+$>n|RUrU> zZ^{MrQgwowoGb1gr>*Y2S`R4&1SFizO#!)bLGyrsQoZUPvGibc<$cOH044IhGQM&! z$;m(^0^rF}86Q2kByx~Tb(=!kIUq9lsFz3+=7UB~1}#Vc=|_D6B-tL60%C%2zv!Z1 z(h~hWLk6xO%!0&Wq-?}Ua{uJ;Z<|st5*T0r@#(JNJ}U=s4k>eQqMg9}0rG(4@V!lF zabX^p=gmO2?gHTX?IyI>Cxt!%k4*c3O9R5MD zTq#lwPYoo6T&N@LgJ7WGXu?blq&KaO-?TCy_!}*On@=><3sko9C3K?64`Gyj~nJ)#N28(g!y2!!$88~RS@)XNk=1o4MT#sc_;v^xdT@n zP?M`-LI8E<_2#Hob?x8Y+ooa0Y;NhxRrDO5B?|1r6xUipu`YuL?B% ztoW+;w?r=>R#7HZ_h?OjP3lNGQ50v$FFnj}3<_9V^lLz;gVv9O& zj`I8sOuzpI+?#(u?+*B8whZ+fI(z>%_@&pZHR7Lw#8G=#H!6P{S_%b-bn(yu`o6MS zpQ{w;4>#v-f79Qd0@`iF`5a334_QW>gA3~aQ1+XhLR8g1A=dC|bpB~y+Y;076OY+E zFDRuG38cS7tsV9xzgbn3=9K6ENvyiPsBY?^?jz#h2r#xSbt9GrD%%i*RZRU*lwXxaGC1TZr ziFYPi)dHh_Lbpk@g4Cz?TcRYc^ev`(tpzsOW&RXMcR7%_pQUb#~v`SI?wwVNqxlTk~ z^x>pqZ`2)*@Aw0UeG_WsBE=vY#GSduJE@dfki;pJX>n=q+BoBuR)Tr6NeBRA ztO#>t1G|j2-5C)bV8jWtZHSWhMy#^+CpGQ8in};dU2)}cGs>=gj<6}n6yY}o!t0(Q5xnO zx8;?mYZhi-3uWITWzJ=~iQ?xxqz1swuEW6hrC+A}e5;Fu+P zCjcnJOH{!xiTCC@=L>2GBM?hx?vzJ7%$b*tjr2#41ZP_5ClfTI0j!Sc8_+^6I1obU}8+*QF`)^Qtr11vg{P44| zY;2W7O|2Pc;mpvWgc;Q^56?KINdz}5ziu5HK%)X7TXB$RTvB0`_HyMsL0TZs(0W7* zhOk{Eij*d-PY2Sy7=AWkE|WGGSSAvYKCAhCX)E3Y;cu6oq&lnqMipanTneOmBC2I( z!(7$qdvyp&t1)Q6y$i=pSSW>u@=@)3EGES%u|l2HFi(iwO?ac`0p=;3sytBnr3})? z468Ry+t~5I=phW`aK}^Gn|{9Oe83ZF!du!0w1-~YIm7M@oPGW=bRRM^F#yMci*0gM zD}y|@X8Z{4`|5%Ap z$^`eqw>BS^_-K~5Hgm5uZE-e5pjwh6tKdcn<~lM;2Wn|6yl?(`d7Rx9`95J%-n{sRXD$C7rJ2Xv{AD+ixDlq1A*mbD%9P{QI9r$={Iion_4ux}#kYV_GQK-e}Ih z0cqYeD>JhD&IR+Lmv=2Y%8>TfecU7iSFAUuD{PExjh^@dU4F+8{=Xl3ejjRSq~sKD z<>_T6M(I8bNz2pKsIgA6sjE;A%S{B-$X>y9e<_rKm42k4cx++Tldv+9u|kP3FE9A? zIY%FK=Wu1|Fy#Qt6wADz@blu^F4+Hkbnn4J?o@yR00xNP3PpZzg>ef+&% zaiTdEg~y5Bh4mx|@9h4QV<(PceRIMlagE$0D+#}$@kIFp8*4&49vUbG_pJ(b!PgWK zd;X+pAuxoFn>ZNq`Xiz#sni z^*fcW_%ovyQ^{vO`&)BSv->DYB}Jo{!q`2+(f^cP$?Bd?~OxmeAj4`yq%DrV7!=(2x7Hu6qShypBW*DA-yo=xe=J2skzqX};R@M%R;{E%xxj6mT zmlv#c{jOgZ$CsQ(vs9P8{arsFM^d_8FL`dOw^uQkI(@IMjuNppd~XjF;|P{l@Ci~c zNIuqFRBjocQ$`sEB0gV&2xj#&i}WW5p&YsupN$NG>S+@n_qtY}_O9S-3_!H=by+X9 z5?!{C$EH zWBL%;eV*`JT;VQQ_#MP&Lf!s%39?Ry(=AchZ1MbVi!n-k&dYKML;Ze~h$Q0i?!nSn zK5y<0No?njhdlZfH-7MXzP;x5d*Dh zp5ldh=A-LC=VxCx2;9oef7%I-<70(GeAje0hOBHI#Ag@=4GWL878HT;OGhlLOv~mh zDPu9?9TFJ2#D@;F#NC*06CZ1-e!346x`Q}FLd0obJ}2>HP@5iz1=hjb6VY3HS!Azv zJ0z4l&wHvl>&-p9K9`!!=m}Jrj$5Z)YYp7q-3nW!wfh7PQ=VTPW-GSW?6Hv~osB?z zYZGzz1#h2u(rC&`VW7u(|6r^HZj+=zn5;a}x&Wx11RrO$_ z%r!0uccsI~nXGtLxb}#PnNcurDQ`_LfrChR^q|p+5lxXPJk;VpU$2<`;diL&u9*T! zy)=VuC})PJ?24_dk0^q!XC9)rl%_G|qA{g(oRX&{;kXCOY>R>6v3IvA-mw=hyeu4M zhM#m`j8Rmd)*f96JDw)tmB?0-2BKud#6}$F@_wn+(bLM+vb00IfPpO9r7nhfnmGt- zi=KDv^RwnaYg+g$t73~$3!W3(aSRfQwKyqNb08(<`^kP@yT=AA=q6e+cI!v9L+ri< z56Bj>S#7K@@0;Clq_gcF+zmhDVAY0;CGqGaDhxxi#HV^E^)u)*_$MQ0Vhg< zh6WQIRP4uqs9>k#F_yrLYK-{3NB3=mVT*l+2u!_1H~$||qfuFw}*SEsyE&qfaouQ>be!PZrRi~q8cN^mG^RLfO} z{)bG~!_)9;`&? zLQ$fk)ow*QLjercSWihcgR&ug;aAq=eaQJ(X=Km^KfYXxlM0xvJX5`;hPn+Hg zODbv>d(9%+N=WD*)@;4Sg4vcd@Wk}e#; zw7^_pbfYEG+Dr|rxKT4j(DSOZo~q#+yLSEvC82KQIUNHgp5DB8-G#`|ar82^w!bLe zr{#OnI)JnR zgdzv_7&dRP2^3GNjGyVwVlh1WWCHp^&O|Vvn)5>hKR8@$evjVg1QI)*?c8%;k6he% z>F?B1-$*j8ifZ_0u7#0S0)5pb zQI=?eHKo~@p2d|08GTI88AZ8gl`|{=SuvAKqV5a)@#NS>=URcA_TQH^QqF$ z(}rBQ>mNe-_}o#Wm2?Z1Sof(6;&gmNg<2AJ%s`y+bcU*$D1Hc0nOExHIj_Ps;rMkXf8T)DHbx^x~{6zsNkVivu@@0^k zpY#mGF+#CZ{=e6O3B3e9rUHYq3K*2AK>q{lz>Mwf>`aYaEbZ-n@05>D5Vqc7Mh-oP zdqEO$mvlm1Mcz)LEXixaZ}irsyjnzQASa6v?X7+F9h8@?OA2jZ!j1Xaap0-NpQ%fw zfSriYne-?o8@L{_{M4Alv{7b5B2Ie2;nHJF!<4$)_jI;041PX^?Ee{@&4+d`zF40& zc@%}9K>BdXxd>(o#1Th3`6)uFh>WyFLB4@83GBySa<$98KQZF=k4baNX2Kyt8}p;9 zfrQ?)J?9^yA)7nkZy7V|_{w!r6QlG0UYtviPN}EhOon6#4htX8*l2yfQTs?MGErU_a6W`;qW({pjdw z>g1_vXaubJVfyR$@8{X*__4Qw_mFd`cF|q$;{q!cT#kw-Q8A_nQ54Bto{WCd#^8<; zT#|JHDm9Q2{AN${!Hr6@gOSAY4l-=IdKqah*a)b|A3DXX6cf**U1Ztfg-#!=A!v@e z6ZW?6%zmv09o?NM1s@;}7Z!-vpvo{*39<4{BTz5U)W^f?TFO`fS2~(70K@6A!Ni3L zFyiAOVpp$1RhMtHzwVm!J_Ma@s5{U!Pkq4Ra$+ux z5^-o=X310mlbkx3*+EZ4)CKg-3tbGOqsCc(4aj#saZ1U{I4Y#5aQHT8QWyEf2J>;t z7yY5`)?|BQY`db1zb_D zxz<+GLIsOQ4mK&a>(?qPWm=dnKb=D+(!pa8G0m4rP!X)Z273@t24KC(fB*l9e~fMa z`2H{dMxiA8?*RW^3I7kqx9=w4ROw&p;{Rm)_v+w(Wn2XogZ+Qk3jc}oXN~AzNQA(u z(LX9i|78BN{_HR2SNPw|e^sOX$@*vg&R?ugz#SGqxz2x9^ZbeM=Wdk05bQ|)srmok z-jqK9|J>g3FMy