OverviewFilesCommitsIssuesDocsReleasesPeers

basal-agent / coemerge.c

94 lines · c ref:
/* coemerge.c — the hard one: can COMPARTMENTS and the REPLICASE co-emerge from ONE physics, unaided?
 *
 * ribozyme needed supplied compartments; bridges.c showed compartmentalized privatization is the
 * load-bearing ingredient and the decreed catalysis-map is not (emergent binding suffices). The remaining
 * edge: make the COMPARTMENT emerge too. Idea: let BINDING do double duty. Complementarity (the same physics
 * that gives catalysis) also gives COHESION -- mutually-binding strands stick together into a spatial cluster
 * (an emergent compartment), while poor binders (parasites) don't stick and DIFFUSE AWAY, excluding
 * themselves. One supplied physics (complementarity + diffusion + template copying); compartments, catalysis,
 * and parasite exclusion are all MEASURED, not decreed. No walls, no group-selection machinery, no phi->f map.
 *
 * Local binding b(c) = best complementarity of strand c to an occupied neighbour. It does BOTH:
 *   - COHESION: if b(c) >= THETA the strand is held (immobile); else it random-walks away (parasites shed).
 *   - CATALYSIS: copy fidelity for a birth near c = F0 + (F1-F0)*b(c)/PHIMAX.
 * Control: MOBILITY OFF (strands frozen = the failed bridge-A surface regime) vs ON (cohesion active), to
 * isolate whether cohesion is what makes compartments emerge. Razor: nothing rewards a sequence; phi/binding
 * are emergent; whether phi RISES and clusters FORM is measured.
 *
 * build:  cc -O2 -Wall -std=c11 -o coemerge coemerge.c -lm
 */
#include <math.h>
#include <stdio.h>
#include <stdint.h>

#define G      56
#define NC     (G*G)
#define L      24
#define PHIMAX (L/2)
#define F0     0.85
#define F1     0.999
#define BETA   2.0
#define THETA  8            /* binding needed to be held (immobile). below -> diffuse away */
#define DEG    0.08
#define EMPTY  0xffffffffu

static unsigned long long RNG;
static unsigned long long xs(void){ RNG^=RNG<<13; RNG^=RNG>>7; RNG^=RNG<<17; return RNG; }
static double urand(void){ return (double)(xs()>>11)*(1.0/9007199254740992.0); }
static int phi(uint32_t s){ int c=0; for(int i=0;i<PHIMAX;i++){ int a=(s>>i)&1,b=(s>>(L-1-i))&1; if(a!=b)c++; } return c; }
static int bind(uint32_t a,uint32_t b){ int c=0; for(int i=0;i<PHIMAX;i++){ int x=(a>>i)&1,y=(b>>(L-1-i))&1; if(x!=y)c++; } return c; }
static uint32_t replicate(uint32_t t,double f){ uint32_t c=0; for(int i=0;i<L;i++){ int b=(t>>i)&1; int nb=(urand()<f)?(1-b):b; if(nb)c|=(1u<<i);} return c; }
static uint32_t randstrand(void){ uint32_t s=0; for(int b=0;b<L;b++) if(urand()<0.5) s|=(1u<<b); return s; }

static uint32_t grd[NC];
static int bestbind(int x,int y){ int best=0; uint32_t s=grd[y*G+x]; for(int dy=-1;dy<=1;dy++)for(int dx=-1;dx<=1;dx++){ if(!dx&&!dy)continue; uint32_t n=grd[((y+dy+G)%G)*G+((x+dx+G)%G)]; if(n!=EMPTY){ int v=bind(s,n); if(v>best)best=v; } } return best; }

