fill vs refill

This commit is contained in:
2026-06-19 14:09:24 +02:00
parent e807c77dad
commit 4c6c956345
2 changed files with 60 additions and 16 deletions
@@ -66,17 +66,31 @@ Replenishment contexts (NOT_AP, NOT_bAP): competitive refill, ship downstream, d
---
## Shared competitive replenishment (used by all NOT contexts)
## Pool-filling primitives
Two shapes share the core "rise toward a ceiling, bounded by the gap, paying budget":
```
// PRIVATE: fill own pool from own reserve toward own ceiling, at a rate cap
fill(pool, ceiling, rate_cap, cost, budget):
amount = min(rate_cap, ceiling - pool)·Δt // bounded by rate AND gap
pool += amount
budget -= amount·cost
// CONTESTED: fill toward ceiling by a rationed share of a shared supply S
refill(component c from supply S):
demand = c.budget_ceiling - c.budget // claim = gap to ceiling
total = Σ demand over components on S
factor = min(1, S / (total + ε))
c.budget += demand × factor // never exceeds ceiling
S -= demand × factor
demand = c.budget_ceiling - c.budget // claim = gap to ceiling
total = Σ demand over components on S
factor = min(1, S / (total + ε))
c.budget += demand × factor // never exceeds ceiling
S -= demand × factor
```
Choose by source: a pool drawn from a **private reserve** uses `fill`; a pool drawn from a
**contested shared supply** uses `refill`. The distinction is biologically real — RRP comes
from the bouton's private reserve pool, while operational budget comes from astrocytic lactate
that neighbours compete for.
---
## PRE
@@ -93,16 +107,13 @@ DAY | AP:
if RRP > 0:
NT_flux = RRP × drive
glutamate += NT_flux·Δt; RRP -= NT_flux·Δt; pre_budget -= NT_flux·fusion_cost
RRP += min(refill_rate, pre_structure.refill_ceiling)·Δt
RRP = clamp(RRP, 0, pre_structure.slot_ceiling)
pre_budget -= RRP_refill·vatpase_cost
if glutamate > spillover: drive *= brake
fill(RRP, pre_structure.slot_ceiling, pre_structure.refill_ceiling, vatpase_cost, pre_budget)
if glutamate > spillover: drive *= brake // output brake (not a fill)
DAY | NOT_AP:
pre_fast_trace *= decay(100ms); pre_endurance_need *= decay(min)
refill(pre from astro_lactate[syn] + axon_ship_pre)
RRP += min(refill_rate, pre_structure.refill_ceiling)·Δt
RRP = clamp(RRP, 0, pre_structure.slot_ceiling)
refill(pre from astro_lactate[syn] + axon_ship_pre) // contested: lactate + shipment
fill(RRP, pre_structure.slot_ceiling, pre_structure.refill_ceiling, vatpase_cost, pre_budget)
if pre_fast_trace > elig: pre_possible_tag += pre_fast_trace
pre_possible_tag *= decay(s); dopamine *= decay(ms)
if dopamine > dop_thr and pre_possible_tag > tag_thr:
@@ -129,10 +140,11 @@ DAY | NOT_bAP:
post_fast_trace *= decay(ms)
// CASE 1 — short-term potentiation: fill slots (no dopamine)
// CASE 1 — short-term potentiation: fill slots from private reserve (no dopamine)
// NOT generic fill(): rate is Ca-driven, and the else-branch is the STD consequence
if post_fast_trace > Ca_STP:
AMPA_surface = min(AMPA_surface + Ca_insert(post_fast_trace),
post_structure.slot_ceiling)
post_structure.slot_ceiling) // private: spine endosomal reserve
post_budget -= traffic_cost
else:
AMPA_surface = max(AMPA_surface - drift·Δt, baseline) // STD = consequence
@@ -223,7 +235,7 @@ DAY | NOT_AP:
soma_fast_trace *= decay(τ_nuclear)
soma_refractory_alignment *= decay(τ_align) // self-limiting
soma_endurance_need *= decay(min)
soma_budget += mito_output·Δt // self-replenish (root)
fill(soma_budget, soma_budget_ceiling, mito_output, 0, soma_budget) // private: own mitochondria, no external cost
branch_Vm = integrate(DEND.branch_Vm, branches)
ship(soma_budget → dend_budget, gap_to(dend))
ship(soma_budget → axon_budget, gap_to(axon))