Hi all,
Very short time step is required for time evolution, but the observable time is in seconds. The following code will cause a memory error. Is there any way to resolve this error?
I would be thankful if you could help me with this question.
import os
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
import arviz as az
from sklearn.datasets import make_regression
import pymc as pm
import pytensor
import pytensor.tensor as pt
from pytensor.scan.utils import until
from pymc.pytensorf import collect_default_updates
# Initialize random number generator
RANDOM_SEED = 8927
rng = np.random.default_rng(RANDOM_SEED)
az.style.use("arviz-darkgrid")
time = 600
steps_per_second = 10000000
n_steps = time * steps_per_second
dt =1 / steps_per_second
def ode_update_func(A, B, C, k1, k2, am, bm):
A_new = A + (-k1*pt.power(A, am))*dt
B_new = B + (k1*pt.power(A, am) - k2*pt.power(B, bm))*dt
C_new = C + (k2*pt.power(B, bm))*dt
return A_new, B_new, C_new
with pm.Model() as model:
k1 = pm.TruncatedNormal("k1", mu=0.3, sigma=0.2, lower=0)
k2 = pm.TruncatedNormal("k2", mu=0.03, sigma=0.02, lower=0)
am = pm.TruncatedNormal("am", mu=1.0, sigma=0.2, lower=0)
bm = pm.TruncatedNormal("bm", mu=1.0, sigma=0.2, lower=0)
sigma = pm.InverseGamma("sigma", alpha=5, beta=0.2)
A_init = np.array(1.0, dtype=np.float64)
B_init = np.array(0.0, dtype=np.float64)
C_init = np.array(0.0, dtype=np.float64)
results, updates = pytensor.scan(
fn=ode_update_func,
outputs_info=[A_init, B_init, C_init],
non_sequences=[k1, k2, am, bm],
n_steps=n_steps,
strict=True
)
pm.Deterministic("result", pm.math.stack([results[0][::steps_per_second], results[1][::steps_per_second], results[2][::steps_per_second]]))
idata = pm.sample(draws=10, tune=10, chains=1, nuts_sampler="numpyro")
Only 10 samples in chain.
Compiling...
Compilation time = 0:00:00.358350
Sampling...
sample: 100%|██████████| 20/20 [00:00<00:00, 21.76it/s, 15 steps of size 9.55e-02. acc. prob=0.98]
Sampling time = 0:00:01.670323
Transforming variables...