planner: four-strate owner plan spawns (L66); pinned 2-strate regression fixture
- Core caps each passage mouth reach to its own strate's usable content band (owner DA_Strate1 exports ReachMax=5000 owner voxels, which put the SW->FI lower mouth 79.5 m below FI, inside TN). - Unreal adapter: SW route search keeps the old 64 m candidates first, then a bounded single-mouth search with shorter lengths; logs candidate/rejection counts. - Internal-chain passage floor/support tweaks (only with >2 strates): ripple 1-2 4.78->2.90 cm, 2-3 3.57->0.10 cm. Interfaces still 0/3 walkable (59/3/2 unsupported). - verify.py: legacy tiers use Standalone/data/regression/owner_world_2strate_l61.json; new four-strate stage reads its expectations from owner_world.json (currently red on interfaces). - Unreal trace L14 vs HEAD, same assets (16-chunk FlatPlain): 12.20 vs 12.56 worker-s; no x2. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016dhxM43dnWvUu2B5Ph1iG1
This commit is contained in:
1 parent
47148e0a0d
commit
5e2fc53d39
17 files changed
+745
-73
No files matched your search
@@ -1950,6 +1950,10 @@ int main(int argc,char** argv)
|
||||
&&stratum.passageCapabilities.hasNativeLatticeField;});
|
||||
const auto actualRecipe=hasNativeLatticeRecipe?std::string_view("lattice")
|
||||
:hasNativeCavesRecipe?std::string_view("caves")
|
||||
:requestedRecipe=="surface-world"&&hasSurfaceWorldPlan
|
||||
?std::string_view("surface-world")
|
||||
:requestedRecipe=="floating-islands"&&hasFloatingIslands
|
||||
?std::string_view("floating-islands")
|
||||
:hasFloatingIslands?std::string_view("floating-islands")
|
||||
:hasSurfaceWorldPlan?std::string_view("surface-world")
|
||||
:std::string_view("missing");
|
||||
|
||||
@@ -2994,6 +2994,11 @@ namespace StandaloneStreamBenchmark
|
||||
appendDetrendedProfile(radii,start,windowSamples);
|
||||
double localPeriod=0.0;
|
||||
const double localAmplitude=sinusoidAmplitude(windowSamples,localPeriod);
|
||||
std::printf("[PassageWallRippleWindow] id=%s start_m=%.3f "
|
||||
"period_m=%.3f amplitude_m=%.4f coverage=%zu/%zu threshold_m=0.035\n",
|
||||
passage.stableId.c_str(),start,localPeriod,localAmplitude,
|
||||
radii.size(),static_cast<std::size_t>(WindowLengthMetres/
|
||||
SampleSpacingMetres)+1);
|
||||
if(localAmplitude>audit.localPeakAmplitudeMetres)
|
||||
{
|
||||
audit.localPeakAmplitudeMetres=localAmplitude;
|
||||
|
||||
@@ -47,7 +47,9 @@ namespace StandaloneWorldAssemblyPrototype
|
||||
std::uint64_t& gradeRejected,std::uint64_t& placementRejected,
|
||||
std::uint64_t& sweepRejected,std::uint32_t coreVoxelSizeMicrons,
|
||||
std::int64_t arrivalRadiusSubvoxels,
|
||||
std::int64_t departureRadiusSubvoxels,std::string& error)
|
||||
std::int64_t departureRadiusSubvoxels,std::string& error,
|
||||
bool multiStratePlan=false,
|
||||
bool fallbackSearch=false)
|
||||
{
|
||||
using namespace VoxelForgeCore;
|
||||
constexpr std::int64_t PlayerRadiusQ=348; // 0.34 m in Core's 0.25 m voxel scale.
|
||||
@@ -130,6 +132,26 @@ namespace StandaloneWorldAssemblyPrototype
|
||||
}
|
||||
candidateCenterSpacing=32;
|
||||
}
|
||||
else if(fallbackSearch&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0))
|
||||
{
|
||||
// Keep the original route candidates first. If their composed-field
|
||||
// sweep fails, use short, origin-biased chords that can meet the one
|
||||
// bounded mouth used by an outer strate.
|
||||
constexpr std::int64_t placementMarginQ=12*WorldAssemblySubvoxelsPerVoxel;
|
||||
const std::int64_t availableLengthVoxels=std::max<std::int64_t>(1,
|
||||
(arrivalRadiusSubvoxels+departureRadiusSubvoxels-placementMarginQ)
|
||||
/WorldAssemblySubvoxelsPerVoxel);
|
||||
const std::int32_t maximumHalfLength=static_cast<std::int32_t>(std::min<std::int64_t>(128,
|
||||
std::max<std::int64_t>(1,availableLengthVoxels/2)));
|
||||
candidateHalfLengths.clear();
|
||||
for(const std::int32_t numerator:std::array<std::int32_t,6>{{8,7,6,5,4,3}})
|
||||
{
|
||||
const std::int32_t halfLength=std::max(1,maximumHalfLength*numerator/8);
|
||||
if(std::find(candidateHalfLengths.begin(),candidateHalfLengths.end(),halfLength)
|
||||
==candidateHalfLengths.end())candidateHalfLengths.push_back(halfLength);
|
||||
}
|
||||
candidateCenterSpacing=32;
|
||||
}
|
||||
const double coreVoxelMetres=static_cast<double>(coreVoxelSizeMicrons)/1000000.0;
|
||||
if(std::getenv("VOXELFORGE_AUDIT_LEGACY_ROUTE_GRADE"))
|
||||
{
|
||||
@@ -245,12 +267,20 @@ namespace StandaloneWorldAssemblyPrototype
|
||||
candidate.endpointProximityCost+=static_cast<std::uint64_t>(
|
||||
targetRadiusQ*targetRadiusQ)*64ull;
|
||||
}
|
||||
else if(arrivalRadiusSubvoxels>0&&departureRadiusSubvoxels>0
|
||||
else if(((arrivalRadiusSubvoxels>0&&departureRadiusSubvoxels>0)
|
||||
||(!fallbackSearch&&multiStratePlan
|
||||
&&arrivalRadiusSubvoxels==0
|
||||
&&departureRadiusSubvoxels>0)
|
||||
||(fallbackSearch&&multiStratePlan
|
||||
&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0)))
|
||||
&&(index==0||index==32))
|
||||
{
|
||||
const std::uint64_t radiusSquared=static_cast<std::uint64_t>(
|
||||
xQ*xQ+yQ*yQ);
|
||||
candidate.endpointProximityCost+=radiusSquared*(index==0?16ull:1ull);
|
||||
if(index==0&&arrivalRadiusSubvoxels>0)
|
||||
candidate.endpointProximityCost+=radiusSquared*16ull;
|
||||
if(index==32&&departureRadiusSubvoxels>0)
|
||||
candidate.endpointProximityCost+=radiusSquared;
|
||||
}
|
||||
const auto inRadius=[](std::int64_t xValue,std::int64_t yValue,std::int64_t radius)
|
||||
{return radius<=0||xValue*xValue+yValue*yValue<=radius*radius;};
|
||||
@@ -412,6 +442,16 @@ namespace StandaloneWorldAssemblyPrototype
|
||||
++sweepAttempt;
|
||||
++sweepRejected;
|
||||
}
|
||||
if(!fallbackSearch&&multiStratePlan
|
||||
&&(arrivalRadiusSubvoxels>0||departureRadiusSubvoxels>0))
|
||||
{
|
||||
std::printf("[WorldAssemblerRouteFallback] reason=bounded-single-mouth arrival_radius_m=%.3f departure_radius_m=%.3f\n",
|
||||
arrivalRadiusSubvoxels*coreVoxelMetres/WorldAssemblySubvoxelsPerVoxel,
|
||||
departureRadiusSubvoxels*coreVoxelMetres/WorldAssemblySubvoxelsPerVoxel);
|
||||
return BuildFiniteStrateRoute(recipe,stratum,tested,gradeRejected,placementRejected,
|
||||
sweepRejected,coreVoxelSizeMicrons,arrivalRadiusSubvoxels,
|
||||
departureRadiusSubvoxels,error,multiStratePlan,true);
|
||||
}
|
||||
std::printf("[WorldAssemblerRouteSearchFailed] tested=%llu grade_rejected=%llu sweepable_candidates=%llu sweep_rejected=%llu last_blocked=%llu last_unsupported=%llu last_grade_failures=%llu\n",
|
||||
static_cast<unsigned long long>(tested),static_cast<unsigned long long>(gradeRejected),
|
||||
static_cast<unsigned long long>(candidates.size()),static_cast<unsigned long long>(sweepRejected),
|
||||
@@ -847,7 +887,7 @@ namespace StandaloneWorldAssemblyPrototype
|
||||
std::uint64_t routeCandidates=0,routeGradeRejected=0,routePlacementRejected=0,routeSweepRejected=0;
|
||||
if(!BuildFiniteStrateRoute(recipe,stratum,routeCandidates,routeGradeRejected,
|
||||
routePlacementRejected,routeSweepRejected,owner.CoreVoxelSizeMicrons,
|
||||
arrivalRadiusQ,departureRadiusQ,error))return false;
|
||||
arrivalRadiusQ,departureRadiusQ,error,owner.Manager->GetLayout().Num()>2))return false;
|
||||
std::printf("[WorldAssemblerRoutePlan] candidates=%llu grade_rejected=%llu placement_rejected=%llu sweep_rejected=%llu accepted_points=%zu capsule_m=0.34x1.76 corridor_radius_vox=4 support_probe_points=5 minimum_support_probes=%u arrival_radius_m=%.3f departure_radius_m=%.3f status=PASS\n",
|
||||
static_cast<unsigned long long>(routeCandidates),
|
||||
static_cast<unsigned long long>(routeGradeRejected),
|
||||
|
||||
Reference in new issue
Block a user