paramrf 0.37.1__tar.gz → 0.37.3__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. {paramrf-0.37.1/paramrf.egg-info → paramrf-0.37.3}/PKG-INFO +1 -1
  2. {paramrf-0.37.1 → paramrf-0.37.3/paramrf.egg-info}/PKG-INFO +1 -1
  3. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/__init__.py +1 -0
  4. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/empirical.py +20 -4
  5. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/nodal.py +46 -0
  6. {paramrf-0.37.1 → paramrf-0.37.3}/pyproject.toml +1 -1
  7. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_lines.py +34 -2
  8. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_nodal.py +41 -1
  9. {paramrf-0.37.1 → paramrf-0.37.3}/.github/workflows/docs.yml +0 -0
  10. {paramrf-0.37.1 → paramrf-0.37.3}/.github/workflows/draft-pdf.yml +0 -0
  11. {paramrf-0.37.1 → paramrf-0.37.3}/.github/workflows/publish.yml +0 -0
  12. {paramrf-0.37.1 → paramrf-0.37.3}/.github/workflows/tests.yml +0 -0
  13. {paramrf-0.37.1 → paramrf-0.37.3}/.gitignore +0 -0
  14. {paramrf-0.37.1 → paramrf-0.37.3}/AGENTS.md +0 -0
  15. {paramrf-0.37.1 → paramrf-0.37.3}/CHANGELOG.md +0 -0
  16. {paramrf-0.37.1 → paramrf-0.37.3}/CITATION.cff +0 -0
  17. {paramrf-0.37.1 → paramrf-0.37.3}/CLAUDE.md +0 -0
  18. {paramrf-0.37.1 → paramrf-0.37.3}/CONTEXT.md +0 -0
  19. {paramrf-0.37.1 → paramrf-0.37.3}/CONTRIBUTING.md +0 -0
  20. {paramrf-0.37.1 → paramrf-0.37.3}/LICENSE +0 -0
  21. {paramrf-0.37.1 → paramrf-0.37.3}/NOTICE +0 -0
  22. {paramrf-0.37.1 → paramrf-0.37.3}/README.rst +0 -0
  23. {paramrf-0.37.1 → paramrf-0.37.3}/assets/logo.png +0 -0
  24. {paramrf-0.37.1 → paramrf-0.37.3}/docs/Makefile +0 -0
  25. {paramrf-0.37.1 → paramrf-0.37.3}/docs/_static/custom.css +0 -0
  26. {paramrf-0.37.1 → paramrf-0.37.3}/docs/_templates/autosummary/class.rst +0 -0
  27. {paramrf-0.37.1 → paramrf-0.37.3}/docs/_templates/autosummary/function.rst +0 -0
  28. {paramrf-0.37.1 → paramrf-0.37.3}/docs/_templates/autosummary/module.rst +0 -0
  29. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0001-line-modelling-architecture.md +0 -0
  30. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0002-parameter-api.md +0 -0
  31. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0003-derived-models.md +0 -0
  32. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0004-profiled-lines.md +0 -0
  33. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0005-priors-by-name.md +0 -0
  34. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0006-reference-impedance.md +0 -0
  35. {paramrf-0.37.1 → paramrf-0.37.3}/docs/adr/0007-edge-values.md +0 -0
  36. {paramrf-0.37.1 → paramrf-0.37.3}/docs/agents/domain.md +0 -0
  37. {paramrf-0.37.1 → paramrf-0.37.3}/docs/agents/issue-tracker.md +0 -0
  38. {paramrf-0.37.1 → paramrf-0.37.3}/docs/agents/triage-labels.md +0 -0
  39. {paramrf-0.37.1 → paramrf-0.37.3}/docs/api/index.rst +0 -0
  40. {paramrf-0.37.1 → paramrf-0.37.3}/docs/conf.py +0 -0
  41. {paramrf-0.37.1 → paramrf-0.37.3}/docs/core_concepts/core_primitives.rst +0 -0
  42. {paramrf-0.37.1 → paramrf-0.37.3}/docs/core_concepts/index.rst +0 -0
  43. {paramrf-0.37.1 → paramrf-0.37.3}/docs/core_concepts/jax_overview.rst +0 -0
  44. {paramrf-0.37.1 → paramrf-0.37.3}/docs/core_concepts/optimization_and_inference.rst +0 -0
  45. {paramrf-0.37.1 → paramrf-0.37.3}/docs/core_concepts/parameter_names.rst +0 -0
  46. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/cascading_and_terminating.rst +0 -0
  47. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/circuit_clc.png +0 -0
  48. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/circuit_models.rst +0 -0
  49. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/custom_models.rst +0 -0
  50. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/derivatives_and_sweeps.rst +0 -0
  51. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/discrepancy_prediction.rst +0 -0
  52. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/index.rst +0 -0
  53. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/model_optimization.rst +0 -0
  54. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/multiple_models_one_parameter_set.rst +0 -0
  55. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/parameter_naming_and_model_manipulation.rst +0 -0
  56. {paramrf-0.37.1 → paramrf-0.37.3}/docs/examples/shared_modules.rst +0 -0
  57. {paramrf-0.37.1 → paramrf-0.37.3}/docs/index.rst +0 -0
  58. {paramrf-0.37.1 → paramrf-0.37.3}/docs/license.rst +0 -0
  59. {paramrf-0.37.1 → paramrf-0.37.3}/docs/make.bat +0 -0
  60. {paramrf-0.37.1 → paramrf-0.37.3}/docs/research/conductor-loss-alternatives.md +0 -0
  61. {paramrf-0.37.1 → paramrf-0.37.3}/docs/research/holloway1994.pdf +0 -0
  62. {paramrf-0.37.1 → paramrf-0.37.3}/docs/research/microstrip-loss-conventions.md +0 -0
  63. {paramrf-0.37.1 → paramrf-0.37.3}/docs/research/precision-coax-microstrip-10-500mhz.md +0 -0
  64. {paramrf-0.37.1 → paramrf-0.37.3}/docs/skrf_comparison/index.rst +0 -0
  65. {paramrf-0.37.1 → paramrf-0.37.3}/docs/skrf_comparison/overview.rst +0 -0
  66. {paramrf-0.37.1 → paramrf-0.37.3}/docs/skrf_comparison/performance.rst +0 -0
  67. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/1_cable_fitting.ipynb +0 -0
  68. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/2_chip_inductor_fitting.ipynb +0 -0
  69. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/3_discrepancy_transfer.ipynb +0 -0
  70. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/data/CBN-1.5FT-SMSM.s2p +0 -0
  71. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/data/on-chip-inductor.s2p +0 -0
  72. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/index.rst +0 -0
  73. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/line_internal_discrepancy.py +0 -0
  74. {paramrf-0.37.1 → paramrf-0.37.3}/docs/tutorials/port_discrepancy.py +0 -0
  75. {paramrf-0.37.1 → paramrf-0.37.3}/paper/paper.bib +0 -0
  76. {paramrf-0.37.1 → paramrf-0.37.3}/paper/paper.md +0 -0
  77. {paramrf-0.37.1 → paramrf-0.37.3}/paper/rlc.png +0 -0
  78. {paramrf-0.37.1 → paramrf-0.37.3}/paramrf.egg-info/SOURCES.txt +0 -0
  79. {paramrf-0.37.1 → paramrf-0.37.3}/paramrf.egg-info/dependency_links.txt +0 -0
  80. {paramrf-0.37.1 → paramrf-0.37.3}/paramrf.egg-info/requires.txt +0 -0
  81. {paramrf-0.37.1 → paramrf-0.37.3}/paramrf.egg-info/top_level.txt +0 -0
  82. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/__init__.py +0 -0
  83. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/_solver_view.py +0 -0
  84. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/__init__.py +0 -0
  85. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/minimize.py +0 -0
  86. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/result.py +0 -0
  87. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/routers.py +0 -0
  88. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/sample.py +0 -0
  89. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/fitting/targets.py +0 -0
  90. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/frequency.py +0 -0
  91. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/__init__.py +0 -0
  92. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/base.py +0 -0
  93. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/result.py +0 -0
  94. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/sample.py +0 -0
  95. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/solvers/__init__.py +0 -0
  96. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/solvers/blackjax.py +0 -0
  97. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/infer/solvers/polychord.py +0 -0
  98. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/__init__.py +0 -0
  99. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/conductor.py +0 -0
  100. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/dielectric.py +0 -0
  101. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/properties.py +0 -0
  102. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/roughness.py +0 -0
  103. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/substrate.py +0 -0
  104. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/materials/surface_impedance.py +0 -0
  105. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/__init__.py +0 -0
  106. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/aggregations.py +0 -0
  107. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/bessel.py +0 -0
  108. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/conversions.py +0 -0
  109. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/losses.py +0 -0
  110. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/math/misc.py +0 -0
  111. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/__init__.py +0 -0
  112. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/base.py +0 -0
  113. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/bridge.py +0 -0
  114. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/callable.py +0 -0
  115. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/delegated.py +0 -0
  116. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/derived.py +0 -0
  117. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/static.py +0 -0
  118. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/adapters/wrapped.py +0 -0
  119. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/base.py +0 -0
  120. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/__init__.py +0 -0
  121. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/ideal.py +0 -0
  122. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/__init__.py +0 -0
  123. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/base.py +0 -0
  124. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/coaxial.py +0 -0
  125. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/ideal.py +0 -0
  126. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/microstrip.py +0 -0
  127. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/nodal.py +0 -0
  128. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/nonuniform.py +0 -0
  129. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/planar.py +0 -0
  130. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/profiles.py +0 -0
  131. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lines/stripline.py +0 -0
  132. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/lumped.py +0 -0
  133. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/components/sections.py +0 -0
  134. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/__init__.py +0 -0
  135. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/__init__.py +0 -0
  136. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/cascade.py +0 -0
  137. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/__init__.py +0 -0
  138. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/base.py +0 -0
  139. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/circuit.py +0 -0
  140. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/solvers/__init__.py +0 -0
  141. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/solvers/nodal.py +0 -0
  142. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/circuit/solvers/scattering.py +0 -0
  143. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/interconnected/terminated.py +0 -0
  144. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/topological.py +0 -0
  145. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/composite/transformed.py +0 -0
  146. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/line_discrepancy.py +0 -0
  147. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/port_discrepancy.py +0 -0
  148. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/surrogates/__init__.py +0 -0
  149. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/surrogates/expansion.py +0 -0
  150. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/models/surrogates/rational.py +0 -0
  151. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/modules/__init__.py +0 -0
  152. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/modules/base.py +0 -0
  153. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/modules/wrapped.py +0 -0
  154. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/network_collection.py +0 -0
  155. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/objectives/__init__.py +0 -0
  156. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/objectives/evaluators.py +0 -0
  157. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/objectives/losses.py +0 -0
  158. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/objectives/problems.py +0 -0
  159. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/objectives/terms.py +0 -0
  160. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/__init__.py +0 -0
  161. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/base.py +0 -0
  162. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/minimize.py +0 -0
  163. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/result.py +0 -0
  164. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/solvers/__init__.py +0 -0
  165. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/solvers/jaxopt.py +0 -0
  166. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/solvers/optimistix.py +0 -0
  167. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/optimize/solvers/scipy.py +0 -0
  168. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/parameters/__init__.py +0 -0
  169. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/parameters/constraints.py +0 -0
  170. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/rf/__init__.py +0 -0
  171. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/rf/cascade.py +0 -0
  172. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/rf/conversions.py +0 -0
  173. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/rf/mna.py +0 -0
  174. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/serialization.py +0 -0
  175. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/__init__.py +0 -0
  176. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/bijectors.py +0 -0
  177. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/covariance_kernels.py +0 -0
  178. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/discrepancy_models.py +0 -0
  179. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/distributions.py +0 -0
  180. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/likelihoods.py +0 -0
  181. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/linearization.py +0 -0
  182. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/stats/noise_models.py +0 -0
  183. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/types.py +0 -0
  184. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/__init__.py +0 -0
  185. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/array.py +0 -0
  186. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/debug.py +0 -0
  187. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/network.py +0 -0
  188. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/random.py +0 -0
  189. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/rf.py +0 -0
  190. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/transforms.py +0 -0
  191. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/tree.py +0 -0
  192. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/utils/type.py +0 -0
  193. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/viz/__init__.py +0 -0
  194. {paramrf-0.37.1 → paramrf-0.37.3}/pmrf/viz/plots.py +0 -0
  195. {paramrf-0.37.1 → paramrf-0.37.3}/scripts/benchmark_gp_marginal_likelihood.py +0 -0
  196. {paramrf-0.37.1 → paramrf-0.37.3}/scripts/install-test-deps.sh +0 -0
  197. {paramrf-0.37.1 → paramrf-0.37.3}/setup.cfg +0 -0
  198. {paramrf-0.37.1 → paramrf-0.37.3}/tests/__init__.py +0 -0
  199. {paramrf-0.37.1 → paramrf-0.37.3}/tests/_jit.py +0 -0
  200. {paramrf-0.37.1 → paramrf-0.37.3}/tests/conftest.py +0 -0
  201. {paramrf-0.37.1 → paramrf-0.37.3}/tests/data/10m_cable.s2p +0 -0
  202. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_autodiff.py +0 -0
  203. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_box_space_solving.py +0 -0
  204. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_conversions.py +0 -0
  205. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_covariance_kernels.py +0 -0
  206. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_dc_limits.py +0 -0
  207. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_discrepancy_models.py +0 -0
  208. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_evaluators.py +0 -0
  209. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_fitting_minimize.py +0 -0
  210. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_fitting_routers.py +0 -0
  211. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_fitting_sample.py +0 -0
  212. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_fitting_targets.py +0 -0
  213. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_frequency.py +0 -0
  214. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_grouped_exports.py +0 -0
  215. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_infer_base.py +0 -0
  216. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_infer_sample.py +0 -0
  217. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_line_internal_discrepancy_example.py +0 -0
  218. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_linearization.py +0 -0
  219. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_map_priors.py +0 -0
  220. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_materials/test_conductor.py +0 -0
  221. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_materials/test_dielectric.py +0 -0
  222. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_materials/test_serialization.py +0 -0
  223. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_materials/test_substrate.py +0 -0
  224. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_materials/test_surface_impedance.py +0 -0
  225. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_math/test_bessel.py +0 -0
  226. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_model.py +0 -0
  227. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_adapters.py +0 -0
  228. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_cascade.py +0 -0
  229. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_native_z0.py +0 -0
  230. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_nodal.py +0 -0
  231. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_port_order.py +0 -0
  232. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_scattering.py +0 -0
  233. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_shorted_ports.py +0 -0
  234. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_skrf_port_names.py +0 -0
  235. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_circuit_z0.py +0 -0
  236. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_current_distribution.py +0 -0
  237. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_derived.py +0 -0
  238. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_edge_values.py +0 -0
  239. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_interconnected.py +0 -0
  240. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_line_discrepancy.py +0 -0
  241. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_lines_skrf_matrix.py +0 -0
  242. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_lumped.py +0 -0
  243. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_port_discrepancy.py +0 -0
  244. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_profiles.py +0 -0
  245. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_rational.py +0 -0
  246. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_repeated_cascade.py +0 -0
  247. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_sections.py +0 -0
  248. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_transformed.py +0 -0
  249. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_models/test_transformers.py +0 -0
  250. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_module.py +0 -0
  251. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_naming.py +0 -0
  252. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_optimize_base.py +0 -0
  253. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_optimize_minimize.py +0 -0
  254. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_parameters.py +0 -0
  255. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_parameters_by_name.py +0 -0
  256. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_parameters_joint_prior.py +0 -0
  257. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_parameters_prior.py +0 -0
  258. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_parameters_validity.py +0 -0
  259. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_port_discrepancy_example.py +0 -0
  260. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_raw_space_solving.py +0 -0
  261. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_serialization.py +0 -0
  262. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_structural_updates.py +0 -0
  263. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_terms.py +0 -0
  264. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_transforms.py +0 -0
  265. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_utils/test_compress.py +0 -0
  266. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_utils/test_debug.py +0 -0
  267. {paramrf-0.37.1 → paramrf-0.37.3}/tests/test_utils/test_tree.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramrf
