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); } @Override public PStackComputable findSimilarMasks(G22FindSimilarMasksTask task) { ret new FindSimilarMasks(task); } record noeq FindSimilarMasks(G22FindSimilarMasksTask task) extends PStackComputableWithStep is IMakeEmptyClone { bool brightBranch; public selfType makeEmptyClone() { ret new selfType; } void step(IPStack stack) { if (step == 0) { ++step; bool bright = isMaskBright(task.queryImage); printVars("step 0", +splitPixel, +bright); double bias = 0.9; stack.probabilisticOptions(this, ll( withProbability(bias, self -> self.brightBranch = bright), withProbability(1-bias, self -> self.brightBranch = !bright))); } else { printVars("step 1", +splitPixel, +brightBranch); IG22MasksHolder branch = brightBranch ? brightHolder : darkHolder; stack.tailCall(branch.findSimilarMasks(task)); } } } // Does the mask belong in darkHolder or brightHolder? bool isMaskBright(Image2B maskImage) { ret maskImage.getBoolPixel(splitPixel); } public IG22MasksHolder cloneTreeWithLabelTransform(IF1 f) { ret new G22PixelSplitMasks().splitPixel(splitPixel) .darkHolder(darkHolder.cloneTreeWithLabelTransform(f)) .brightHolder(brightHolder.cloneTreeWithLabelTransform(f)); } !include early #1035854 // Masks holder Include }