Workarounds for `arviz` no longer supporting `MultiTrace`?

The main reason is memory limitations, the InferenceData object is ~100 MB, but I suspect there might be a memory leak (or something is being cached?) since the size grows in subsequent runs of the sampler. I frequently run into OSError: [Errno 12] Cannot allocate memory (full traceback below) when using InferenceData but I have no issues when using MultiTrace. A less important reason is needing to refactor my analysis pipelines to use the syntax associated with InferenceData.

Problem occurred during compilation with the command line below:
/lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/bin/g++ -shared -g -O3 -fno-math-errno -Wno-unused-label -Wno-unused-variable -Wno-write-strings -Wno-c++11-narrowing -fno-exceptions -fno-unwind-tables -fno-asynchronous-unwind-tables -march=alderlake -mmmx -mpopcnt -msse -msse2 -msse3 -mssse3 -msse4.1 -msse4.2 -mavx -mavx2 -mno-sse4a -mno-fma4 -mno-xop -mfma -mno-avx512f -mbmi -mbmi2 -maes -mpclmul -mno-avx512vl -mno-avx512bw -mno-avx512dq -mno-avx512cd -mno-avx512er -mno-avx512pf -mno-avx512vbmi -mno-avx512ifma -mno-avx5124vnniw -mno-avx5124fmaps -mno-avx512vpopcntdq -mno-avx512vbmi2 -mgfni -mvpclmulqdq -mno-avx512vnni -mno-avx512bitalg -mno-avx512bf16 -mno-avx512vp2intersect -mno-3dnow -madx -mabm -mno-cldemote -mclflushopt -mclwb -mno-clzero -mcx16 -mno-enqcmd -mf16c -mfsgsbase -mfxsr -mno-hle -msahf -mno-lwp -mlzcnt -mmovbe -mmovdir64b -mmovdiri -mno-mwaitx -mpconfig -mpku -mno-prefetchwt1 -mprfchw -mptwrite -mrdpid -mrdrnd -mrdseed -mno-rtm -mserialize -mno-sgx -msha -mshstk -mno-tbm -mno-tsxldtrk -mvaes -mwaitpkg -mno-wbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mno-amx-tile -mno-amx-int8 -mno-amx-bf16 -mno-uintr -mhreset -mno-kl -mno-widekl -mavxvnni -mno-avx512fp16 --param l1-cache-size=32 --param l1-cache-line-size=64 --param l2-cache-size=25600 -mtune=alderlake -DNPY_NO_DEPRECATED_API=NPY_1_7_API_VERSION -m64 -fPIC -I/lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/numpy/core/include -I/lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/include/python3.9 -I/lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/c_code -L/lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib -fvisibility=hidden -o /users/tcohen/.pytensor/compiledir_Linux-4.18-el8_10.x86_64-x86_64-with-glibc2.28-x86_64-3.9.21-64/tmpo0be69ms/me00b73b710beaa3c6ed4d22d8941ba754bf43854f31f406a769cc9da89091508.so /users/tcohen/.pytensor/compiledir_Linux-4.18-el8_10.x86_64-x86_64-with-glibc2.28-x86_64-3.9.21-64/tmpo0be69ms/mod.cpp -lpython3.9
ERROR (pytensor.link.c.cmodule): [Errno 12] Cannot allocate memory
---------------------------------------------------------------------------
OSError                                   Traceback (most recent call last)
File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/vm.py:1235, in VMLinker.make_all(self, profiler, input_storage, output_storage, storage_map)
   1231 # no-recycling is done at each VM.__call__ So there is
   1232 # no need to cause duplicate c code by passing
   1233 # no_recycling here.
   1234 thunks.append(
-> 1235     node.op.make_thunk(node, storage_map, compute_map, [], impl=impl)
   1236 )
   1237 linker_make_thunk_time[node] = time.perf_counter() - thunk_start

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/op.py:119, in COp.make_thunk(self, node, storage_map, compute_map, no_recycling, impl)
    118 try:
--> 119     return self.make_c_thunk(node, storage_map, compute_map, no_recycling)
    120 except (NotImplementedError, MethodNotDefined):
    121     # We requested the c code, so don't catch the error.

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/op.py:84, in COp.make_c_thunk(self, node, storage_map, compute_map, no_recycling)
     83         raise NotImplementedError("float16")
