ParamRF, or pmrf, is an open-source radio frequency (RF) modelling framework. It provides a declarative, object-orientated syntax for modelling complex RF circuits and surrogates using JAX and Equinox. The library also provides tools for model optimization, fitting, statistical analysis and Bayesian inference.
- Version:
- Author:
Gary Allen
- Homepage:
- Docs:
- Paper:
Key Features
Declarative syntax: Allows for the definition of models using either a self-documenting, declarative syntax, or via compositional techniques such as cascading or node composition. Since models can consist of a mix of parax.Parameter and other
pmrf.Modelobjects, this allows for a natural means of building complex, hierarchial models.Differentiable: Since the framework is built using
jax, all models can be differentiated with respect to frequency and parameters. This allows for complex optimization and sensitivity analysis.High performance and hardware flexibile: Since models are compiled using
jaxwith Just-In-Time (JIT) compilation, model performance is improved, and models can also be computed on high-performance hardware (CPU, GPU, TPU).Built-in optimization and inference wrappers: Provides built-in wrappers for frequentist optimization and Bayesian inference in
pmrf.optimizeandpmrf.infer, as well as high-level wrappers for data-fitting inpmrf.fit.Extensibility: Designed to be extendable, such that additional models, fitting algorithms, cost functions, sampling routines etc. can easily be implemented.
Installation
ParamRF can be installed directly using pip:
pip install paramrf
Sometimes this version may not be the latest release. To install from GitHub instead:
pip install git+https://github.com/gvcallen/paramrf@main
Example
The example below shows how to define and fit a simple RLC model to measured data using ParamRF. See the documentation for more complex examples.
import skrf as rf
import pmrf as prf
from pmrf.models import Resistor, Inductor, Capacitor
from pmrf.fit import fit
# Define the model and load data
model = Resistor(R=100.0) ** Inductor(L=1e-9) ** Capacitor(L=1e-12)
data = rf.Network('path/to/rlc.s2p')
# Fit the model and output results and parmaeters
results = fit(model, data)
results.plot('s_db')
print(results.model.named_params())
Optional dependencies
Several additional dependencies are required/recommended for more advanced use-cases.
For Bayesian inference, you may need this fork of distreqx:
pip install git+https://github.com/gvcallen/distreqx.git@extra_bijs_and_dists
For PolyChord fitting:
pip install git+https://github.com/PolyChord/PolyChordLite.git anesthetic mpi4py
For BlackJAX fitting:
pip install git+https://github.com/handley-lab/blackjax@nested_sampling anesthetic
For eqx-learn surrogate modeling:
pip install git+https://github.com/eqx-learn/eqx-learn
Citation
If you have used ParamRF for academic work, please cite the original paper (https://doi.org/10.48550/arXiv.2510.15881): as:
G.V.C. Allen, D.I.L. de Villiers, (2025). ParamRF: A JAX-native Framework for Declarative Circuit Modelling. arXiv, https://doi.org/10.48550/arXiv.2510.15881.
or using the BibTeX:
@article{paramrf,
doi = {10.48550/arXiv.2510.15881},
url = {https://doi.org/10.48550/arXiv.2510.15881},
year = {2025},
month = {Oct},
title = {ParamRF: A JAX-native Framework for Declarative Circuit Modelling},
author = {Gary V. C. Allen and Dirk I. L. de Villiers},
eprint = {2510.15881},
archivePrefix = {arXiv},
primaryClass = {cs.OH},
}