# Shared data-generating model for the tumour growth example and simulation.
# log volume grows linearly: log V = log V0 + rate * day + measurement error. Mice are culled after the first
# measurement at or above the humane endpoint (1500 mm3 here), so later measurements are missing.
import numpy as np
DAYS = np.arange(0, 22, 3)            # day 0, 3, ..., 21
LIMIT = 1500.0
def simulate(rng, n, rate, v0=100.0, sd_v0=0.3, sd_rate=0.02, sd_meas=0.15):
    lv0 = np.log(v0) + rng.normal(0, sd_v0, n)
    r = rate + rng.normal(0, sd_rate, n)
    lv = lv0[:, None] + r[:, None] * DAYS[None, :] + rng.normal(0, sd_meas, (n, len(DAYS)))
    v = np.exp(lv)
    over = v >= LIMIT
    first = np.where(over.any(1), over.argmax(1), len(DAYS) - 1)
    v[np.arange(len(DAYS))[None, :] > first[:, None]] = np.nan     # culled after reaching the limit
    return v