---> 84 outputs = cl.make_thunk(
     85     input_storage=node_input_storage, output_storage=node_output_storage
     86 )
     87 thunk, node_input_filters, node_output_filters = outputs

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1189, in CLinker.make_thunk(self, input_storage, output_storage, storage_map, cache, **kwargs)
   1188 init_tasks, tasks = self.get_init_tasks()
-> 1189 cthunk, module, in_storage, out_storage, error_storage = self.__compile__(
   1190     input_storage, output_storage, storage_map, cache
   1191 )
   1193 res = _CThunk(cthunk, init_tasks, tasks, error_storage, module)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1109, in CLinker.__compile__(self, input_storage, output_storage, storage_map, cache)
   1108 output_storage = tuple(output_storage)
-> 1109 thunk, module = self.cthunk_factory(
   1110     error_storage,
   1111     input_storage,
   1112     output_storage,
   1113     storage_map,
   1114     cache,
   1115 )
   1116 return (
   1117     thunk,
   1118     module,
   (...)
   1127     error_storage,
   1128 )

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1631, in CLinker.cthunk_factory(self, error_storage, in_storage, out_storage, storage_map, cache)
   1630         cache = get_module_cache()
-> 1631     module = cache.module_from_key(key=key, lnk=self)
   1633 vars = self.inputs + self.outputs + self.orphans

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/cmodule.py:1231, in ModuleCache.module_from_key(self, key, lnk)
   1230 location = dlimport_workdir(self.dirname)
-> 1231 module = lnk.compile_cmodule(location)
   1232 name = module.__file__

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1532, in CLinker.compile_cmodule(self, location)
   1531     _logger.debug(f"LOCATION {location}")
-> 1532     module = c_compiler.compile_str(
   1533         module_name=mod.code_hash,
   1534         src_code=src_code,
   1535         location=location,
   1536         include_dirs=self.header_dirs(),
   1537         lib_dirs=self.lib_dirs(),
   1538         libs=libs,
   1539         preargs=preargs,
   1540     )
   1541 except Exception as e:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/cmodule.py:2589, in GCC_compiler.compile_str(module_name, src_code, location, include_dirs, lib_dirs, libs, preargs, py_module, hide_symbols)
   2588 try:
-> 2589     p_out = output_subprocess_Popen(cmd)
   2590     compile_stderr = p_out[1].decode()

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/utils.py:209, in output_subprocess_Popen(command, **params)
    208 params["stderr"] = subprocess.PIPE
--> 209 p = subprocess_Popen(command, **params)
    210 # we need to use communicate to make sure we don't deadlock around
    211 # the stdout/stderr pipe.

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/utils.py:175, in subprocess_Popen(command, **params)
    174 try:
--> 175     proc = subprocess.Popen(command, startupinfo=startupinfo, **params)
    176 finally:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/subprocess.py:951, in Popen.__init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask)
    948             self.stderr = io.TextIOWrapper(self.stderr,
    949                     encoding=encoding, errors=errors)
--> 951     self._execute_child(args, executable, preexec_fn, close_fds,
    952                         pass_fds, cwd, env,
    953                         startupinfo, creationflags, shell,
    954                         p2cread, p2cwrite,
    955                         c2pread, c2pwrite,
    956                         errread, errwrite,
    957                         restore_signals,
    958                         gid, gids, uid, umask,
    959                         start_new_session)
    960 except:
    961     # Cleanup if the child failed starting.

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/subprocess.py:1770, in Popen._execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session)
   1769 fds_to_keep.add(errpipe_write)
-> 1770 self.pid = _posixsubprocess.fork_exec(
   1771         args, executable_list,
   1772         close_fds, tuple(sorted(map(int, fds_to_keep))),
   1773         cwd, env_list,
   1774         p2cread, p2cwrite, c2pread, c2pwrite,
   1775         errread, errwrite,
   1776         errpipe_read, errpipe_write,
   1777         restore_signals, start_new_session,
   1778         gid, gids, uid, umask,
   1779         preexec_fn)
   1780 self._child_created = True

