From 2ca58d139ac69b050208b090221ba0c6d9561d41 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ricardo=20Monta=C3=B1ana?= Date: Wed, 30 Nov 2022 16:11:21 +0100 Subject: [PATCH] Enhance cutpoints --- Ejemplo.xlsx | Bin 0 -> 9855 bytes feature0.txt | 152 ++++++++++++++++++ feature0_ant.txt | 25 +++ feature0_new.txt | 212 +++++++++++++++++++++++++ fimdlp/CPPFImdlp.cpp | 75 +++++++-- fimdlp/CPPFImdlp.h | 8 +- fimdlp/Metrics.h | 1 + fimdlp/cfimdlp.pyx | 7 +- fimdlp/cppfimdlp.cpython-310-darwin.so | Bin 0 -> 112176 bytes fimdlp/mdlp.py | 6 +- sample.py | 10 +- 11 files changed, 473 insertions(+), 23 deletions(-) create mode 100644 Ejemplo.xlsx create mode 100644 feature0.txt create mode 100644 feature0_ant.txt create mode 100644 feature0_new.txt create mode 100755 fimdlp/cppfimdlp.cpython-310-darwin.so diff --git a/Ejemplo.xlsx b/Ejemplo.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..355968bf5b389f8a9f65a4aa49a5c4281e523166 GIT binary patch literal 9855 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

