From 179df2ef6987c9bcac621a4cb61578d9b48866f0 Mon Sep 17 00:00:00 2001 From: Villu Ruusmann Date: Sun, 25 Aug 2024 14:20:09 +0300 Subject: [PATCH] Added support for truncated (non-zero offset) bitsets. HT: Eric Blood See https://github.com/jpmml/jpmml-h2o/pull/16#issuecomment-2307619336 --- .../h2o/SharedTreeMojoModelConverter.java | 19 +- .../testing/DrfMojoModelConverterTest.java | 5 + pmml-h2o/src/test/resources/csv/BitSet.csv | 1201 +++++++++++++++++ .../test/resources/csv/RandomForestBitSet.csv | 1201 +++++++++++++++++ pmml-h2o/src/test/resources/main.py | 20 +- .../resources/mojo/RandomForestBitSet.zip | Bin 0 -> 16631 bytes 6 files changed, 2442 insertions(+), 4 deletions(-) create mode 100644 pmml-h2o/src/test/resources/csv/BitSet.csv create mode 100644 pmml-h2o/src/test/resources/csv/RandomForestBitSet.csv create mode 100644 pmml-h2o/src/test/resources/mojo/RandomForestBitSet.zip diff --git a/pmml-h2o/src/main/java/org/jpmml/h2o/SharedTreeMojoModelConverter.java b/pmml-h2o/src/main/java/org/jpmml/h2o/SharedTreeMojoModelConverter.java index 69e750f..5a19e8c 100644 --- a/pmml-h2o/src/main/java/org/jpmml/h2o/SharedTreeMojoModelConverter.java +++ b/pmml-h2o/src/main/java/org/jpmml/h2o/SharedTreeMojoModelConverter.java @@ -234,12 +234,25 @@ public Node encodeNode(SharedTree sharedTree, ByteBufferWrapper byteBuffer, Inte continue; } // End if - if(!bitSet.contains(i)){ - leftValues.add(value); + if(bitSet.isInRange(i)){ + + if(!bitSet.contains(i)){ + leftValues.add(value); + } else + + { + rightValues.add(value); + } } else { - rightValues.add(value); + if(leftward){ + leftValues.add(value); + } else + + { + rightValues.add(value); + } } } } else diff --git a/pmml-h2o/src/test/java/org/jpmml/h2o/testing/DrfMojoModelConverterTest.java b/pmml-h2o/src/test/java/org/jpmml/h2o/testing/DrfMojoModelConverterTest.java index f0dd071..698fb22 100644 --- a/pmml-h2o/src/test/java/org/jpmml/h2o/testing/DrfMojoModelConverterTest.java +++ b/pmml-h2o/src/test/java/org/jpmml/h2o/testing/DrfMojoModelConverterTest.java @@ -48,6 +48,11 @@ public void evaluateAutoNA() throws Exception { evaluate("RandomForest", AUTO_NA); } + @Test + public void evaluateBitSet() throws Exception { + evaluate("RandomForest", "BitSet"); + } + @Test public void evaluateIris() throws Exception { evaluate("RandomForest", IRIS); diff --git a/pmml-h2o/src/test/resources/csv/BitSet.csv b/pmml-h2o/src/test/resources/csv/BitSet.csv new file mode 100644 index 0000000..88c5b78 --- /dev/null +++ b/pmml-h2o/src/test/resources/csv/BitSet.csv @@ -0,0 +1,1201 @@ +Code,Score +C001,1 +C002,0 +C003,1 +C004,0 +C005,1 +C006,0 +C007,1 +C008,0 +C009,1 +C010,0 +C011,1 +C012,0 +C013,1 +C014,0 +C015,1 +C016,0 +C017,1 +C018,0 +C019,1 +C020,0 +C021,1 +C022,0 +C023,1 +C024,0 +C025,1 +C026,0 +C027,1 +C028,0 +C029,1 +C030,0 +C031,1 +C032,0 +C033,1 +C034,0 +C035,1 +C036,0 +C037,1 +C038,0 +C039,1 +C040,0 +C041,1 +C042,0 +C043,1 +C044,0 +C045,0 +C046,0 +C047,0 +C048,0 +C049,1 +C050,0 +C051,1 +C052,0 +C053,1 +C054,0 +C055,1 +C056,0 +C057,0 +C058,0 +C059,0 +C060,0 +C061,1 +C062,0 +C063,1 +C064,0 +C065,1 +C066,0 +C067,1 +C068,0 +C069,1 +C070,0 +C071,1 +C072,0 +C073,1 +C074,0 +C075,1 +C076,0 +C077,1 +C078,0 +C079,1 +C080,0 +C081,1 +C082,0 +C083,1 +C084,0 +C085,1 +C086,0 +C087,1 +C088,0 +C089,1 +C090,0 +C091,1 +C092,0 +C093,1 +C094,0 +C095,1 +C096,0 +C097,1 +C098,0 +C099,1 +C100,0 +C101,1 +C102,0 +C103,1 +C104,0 +C105,1 +C106,0 +C107,1 +C108,0 +C109,1 +C110,1 +C111,1 +C112,0 +C113,1 +C114,1 +C115,1 +C116,0 +C117,1 +C118,1 +C119,1 +C120,0 +C121,1 +C122,0 +C123,1 +C124,0 +C125,1 +C126,0 +C127,1 +C128,0 +C129,1 +C130,0 +C131,1 +C132,0 +C133,1 +C134,0 +C135,1 +C136,0 +C137,1 +C138,0 +C139,1 +C140,0 +C141,1 +C142,0 +C143,1 +C144,0 +C145,1 +C146,0 +C147,1 +C148,0 +C149,1 +C150,0 +C151,1 +C152,0 +C153,1 +C154,0 +C155,1 +C156,0 +C157,0 +C158,0 +C159,1 +C160,0 +C161,1 +C162,0 +C163,1 +C164,0 +C165,1 +C166,0 +C167,1 +C168,0 +C169,1 +C170,0 +C171,1 +C172,0 +C173,1 +C174,0 +C175,1 +C176,0 +C177,1 +C178,0 +C179,1 +C180,0 +C181,1 +C182,0 +C183,1 +C184,0 +C185,1 +C186,0 +C187,1 +C188,0 +C189,0 +C190,0 +C191,1 +C192,0 +C193,1 +C194,0 +C195,1 +C196,0 +C197,1 +C198,0 +C199,0 +C200,0 +C201,1 +C202,0 +C203,1 +C204,0 +C205,1 +C206,0 +C207,1 +C208,0 +C209,1 +C210,0 +C211,1 +C212,0 +C213,1 +C214,0 +C215,1 +C216,0 +C217,1 +C218,0 +C219,1 +C220,0 +C221,1 +C222,0 +C223,1 +C224,0 +C225,1 +C226,0 +C227,1 +C228,0 +C229,1 +C230,0 +C231,0 +C232,0 +C233,1 +C234,0 +C235,1 +C236,0 +C237,1 +C238,0 +C239,1 +C240,0 +C241,1 +C242,0 +C243,1 +C244,0 +C245,1 +C246,0 +C247,1 +C248,0 +C249,1 +C250,0 +C251,1 +C252,0 +C253,1 +C254,0 +C255,1 +C256,0 +C257,1 +C258,0 +C259,1 +C260,0 +C261,1 +C262,0 +C263,1 +C264,0 +C265,1 +C266,0 +C267,1 +C268,0 +C269,1 +C270,0 +C271,1 +C272,0 +C273,1 +C274,0 +C275,1 +C276,0 +C277,1 +C278,0 +C279,1 +C280,0 +C281,0 +C282,0 +C283,1 +C284,0 +C285,0 +C286,0 +C287,1 +C288,0 +C289,1 +C290,0 +C291,1 +C292,0 +C293,1 +C294,0 +C295,1 +C296,0 +C297,0 +C298,0 +C299,1 +C300,1 +C301,1 +C302,1 +C303,1 +C304,1 +C305,1 +C306,1 +C307,1 +C308,1 +C309,1 +C310,1 +C311,1 +C312,1 +C313,1 +C314,1 +C315,1 +C316,1 +C317,1 +C318,1 +C319,1 +C320,1 +C321,1 +C322,1 +C323,1 +C324,1 +C325,1 +C326,1 +C327,1 +C328,1 +C329,1 +C330,1 +C331,1 +C332,1 +C333,1 +C334,1 +C335,1 +C336,1 +C337,1 +C338,1 +C339,1 +C340,1 +C341,1 +C342,1 +C343,1 +C344,1 +C345,1 +C346,1 +C347,1 +C348,1 +C349,1 +C350,1 +C351,1 +C352,1 +C353,1 +C354,1 +C355,1 +C356,1 +C357,1 +C358,1 +C359,1 +C360,1 +C361,1 +C362,1 +C363,1 +C364,1 +C365,1 +C366,1 +C367,1 +C368,1 +C369,1 +C370,1 +C371,1 +C372,1 +C373,1 +C374,1 +C375,1 +C376,1 +C377,1 +C378,1 +C379,1 +C380,1 +C381,1 +C382,1 +C383,1 +C384,1 +C385,1 +C386,1 +C387,1 +C388,1 +C389,1 +C390,1 +C391,1 +C392,1 +C393,1 +C394,1 +C395,1 +C396,1 +C397,1 +C398,1 +C399,1 +C400,1 +C401,1 +C402,1 +C403,1 +C404,1 +C405,1 +C406,1 +C407,1 +C408,1 +C409,1 +C410,1 +C411,1 +C412,1 +C413,1 +C414,1 +C415,1 +C416,1 +C417,1 +C418,1 +C419,1 +C420,1 +C421,1 +C422,1 +C423,1 +C424,1 +C425,1 +C426,1 +C427,1 +C428,1 +C429,1 +C430,1 +C431,1 +C432,1 +C433,1 +C434,1 +C435,1 +C436,1 +C437,1 +C438,1 +C439,1 +C440,1 +C441,1 +C442,1 +C443,1 +C444,1 +C445,1 +C446,1 +C447,1 +C448,1 +C449,1 +C450,1 +C451,1 +C452,1 +C453,1 +C454,1 +C455,1 +C456,1 +C457,1 +C458,1 +C459,1 +C460,1 +C461,1 +C462,1 +C463,1 +C464,1 +C465,1 +C466,1 +C467,1 +C468,1 +C469,1 +C470,1 +C471,1 +C472,1 +C473,1 +C474,1 +C475,1 +C476,1 +C477,1 +C478,1 +C479,1 +C480,1 +C481,1 +C482,1 +C483,1 +C484,1 +C485,1 +C486,1 +C487,1 +C488,1 +C489,1 +C490,1 +C491,1 +C492,1 +C493,1 +C494,1 +C495,1 +C496,1 +C497,1 +C498,1 +C499,1 +C500,1 +C501,1 +C502,1 +C503,1 +C504,1 +C505,1 +C506,1 +C507,1 +C508,1 +C509,1 +C510,1 +C511,1 +C512,1 +C513,1 +C514,1 +C515,1 +C516,1 +C517,1 +C518,1 +C519,1 +C520,1 +C521,1 +C522,1 +C523,1 +C524,1 +C525,1 +C526,1 +C527,1 +C528,1 +C529,1 +C530,1 +C531,1 +C532,1 +C533,1 +C534,1 +C535,1 +C536,1 +C537,1 +C538,1 +C539,1 +C540,1 +C541,1 +C542,1 +C543,1 +C544,1 +C545,1 +C546,1 +C547,1 +C548,1 +C549,1 +C550,1 +C551,1 +C552,1 +C553,1 +C554,1 +C555,1 +C556,1 +C557,1 +C558,1 +C559,1 +C560,1 +C561,1 +C562,1 +C563,1 +C564,1 +C565,1 +C566,1 +C567,1 +C568,1 +C569,1 +C570,1 +C571,1 +C572,1 +C573,1 +C574,1 +C575,1 +C576,1 +C577,1 +C578,1 +C579,1 +C580,1 +C581,1 +C582,1 +C583,1 +C584,1 +C585,1 +C586,1 +C587,1 +C588,1 +C589,1 +C590,1 +C591,1 +C592,1 +C593,1 +C594,1 +C595,1 +C596,1 +C597,1 +C598,1 +C599,1 +C600,1 +C601,1 +C602,0 +C603,0 +C604,0 +C605,1 +C606,0 +C607,1 +C608,0 +C609,1 +C610,0 +C611,1 +C612,1 +C613,1 +C614,1 +C615,1 +C616,0 +C617,1 +C618,0 +C619,1 +C620,0 +C621,1 +C622,0 +C623,1 +C624,0 +C625,1 +C626,1 +C627,1 +C628,0 +C629,1 +C630,0 +C631,1 +C632,0 +C633,1 +C634,0 +C635,1 +C636,0 +C637,1 +C638,0 +C639,1 +C640,0 +C641,1 +C642,0 +C643,1 +C644,0 +C645,1 +C646,0 +C647,1 +C648,0 +C649,1 +C650,0 +C651,1 +C652,1 +C653,1 +C654,0 +C655,1 +C656,0 +C657,1 +C658,0 +C659,1 +C660,0 +C661,1 +C662,0 +C663,1 +C664,0 +C665,1 +C666,0 +C667,1 +C668,0 +C669,1 +C670,0 +C671,1 +C672,0 +C673,1 +C674,0 +C675,1 +C676,0 +C677,1 +C678,0 +C679,1 +C680,0 +C681,1 +C682,0 +C683,1 +C684,1 +C685,1 +C686,0 +C687,1 +C688,0 +C689,1 +C690,0 +C691,1 +C692,0 +C693,1 +C694,0 +C695,1 +C696,0 +C697,1 +C698,0 +C699,1 +C700,0 +C701,1 +C702,0 +C703,1 +C704,0 +C705,1 +C706,0 +C707,1 +C708,0 +C709,1 +C710,0 +C711,1 +C712,0 +C713,1 +C714,0 +C715,1 +C716,0 +C717,1 +C718,0 +C719,1 +C720,0 +C721,1 +C722,0 +C723,1 +C724,0 +C725,1 +C726,0 +C727,1 +C728,0 +C729,1 +C730,0 +C731,1 +C732,0 +C733,0 +C734,0 +C735,1 +C736,0 +C737,1 +C738,0 +C739,1 +C740,0 +C741,1 +C742,0 +C743,1 +C744,0 +C745,1 +C746,0 +C747,1 +C748,0 +C749,1 +C750,0 +C751,1 +C752,0 +C753,1 +C754,0 +C755,1 +C756,0 +C757,0 +C758,0 +C759,1 +C760,0 +C761,1 +C762,0 +C763,1 +C764,0 +C765,1 +C766,0 +C767,1 +C768,0 +C769,1 +C770,0 +C771,1 +C772,0 +C773,1 +C774,0 +C775,1 +C776,0 +C777,1 +C778,0 +C779,1 +C780,0 +C781,0 +C782,0 +C783,1 +C784,0 +C785,1 +C786,0 +C787,1 +C788,0 +C789,1 +C790,0 +C791,1 +C792,0 +C793,1 +C794,0 +C795,1 +C796,0 +C797,1 +C798,0 +C799,1 +C800,0 +C801,1 +C802,0 +C803,1 +C804,0 +C805,1 +C806,0 +C807,1 +C808,0 +C809,0 +C810,0 +C811,0 +C812,0 +C813,1 +C814,0 +C815,1 +C816,0 +C817,1 +C818,0 +C819,1 +C820,0 +C821,1 +C822,0 +C823,1 +C824,0 +C825,1 +C826,0 +C827,1 +C828,0 +C829,0 +C830,0 +C831,0 +C832,0 +C833,1 +C834,0 +C835,0 +C836,0 +C837,1 +C838,0 +C839,0 +C840,0 +C841,1 +C842,0 +C843,1 +C844,0 +C845,1 +C846,0 +C847,1 +C848,0 +C849,1 +C850,0 +C851,1 +C852,0 +C853,0 +C854,0 +C855,0 +C856,0 +C857,1 +C858,0 +C859,1 +C860,0 +C861,0 +C862,0 +C863,1 +C864,0 +C865,1 +C866,0 +C867,0 +C868,0 +C869,1 +C870,0 +C871,1 +C872,0 +C873,1 +C874,0 +C875,1 +C876,0 +C877,1 +C878,0 +C879,0 +C880,0 +C881,0 +C882,0 +C883,1 +C884,0 +C885,1 +C886,0 +C887,0 +C888,0 +C889,1 +C890,0 +C891,0 +C892,0 +C893,1 +C894,0 +C895,0 +C896,0 +C897,0 +C898,0 +C899,1 +C900,1 +C901,1 +C902,1 +C903,1 +C904,1 +C905,1 +C906,1 +C907,1 +C908,1 +C909,1 +C910,1 +C911,1 +C912,1 +C913,1 +C914,1 +C915,1 +C916,1 +C917,1 +C918,1 +C919,1 +C920,1 +C921,1 +C922,1 +C923,1 +C924,1 +C925,1 +C926,1 +C927,1 +C928,1 +C929,1 +C930,1 +C931,1 +C932,1 +C933,1 +C934,1 +C935,1 +C936,1 +C937,1 +C938,1 +C939,1 +C940,1 +C941,1 +C942,1 +C943,1 +C944,1 +C945,1 +C946,1 +C947,1 +C948,1 +C949,1 +C950,1 +C951,1 +C952,1 +C953,1 +C954,1 +C955,1 +C956,1 +C957,1 +C958,1 +C959,1 +C960,1 +C961,1 +C962,1 +C963,1 +C964,1 +C965,1 +C966,1 +C967,1 +C968,1 +C969,1 +C970,1 +C971,1 +C972,1 +C973,1 +C974,1 +C975,1 +C976,1 +C977,1 +C978,1 +C979,1 +C980,1 +C981,1 +C982,1 +C983,1 +C984,1 +C985,1 +C986,1 +C987,1 +C988,1 +C989,1 +C990,1 +C991,1 +C992,1 +C993,1 +C994,1 +C995,1 +C996,1 +C997,1 +C998,1 +C999,1 +C1000,1 +C1001,1 +C1002,1 +C1003,1 +C1004,1 +C1005,1 +C1006,1 +C1007,1 +C1008,1 +C1009,1 +C1010,1 +C1011,1 +C1012,1 +C1013,1 +C1014,1 +C1015,1 +C1016,1 +C1017,1 +C1018,1 +C1019,1 +C1020,1 +C1021,1 +C1022,1 +C1023,1 +C1024,1 +C1025,1 +C1026,1 +C1027,1 +C1028,1 +C1029,1 +C1030,1 +C1031,1 +C1032,1 +C1033,1 +C1034,1 +C1035,1 +C1036,1 +C1037,1 +C1038,1 +C1039,1 +C1040,1 +C1041,1 +C1042,1 +C1043,1 +C1044,1 +C1045,1 +C1046,1 +C1047,1 +C1048,1 +C1049,1 +C1050,1 +C1051,1 +C1052,1 +C1053,1 +C1054,1 +C1055,1 +C1056,1 +C1057,1 +C1058,1 +C1059,1 +C1060,1 +C1061,1 +C1062,1 +C1063,1 +C1064,1 +C1065,1 +C1066,1 +C1067,1 +C1068,1 +C1069,1 +C1070,1 +C1071,1 +C1072,1 +C1073,1 +C1074,1 +C1075,1 +C1076,1 +C1077,1 +C1078,1 +C1079,1 +C1080,1 +C1081,1 +C1082,1 +C1083,1 +C1084,1 +C1085,1 +C1086,1 +C1087,1 +C1088,1 +C1089,1 +C1090,1 +C1091,1 +C1092,1 +C1093,1 +C1094,1 +C1095,1 +C1096,1 +C1097,1 +C1098,1 +C1099,1 +C1100,1 +C1101,1 +C1102,1 +C1103,1 +C1104,1 +C1105,1 +C1106,1 +C1107,1 +C1108,1 +C1109,1 +C1110,1 +C1111,1 +C1112,1 +C1113,1 +C1114,1 +C1115,1 +C1116,1 +C1117,1 +C1118,1 +C1119,1 +C1120,1 +C1121,1 +C1122,1 +C1123,1 +C1124,1 +C1125,1 +C1126,1 +C1127,1 +C1128,1 +C1129,1 +C1130,1 +C1131,1 +C1132,1 +C1133,1 +C1134,1 +C1135,1 +C1136,1 +C1137,1 +C1138,1 +C1139,1 +C1140,1 +C1141,1 +C1142,1 +C1143,1 +C1144,1 +C1145,1 +C1146,1 +C1147,1 +C1148,1 +C1149,1 +C1150,1 +C1151,1 +C1152,1 +C1153,1 +C1154,1 +C1155,1 +C1156,1 +C1157,1 +C1158,1 +C1159,1 +C1160,1 +C1161,1 +C1162,1 +C1163,1 +C1164,1 +C1165,1 +C1166,1 +C1167,1 +C1168,1 +C1169,1 +C1170,1 +C1171,1 +C1172,1 +C1173,1 +C1174,1 +C1175,1 +C1176,1 +C1177,1 +C1178,1 +C1179,1 +C1180,1 +C1181,1 +C1182,1 +C1183,1 +C1184,1 +C1185,1 +C1186,1 +C1187,1 +C1188,1 +C1189,1 +C1190,1 +C1191,1 +C1192,1 +C1193,1 +C1194,1 +C1195,1 +C1196,1 +C1197,1 +C1198,1 +C1199,1 +C1200,1 diff --git a/pmml-h2o/src/test/resources/csv/RandomForestBitSet.csv b/pmml-h2o/src/test/resources/csv/RandomForestBitSet.csv new file mode 100644 index 0000000..b5a868f --- /dev/null +++ b/pmml-h2o/src/test/resources/csv/RandomForestBitSet.csv @@ -0,0 +1,1201 @@ +Score +0.8 +0.4 +0.8 +0.0 +0.6 +0.4 +0.8 +0.4 +0.6 +0.4 +0.8 +0.0 +0.6 +0.4 +0.8 +0.2 +0.8 +0.4 +1.0 +0.2 +1.0 +0.6 +0.8 +0.2 +0.8 +0.2 +0.8 +0.0 +1.0 +0.2 +0.6 +0.2 +0.8 +0.2 +1.0 +0.2 +0.8 +0.4 +0.8 +0.2 +0.6 +0.2 +1.0 +0.2 +0.2 +0.2 +0.2 +0.2 +0.8 +0.2 +0.8 +0.2 +1.0 +0.4 +0.8 +0.0 +0.2 +0.2 +0.4 +0.2 +1.0 +0.6 +0.8 +0.4 +1.0 +0.4 +0.8 +0.4 +1.0 +0.2 +0.8 +0.4 +1.0 +0.2 +0.8 +0.4 +0.8 +0.2 +0.8 +0.2 +0.8 +0.4 +1.0 +0.2 +0.8 +0.0 +0.8 +0.4 +0.6 +0.0 +1.0 +0.2 +0.8 +0.4 +1.0 +0.8 +1.0 +0.4 +1.0 +0.8 +1.0 +0.4 +1.0 +0.8 +1.0 +0.6 +1.0 +0.4 +1.0 +1.0 +1.0 +0.2 +1.0 +1.0 +1.0 +0.0 +1.0 +1.0 +1.0 +0.4 +1.0 +0.6 +0.6 +0.6 +1.0 +0.0 +1.0 +0.4 +1.0 +0.0 +0.6 +0.2 +1.0 +0.2 +0.8 +0.0 +0.6 +0.2 +0.8 +0.0 +0.6 +0.2 +0.6 +0.2 +0.6 +0.0 +0.2 +0.2 +1.0 +0.0 +1.0 +0.2 +1.0 +0.2 +0.6 +0.0 +0.2 +0.0 +0.8 +0.2 +0.8 +0.0 +0.6 +0.0 +0.4 +0.0 +0.4 +0.0 +0.8 +0.0 +1.0 +0.0 +0.6 +0.0 +0.4 +0.0 +0.4 +0.0 +1.0 +0.2 +0.6 +0.0 +0.8 +0.2 +0.8 +0.0 +0.6 +0.0 +0.0 +0.2 +0.8 +0.2 +0.6 +0.0 +0.6 +0.2 +1.0 +0.0 +0.2 +0.2 +0.2 +0.0 +0.8 +0.2 +0.2 +0.2 +0.6 +0.2 +0.6 +0.0 +0.6 +0.0 +0.8 +0.2 +0.6 +0.2 +0.6 +0.2 +0.6 +0.2 +0.8 +0.0 +0.8 +0.0 +1.0 +0.0 +1.0 +0.0 +0.8 +0.0 +0.0 +0.2 +0.8 +0.0 +0.8 +0.0 +0.6 +0.0 +0.8 +0.2 +0.8 +0.0 +0.6 +0.0 +1.0 +0.0 +0.8 +0.2 +0.8 +0.0 +0.6 +0.2 +0.8 +0.0 +1.0 +0.0 +0.4 +0.0 +0.8 +0.2 +0.6 +0.0 +0.8 +0.0 +0.4 +0.0 +0.8 +0.0 +1.0 +0.2 +1.0 +0.2 +0.8 +0.2 +0.2 +0.2 +0.8 +0.2 +0.8 +0.0 +0.2 +0.2 +1.0 +0.0 +0.0 +0.0 +0.4 +0.0 +0.6 +0.2 +0.8 +0.0 +0.8 +0.0 +0.6 +0.2 +0.2 +0.2 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +0.2 +0.2 +0.4 +1.0 +0.4 +0.8 +0.2 +0.8 +0.4 +0.8 +1.0 +1.0 +0.8 +0.8 +0.4 +1.0 +0.2 +1.0 +0.4 +1.0 +0.0 +1.0 +0.2 +1.0 +1.0 +0.8 +0.4 +0.8 +0.4 +0.8 +0.4 +1.0 +0.4 +1.0 +0.6 +0.8 +0.2 +0.8 +0.8 +1.0 +0.6 +1.0 +0.4 +1.0 +0.2 +0.8 +0.0 +1.0 +0.6 +0.8 +1.0 +0.8 +0.6 +1.0 +0.4 +0.8 +0.4 +1.0 +0.2 +1.0 +0.2 +1.0 +0.2 +1.0 +0.4 +1.0 +0.2 +1.0 +0.4 +1.0 +0.0 +0.8 +0.2 +1.0 +0.4 +0.8 +0.2 +0.8 +0.2 +1.0 +0.4 +1.0 +0.8 +1.0 +0.2 +1.0 +0.2 +1.0 +0.2 +1.0 +0.0 +0.8 +0.8 +0.8 +0.8 +1.0 +0.2 +0.8 +0.2 +0.8 +0.4 +1.0 +0.2 +0.6 +0.2 +0.6 +0.2 +1.0 +0.2 +0.8 +0.0 +0.6 +0.4 +0.6 +0.0 +0.8 +0.2 +0.8 +0.4 +0.6 +0.2 +1.0 +0.0 +1.0 +0.2 +0.8 +0.0 +1.0 +0.2 +0.8 +0.2 +0.0 +0.4 +0.6 +0.4 +1.0 +0.2 +0.8 +0.2 +1.0 +0.2 +1.0 +0.0 +0.8 +0.4 +0.8 +0.0 +1.0 +0.2 +1.0 +0.2 +0.8 +0.4 +1.0 +0.2 +0.2 +0.2 +1.0 +0.2 +0.8 +0.0 +0.8 +0.0 +0.8 +0.6 +0.8 +0.4 +1.0 +0.2 +1.0 +0.2 +1.0 +0.0 +0.8 +0.2 +0.8 +0.2 +0.8 +0.4 +0.2 +0.2 +0.6 +0.4 +0.6 +0.2 +0.6 +0.2 +0.8 +0.0 +0.6 +0.2 +1.0 +0.2 +1.0 +0.2 +1.0 +0.2 +1.0 +0.2 +0.6 +0.4 +0.6 +0.0 +0.4 +0.4 +0.8 +0.0 +0.2 +0.2 +0.0 +0.2 +0.4 +0.2 +1.0 +0.0 +0.8 +0.2 +1.0 +0.0 +0.6 +0.0 +0.6 +0.0 +0.8 +0.0 +0.6 +0.0 +0.0 +0.0 +0.0 +0.0 +0.6 +0.0 +0.0 +0.0 +0.8 +0.0 +0.0 +0.0 +0.8 +0.0 +0.4 +0.0 +0.6 +0.0 +0.6 +0.0 +0.6 +0.0 +0.6 +0.0 +0.0 +0.0 +0.0 +0.0 +0.8 +0.0 +0.4 +0.0 +0.0 +0.0 +0.6 +0.0 +0.6 +0.0 +0.0 +0.0 +0.8 +0.0 +0.2 +0.0 +0.6 +0.0 +0.4 +0.0 +0.6 +0.0 +0.0 +0.0 +0.0 +0.0 +0.6 +0.0 +0.8 +0.0 +0.0 +0.0 +1.0 +0.0 +0.0 +0.0 +0.8 +0.0 +0.0 +0.0 +0.0 +0.2 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 +1.0 diff --git a/pmml-h2o/src/test/resources/main.py b/pmml-h2o/src/test/resources/main.py index 9bd89fb..5736475 100644 --- a/pmml-h2o/src/test/resources/main.py +++ b/pmml-h2o/src/test/resources/main.py @@ -46,7 +46,7 @@ def make_stacked_ensemble(df, ntrees): if len(sys.argv) > 1: datasets = (sys.argv[1]).split(",") else: - datasets = ["Audit", "Auto", "Housing", "Iris", "Visit"] + datasets = ["Audit", "Auto", "BitSet", "Housing", "Iris", "Visit"] # # Binary classification @@ -206,3 +206,21 @@ def build_housing(df, estimator, name): build_housing(housing_df, H2OExtendedIsolationForestEstimator(ntrees = 17, extension_level = 4, seed = 42), "ExtendedIsolationForestHousing") build_housing(housing_df, H2OIsolationForestEstimator(ntrees = 17, max_depth = 11, seed = 42), "IsolationForestHousing") + +# +# GenmodelBitSet issue +# + +def load_bitset(name): + return load_csv(name + ".csv", ["Code"]) + +def build_bitset(df, regressor, name): + regressor.train(*split_columns(df), training_frame = df) + store_mojo(regressor, name + ".zip") + score = regressor.predict(df) + score.set_names(["Score"]) + store_csv(score, name + ".csv") + +if "BitSet" in datasets: + df = load_bitset("BitSet") + build_bitset(df, H2ORandomForestEstimator(ntrees = 5, nbins_cats = 256, seed = 42), "RandomForestBitSet") diff --git a/pmml-h2o/src/test/resources/mojo/RandomForestBitSet.zip b/pmml-h2o/src/test/resources/mojo/RandomForestBitSet.zip new file mode 100644 index 0000000000000000000000000000000000000000..8bf6f5f29c6f95ab35043e1dcf6c80b4216a78fe GIT binary patch literal 16631 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

vlE;M7{2>}+}- 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 T@d1N@J$tMXk9d{mdD8v|C^dSF literal 0 HcmV?d00001