OSError: [Errno 12] Cannot allocate memory

During handling of the above exception, another exception occurred:

OSError                                   Traceback (most recent call last)
Cell In[11], line 1
----> 1 single_profile_bayes_pymc.test_widebandportrait_prior_real_imag()

File ~/Documents/Research_Journal/MSP_Populations/pulse_shapes/single_profile_bayes_pymc.py:145, in test_widebandportrait_prior_real_imag(td_noise_sigma, p0, nbins, plot)
    138 uscale_smooth = SinglePulse(profile, period=p0).getUscale()
    139 injected_profile = {"weff_smooth" : weff_smooth,
    140                     "uscale_smooth" : uscale_smooth,
    141                     "spin_period" : nbins,
    142                     "profile" : profile,
    143                     "noise_sigma" : noise_sigma,
    144                     "noiseless_profile" : noiseless_prof}
--> 145 trace = gaussian_pwrlaw_k_prior_real_imag(injected_profile, tunesamp=4000,
    146                                          plot=plot)
    147 return trace

File ~/Documents/Research_Journal/MSP_Populations/pulse_shapes/single_profile_bayes_pymc.py:201, in gaussian_pwrlaw_k_prior_real_imag(profile_dict, tunesamp, target_accept, plot)
    196 Y_obs_imag = pm.Normal('Y_obs_imag',
    197                        mu=b_k,
    198                        sigma=noise_sigma,
    199                        observed=Uobs_imag)
    200 # Compute the Maximum A Posteriori estimate
--> 201 map_estimate = pm.find_MAP(model=model)
    202 trace = pm.sample(10000,
    203                   tune=tunesamp,
    204                   target_accept=target_accept,
    205                   init="adapt_diag")
    206 with open("single_profile_bayes_pymc.map", "wb") as f:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pymc/tuning/starting.py:127, in find_MAP(start, vars, method, return_raw, include_transformed, progressbar, maxeval, model, seed, *args, **kwargs)
    120 ipfn = make_initial_point_fn(
    121     model=model,
    122     jitter_rvs=set(),
    123     return_transformed=True,
    124     overrides=start,
    125 )
    126 start = ipfn(seed)
--> 127 model.check_start_vals(start)
    129 vars_dict = {var.name: var for var in vars}
    130 x0 = DictToArrayBijection.map(
    131     {var_name: value for var_name, value in start.items() if var_name in vars_dict}
    132 )

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pymc/model/core.py:1678, in Model.check_start_vals(self, start)
   1672     valid_keys = ", ".join(value_names_set)
   1673     raise KeyError(
   1674         "Some start parameters do not appear in the model!\n"
   1675         f"Valid keys are: {valid_keys}, but {extra_keys} was supplied"
   1676     )
-> 1678 initial_eval = self.point_logps(point=elem)
   1680 if not all(np.isfinite(v) for v in initial_eval.values()):
   1681     raise SamplingError(
   1682         "Initial evaluation of model at starting point failed!\n"
   1683         f"Starting values:\n{elem}\n\n"
   1684         f"Logp initial evaluation results:\n{initial_eval}\n"
   1685         "You can call `model.debug()` for more details."
   1686     )

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pymc/model/core.py:1713, in Model.point_logps(self, point, round_vals)
   1707 factors = self.basic_RVs + self.potentials
   1708 factor_logps_fn = [pt.sum(factor) for factor in self.logp(factors, sum=False)]
   1709 return {
   1710     factor.name: np.round(np.asarray(factor_logp), round_vals)
   1711     for factor, factor_logp in zip(
   1712         factors,
-> 1713         self.compile_fn(factor_logps_fn)(point),
   1714     )
   1715 }

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pymc/model/core.py:1552, in Model.compile_fn(self, outs, inputs, mode, point_fn, **kwargs)
   1549     inputs = inputvars(outs)
   1551 with self:
