mirror of
https://github.com/VolmitSoftware/Iris.git
synced 2026-05-19 16:10:42 +00:00
OptiPass 2
Smart Sampling and stuff
This commit is contained in:
+797
-121
File diff suppressed because it is too large
Load Diff
@@ -68,6 +68,19 @@ public class IrisCaveProfile {
|
|||||||
@Desc("Vertical sample step used while evaluating cave density.")
|
@Desc("Vertical sample step used while evaluating cave density.")
|
||||||
private int sampleStep = 1;
|
private int sampleStep = 1;
|
||||||
|
|
||||||
|
@Desc("Use adaptive cave density prediction so only threshold-adjacent cells fall back to full-resolution evaluation.")
|
||||||
|
private boolean adaptiveSampling = true;
|
||||||
|
|
||||||
|
@MinNumber(2)
|
||||||
|
@MaxNumber(4)
|
||||||
|
@Desc("Horizontal adaptive predictor grid step used while classifying cave density planes.")
|
||||||
|
private int adaptiveSampleStep = 2;
|
||||||
|
|
||||||
|
@MinNumber(0)
|
||||||
|
@MaxNumber(1)
|
||||||
|
@Desc("Additional adaptive ambiguity margin used before the cave predictor falls back to exact sampling.")
|
||||||
|
private double adaptiveThresholdMargin = 0.04;
|
||||||
|
|
||||||
@MinNumber(0)
|
@MinNumber(0)
|
||||||
@MaxNumber(4096)
|
@MaxNumber(4096)
|
||||||
@Desc("Minimum carved cells expected from this profile before recovery boost applies.")
|
@Desc("Minimum carved cells expected from this profile before recovery boost applies.")
|
||||||
|
|||||||
+37
-9
@@ -130,12 +130,12 @@ public class IrisCaveCarver3DNearParityTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void exactPathMatchesNaiveReferenceWithoutWarpOrModules() throws Exception {
|
public void exactPathMatchesNaiveReferenceWithoutWarpOrModules() throws Exception {
|
||||||
assertExactParity(false, false);
|
assertExactParity(false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void exactPathMatchesNaiveReferenceWithWarpAndModules() throws Exception {
|
public void exactPathMatchesNaiveReferenceWithWarpAndModules() throws Exception {
|
||||||
assertExactParity(true, true);
|
assertExactParity(true, true, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
@@ -145,12 +145,12 @@ public class IrisCaveCarver3DNearParityTest {
|
|||||||
int[] precomputedSurfaceHeights = filledHeights(90);
|
int[] precomputedSurfaceHeights = filledHeights(90);
|
||||||
IrisRange worldYRange = new IrisRange(0D, 88D);
|
IrisRange worldYRange = new IrisRange(0D, 88D);
|
||||||
|
|
||||||
IrisCaveProfile exactProfile = createProfile(true, true).setSampleStep(1);
|
IrisCaveProfile exactProfile = createProfile(true, true).setSampleStep(1).setAdaptiveSampling(false);
|
||||||
IrisCaveCarver3D exactCarver = new IrisCaveCarver3D(engine, exactProfile);
|
IrisCaveCarver3D exactCarver = new IrisCaveCarver3D(engine, exactProfile);
|
||||||
WriterCapture exactCapture = createWriterCapture(96);
|
WriterCapture exactCapture = createWriterCapture(96);
|
||||||
int exactCarved = exactCarver.carve(exactCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
int exactCarved = exactCarver.carve(exactCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
||||||
|
|
||||||
IrisCaveProfile legacyProfile = createProfile(true, true).setSampleStep(2);
|
IrisCaveProfile legacyProfile = createProfile(true, true).setSampleStep(2).setAdaptiveSampling(false);
|
||||||
IrisCaveCarver3D legacyCarver = new IrisCaveCarver3D(engine, legacyProfile);
|
IrisCaveCarver3D legacyCarver = new IrisCaveCarver3D(engine, legacyProfile);
|
||||||
WriterCapture legacyCapture = createWriterCapture(96);
|
WriterCapture legacyCapture = createWriterCapture(96);
|
||||||
int legacyCarved = legacyCarver.carve(legacyCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
int legacyCarved = legacyCarver.carve(legacyCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
||||||
@@ -185,8 +185,8 @@ public class IrisCaveCarver3DNearParityTest {
|
|||||||
@Test
|
@Test
|
||||||
public void optimizedExactPathOutperformsNaiveReference() throws Exception {
|
public void optimizedExactPathOutperformsNaiveReference() throws Exception {
|
||||||
Engine engine = createEngine(128, 92);
|
Engine engine = createEngine(128, 92);
|
||||||
IrisCaveCarver3D optimizedCarver = new IrisCaveCarver3D(engine, createProfile(true, true));
|
IrisCaveCarver3D optimizedCarver = new IrisCaveCarver3D(engine, createProfile(true, true).setAdaptiveSampling(false));
|
||||||
IrisCaveCarver3D naiveCarver = new IrisCaveCarver3D(engine, createProfile(true, true));
|
IrisCaveCarver3D naiveCarver = new IrisCaveCarver3D(engine, createProfile(true, true).setAdaptiveSampling(false));
|
||||||
double[] columnWeights = fullWeights();
|
double[] columnWeights = fullWeights();
|
||||||
int[] precomputedSurfaceHeights = filledHeights(92);
|
int[] precomputedSurfaceHeights = filledHeights(92);
|
||||||
IrisRange worldYRange = new IrisRange(0D, 96D);
|
IrisRange worldYRange = new IrisRange(0D, 96D);
|
||||||
@@ -213,17 +213,45 @@ public class IrisCaveCarver3DNearParityTest {
|
|||||||
assertTrue("expected at least 2.0x speedup but was " + speedup, speedup >= 2D);
|
assertTrue("expected at least 2.0x speedup but was " + speedup, speedup >= 2D);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void assertExactParity(boolean warp, boolean modules) throws Exception {
|
@Test
|
||||||
|
public void adaptivePathStaysNearExactReferenceWithWarpAndModules() throws Exception {
|
||||||
Engine engine = createEngine(96, 90);
|
Engine engine = createEngine(96, 90);
|
||||||
double[] columnWeights = fullWeights();
|
double[] columnWeights = fullWeights();
|
||||||
int[] precomputedSurfaceHeights = filledHeights(90);
|
int[] precomputedSurfaceHeights = filledHeights(90);
|
||||||
IrisRange worldYRange = new IrisRange(0D, 88D);
|
IrisRange worldYRange = new IrisRange(0D, 88D);
|
||||||
|
|
||||||
IrisCaveCarver3D optimizedCarver = new IrisCaveCarver3D(engine, createProfile(warp, modules));
|
IrisCaveCarver3D adaptiveCarver = new IrisCaveCarver3D(engine, createProfile(true, true).setAdaptiveSampling(true));
|
||||||
|
WriterCapture adaptiveCapture = createWriterCapture(96);
|
||||||
|
int adaptiveCarved = adaptiveCarver.carve(adaptiveCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
||||||
|
|
||||||
|
IrisCaveCarver3D exactCarver = new IrisCaveCarver3D(engine, createProfile(true, true).setAdaptiveSampling(false));
|
||||||
|
WriterCapture exactCapture = createWriterCapture(96);
|
||||||
|
int exactCarved = exactCarver.carve(exactCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
||||||
|
|
||||||
|
Set<String> differingCells = new HashSet<>(adaptiveCapture.carvedCells);
|
||||||
|
differingCells.addAll(exactCapture.carvedCells);
|
||||||
|
Set<String> sharedCells = new HashSet<>(adaptiveCapture.carvedCells);
|
||||||
|
sharedCells.retainAll(exactCapture.carvedCells);
|
||||||
|
differingCells.removeAll(sharedCells);
|
||||||
|
|
||||||
|
int baselineCells = Math.max(1, exactCapture.carvedCells.size());
|
||||||
|
double carveDeltaRatio = Math.abs(adaptiveCarved - exactCarved) / (double) baselineCells;
|
||||||
|
double differingRatio = differingCells.size() / (double) baselineCells;
|
||||||
|
assertTrue("expected carve count delta below 2.5% but was " + carveDeltaRatio, carveDeltaRatio <= 0.025D);
|
||||||
|
assertTrue("expected carved cell delta below 3.5% but was " + differingRatio, differingRatio <= 0.035D);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void assertExactParity(boolean warp, boolean modules, boolean adaptiveSampling) throws Exception {
|
||||||
|
Engine engine = createEngine(96, 90);
|
||||||
|
double[] columnWeights = fullWeights();
|
||||||
|
int[] precomputedSurfaceHeights = filledHeights(90);
|
||||||
|
IrisRange worldYRange = new IrisRange(0D, 88D);
|
||||||
|
|
||||||
|
IrisCaveCarver3D optimizedCarver = new IrisCaveCarver3D(engine, createProfile(warp, modules).setAdaptiveSampling(adaptiveSampling));
|
||||||
WriterCapture optimizedCapture = createWriterCapture(96);
|
WriterCapture optimizedCapture = createWriterCapture(96);
|
||||||
int optimizedCarved = optimizedCarver.carve(optimizedCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
int optimizedCarved = optimizedCarver.carve(optimizedCapture.writer, 5, -1, columnWeights, 0D, 0D, worldYRange, precomputedSurfaceHeights);
|
||||||
|
|
||||||
IrisCaveCarver3D naiveCarver = new IrisCaveCarver3D(engine, createProfile(warp, modules));
|
IrisCaveCarver3D naiveCarver = new IrisCaveCarver3D(engine, createProfile(warp, modules).setAdaptiveSampling(false));
|
||||||
WriterCapture naiveCapture = createWriterCapture(96);
|
WriterCapture naiveCapture = createWriterCapture(96);
|
||||||
int naiveCarved = carveNaiveExact(naiveCarver, naiveCapture.writer, 5, -1, columnWeights, worldYRange, precomputedSurfaceHeights);
|
int naiveCarved = carveNaiveExact(naiveCarver, naiveCapture.writer, 5, -1, columnWeights, worldYRange, precomputedSurfaceHeights);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user