/* one run. mobile=1 enables cohesion/diffusion. returns final mean phi; writes final mean binding + start phi. */
static double run(int mobile,double *meanbind,double *start){
	for(int i=0;i<NC;i++) grd[i]= (urand()<0.5)? randstrand() : EMPTY;
	{ double s=0;int c=0; for(int i=0;i<NC;i++) if(grd[i]!=EMPTY){ s+=phi(grd[i]); c++; } *start=c?s/c:0; }
	for(int g=0;g<300;g++){
		/* mobility: unbound strands (low local binding) random-walk into an adjacent empty cell */
		if(mobile){
			for(int t=0;t<NC;t++){ int x=(int)(xs()%G),y=(int)(xs()%G),c=y*G+x; if(grd[c]==EMPTY)continue;
				if(bestbind(x,y)>=THETA) continue;                        /* held by binding -> stays */
				int dx=(int)(xs()%3)-1,dy=(int)(xs()%3)-1,nx=(x+dx+G)%G,ny=(y+dy+G)%G,nc=ny*G+nx;
				if(grd[nc]==EMPTY){ grd[nc]=grd[c]; grd[c]=EMPTY; }        /* wander */
			}
		}
		/* replication into an adjacent empty cell; fidelity from LOCAL binding; parasites faster */
		for(int t=0;t<NC;t++){ int x=(int)(xs()%G),y=(int)(xs()%G),c=y*G+x; if(grd[c]==EMPTY)continue;
			double w=1.0+BETA*(1.0-(double)phi(grd[c])/PHIMAX); if(urand()> w/(1.0+BETA)) continue;
			int dx=(int)(xs()%3)-1,dy=(int)(xs()%3)-1,nx=(x+dx+G)%G,ny=(y+dy+G)%G,nc=ny*G+nx; if(grd[nc]!=EMPTY)continue;
			int b=bestbind(x,y); double f=F0+(F1-F0)*((double)b/PHIMAX);
			grd[nc]=replicate(grd[c],f);
		}
		for(int i=0;i<NC;i++) if(grd[i]!=EMPTY && urand()<DEG) grd[i]=EMPTY;
	}
	double s=0,mb=0; int c=0; for(int y=0;y<G;y++)for(int x=0;x<G;x++){ if(grd[y*G+x]!=EMPTY){ s+=phi(grd[y*G+x]); mb+=bestbind(x,y); c++; } }
	*meanbind=c?mb/c:0; return c?s/c:0;
}

int main(void){
	printf("=== Co-emergence: can compartments + replicase arise from ONE physics (binding)? ===\n");
	printf("  Binding does double duty: COHESION (held if >=%d) + CATALYSIS (fidelity from local binding).\n",THETA);
	printf("  %dx%d grid, random start phi~6 (max 12). MOBILITY OFF = frozen (bridge-A surface control).\n\n",G,G);
	printf("  arm            | phi start->end | mean local-binding end | verdict\n");
	printf("  ---------------+----------------+------------------------+--------\n");

	unsigned long long seeds[]={0x9e3779b97f4a7c15ULL,0xd1b54a32d192ed03ULL,0x2545f4914f6cdd1dULL};
	int NS=3; double mb,st,en, offS=0,offE=0,offB=0, onS=0,onE=0,onB=0;
	for(int s=0;s<NS;s++){ RNG=seeds[s]; en=run(0,&mb,&st); offS+=st;offE+=en;offB+=mb; }
	for(int s=0;s<NS;s++){ RNG=seeds[s]; en=run(1,&mb,&st); onS+=st;onE+=en;onB+=mb; }
	offS/=NS;offE/=NS;offB/=NS; onS/=NS;onE/=NS;onB/=NS;
	printf("  MOBILITY OFF   |  %.2f -> %.2f  |         %.2f           | %s\n", offS,offE,offB, offE>offS+2?"IGNITES":(offE>offS+0.5?"partial":(offE<offS-0.5?"falls":"~flat")));
	int ig = onE>onS+2; st=onS;en=onE;mb=onB;
	printf("  MOBILITY ON    |  %.2f -> %.2f  |         %.2f           | %s\n", onS,onE,onB, ig?"IGNITES":(onE>onS+0.5?"partial":(onE<onS-0.5?"falls":"~flat")));
	printf("\n");
	if(ig)
		printf("  => CO-EMERGENCE. From ONE supplied physics (complementarity + diffusion + template copying),\n     binding self-organizes cohesive high-fidelity CLUSTERS (emergent compartments) that shed parasites\n     by diffusion, and fidelity bootstraps -- with NO decreed walls, group-selection machinery, or phi->f\n     map. Mobility (cohesion) is what does it: the frozen control (bridge-A surface) does NOT ignite.\n     HONEST BOUND: I still supplied the complementarity/diffusion/copy PHYSICS; whether THAT chemistry\n     exists is the pre-biotic given, not shown to arise from nothing.\n");
	else
		printf("  => Honest NULL: binding-cohesion did NOT ignite the bootstrap here. Compartments did not emerge\n     strongly enough to privatize catalysis against parasites in this regime. Co-emergence not shown; the\n     supplied-compartment result (ribozyme) still stands as the only crossing. Do not tune to force it.\n");
	return 0;
}