#define main cli_entry_for_tests #include "slime_bench.cu" #undef main #include struct HostEmit{ const sr::CellTerm* cells;int count;std::set* result; __host__ __device__ void operator()(uint64_t seed){ #ifndef __CUDA_ARCH__ if(sr::verifyPattern(seed,cells,count))result->insert(seed); #endif } }; void check(bool ok,const char*msg){if(!ok)throw std::runtime_error(msg);} int main(){ uint64_t points=0,groups=0,mixed=0;std::mt19937_64 rng(123456); for(int r=0;r<=64;++r){Config c;c.x=-123;c.z=98;c.radius=r;std::set> actual; for(uint64_t i=0;i cells(count);terms(coord,n,cells.data());uint32_t root=rng()&262143,base=(rng()&131071)&~240U; std::vector prepared(count*2); for(int i=0;i>18;prepared[2*i+1]=((((a^sr::kCombinedXor)&262143)*sr::kJavaMultiplier+11)>>17); for(int j=0;j<16;++j)check(q(prepared.data(),i,base+16*j)==(sr::nextStateFromTerm(root+(uint64_t(base+16*j)<<18),cells[i].term)>>17),"prepared q mismatch");} uint32_t expected=0;for(int j=0;j<16;++j)if(fs::differenceFilter(root+(uint64_t(base+16*j)<<18),cells.data(),count))expected|=1U< cells(count);terms(coord,pattern,cells.data()); uint64_t normalized=(world+sr::coordinateTerm(coord.x+pattern.cells.front().x,coord.z+pattern.cells.front().z))&sr::kMask48; check(sr::verifyPattern(normalized,cells.data(),count),"normalized pattern mismatch"); uint64_t low=normalized&((1ULL<<35)-1);std::set actual,expected; HostEmit emit{cells.data()+pattern.positive,count-pattern.positive,&actual}; fs::solveIntervals(low,cells.data(),pattern.positive,emit); for(uint64_t high=0;high<8192;++high){uint64_t seed=low+(high<<35); // Ordinary branch requires a successful first draw at positive cells. bool ordinary=true;for(int i=0;i>17)%10!=0)ordinary=false; if(ordinary&&sr::verifyPattern(seed,cells.data(),count))expected.insert(seed); } check(actual==expected,"mixed pattern high-bit solver mismatch");++mixed; uint32_t root=low&262143,base=uint32_t(low>>18)&~240U; std::vector prepared(count*2); for(int i=0;i>18;prepared[2*i+1]=((((a^sr::kCombinedXor)&262143)*sr::kJavaMultiplier+11)>>17);} uint32_t wanted=0;for(int j=0;j<16;++j)if(fs::differenceFilter(root+(uint64_t(base+16*j)<<18),cells.data(),pattern.positive))wanted|=1U<