-> 1552     fn = compile_pymc(
   1553         inputs,
   1554         outs,
   1555         allow_input_downcast=True,
   1556         accept_inplace=True,
   1557         mode=mode,
   1558         **kwargs,
   1559     )
   1561 if point_fn:
   1562     return PointFunc(fn)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pymc/pytensorf.py:985, in compile_pymc(inputs, outputs, random_seed, mode, **kwargs)
    983 opt_qry = mode.provided_optimizer.including("random_make_inplace", check_parameter_opt)
    984 mode = Mode(linker=mode.linker, optimizer=opt_qry)
--> 985 pytensor_function = pytensor.function(
    986     inputs,
    987     outputs,
    988     updates={**rng_updates, **kwargs.pop("updates", {})},
    989     mode=mode,
    990     **kwargs,
    991 )
    992 return pytensor_function

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/compile/function/__init__.py:315, in function(inputs, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input)
    309     fn = orig_function(
    310         inputs, outputs, mode=mode, accept_inplace=accept_inplace, name=name
    311     )
    312 else:
    313     # note: pfunc will also call orig_function -- orig_function is
    314     #      a choke point that all compilation must pass through
--> 315     fn = pfunc(
    316         params=inputs,
    317         outputs=outputs,
    318         mode=mode,
    319         updates=updates,
    320         givens=givens,
    321         no_default_updates=no_default_updates,
    322         accept_inplace=accept_inplace,
    323         name=name,
    324         rebuild_strict=rebuild_strict,
    325         allow_input_downcast=allow_input_downcast,
    326         on_unused_input=on_unused_input,
    327         profile=profile,
    328         output_keys=output_keys,
    329     )
    330 return fn

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/compile/function/pfunc.py:469, in pfunc(params, outputs, mode, updates, givens, no_default_updates, accept_inplace, name, rebuild_strict, allow_input_downcast, profile, on_unused_input, output_keys, fgraph)
    455     profile = ProfileStats(message=profile)
    457 inputs, cloned_outputs = construct_pfunc_ins_and_outs(
    458     params,
    459     outputs,
   (...)
    466     fgraph=fgraph,
    467 )
--> 469 return orig_function(
    470     inputs,
    471     cloned_outputs,
    472     mode,
    473     accept_inplace=accept_inplace,
    474     name=name,
    475     profile=profile,
    476     on_unused_input=on_unused_input,
    477     output_keys=output_keys,
    478     fgraph=fgraph,
    479 )

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/compile/function/types.py:1762, in orig_function(inputs, outputs, mode, accept_inplace, name, profile, on_unused_input, output_keys, fgraph)
   1750     m = Maker(
   1751         inputs,
   1752         outputs,
   (...)
   1759         fgraph=fgraph,
   1760     )
   1761     with config.change_flags(compute_test_value="off"):
-> 1762         fn = m.create(defaults)
   1763 finally:
   1764     if profile and fn:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/compile/function/types.py:1654, in FunctionMaker.create(self, input_storage, storage_map)
   1651 start_import_time = pytensor.link.c.cmodule.import_time
   1653 with config.change_flags(traceback__limit=config.traceback__compile_limit):
-> 1654     _fn, _i, _o = self.linker.make_thunk(
   1655         input_storage=input_storage_lists, storage_map=storage_map
   1656     )
   1658 end_linker = time.perf_counter()
   1660 linker_time = end_linker - start_linker

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/basic.py:245, in LocalLinker.make_thunk(self, input_storage, output_storage, storage_map, **kwargs)
    238 def make_thunk(
    239     self,
    240     input_storage: Optional["InputStorageType"] = None,
   (...)
    243     **kwargs,
    244 ) -> tuple["BasicThunkType", "InputStorageType", "OutputStorageType"]:
--> 245     return self.make_all(
    246         input_storage=input_storage,
    247         output_storage=output_storage,
    248         storage_map=storage_map,
    249     )[:3]

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/vm.py:1244, in VMLinker.make_all(self, profiler, input_storage, output_storage, storage_map)
   1242             thunks[-1].lazy = False
   1243     except Exception:
-> 1244         raise_with_op(fgraph, node)
   1246 t1 = time.perf_counter()
   1248 if self.profile:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/utils.py:531, in raise_with_op(fgraph, node, thunk, exc_info, storage_map)
    526     warnings.warn(
    527         f"{exc_type} error does not allow us to add an extra error message"
    528     )
    529     # Some exception need extra parameter in inputs. So forget the
    530     # extra long error message in that case.