3eBB~f(=%Qo-E@MD(*${ znE(n;(v)dchuZbk7S;CE(XiA#^0=|6n? zELszDo?m3B7@s>@m$jBY^4Bc+IuQEdyMOs)>Zekd zb3Fp*7TQ3P#N?{SQ~MI}O;I~SXFH^4i&*^XfnOQ4KOpDgMW#qKszDZWM^Cadd#Do! zCF3i;VI_cnv=0(w71OwCVb$zK3?q05wc*3ux%sgnTv;b7dbx1K;(_HxJ4+Oi#T$$Fqo5C8$2YZUiBy2X|8)fE~hg^-s z1gk{+gZgkZJMhpQ7lN$0#q}vwYdb=nv#qNNP-@lfoXpym$P9PtD`_^$mmJneCZ)*U zxD}li*!K$7f(t+dy1>VWvE|nZh+b7#*L*mSg5Z(Xz`cJ>{=6`ya{kFi2Rvo;F`qK} zrVb`b&JK<)Y$guQX8+-$|Ch*rvemHYC4~-lg04e(@8H}^ooRpgWIIz30X9?s7tvwz z1q@!Ty;X5Q54#8!n>nE`#4s#jpMR-*)7xrB2e1AVO~xWO4CB~)-ETd&cU?$4VtZtt z;uSF++<+_+rnbLS^VJ>mI_^d;$V*)#Lk@oS3r!(oIaL*VUKW8(iyz2pSRe=2B9|%g z%PXE9+_iFBG`^#ISzSLP5MdDSi&_DUQ8dOYD6QtgCMd*k%3$c6(L@heUoX@G@kfCX zhF3#WT*duvvt7dG&suQN4|0dlx*N)x8zvzY*GN8O3&Py$3v%{uT~J+_%dtSiJhkJq zn$L0w*cRM``F%Ikg!Ds$H!iOCSgX|2=Gpw?=B5dv121$-ABco_=I~QMa~5KJ&p8+H z=7EZ(4-}+Xd`AIov=CGQM#|VKtJ|!;6B8d*BQNDWtoz^@`S+jUNoNnpFfaZ1AoNRg z4^L+IPtKr2Ukfqv$ta1R`~=2djnc@`@qae?WQ_kQsnPNdb3X}5m>Y7G1!8_XWfcDs zOC%(JQg2~zRMY0MG(9(eK6DEtM&H;T5aIHNzdZ+Ftd;tmDQ|Bjc%K8b{ z1{OTDqGj5T|97JR3Yz69viBujju%6`14y-^BlM8vIquuN#&>wcL{YzJg!3FTZN|dwl&<9smd@0|5RJ nZGRR2yC?jsI5p*8#Q)4 literal 0 HcmV?d00001 diff --git a/feature0.txt b/feature0.txt new file mode 100644 index 0000000..fbc8eb6 --- /dev/null +++ b/feature0.txt @@ -0,0 +1,152 @@ ++++++++++++++++++++++++ +( 0, 13) -> (4.3, 0) +( 1, 8) -> (4.4, 0) +( 2, 38) -> (4.4, 0) +( 3, 42) -> (4.4, 0) +( 4, 41) -> (4.5, 0) +( 5, 3) -> (4.6, 0) +( 6, 6) -> (4.6, 0) +( 7, 22) -> (4.6, 0) +( 8, 47) -> (4.6, 0) +( 9, 2) -> (4.7, 0) +( 10, 29) -> (4.7, 0) +( 11, 11) -> (4.8, 0) +( 12, 12) -> (4.8, 0) +( 13, 24) -> (4.8, 0) +( 14, 30) -> (4.8, 0) +( 15, 45) -> (4.8, 0) +( 16, 1) -> (4.9, 0) +( 17, 9) -> (4.9, 0) +( 18, 34) -> (4.9, 0) +( 19, 37) -> (4.9, 0) +( 20, 57) -> (4.9, 1) +( 21, 106) -> (4.9, 2) +( 22, 4) -> (5.0, 0) +( 23, 7) -> (5.0, 0) +( 24, 25) -> (5.0, 0) +( 25, 26) -> (5.0, 0) +( 26, 35) -> (5.0, 0) +( 27, 40) -> (5.0, 0) +( 28, 43) -> (5.0, 0) +( 29, 49) -> (5.0, 0) +( 30, 60) -> (5.0, 1) +( 31, 93) -> (5.0, 1) +( 32, 0) -> (5.1, 0) +( 33, 17) -> (5.1, 0) +( 34, 19) -> (5.1, 0) +( 35, 21) -> (5.1, 0) +( 36, 23) -> (5.1, 0) +( 37, 39) -> (5.1, 0) +( 38, 44) -> (5.1, 0) +( 39, 46) -> (5.1, 0) +( 40, 98) -> (5.1, 1) +( 41, 27) -> (5.2, 0) +( 42, 28) -> (5.2, 0) +( 43, 32) -> (5.2, 0) +( 44, 59) -> (5.2, 1) +( 45, 48) -> (5.3, 0) +( 46, 5) -> (5.4, 0) +( 47, 10) -> (5.4, 0) +( 48, 16) -> (5.4, 0) +( 49, 20) -> (5.4, 0) +( 50, 31) -> (5.4, 0) +( 51, 84) -> (5.4, 1) +( 52, 33) -> (5.5, 0) +( 53, 36) -> (5.5, 0) +( 54, 53) -> (5.5, 1) +( 55, 80) -> (5.5, 1) +( 56, 81) -> (5.5, 1) +( 57, 89) -> (5.5, 1) +( 58, 90) -> (5.5, 1) +( 59, 64) -> (5.6, 1) +( 60, 66) -> (5.6, 1) +( 61, 69) -> (5.6, 1) +( 62, 88) -> (5.6, 1) +( 63, 94) -> (5.6, 1) +( 64, 121) -> (5.6, 2) +( 65, 15) -> (5.7, 0) +( 66, 18) -> (5.7, 0) +( 67, 55) -> (5.7, 1) +( 68, 79) -> (5.7, 1) +( 69, 95) -> (5.7, 1) +( 70, 96) -> (5.7, 1) +( 71, 99) -> (5.7, 1) +( 72, 113) -> (5.7, 2) +( 73, 14) -> (5.8, 0) +( 74, 67) -> (5.8, 1) +( 75, 82) -> (5.8, 1) +( 76, 92) -> (5.8, 1) +( 77, 101) -> (5.8, 2) +( 78, 114) -> (5.8, 2) +( 79, 142) -> (5.8, 2) +( 80, 61) -> (5.9, 1) +( 81, 70) -> (5.9, 1) +( 82, 149) -> (5.9, 2) +( 83, 62) -> (6.0, 1) +( 84, 78) -> (6.0, 1) +( 85, 83) -> (6.0, 1) +( 86, 85) -> (6.0, 1) +( 87, 119) -> (6.0, 2) +( 88, 138) -> (6.0, 2) +( 89, 63) -> (6.1, 1) +( 90, 71) -> (6.1, 1) +( 91, 73) -> (6.1, 1) +( 92, 91) -> (6.1, 1) +( 93, 127) -> (6.1, 2) +( 94, 134) -> (6.1, 2) +( 95, 68) -> (6.2, 1) +( 96, 97) -> (6.2, 1) +( 97, 126) -> (6.2, 2) +( 98, 148) -> (6.2, 2) +( 99, 56) -> (6.3, 1) +(100, 72) -> (6.3, 1) +(101, 87) -> (6.3, 1) +(102, 100) -> (6.3, 2) +(103, 103) -> (6.3, 2) +(104, 123) -> (6.3, 2) +(105, 133) -> (6.3, 2) +(106, 136) -> (6.3, 2) +(107, 146) -> (6.3, 2) +(108, 51) -> (6.4, 1) +(109, 74) -> (6.4, 1) +(110, 111) -> (6.4, 2) +(111, 115) -> (6.4, 2) +(112, 128) -> (6.4, 2) +(113, 132) -> (6.4, 2) +(114, 137) -> (6.4, 2) +(115, 54) -> (6.5, 1) +(116, 104) -> (6.5, 2) +(117, 110) -> (6.5, 2) +(118, 116) -> (6.5, 2) +(119, 147) -> (6.5, 2) +(120, 58) -> (6.6, 1) +(121, 75) -> (6.6, 1) +(122, 65) -> (6.7, 1) +(123, 77) -> (6.7, 1) +(124, 86) -> (6.7, 1) +(125, 108) -> (6.7, 2) +(126, 124) -> (6.7, 2) +(127, 140) -> (6.7, 2) +(128, 144) -> (6.7, 2) +(129, 145) -> (6.7, 2) +(130, 76) -> (6.8, 1) +(131, 112) -> (6.8, 2) +(132, 143) -> (6.8, 2) +(133, 52) -> (6.9, 1) +(134, 120) -> (6.9, 2) +(135, 139) -> (6.9, 2) +(136, 141) -> (6.9, 2) +(137, 50) -> (7.0, 1) +(138, 102) -> (7.1, 2) +(139, 109) -> (7.2, 2) +(140, 125) -> (7.2, 2) +(141, 129) -> (7.2, 2) +(142, 107) -> (7.3, 2) +(143, 130) -> (7.4, 2) +(144, 105) -> (7.6, 2) +(145, 117) -> (7.7, 2) +(146, 118) -> (7.7, 2) +(147, 122) -> (7.7, 2) +(148, 135) -> (7.7, 2) +(149, 131) -> (7.9, 2) ++++++++++++++++++++++++ \ No newline at end of file diff --git a/feature0_ant.txt b/feature0_ant.txt new file mode 100644 index 0000000..a1f74b8 --- /dev/null +++ b/feature0_ant.txt @@ -0,0 +1,25 @@ +Cut point: 4.95 //5 -> 0 yPrev= 2* (5, 4.9)=4.95idxPrev106 +Cut point: 5.05 //5.1 -> 0 yPrev= 1* (5.1, 5)=5.05idxPrev93 +Cut point: 5.15 //5.2 -> 0 yPrev= 1* (5.2, 5.1)=5.15idxPrev98 +Cut point: 5.25 //5.3 -> 0 yPrev= 1* (5.3, 5.2)=5.25idxPrev59 +Cut point: 5.45 //5.5 -> 0 yPrev= 1* (5.5, 5.4)=5.45idxPrev84 +Cut point: 5.65 //5.7 -> 0 yPrev= 2* (5.7, 5.6)=5.65idxPrev121 +Cut point: 5.75 //5.8 -> 0 yPrev= 2* (5.8, 5.7)=5.75idxPrev113 +Cut point: 5.85 //5.9 -> 1 yPrev= 2* (5.9, 5.8)=5.85idxPrev142 +Cut point: 5.95 //6 -> 1 yPrev= 2* (6, 5.9)=5.95idxPrev149 +Cut point: 6.05 //6.1 -> 1 yPrev= 2* (6.1, 6)=6.05idxPrev138 +Cut point: 6.15 //6.2 -> 1 yPrev= 2* (6.2, 6.1)=6.15idxPrev134 +Cut point: 6.25 //6.3 -> 1 yPrev= 2* (6.3, 6.2)=6.25idxPrev148 +Cut point: 6.35 //6.4 -> 1 yPrev= 2* (6.4, 6.3)=6.35idxPrev146 +Cut point: 6.45 //6.5 -> 1 yPrev= 2* (6.5, 6.4)=6.45idxPrev137 +Cut point: 6.55 //6.6 -> 1 yPrev= 2* (6.6, 6.5)=6.55idxPrev147 +Cut point: 6.75 //6.8 -> 1 yPrev= 2* (6.8, 6.7)=6.75idxPrev145 +Cut point: 6.85 //6.9 -> 1 yPrev= 2* (6.9, 6.8)=6.85idxPrev143 +Cut point: 6.95 //7 -> 1 yPrev= 2* (7, 6.9)=6.95idxPrev141 +Cut point: 7.05 //7.1 -> 2 yPrev= 1* (7.1, 7)=7.05idxPrev50 +[4.949999809265137, 5.050000190734863, 5.150000095367432, 5.25, 5.449999809265137, +5.650000095367432, 5.75, 5.850000858306885, 5.949999809265137, 6.050000190734863, +6.150000095367432, 6.25, 6.350000858306885, 6.449999809265137, 6.550000190734863, +6.75, 6.850000858306885, 6.949999809265137, 7.050000190734863] + +Cuts calculados en python: [4.85, 5.25, 5.35, 6.25, 6.55, 6.95, 7.05] \ No newline at end of file diff --git a/feature0_new.txt b/feature0_new.txt new file mode 100644 index 0000000..7675db2 --- /dev/null +++ b/feature0_new.txt @@ -0,0 +1,212 @@ +*idx=0 -> (-1, -1) Prev(4.3, 0) Elementos: 149 + Prev(4.3, 0) Pivot(4.3, 0) Cur(4.3, 0) +>idx=1 -> Prev(4.3, 0) Pivot(4.3, 0) Cur(4.4, 0) + Prev(4.3, 0) Pivot(4.4, 0) Cur(4.4, 0) +>idx=2 -> Prev(4.3, 0) Pivot(4.4, 0) Cur(4.4, 0) +>idx=3 -> Prev(4.3, 0) Pivot(4.4, 0) Cur(4.4, 0) +>idx=4 -> Prev(4.3, 0) Pivot(4.4, 0) Cur(4.5, 0) + Prev(4.4, 0) Pivot(4.5, 0) Cur(4.5, 0) +>idx=5 -> Prev(4.4, 0) Pivot(4.5, 0) Cur(4.6, 0) + Prev(4.5, 0) Pivot(4.6, 0) Cur(4.6, 0) +>idx=6 -> Prev(4.5, 0) Pivot(4.6, 0) Cur(4.6, 0) +>idx=7 -> Prev(4.5, 0) Pivot(4.6, 0) Cur(4.6, 0) +>idx=8 -> Prev(4.5, 0) Pivot(4.6, 0) Cur(4.6, 0) +>idx=9 -> Prev(4.5, 0) Pivot(4.6, 0) Cur(4.7, 0) + Prev(4.6, 0) Pivot(4.7, 0) Cur(4.7, 0) +>idx=10 -> Prev(4.6, 0) Pivot(4.7, 0) Cur(4.7, 0) +>idx=11 -> Prev(4.6, 0) Pivot(4.7, 0) Cur(4.8, 0) + Prev(4.7, 0) Pivot(4.8, 0) Cur(4.8, 0) +>idx=12 -> Prev(4.7, 0) Pivot(4.8, 0) Cur(4.8, 0) +>idx=13 -> Prev(4.7, 0) Pivot(4.8, 0) Cur(4.8, 0) +>idx=14 -> Prev(4.7, 0) Pivot(4.8, 0) Cur(4.8, 0) +>idx=15 -> Prev(4.7, 0) Pivot(4.8, 0) Cur(4.8, 0) +>idx=16 -> Prev(4.7, 0) Pivot(4.8, 0) Cur(4.9, 0) + Prev(4.8, 0) Pivot(4.9, 0) Cur(4.9, 0) +>idx=17 -> Prev(4.8, 0) Pivot(4.9, 0) Cur(4.9, 0) +>idx=18 -> Prev(4.8, 0) Pivot(4.9, 0) Cur(4.9, 0) +>idx=19 -> Prev(4.8, 0) Pivot(4.9, 0) Cur(4.9, 0) +>idx=20 -> Prev(4.8, 0) Pivot(4.9, -1) Cur(4.9, 1) +>idx=21 -> Prev(4.8, 0) Pivot(4.9, -1) Cur(4.9, 2) +>idx=22 -> Prev(4.8, 0) Pivot(4.9, -1) Cur(5.0, 0) +Cutpoint idx=22 Cur(5.0, 0) Prev(4.8, 0) Pivot(4.9, -1) = 4.9 + Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=23 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=24 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=25 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=26 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=27 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=28 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=29 -> Prev(4.9, -1) Pivot(5.0, 0) Cur(5.0, 0) +>idx=30 -> Prev(4.9, -1) Pivot(5.0, -1) Cur(5.0, 1) +>idx=31 -> Prev(4.9, -1) Pivot(5.0, -1) Cur(5.0, 1) +>idx=32 -> Prev(4.9, -1) Pivot(5.0, -1) Cur(5.1, 0) +Cutpoint idx=32 Cur(5.1, 0) Prev(4.9, -1) Pivot(5.0, -1) = 5.0 + Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=33 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=34 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=35 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=36 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=37 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=38 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=39 -> Prev(5.0, -1) Pivot(5.1, 0) Cur(5.1, 0) +>idx=40 -> Prev(5.0, -1) Pivot(5.1, -1) Cur(5.1, 1) +>idx=41 -> Prev(5.0, -1) Pivot(5.1, -1) Cur(5.2, 0) +Cutpoint idx=41 Cur(5.2, 0) Prev(5.0, -1) Pivot(5.1, -1) = 5.1 + Prev(5.1, -1) Pivot(5.2, 0) Cur(5.2, 0) +>idx=42 -> Prev(5.1, -1) Pivot(5.2, 0) Cur(5.2, 0) +>idx=43 -> Prev(5.1, -1) Pivot(5.2, 0) Cur(5.2, 0) +>idx=44 -> Prev(5.1, -1) Pivot(5.2, -1) Cur(5.2, 1) +>idx=45 -> Prev(5.1, -1) Pivot(5.2, -1) Cur(5.3, 0) +Cutpoint idx=45 Cur(5.3, 0) Prev(5.1, -1) Pivot(5.2, -1) = 5.2 + Prev(5.2, -1) Pivot(5.3, 0) Cur(5.3, 0) +>idx=46 -> Prev(5.2, -1) Pivot(5.3, 0) Cur(5.4, 0) +Cutpoint idx=46 Cur(5.4, 0) Prev(5.2, -1) Pivot(5.3, 0) = 5.3 + Prev(5.3, 0) Pivot(5.4, 0) Cur(5.4, 0) +>idx=47 -> Prev(5.3, 0) Pivot(5.4, 0) Cur(5.4, 0) +>idx=48 -> Prev(5.3, 0) Pivot(5.4, 0) Cur(5.4, 0) +>idx=49 -> Prev(5.3, 0) Pivot(5.4, 0) Cur(5.4, 0) +>idx=50 -> Prev(5.3, 0) Pivot(5.4, 0) Cur(5.4, 0) +>idx=51 -> Prev(5.3, 0) Pivot(5.4, -1) Cur(5.4, 1) +>idx=52 -> Prev(5.3, 0) Pivot(5.4, -1) Cur(5.5, 0) +Cutpoint idx=52 Cur(5.5, 0) Prev(5.3, 0) Pivot(5.4, -1) = 5.4 + Prev(5.4, -1) Pivot(5.5, 0) Cur(5.5, 0) +>idx=53 -> Prev(5.4, -1) Pivot(5.5, 0) Cur(5.5, 0) +>idx=54 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.5, 1) +>idx=55 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.5, 1) +>idx=56 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.5, 1) +>idx=57 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.5, 1) +>idx=58 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.5, 1) +>idx=59 -> Prev(5.4, -1) Pivot(5.5, -1) Cur(5.6, 1) +Cutpoint idx=59 Cur(5.6, 1) Prev(5.4, -1) Pivot(5.5, -1) = 5.5 + Prev(5.5, -1) Pivot(5.6, 1) Cur(5.6, 1) +>idx=60 -> Prev(5.5, -1) Pivot(5.6, 1) Cur(5.6, 1) +>idx=61 -> Prev(5.5, -1) Pivot(5.6, 1) Cur(5.6, 1) +>idx=62 -> Prev(5.5, -1) Pivot(5.6, 1) Cur(5.6, 1) +>idx=63 -> Prev(5.5, -1) Pivot(5.6, 1) Cur(5.6, 1) +>idx=64 -> Prev(5.5, -1) Pivot(5.6, -1) Cur(5.6, 2) +>idx=65 -> Prev(5.5, -1) Pivot(5.6, -1) Cur(5.7, 0) +Cutpoint idx=65 Cur(5.7, 0) Prev(5.5, -1) Pivot(5.6, -1) = 5.6 + Prev(5.6, -1) Pivot(5.7, 0) Cur(5.7, 0) +>idx=66 -> Prev(5.6, -1) Pivot(5.7, 0) Cur(5.7, 0) +>idx=67 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 1) +>idx=68 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 1) +>idx=69 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 1) +>idx=70 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 1) +>idx=71 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 1) +>idx=72 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.7, 2) +>idx=73 -> Prev(5.6, -1) Pivot(5.7, -1) Cur(5.8, 0) +Cutpoint idx=73 Cur(5.8, 0) Prev(5.6, -1) Pivot(5.7, -1) = 5.7 + Prev(5.7, -1) Pivot(5.8, 0) Cur(5.8, 0) +>idx=74 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 1) +>idx=75 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 1) +>idx=76 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 1) +>idx=77 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 2) +>idx=78 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 2) +>idx=79 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.8, 2) +>idx=80 -> Prev(5.7, -1) Pivot(5.8, -1) Cur(5.9, 1) +Cutpoint idx=80 Cur(5.9, 1) Prev(5.7, -1) Pivot(5.8, -1) = 5.8 + Prev(5.8, -1) Pivot(5.9, 1) Cur(5.9, 1) +>idx=81 -> Prev(5.8, -1) Pivot(5.9, 1) Cur(5.9, 1) +>idx=82 -> Prev(5.8, -1) Pivot(5.9, -1) Cur(5.9, 2) +>idx=83 -> Prev(5.8, -1) Pivot(5.9, -1) Cur(6.0, 1) +Cutpoint idx=83 Cur(6.0, 1) Prev(5.8, -1) Pivot(5.9, -1) = 5.9 + Prev(5.9, -1) Pivot(6.0, 1) Cur(6.0, 1) +>idx=84 -> Prev(5.9, -1) Pivot(6.0, 1) Cur(6.0, 1) +>idx=85 -> Prev(5.9, -1) Pivot(6.0, 1) Cur(6.0, 1) +>idx=86 -> Prev(5.9, -1) Pivot(6.0, 1) Cur(6.0, 1) +>idx=87 -> Prev(5.9, -1) Pivot(6.0, -1) Cur(6.0, 2) +>idx=88 -> Prev(5.9, -1) Pivot(6.0, -1) Cur(6.0, 2) +>idx=89 -> Prev(5.9, -1) Pivot(6.0, -1) Cur(6.1, 1) +Cutpoint idx=89 Cur(6.1, 1) Prev(5.9, -1) Pivot(6.0, -1) = 6.0 + Prev(6.0, -1) Pivot(6.1, 1) Cur(6.1, 1) +>idx=90 -> Prev(6.0, -1) Pivot(6.1, 1) Cur(6.1, 1) +>idx=91 -> Prev(6.0, -1) Pivot(6.1, 1) Cur(6.1, 1) +>idx=92 -> Prev(6.0, -1) Pivot(6.1, 1) Cur(6.1, 1) +>idx=93 -> Prev(6.0, -1) Pivot(6.1, -1) Cur(6.1, 2) +>idx=94 -> Prev(6.0, -1) Pivot(6.1, -1) Cur(6.1, 2) +>idx=95 -> Prev(6.0, -1) Pivot(6.1, -1) Cur(6.2, 1) +Cutpoint idx=95 Cur(6.2, 1) Prev(6.0, -1) Pivot(6.1, -1) = 6.1 + Prev(6.1, -1) Pivot(6.2, 1) Cur(6.2, 1) +>idx=96 -> Prev(6.1, -1) Pivot(6.2, 1) Cur(6.2, 1) +>idx=97 -> Prev(6.1, -1) Pivot(6.2, -1) Cur(6.2, 2) +>idx=98 -> Prev(6.1, -1) Pivot(6.2, -1) Cur(6.2, 2) +>idx=99 -> Prev(6.1, -1) Pivot(6.2, -1) Cur(6.3, 1) +Cutpoint idx=99 Cur(6.3, 1) Prev(6.1, -1) Pivot(6.2, -1) = 6.2 + Prev(6.2, -1) Pivot(6.3, 1) Cur(6.3, 1) +>idx=100 -> Prev(6.2, -1) Pivot(6.3, 1) Cur(6.3, 1) +>idx=101 -> Prev(6.2, -1) Pivot(6.3, 1) Cur(6.3, 1) +>idx=102 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=103 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=104 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=105 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=106 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=107 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.3, 2) +>idx=108 -> Prev(6.2, -1) Pivot(6.3, -1) Cur(6.4, 1) +Cutpoint idx=108 Cur(6.4, 1) Prev(6.2, -1) Pivot(6.3, -1) = 6.3 + Prev(6.3, -1) Pivot(6.4, 1) Cur(6.4, 1) +>idx=109 -> Prev(6.3, -1) Pivot(6.4, 1) Cur(6.4, 1) +>idx=110 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.4, 2) +>idx=111 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.4, 2) +>idx=112 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.4, 2) +>idx=113 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.4, 2) +>idx=114 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.4, 2) +>idx=115 -> Prev(6.3, -1) Pivot(6.4, -1) Cur(6.5, 1) +Cutpoint idx=115 Cur(6.5, 1) Prev(6.3, -1) Pivot(6.4, -1) = 6.4 + Prev(6.4, -1) Pivot(6.5, 1) Cur(6.5, 1) +>idx=116 -> Prev(6.4, -1) Pivot(6.5, -1) Cur(6.5, 2) +>idx=117 -> Prev(6.4, -1) Pivot(6.5, -1) Cur(6.5, 2) +>idx=118 -> Prev(6.4, -1) Pivot(6.5, -1) Cur(6.5, 2) +>idx=119 -> Prev(6.4, -1) Pivot(6.5, -1) Cur(6.5, 2) +>idx=120 -> Prev(6.4, -1) Pivot(6.5, -1) Cur(6.6, 1) +Cutpoint idx=120 Cur(6.6, 1) Prev(6.4, -1) Pivot(6.5, -1) = 6.5 + Prev(6.5, -1) Pivot(6.6, 1) Cur(6.6, 1) +>idx=121 -> Prev(6.5, -1) Pivot(6.6, 1) Cur(6.6, 1) +>idx=122 -> Prev(6.5, -1) Pivot(6.6, 1) Cur(6.7, 1) +Cutpoint idx=122 Cur(6.7, 1) Prev(6.5, -1) Pivot(6.6, 1) = 6.6 + Prev(6.6, 1) Pivot(6.7, 1) Cur(6.7, 1) +>idx=123 -> Prev(6.6, 1) Pivot(6.7, 1) Cur(6.7, 1) +>idx=124 -> Prev(6.6, 1) Pivot(6.7, 1) Cur(6.7, 1) +>idx=125 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.7, 2) +>idx=126 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.7, 2) +>idx=127 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.7, 2) +>idx=128 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.7, 2) +>idx=129 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.7, 2) +>idx=130 -> Prev(6.6, 1) Pivot(6.7, -1) Cur(6.8, 1) +Cutpoint idx=130 Cur(6.8, 1) Prev(6.6, 1) Pivot(6.7, -1) = 6.7 + Prev(6.7, -1) Pivot(6.8, 1) Cur(6.8, 1) +>idx=131 -> Prev(6.7, -1) Pivot(6.8, -1) Cur(6.8, 2) +>idx=132 -> Prev(6.7, -1) Pivot(6.8, -1) Cur(6.8, 2) +>idx=133 -> Prev(6.7, -1) Pivot(6.8, -1) Cur(6.9, 1) +Cutpoint idx=133 Cur(6.9, 1) Prev(6.7, -1) Pivot(6.8, -1) = 6.8 + Prev(6.8, -1) Pivot(6.9, 1) Cur(6.9, 1) +>idx=134 -> Prev(6.8, -1) Pivot(6.9, -1) Cur(6.9, 2) +>idx=135 -> Prev(6.8, -1) Pivot(6.9, -1) Cur(6.9, 2) +>idx=136 -> Prev(6.8, -1) Pivot(6.9, -1) Cur(6.9, 2) +>idx=137 -> Prev(6.8, -1) Pivot(6.9, -1) Cur(7.0, 1) +Cutpoint idx=137 Cur(7.0, 1) Prev(6.8, -1) Pivot(6.9, -1) = 6.9 + Prev(6.9, -1) Pivot(7.0, 1) Cur(7.0, 1) +>idx=138 -> Prev(6.9, -1) Pivot(7.0, 1) Cur(7.1, 2) +Cutpoint idx=138 Cur(7.1, 2) Prev(6.9, -1) Pivot(7.0, 1) = 7.0 + Prev(7.0, 1) Pivot(7.1, 2) Cur(7.1, 2) +>idx=139 -> Prev(7.0, 1) Pivot(7.1, 2) Cur(7.2, 2) +Cutpoint idx=139 Cur(7.2, 2) Prev(7.0, 1) Pivot(7.1, 2) = 7.1 + Prev(7.1, 2) Pivot(7.2, 2) Cur(7.2, 2) +>idx=140 -> Prev(7.1, 2) Pivot(7.2, 2) Cur(7.2, 2) +>idx=141 -> Prev(7.1, 2) Pivot(7.2, 2) Cur(7.2, 2) +>idx=142 -> Prev(7.1, 2) Pivot(7.2, 2) Cur(7.3, 2) + Prev(7.2, 2) Pivot(7.3, 2) Cur(7.3, 2) +>idx=143 -> Prev(7.2, 2) Pivot(7.3, 2) Cur(7.4, 2) + Prev(7.3, 2) Pivot(7.4, 2) Cur(7.4, 2) +>idx=144 -> Prev(7.3, 2) Pivot(7.4, 2) Cur(7.6, 2) + Prev(7.4, 2) Pivot(7.6, 2) Cur(7.6, 2) +>idx=145 -> Prev(7.4, 2) Pivot(7.6, 2) Cur(7.7, 2) + Prev(7.6, 2) Pivot(7.7, 2) Cur(7.7, 2) +>idx=146 -> Prev(7.6, 2) Pivot(7.7, 2) Cur(7.7, 2) +>idx=147 -> Prev(7.6, 2) Pivot(7.7, 2) Cur(7.7, 2) +>idx=148 -> Prev(7.6, 2) Pivot(7.7, 2) Cur(7.7, 2) +>idx=149 -> Prev(7.6, 2) Pivot(7.7, 2) Cur(7.9, 2) +[4.900000095367432, 5.0, 5.099999904632568, 5.199999809265137, 5.300000190734863, +5.400000095367432, 5.5, 5.599999904632568, 5.699999809265137, 5.800000190734863, +5.900000095367432, 6.0, 6.099999904632568, 6.199999809265137, 6.300000190734863, +6.400000095367432, 6.5, 6.599999904632568, 6.699999809265137, 6.800000190734863, +6.900000095367432, 7.0, 7.099999904632568] \ No newline at end of file diff --git a/fimdlp/CPPFImdlp.cpp b/fimdlp/CPPFImdlp.cpp index 08f9cc9..96debe1 100644 --- a/fimdlp/CPPFImdlp.cpp +++ b/fimdlp/CPPFImdlp.cpp @@ -1,11 +1,17 @@ #include "CPPFImdlp.h" #include #include +#include #include #include #include "Metrics.h" namespace CPPFImdlp { + std::ostream &operator<<(std::ostream &os, const CutPointBody &cut) + { + os << "(" << cut.start << ", " << cut.end << ") -> (" << cut.fromValue << ", " << cut.toValue << "]"; + return os; + } CPPFImdlp::CPPFImdlp() : debug(false), precision(6) { divider = pow(10, precision); @@ -17,33 +23,52 @@ namespace CPPFImdlp CPPFImdlp::~CPPFImdlp() { } - std::vector CPPFImdlp::cutPoints(std::vector &X, std::vector &y) + void CPPFImdlp::debugPoints(std::vector &X, std::vector &y) { - std::vector cutPts; - std::vector cutIdx; - float xPrev, xCur, xPivot, cutPoint; - int yPrev, yCur, yPivot; - size_t idxPrev, idx, numElements; + std::cout << "+++++++++++++++++++++++" << std::endl; + // for (auto i : sortIndices(X)) std::vector indices = sortIndices(X); - xCur = xPrev = X.at(indices.at(0)); - yCur = yPrev = y.at(indices.at(0)); + for (size_t i = 0; i < indices.size(); i++) + { + printf("(%3lu, %3lu) -> (%3.1f, %d)\n", i, indices[i], X[indices[i]], y[indices[i]]); + } + std::cout << "+++++++++++++++++++++++" << std::endl; + for (auto item : cutPoints(X, y)) + { + std::cout << item << " X[" << item.end << "]=" << X[item.end] << std::endl; + } + } + std::vector CPPFImdlp::cutPoints(std::vector &X, std::vector &y) + { + + std::vector cutPts; + CutPointBody cutPoint; + std::vector cutIdx; + float xPrev, xCur, xPivot; + int yPrev, yCur, yPivot; + size_t idxPrev, idxPivot, idx, numElements, start; + std::vector indices = sortIndices(X); + xCur = xPrev = X[indices[0]]; + yCur = yPrev = y[indices[0]]; numElements = indices.size() - 1; - // idxPrev = indices.at(0); - idx = 0; + idxPrev = indices[0]; + idx = start = 0; + bool firstCutPoint = true; if (debug) printf("*idx=%lu -> (-1, -1) Prev(%3.1f, %d) Elementos: %lu\n", idx, xCur, yCur, numElements); while (idx < numElements) { xPivot = xCur; yPivot = yCur; + idxPivot = indices[idx]; if (debug) printf(" Prev(%3.1f, %d) Pivot(%3.1f, %d) Cur(%3.1f, %d) \n", idx, xPrev, yPrev, xPivot, yPivot, xCur, yCur); // Read the same values and check class changes do { idx++; - xCur = X.at(indices.at(idx)); - yCur = y.at(indices.at(idx)); + xCur = X[indices[idx]]; + yCur = y[indices[idx]]; if (yCur != yPivot && xCur == xPivot) { yPivot = -1; @@ -53,15 +78,33 @@ namespace CPPFImdlp } while (idx < numElements && xCur == xPivot); if (yPivot == -1 || yPrev != yCur) { - cutPoint = (xPrev + xCur) / 2; + cutPoint.start = start; + cutPoint.end = idxPrev; + start = idx; + cutPoint.fromValue = firstCutPoint ? std::numeric_limits::lowest() : cutPts.back().toValue; + cutPoint.toValue = (xPrev + xCur) / 2; + firstCutPoint = false; if (debug) - printf("Cutpoint idx=%lu Cur(%3.1f, %d) Prev(%3.1f, %d) Pivot(%3.1f, %d) = %3.1f \n", idx, xCur, yCur, xPrev, yPrev, xPivot, yPivot, cutPoint); + { + printf("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); - // cutIdx.push_back(idxPrev); + cutIdx.push_back(idxPrev); } yPrev = yPivot; xPrev = xPivot; - // idxPrev = indices.at(idxPivot); + idxPrev = indices[idxPivot]; + } + if (idxPrev >= numElements) + { + cutPoint.start = start; + cutPoint.end = numElements; + cutPoint.fromValue = firstCutPoint ? std::numeric_limits::lowest() : cutPts.back().toValue; + cutPoint.toValue = std::numeric_limits::max(); + if (debug) + 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); + cutIdx.push_back(idxPrev); } return cutPts; } diff --git a/fimdlp/CPPFImdlp.h b/fimdlp/CPPFImdlp.h index 413779e..baf5f9a 100644 --- a/fimdlp/CPPFImdlp.h +++ b/fimdlp/CPPFImdlp.h @@ -4,6 +4,11 @@ #include namespace CPPFImdlp { + struct CutPointBody + { + size_t start, end; + float fromValue, toValue; + }; class CPPFImdlp { private: @@ -17,8 +22,9 @@ namespace CPPFImdlp CPPFImdlp(); CPPFImdlp(int, bool debug = false); ~CPPFImdlp(); - std::vector cutPoints(std::vector &, std::vector &); + std::vector cutPoints(std::vector &, std::vector &); std::vector cutPointsAnt(std::vector &, std::vector &); + void debugPoints(std::vector &, std::vector &); }; } #endif \ No newline at end of file diff --git a/fimdlp/Metrics.h b/fimdlp/Metrics.h index c487cc9..3c8f2a8 100644 --- a/fimdlp/Metrics.h +++ b/fimdlp/Metrics.h @@ -1,6 +1,7 @@ #ifndef METRICS_H #define METRICS_H #include +#include namespace CPPFImdlp { class Metrics diff --git a/fimdlp/cfimdlp.pyx b/fimdlp/cfimdlp.pyx index 34fc88c..84d136e 100644 --- a/fimdlp/cfimdlp.pyx +++ b/fimdlp/cfimdlp.pyx @@ -7,8 +7,9 @@ cdef extern from "CPPFImdlp.h" namespace "CPPFImdlp": cdef cppclass CPPFImdlp: CPPFImdlp() except + CPPFImdlp(int, bool) except + - vector[float] cutPoints(vector[float]&, vector[int]&) vector[float] cutPointsAnt(vector[float]&, vector[int]&) + void debugPoints(vector[float]&, vector[int]&) + cdef class CFImdlp: cdef CPPFImdlp *thisptr @@ -16,7 +17,7 @@ cdef class CFImdlp: self.thisptr = new CPPFImdlp(precision, debug) def __dealloc__(self): del self.thisptr - def cut_points(self, X, y): - return self.thisptr.cutPoints(X, y) def cut_points_ant(self, X, y): return self.thisptr.cutPointsAnt(X, y) + def debug_points(self, X, y): + return self.thisptr.debugPoints(X, y) diff --git a/fimdlp/cppfimdlp.cpython-310-darwin.so b/fimdlp/cppfimdlp.cpython-310-darwin.so new file mode 100755 index 0000000000000000000000000000000000000000..c3d0d8322a0aa85cf9260852cbdb0c158f8108ba GIT binary patch literal 112176 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 vH;uek>s%6jY}k9_AIY~Yc|$MRqU$GiU*MvaPb literal 0 HcmV?d00001 diff --git a/fimdlp/mdlp.py b/fimdlp/mdlp.py index 70ac5fb..12eb272 100644 --- a/fimdlp/mdlp.py +++ b/fimdlp/mdlp.py @@ -105,8 +105,10 @@ class FImdlp(TransformerMixin, BaseEstimator): print("Cuts calculados en C++") print("Cut points for each feature in Iris dataset:") for i in range(0, self.n_features_): - datax = self.X_[np.argsort(self.X_[:, i]), i] - y_ = self.y_[np.argsort(self.X_[:, i])] + # 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_) print( f"New ({len(Xcutpoints)}):{self.features_[i]:20s}: " diff --git a/sample.py b/sample.py index e13031d..d19dfa3 100644 --- a/sample.py +++ b/sample.py @@ -8,7 +8,15 @@ X = data.data y = data.target features = data.feature_names test = FImdlp() -test.fit(X, y, features=features).transform(X) +test.fit(X, y, features=features) +# 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 = np.array( # [