3
- Version: 0.37.1
3
+ Version: 0.37.3
4
4
  Summary: Parametric radio frequency modeling
5
5
  Author-email: Gary Allen <gvcallen@gmail.com>
6
6
  Project-URL: homepage, https://github.com/gvcallen/paramrf
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: paramrf
3
- Version: 0.37.1
3
+ Version: 0.37.3
4
4
  Summary: Parametric radio frequency modeling
5
5
  Author-email: Gary Allen <gvcallen@gmail.com>
6
6
  Project-URL: homepage, https://github.com/gvcallen/paramrf
@@ -207,6 +207,7 @@ from pmrf.models.composite.transformed import (
207
207
  from pmrf.models.composite.nodal import (
208
208
  FloatingTwoPort as FloatingTwoPort,
209
209
  Shunt as Shunt,
210
+ Series as Series,
210
211
  GroundLifted as GroundLifted,
211
212
  GroundExposed as GroundExposed,
212
213
  CoupledOnePorts as CoupledOnePorts,
@@ -20,10 +20,14 @@ class PhysicalLine(AbstractImmittanceLine):
20
20
 
21
21
  The per-unit-length parameters are
22
22
  $$R = 2 z_n \alpha_c$$
23
- $$L = \frac{z_n \sqrt{\varepsilon_r}}{c}$$
23
+ $$L = \frac{z_n \sqrt{\varepsilon_r}}{c} + \frac{R}{\omega}$$
24
24
  $$G = \frac{2 \alpha_d}{z_n}$$
25
25
  $$C = \frac{\sqrt{\varepsilon_r}}{z_n c}$$
26
26
 
27
+ The skin-effect term adds conductor reactance to the series impedance:
28
+ $$Z = R + j\omega z_n\sqrt{\varepsilon_r}/c + jR.$$
29
+ This contribution vanishes at DC.
30
+
27
31
  Example
28
32
  --------
29
33
  .. code-block:: python
@@ -93,7 +97,11 @@ class PhysicalLine(AbstractImmittanceLine):
93
97
  G = G_val * ones
94
98
  C = C_val * ones
95
99
 
96
- return ImmittanceResult.from_rlgc(R, L, G, C, freq.w)
100
+ return ImmittanceResult(
101
+ Z=R + 1j * (freq.w * L + R),
102
+ Y=G + 1j * freq.w * C,
103
+ omega=freq.w,
104
+ )
97
105
 
98
106
 
99
107
  class DatasheetLine(AbstractImmittanceLine):
@@ -108,10 +116,14 @@ class DatasheetLine(AbstractImmittanceLine):
108
116
 
109
117
  and the per-unit-length parameters are
110
118
  $$R = 2 z_n \alpha_c$$
111
- $$L = \frac{z_n}{v_f c}$$
119
+ $$L = \frac{z_n}{v_f c} + \frac{R}{\omega}$$
112
120
  $$G = \frac{2 \alpha_d}{z_n}$$
113
121
  $$C = \frac{1}{z_n v_f c}$$
114
122
 
123
+ The skin-effect term adds conductor reactance to the series impedance:
124
+ $$Z = R + j\omega z_n/(v_f c) + jR.$$
125
+ This contribution vanishes at DC.
126
+
115
127
  Example
116
128
  --------
117
129
  .. code-block:: python
@@ -186,5 +198,9 @@ class DatasheetLine(AbstractImmittanceLine):
186
198
  L = (zn / (vf * c)) * jnp.ones_like(w)
187
199
  C = (1.0 / (zn * vf * c)) * jnp.ones_like(w)
188
200
 
189
- return ImmittanceResult.from_rlgc(R, L, G, C, w)
201
+ return ImmittanceResult(
202
+ Z=R + 1j * (w * L + R),
203
+ Y=G + 1j * w * C,
204
+ omega=w,
205
+ )
190
206
 
@@ -203,6 +203,52 @@ class Shunt(Model):
203
203
  return renormalize_s(S_shunt, z0_eval, z0, 'power', 'power')
204
204
 
205
205
 
206
+ class Series(Model):
207
+ r"""Connect a 1-port impedance in series along a 2-port line.
208
+
209
+ **Mathematical Formulation**
210
+
211
+ At a common reference impedance of 50 ohms, the wrapped 1-port's
212
+ reflection coefficient $\Gamma$ gives
213
+
214
+ $$S_{11} = S_{22} = \frac{1 + \Gamma}{3 - \Gamma}, \qquad
215
+ S_{21} = S_{12} = \frac{2(1 - \Gamma)}{3 - \Gamma}.$$
216
+
217
+ The resulting two-port is then renormalized to the requested reference
218
+ impedance. This form also covers ideal shorts and opens without converting
219
+ the wrapped reflection coefficient to an impedance.
220
+
221
+ Parameters
222
+ ----------
223
+ series : Model
224
+ The 1-port model to insert in series.
225
+
226
+ References
227
+ ----------
228
+ D. M. Pozar, *Microwave Engineering*, 4th ed., Wiley, 2012, sec. 4.4.
229
+ """
230
+ #: The 1-port model to insert in series.
231
+ series: Model
232
+
233
+ def __post_init__(self):
234
+ if self.series.nports != 1:
235
+ raise ValueError(
236
+ f"Series requires a 1-port model. Received a {self.series.nports}-port model."
237
+ )
238
+
239
+ def s(self, freq: Frequency, z0: ArrayLike = 50.0) -> jnp.ndarray:
240
+ z0_eval = 50.0
241
+ gamma = self.series.s(freq, z0=z0_eval)[:, 0, 0]
242
+ denom = 3.0 - gamma
243
+ s11 = (1.0 + gamma) / denom
244
+ s21 = 2.0 * (1.0 - gamma) / denom
245
+ s_series = jnp.array([
246
+ [s11, s21],
247
+ [s21, s11],
248
+ ]).transpose(2, 0, 1)
249
+ return renormalize_s(s_series, z0_eval, z0, 'power', 'power')
250
+
251
+
206
252
  class CoupledOnePorts(Model):
207
253
  r"""
208
254
  (experimental) Wraps N 1-port models (e.g. inductors) and couples them via a given K-matrix.
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "paramrf"
3
- version = "0.37.1"
3
+ version = "0.37.3"
4
4
  description = "Parametric radio frequency modeling"
5
5
  readme = "README.rst"
6
6
  authors = [
@@ -25,8 +25,8 @@ from pmrf.materials import (
25
25
  DjordjevicSarkarDielectric,
26
26
  RoughConductor,
27
27
  )
28
- from pmrf.materials.surface_impedance import TescheTubeSurfaceImpedance
29
- from pmrf.models.components.lines.coaxial import TescheCoaxialFormulation
28
+ from pmrf.materials.surface_impedance import HalfSpaceSurfaceImpedance, TescheTubeSurfaceImpedance
29
+ from pmrf.models.components.lines.coaxial import SchelkunoffCoaxialFormulation, TescheCoaxialFormulation
30
30
  from pmrf.models.components.lines.microstrip import KirschningJansenMicrostripDispersion
31
31
 
32
32
  @pytest.fixture
@@ -118,6 +118,38 @@ def test_datasheet_line_attenuation(basic_freq):
118
118
 
119
119
  assert jnp.allclose(jnp.abs(s[:, 1, 0]), expected_mag, atol=1e-4)
120
120
 
121
+
122
+ @pytest.mark.parametrize("line_type", [DatasheetLine, PhysicalLine])
123
+ @pytest.mark.parametrize("length", [1.0, 10.0])
124
+ def test_empirical_line_matches_half_space_coax(line_type, length):
125
+ """Skin-effect loss has the same resistance and reactance as a coax half-space."""
126
+ d_in, d_out = 0.92e-3, 3.0e-3
127
+ ep_r, tand, sigma = 2.1, 1e-4, 5.8e7
128
+ a, b = d_in / 2, d_out / 2
129
+ zn = np.sqrt(mu_0 / epsilon_0) * np.log(b / a) / (2 * np.pi * np.sqrt(ep_r))
130
+ k1 = (2000 / np.log(10)) * np.sqrt(np.pi * 1e6 * mu_0 / sigma) * (1 / a + 1 / b) / (4 * np.pi * zn)
131
+ k2 = (2000 / np.log(10)) * np.pi * 1e6 * np.sqrt(ep_r) * tand / c
132
+
133
+ with jax.enable_x64():
134
+ freq = Frequency(start=10, stop=500, npoints=491, unit='MHz')
135
+ if line_type is DatasheetLine:
136
+ line = DatasheetLine(length=length, zn=zn, vf=1 / np.sqrt(ep_r), k1=k1, k2=k2)
137
+ else:
138
+ line = PhysicalLine(length=length, zn=zn, ep_r=ep_r, A=k1 / 1e5, f_A=1.0, tand=tand)
139
+ reference = CoaxialLine(
140
+ d_in=d_in, d_out=d_out, length=length,
141
+ dielectric=ConstantDielectric(ep_r=ep_r, tand=tand),
142
+ conductor=BulkConductor(sigma=sigma),
143
+ formulation=SchelkunoffCoaxialFormulation(
144
+ inner_impedance=HalfSpaceSurfaceImpedance(),
145
+ shield_impedance=HalfSpaceSurfaceImpedance(),
146
+ ),
147
+ )
148
+
149
+ difference = np.abs(np.asarray(line.s(freq) - reference.s(freq)))
150
+
151
+ assert np.max(difference) < 1e-8
152
+
121
153
  def test_coaxial_line_impedance(basic_freq):
122
154
  """Verify CoaxialLine matches the analytical Zc formula for a lossless coax."""
123
155
  # RG-58 dimensions roughly: ep_r=2.25, d_in=0.9mm, d_out=2.95mm
@@ -3,6 +3,7 @@ import pytest
3
3
  import numpy as np
4
4
  import jax.numpy as jnp
5
5
  import equinox as eqx
6
+ from skrf.media import DefinedGammaZ0
6
7
 
7
8
  from pmrf.frequency import Frequency
8
9
  from pmrf.parameters import Unconstrained
@@ -10,7 +11,8 @@ from pmrf.rf import s2y
10
11
 
11
12
  from pmrf.models import (
12
13
  Model, Cascade, Circuit, FloatingLine, FloatingTwoPort, GroundLifted,
13
- GroundExposed, Shunt, PhaseLine, Port, RLGCLine, Resistor, Short, Open,
14
+ GroundExposed, Shunt, Series, PhaseLine, Port, RLGCLine, Resistor, Short, Open,
15
+ Load,
14
16
  Inductor
15
17
  )
16
18
  from pmrf.models.composite.nodal import CoupledOnePorts, CoupledTwoPorts
@@ -282,6 +284,44 @@ def test_shunt_invalid_port_count():
282
284
  with pytest.raises(ValueError, match="Shunt requires a 1-port model"):
283
285
  Shunt(shunt=res_model)
284
286
 
287
+ # ---------------------------------------------------------
288
+ # Series Tests
289
+ # ---------------------------------------------------------
290
+
291
+ @pytest.mark.parametrize("inner, reflection, transmission", [
292
+ (Short(), 0.0, 1.0),
293
+ (Open(), 1.0, 0.0),
294
+ ])
295
+ def test_series_ideal_limits(inner, reflection, transmission, basic_freq):
296
+ s = Series(series=inner).s(basic_freq)
297
+
298
+ assert s.shape == (basic_freq.npoints, 2, 2)
299
+ assert jnp.all(jnp.isfinite(s))
300
+ np.testing.assert_allclose(s[:, 0, 0], reflection, atol=1e-12)
301
+ np.testing.assert_allclose(s[:, 1, 1], reflection, atol=1e-12)
302
+ np.testing.assert_allclose(s[:, 0, 1], transmission, atol=1e-12)
303
+ np.testing.assert_allclose(s[:, 1, 0], transmission, atol=1e-12)
304
+
305
+
306
+ @pytest.mark.parametrize("resistance", [25.0, 50.0, 200.0])
307
+ @pytest.mark.parametrize("z0", [50.0, 75.0, np.array([45.0, 75.0])])
308
+ def test_series_resistance_matches_skrf(resistance, z0, basic_freq):
309
+ gamma = (resistance - 50.0) / (resistance + 50.0)
310
+ actual = Series(series=Load(gamma=gamma, z0=50.0)).s(basic_freq, z0=z0)
311
+
312
+ # A series element has a singular two-port Z matrix. Construct directly at
313
+ # the target z0: scikit-rf's S -> Z -> S renormalization perturbs that
314
+ # singularity and introduces errors of order 1e-8.
315
+ media = DefinedGammaZ0(basic_freq.to_skrf(), z0=50.0)
316
+ reference = media.resistor(resistance, z0=z0)
317
+
318
+ np.testing.assert_allclose(actual, reference.s, rtol=1e-12, atol=1e-12)
319
+
320
+
321
+ def test_series_invalid_port_count():
322
+ with pytest.raises(ValueError, match="Series requires a 1-port model"):
323
+ Series(series=Resistor(R=50.0))
324
+
285
325
  # ---------------------------------------------------------
286
326
  # CoupledOnePorts Tests
287
327
  # ---------------------------------------------------------
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes