sclass BWImageCategorizer { new L images; float allowedDistance = 0.1f; // allowed difference within category *() {} *(float *allowedDistance) {} int locateImage(BWImage img) { for i over images: if (bwDistance(images.get(i), img, allowedDistance) <= allowedDistance) ret i; ret -1; } int addImage(RGBImage img) { ret addImage(new BWImage(img)); } int addImage(BWImage img) { int i = locateImage(img); if (i >= 0) ret i; images.add(img); ret l(images)-1; } int numCategories() { ret l(images); } void clear() { images.clear(); } L rgbImages() { ret bwImagesToRGB(images); } // find best fit regardless of distance // returns Pair Pair locateLax(BWImage img) { new Lowest l; for i over images: l.put(i, bwDistance(images.get(i), img)); ret pair(or(l.get(), -1), 1f-l.floatScoreOr(1)); } }