| … | … | @@ -7,6 +7,26 @@ |
| 7 | 7 | * 0 PARASITES, which is death, not collapse-to-parasites. Units now persist, production adds, and a |
| 8 | 8 | * per-unit death rate removes. |
| 9 | 9 | * |
| 10 | * THIRD ATTEMPT, ALSO VOID — and it refines the diagnosis rather than fixing it. |
| 11 | * The payoff was made EXPENSIVE TO REDISCOVER (NTARG=4 SPECIFIC types out of NTYPE=16, so a lost |
| 12 | * type costs many mutations to re-find instead of one in four). Templates STILL collapse: |
| 13 | * 0.007 / 0.007 / 0.010 / 0.006 across the arms, and T0 voids the comparison again. |
| 14 | * |
| 15 | * THE REAL OBSTACLE IS DEEPER THAN CHEAP REDISCOVERY. A template costs a slot NOW, which lowers |
| 16 | * current function — and between-compartment selection scores current function EVERY generation. Its |
| 17 | * benefit is DEFERRED and CONDITIONAL: it pays only if a type is later lost. Making rediscovery |
| 18 | * expensive raises the deferred payoff without touching the immediate cost, so the trade is still |
| 19 | * lost before it can be won. |
| 20 | * |
| 21 | * WHAT WOULD ACTUALLY BE NEEDED: losses must occur often enough that the deferred benefit lands |
| 22 | * inside the selection horizon. That means few copies per type — small compartments — which is |
| 23 | * exactly the regime fidfloor.c measured as destroying sequence information. So the requirement |
| 24 | * collides with an already-measured result, and this is not a parameter away from working. |
| 25 | * |
| 26 | * THREE ATTEMPTS, THREE VOIDS, each revealing the previous diagnosis was incomplete. Stopping here |
| 27 | * is the honest call: the question is good and the design is not converging. |
| 28 | * |
| 29 | * ---- second attempt ---- |
| 10 | 30 | * SECOND ATTEMPT, ALSO VOID — and the diagnosis was already on record before it was built. |
| 11 | 31 | * K1 was fixed (growth now tracks TOTAL SIZE, so a parasite-filled compartment grows as well as a |
| 12 | 32 | * catalyst-filled one, and the knockout receives MORE material than FULL) and the metrics were |
| … | … | @@ -97,7 +117,8 @@ |
| 97 | 117 | #define NCOMP 600 |
| 98 | 118 | #define CAP 16 |
| 99 | 119 | #define GEN 400 |
| 100 | | #define NTYPE 4 |
| 120 | #define NTYPE 16 /* larger type space: a lost type is EXPENSIVE to re-find */ |
| 121 | #define NTARG 4 /* payoff needs these SPECIFIC types, not any four */ |
| 101 | 122 | #define BETA 2.0 /* parasite replication advantage */ |
| 102 | 123 | #define MUT 0.02 /* role/type mutation */ |
| 103 | 124 | #define FLO 0.85 /* template copy fidelity without a catalyst present */ |
| … | … | @@ -118,6 +139,7 @@ static int sz[NCOMP], nsz[NCOMP]; |
| 118 | 139 | static double mat[NCOMP], nmat[NCOMP]; |
| 119 | 140 | static int ncomp; |
| 120 | 141 | static double TFRAC; |
| 142 | static int TARGET[NTYPE]; |
| 121 | 143 | |
| 122 | 144 | static void counts(int c,int *nc,int *nt,int *np){ |
| 123 | 145 | *nc=*nt=*np=0; |
| … | … | @@ -127,23 +149,33 @@ static void counts(int c,int *nc,int *nt,int *np){ |
| 127 | 149 | else (*np)++; |
| 128 | 150 | } |
| 129 | 151 | } |
| 130 | | /* function = distinct catalyst types present. What the compartment can actually do. */ |
| 152 | /* function = how many of the SPECIFIC target types are present among catalysts. |
| 153 | THIS IS THE FIX. Previously any of 4 types counted, so a random mutation supplied a useful type |
| 154 | one time in four and rediscovery was cheap — genome.c's diagnosis, rebuilt by accident. Now the |
| 155 | payoff needs %d particular types out of %d, so a lost type costs many mutations to re-find and a |
| 156 | template that holds one is worth keeping. Nothing rewards templates directly; they still fold |
| 157 | nothing and still cost a slot. */ |
| 131 | 158 | static int func_of(int c){ |
| 132 | 159 | int seen[NTYPE]; memset(seen,0,sizeof seen); |
| 133 | 160 | for(int k=0;k<sz[c];k++) if(cell[c][k].role==CAT) seen[cell[c][k].type]=1; |
| 134 | | int f=0; for(int t=0;t<NTYPE;t++) f+=seen[t]; |
| 161 | int f=0; for(int t=0;t<NTYPE;t++) if(seen[t]&&TARGET[t]) f++; |
| 135 | 162 | return f; |
| 136 | 163 | } |
| 137 | 164 | |
| 138 | 165 | /* ko: 0 = FULL, 1 = boundary decoupled, 2 = reading off, 3 = replicase off */ |
| 139 | 166 | static void run(int ko,double *alive,double *funcavg,double *parfrac) |
| 140 | 167 | { |
| 168 | for(int t=0;t<NTYPE;t++) TARGET[t]=0; |
| 169 | for(int got=0;got<NTARG;){ int t=rint_(NTYPE); if(!TARGET[t]){ TARGET[t]=1; got++; } } |
| 141 | 170 | ncomp=NCOMP; |
| 142 | 171 | for(int c=0;c<ncomp;c++){ |
| 143 | 172 | sz[c]=CAP; mat[c]=0; |
| 144 | 173 | for(int k=0;k<CAP;k++){ /* SEEDED COMPLETE: catalysts + templates */ |
| 174 | /* seeded COMPLETE and CORRECT: catalysts and templates covering the target set */ |
| 175 | int tg=-1,seen=0; |
| 176 | for(int t=0;t<NTYPE&&tg<0;t++) if(TARGET[t]){ if(seen==(k/2)%NTARG) tg=t; seen++; } |
| 145 | 177 | cell[c][k].role = (k%2)?TEM:CAT; |
| 146 | | cell[c][k].type = k%NTYPE; |
| 178 | cell[c][k].type = (unsigned char)(tg<0?0:tg); |
| 147 | 179 | } |
| 148 | 180 | } |
| 149 | 181 | for(int g=0;g<GEN;g++){ |
| … | … | @@ -217,10 +249,11 @@ int main(void) |
| 217 | 249 | int NS=5; |
| 218 | 250 | printf("=== THREE CARRIERS: is the COMPLETE system STABLE? (not: can it bootstrap) ===\n"); |
| 219 | 251 | printf(" BOUNDARY nobody maintains, METABOLISM that produces, TEMPLATE that only remembers —\n"); |
| 252 | printf(" PAYOFF IS NOW EXPENSIVE TO REDISCOVER: %d SPECIFIC types of %d, so a lost type costs many\n mutations to re-find and a template holding one is worth keeping.\n",NTARG,NTYPE); |
| 220 | 253 | printf(" three couplings, none defectable: metabolism->boundary, template->function,\n"); |
| 221 | 254 | printf(" catalyst->template fidelity. Seeded COMPLETE; parasites are NOT seeded, they arise by\n"); |
| 222 | 255 | printf(" mutation, replicate %.0fx faster and contribute nothing. %d compartments x %d, %d gens.\n\n",1+BETA,NCOMP,CAP,GEN); |
| 223 | | printf(" arm | working (func>=2) | mean function (max %d) | templates | parasites\n",NTYPE); |
| 256 | printf(" arm | working (func>=2) | mean function (max %d) | templates | parasites\n",NTARG); |
| 224 | 257 | printf(" ------------------------+-------------------+------------------------+-----------+----------\n"); |
| 225 | 258 | const char *nm[4]={"FULL (all three) ","K1 boundary decoupled ","K2 reading off ","K3 replicase off "}; |
| 226 | 259 | double A[4],F[4],P[4],T[4]; |