--> 531 raise exc_value.with_traceback(exc_trace)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/vm.py:1235, in VMLinker.make_all(self, profiler, input_storage, output_storage, storage_map)
   1230 thunk_start = time.perf_counter()
   1231 # no-recycling is done at each VM.__call__ So there is
   1232 # no need to cause duplicate c code by passing
   1233 # no_recycling here.
   1234 thunks.append(
-> 1235     node.op.make_thunk(node, storage_map, compute_map, [], impl=impl)
   1236 )
   1237 linker_make_thunk_time[node] = time.perf_counter() - thunk_start
   1238 if not hasattr(thunks[-1], "lazy"):
   1239     # We don't want all ops maker to think about lazy Ops.
   1240     # So if they didn't specify that its lazy or not, it isn't.
   1241     # If this member isn't present, it will crash later.

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/op.py:119, in COp.make_thunk(self, node, storage_map, compute_map, no_recycling, impl)
    115 self.prepare_node(
    116     node, storage_map=storage_map, compute_map=compute_map, impl="c"
    117 )
    118 try:
--> 119     return self.make_c_thunk(node, storage_map, compute_map, no_recycling)
    120 except (NotImplementedError, MethodNotDefined):
    121     # We requested the c code, so don't catch the error.
    122     if impl == "c":

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/op.py:84, in COp.make_c_thunk(self, node, storage_map, compute_map, no_recycling)
     82         print(f"Disabling C code for {self} due to unsupported float16")
     83         raise NotImplementedError("float16")
---> 84 outputs = cl.make_thunk(
     85     input_storage=node_input_storage, output_storage=node_output_storage
     86 )
     87 thunk, node_input_filters, node_output_filters = outputs
     89 @is_cthunk_wrapper_type
     90 def rval():

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1189, in CLinker.make_thunk(self, input_storage, output_storage, storage_map, cache, **kwargs)
   1154 """Compile this linker's `self.fgraph` and return a function that performs the computations.
   1155 
   1156 The return values can be used as follows:
   (...)
   1186 
   1187 """
   1188 init_tasks, tasks = self.get_init_tasks()
-> 1189 cthunk, module, in_storage, out_storage, error_storage = self.__compile__(
   1190     input_storage, output_storage, storage_map, cache
   1191 )
   1193 res = _CThunk(cthunk, init_tasks, tasks, error_storage, module)
   1194 res.nodes = self.node_order

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1109, in CLinker.__compile__(self, input_storage, output_storage, storage_map, cache)
   1107 input_storage = tuple(input_storage)
   1108 output_storage = tuple(output_storage)
-> 1109 thunk, module = self.cthunk_factory(
   1110     error_storage,
   1111     input_storage,
   1112     output_storage,
   1113     storage_map,
   1114     cache,
   1115 )
   1116 return (
   1117     thunk,
   1118     module,
   (...)
   1127     error_storage,
   1128 )

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1631, in CLinker.cthunk_factory(self, error_storage, in_storage, out_storage, storage_map, cache)
   1629     if cache is None:
   1630         cache = get_module_cache()
-> 1631     module = cache.module_from_key(key=key, lnk=self)
   1633 vars = self.inputs + self.outputs + self.orphans
   1634 # List of indices that should be ignored when passing the arguments
   1635 # (basically, everything that the previous call to uniq eliminated)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/cmodule.py:1231, in ModuleCache.module_from_key(self, key, lnk)
   1229 try:
   1230     location = dlimport_workdir(self.dirname)
-> 1231     module = lnk.compile_cmodule(location)
   1232     name = module.__file__
   1233     assert name.startswith(location)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/basic.py:1532, in CLinker.compile_cmodule(self, location)
   1530 try:
   1531     _logger.debug(f"LOCATION {location}")
