persistable sclass G22PixelSplitMasks is IG22OptimizedMasksHolder> { replace Mask with IG22Mask>. settable Pt splitPixel; settable IG22MasksHolder> darkHolder; settable IG22MasksHolder> brightHolder; public L masks() { ret new ConcatOnDemandList( darkHolder.masks(), brightHolder.masks()); } public L>> subHolders() { ret ll(darkHolder, brightHolder); } public void transformSubHolders(IF1>> f) { darkHolder = f.get(darkHolder); brightHolder = f.get(brightHolder); } public PStackComputable findSimilarMasks( Image2B maskImage, ProbabilisticList outList) { ret new FindSimilarMasks(maskImage, outList); } record noeq FindSimilarMasks(Image2B maskImage, ProbabilisticList outList) extends PStackComputableWithStep { bool brightBranch; void step(IPStack stack) { if (step == 0) { ++step; bool bright = isMaskBright(maskImage); double p = 0.9; stack.probabilisticOptions(this, ll( withProbability(p, self -> self.brightBranch = bright), withProbability(1-p, self -> self.brightBranch = !bright))); } else { (brightBranch ? brightHolder : darkHolder).findSimilarMasks(maskImage, outList); stack.ret(); } } } // Does the mask belong in darkHolder or brightHolder? bool isMaskBright(Image2B maskImage) { ret maskImage.getBoolPixel(splitPixel); } !include early #1035854 // Masks holder Include }