static <E> List<E> selectValues(List<E> values, java.util.function.Predicate<E> valueFilter, Double split, boolean left){ UnsignedLong bits = toUnsignedLong(split.doubleValue()); List<E> result = new ArrayList<>(); for(int i = 0; i < values.size(); i++){ E value = values.get(i); boolean append; // Send "true" categories to the left if(left){ // Test if the least significant bit (LSB) is 1 append = (bits.mod(RandomForestConverter.TWO)).equals(UnsignedLong.ONE); } else // Send all other categories to the right { // Test if the LSB is 0 append = (bits.mod(RandomForestConverter.TWO)).equals(UnsignedLong.ZERO); } // End if if(append && valueFilter.test(value)){ result.add(value); } bits = bits.dividedBy(RandomForestConverter.TWO); } return result; }
@Test public void testHash() { assertEquals(590701660006484765L, CanonicalNodeNameOrder.INSTANCE.hashCodeLong("0").longValue()); assertEquals(590700560494856554L, CanonicalNodeNameOrder.INSTANCE.hashCodeLong("1").longValue()); assertEquals(590699460983228343L, CanonicalNodeNameOrder.INSTANCE.hashCodeLong("2").longValue()); assertEquals(590698361471600132L, CanonicalNodeNameOrder.INSTANCE.hashCodeLong("3").longValue()); assertEquals(287424979109030320L, CanonicalNodeNameOrder.INSTANCE.hashCodeLong("f1").longValue()); assertEquals(1791227333405493115L, CanonicalNodeNameOrder.INSTANCE .hashCodeLong("some-rather-large-feature-identifier").longValue()); String node1Name = "Lines.1"; String node2Name = "Points.1"; UnsignedLong node1Hash = CanonicalNodeNameOrder.INSTANCE.hashCodeLong(node1Name); UnsignedLong node2Hash = CanonicalNodeNameOrder.INSTANCE.hashCodeLong(node2Name); assertFalse(node1Hash.equals(node2Hash)); assertFalse(0 == CanonicalNodeNameOrder.INSTANCE.compare(node1Hash.longValue(), node1Name, node2Hash.longValue(), node2Name)); // If the bits are the same, the compare should fall back to string compare int nameCompare = node1Name.compareTo(node2Name); assertEquals(nameCompare, CanonicalNodeNameOrder.INSTANCE.compare(1L, node1Name, 1L, node2Name)); for (int i = 0; i < 8; i++) { assertTrue(CanonicalNodeNameOrder.bucket(node1Name, i) == CanonicalNodeNameOrder .bucket(node1Hash.longValue(), i)); } }