-> 1532     module = c_compiler.compile_str(
   1533         module_name=mod.code_hash,
   1534         src_code=src_code,
   1535         location=location,
   1536         include_dirs=self.header_dirs(),
   1537         lib_dirs=self.lib_dirs(),
   1538         libs=libs,
   1539         preargs=preargs,
   1540     )
   1541 except Exception as e:
   1542     e.args += (str(self.fgraph),)

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/link/c/cmodule.py:2589, in GCC_compiler.compile_str(module_name, src_code, location, include_dirs, lib_dirs, libs, preargs, py_module, hide_symbols)
   2586     print(" ".join(cmd), file=sys.stderr)
   2588 try:
-> 2589     p_out = output_subprocess_Popen(cmd)
   2590     compile_stderr = p_out[1].decode()
   2591 except Exception:
   2592     # An exception can occur e.g. if `g++` is not found.

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/utils.py:209, in output_subprocess_Popen(command, **params)
    207 params["stdout"] = subprocess.PIPE
    208 params["stderr"] = subprocess.PIPE
--> 209 p = subprocess_Popen(command, **params)
    210 # we need to use communicate to make sure we don't deadlock around
    211 # the stdout/stderr pipe.
    212 out = p.communicate()

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/site-packages/pytensor/utils.py:175, in subprocess_Popen(command, **params)
    172     params["stdin"] = stdin.fileno()
    174 try:
--> 175     proc = subprocess.Popen(command, startupinfo=startupinfo, **params)
    176 finally:
    177     if stdin is not None:

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/subprocess.py:951, in Popen.__init__(self, args, bufsize, executable, stdin, stdout, stderr, preexec_fn, close_fds, shell, cwd, env, universal_newlines, startupinfo, creationflags, restore_signals, start_new_session, pass_fds, user, group, extra_groups, encoding, errors, text, umask)
    947         if self.text_mode:
    948             self.stderr = io.TextIOWrapper(self.stderr,
    949                     encoding=encoding, errors=errors)
--> 951     self._execute_child(args, executable, preexec_fn, close_fds,
    952                         pass_fds, cwd, env,
    953                         startupinfo, creationflags, shell,
    954                         p2cread, p2cwrite,
    955                         c2pread, c2pwrite,
    956                         errread, errwrite,
    957                         restore_signals,
    958                         gid, gids, uid, umask,
    959                         start_new_session)
    960 except:
    961     # Cleanup if the child failed starting.
    962     for f in filter(None, (self.stdin, self.stdout, self.stderr)):

File /lustre/aoc/students/tcohen/miniconda3/envs/pulse_shapes_pm5/lib/python3.9/subprocess.py:1770, in Popen._execute_child(self, args, executable, preexec_fn, close_fds, pass_fds, cwd, env, startupinfo, creationflags, shell, p2cread, p2cwrite, c2pread, c2pwrite, errread, errwrite, restore_signals, gid, gids, uid, umask, start_new_session)
   1768     fds_to_keep = set(pass_fds)
   1769     fds_to_keep.add(errpipe_write)
-> 1770     self.pid = _posixsubprocess.fork_exec(
   1771             args, executable_list,
   1772             close_fds, tuple(sorted(map(int, fds_to_keep))),
   1773             cwd, env_list,
   1774             p2cread, p2cwrite, c2pread, c2pwrite,
   1775             errread, errwrite,
   1776             errpipe_read, errpipe_write,
   1777             restore_signals, start_new_session,
   1778             gid, gids, uid, umask,
   1779             preexec_fn)
   1780     self._child_created = True
   1781 finally:
   1782     # be sure the FD is closed no matter what

OSError: [Errno 12] Cannot allocate memory
Apply node that caused the error: Composite{((-0.5 * sqr((0.8838834764831842 * (i0 - i1)))) - 1.0423685721704357)}(Y_obs_real{[ 2.904211 ... 99220e-01]}, a_k)
Toposort index: 4
Inputs types: [TensorType(float64, shape=(129,)), TensorType(float64, shape=(129,))]

HINT: Use a linker other than the C linker to print the inputs' shapes and strides.
HINT: Re-running with most PyTensor optimizations disabled could provide a back-trace showing when this node was created. This can be done by setting the PyTensor flag 'optimizer=fast_compile'. If that does not work, PyTensor optimizations can be disabled with 'optimizer=None'.
HINT: Use the PyTensor flag `exception_verbosity=high` for a debug print-out and storage map footprint of this Apply node.