content: [build-system]
  requires = ["hatchling"]
  build-backend = "hatchling.build"
  
  [dependency-groups]
  dev = [
    "isort>=5.13",
    "jupyter>=1",
    "lefthook>=1.11.13",
    "mypy>=1.12",
    "pylint>=3.3",
    "pyright>=1.1.401",
    "pytest-ordering",
    "pytest-xdist[psutil]>=3",
    "pytest>=8.4",
    "ruff>=0.9.10",
    "toml-sort>=0.24"
  ]
  
  [project]
  name = "efax"
  version = "1.23.0"
  description = "Exponential families for JAX"
  readme = "README.rst"
  requires-python = ">=3.12,<3.15"
  license = "Apache-2.0"
  authors = [{email = "mistersheik@gmail.com"}, {name = "Neil Girdhar"}]
  maintainers = [{email = "mistersheik@gmail.com"}, {name = "Neil Girdhar"}]
  classifiers = [
    "Development Status :: 5 - Production/Stable",
    "Intended Audience :: Science/Research",
    "License :: OSI Approved :: Apache Software License",
    "Operating System :: OS Independent",
    "Programming Language :: Python :: 3",
    "Programming Language :: Python :: 3.12",
    "Programming Language :: Python :: 3.13",
    "Programming Language :: Python :: 3.14",
    "Programming Language :: Python",
    "Topic :: Scientific/Engineering :: Artificial Intelligence",
    "Topic :: Software Development :: Libraries :: Python Modules",
    "Typing :: Typed"
  ]
  dependencies = [
    "array_api_compat>=1.10",
    "array_api_extra>=0.8",
    "jax>=0.6.1",
    "numpy>=1.25",
    "opt-einsum>=3.4",
    "optimistix>=0.0.9",
    "optype[numpy]>=0.8.0",
    "scipy-stubs>=1.15",
    "scipy>=1.15",
    "tfp-nightly>=0.25",
    "tjax>=1.4.1",
    "typing_extensions>=4.8"
  ]
  
  [project.urls]
  source = "https://github.com/NeilGirdhar/efax"
  
  [tool.isort]
  line_length = 100
  multi_line_output = 0
  skip_glob = [".pytype/*.py"]
  
  [tool.mypy]
  files = ["efax", "tests", "examples"]
  disable_error_code = ["type-abstract"]
  check_untyped_defs = true
  disallow_any_generics = true
  disallow_incomplete_defs = true
  # disallow_untyped_calls = true
  disallow_untyped_decorators = true
  disallow_untyped_defs = true
  no_implicit_optional = true
  pretty = true
  show_error_codes = true
  show_error_context = false
  strict_equality = true
  warn_no_return = true
  warn_redundant_casts = true
  warn_return_any = false
  warn_unreachable = true
  warn_unused_configs = true
  warn_unused_ignores = true
  
  [[tool.mypy.overrides]]
  module = [
    "tensorflow_probability.substrates",
    "array_api_compat",
    "opt_einsum"
  ]
  ignore_missing_imports = true
  
  [tool.pylint.master]
  jobs = 0
  py-version = "3.11"
  load-plugins = [
    "pylint.extensions.bad_builtin",
    "pylint.extensions.broad_try_clause",
    "pylint.extensions.code_style",
    "pylint.extensions.consider_refactoring_into_while_condition",
    "pylint.extensions.dict_init_mutate",
    "pylint.extensions.docparams",
    "pylint.extensions.overlapping_exceptions",
    "pylint.extensions.typing"
  ]
  
  [tool.pylint.messages_control]
  disable = [
    # Ruff
    "C0103",
    "C0105",
    "C0112",
    "C0113",
    "C0114",
    "C0115",
    "C0116",
    "C0121",
    "C0123",
    "C0131",
    "C0132",
    "C0198",
    "C0199",
    "C0201",
    "C0202",
    "C0205",
    "C0206",
    "C0208",
    "C0301",
    "C0303",
    "C0304",
    "C0305",
    "C0321",
    "C0410",
    "C0411",
    "C0412",
    "C0413",
    "C0414",
    "C0415",
    "C0501",
    "C1802",
    "C1901",
    "C2201",
    "C2401",
    "C2403",
    "C2701",
    "C2801",
    "C3001",
    "C3002",
    "E0001",
    "E0013",
    "E0014",
    "E0100",
    "E0101",
    "E0102",
    "E0103",
    "E0104",
    "E0105",
    "E0106",
    "E0107",
    "E0108",
    "E0112",
    "E0115",
    "E0116",
    "E0117",
    "E0118",
    "E0213",
    "E0237",
    "E0241",
    "E0302",
    "E0303",
    "E0304",
    "E0305",
    "E0308",
    "E0309",
    "E0402",
    "E0602",
    "E0603",
    "E0604",
    "E0605",
    "E0643",
    "E0704",
    "E0711",
    "E1132",
    "E1142",
    "E1205",
    "E1206",
    "E1300",
    "E1301",
    "E1302",
    "E1303",
    "E1304",
    "E1305",
    "E1306",
    "E1307",
    "E1310",
    "E1519",
    "E1520",
    "E1700",
    "E2502",
    "E2510",
    "E2512",
    "E2513",
    "E2514",
    "E2515",
    "E4703",
    "E6004",
    "E6005",
    "R0022",
    "R0123",
    "R0124",
    "R0133",
    "R0202",
    "R0203",
    "R0205",
    "R0206",
    "R0402",
    "R0904",
    "R0911",
    "R0912",
    "R0913",
    "R0914",
    "R0915",
    "R0916",
    "R1260",
    "R1701",
    "R1702",
    "R1703",
    "R1704",
    "R1705",
    "R1706",
    "R1707",
    "R1710",
    "R1711",
    "R1714",
    "R1715",
    "R1717",
    "R1718",
    "R1719",
    "R1720",
    "R1721",
    "R1722",
    "R1723",
    "R1724",
    "R1725",
    "R1728",
    "R1729",
    "R1730",
    "R1731",
    "R1732",
    "R1733",
    "R1734",
    "R1735",
    "R1736",
    "R2004",
    "R2044",
    "R5501",
    "R6002",
    "R6003",
    "R6104",
    "R6201",
    "R6301",
    "W0012",
    "W0102",
    "W0104",
    "W0106",
    "W0107",
    "W0108",
    "W0109",
    "W0120",
    "W0122",
    "W0123",
    "W0127",
    "W0129",
    "W0130",
    "W0131",
    "W0133",
    "W0150",
    "W0160",
    "W0177",
    "W0199",
    "W0211",
    "W0212",
    "W0245",
    "W0301",
    "W0401",
    "W0404",
    "W0406",
    "W0410",
    "W0511",
    "W0602",
    "W0603",
    "W0604",
    "W0611",
    "W0612",
    "W0613",
    "W0622",
    "W0640",
    "W0702",
    "W0705",
    "W0706",
    "W0707",
    "W0711",
    "W0718",
    "W0719",
    "W1113",
    "W1201",
    "W1202",
    "W1203",
    "W1301",
    "W1302",
    "W1303",
    "W1304",
    "W1305",
    "W1309",
    "W1310",
    "W1401",
    "W1404",
    "W1405",
    "W1406",
    "W1501",
    "W1502",
    "W1508",
    "W1509",
    "W1510",
    "W1514",
    "W1515",
    "W1518",
    "W1641",
    "W2101",
    "W2402",
    "W2601",
    "W2901",
    "W3201",
    "W3301",
    # Missing
    "E0601",
    "R1737",
    "W0311",
    "W2301",
    # Mine
    "C0111",
    "E1101",
    "E1102",
    "E1120",
    "E1123",
    "E1130",
    "E1135",
    "E1136",
    "E3701",
    "R0204",
    "R0401",
    "R0801",
    "R0901",
    "R0902",
    "R0903",
    "R0917",
    "R5601",
    "R6102",
    "R6103",
    "W0149",
    "W0221",
    "W0222",
    "W0223",
    "W0621",
    "W0717"
  ]
  enable = [
    "useless-suppression",
    "use-symbolic-message-instead"
  ]
  
  [tool.pylint.reports]
  output-format = "colorized"
  
  [tool.pylint.similarities]
  min-similarity-lines = 10
  ignore-imports = "yes"
  
  [tool.pyright]
  include = ["efax", "tests", "examples"]
  stubPath = ""
  venvPath = "."
  venv = ".venv"
  enableTypeIgnoreComments = false
  # reportImportCycles = true
  reportCallInDefaultInitializer = true
  reportConstantRedefinition = true
  reportDeprecated = true
  reportDuplicateImport = true
  reportImplicitOverride = true
  reportImplicitStringConcatenation = false
  reportIncompatibleMethodOverride = true
  reportIncompatibleVariableOverride = true
  reportInconsistentConstructor = true
  reportMatchNotExhaustive = true
  reportMissingParameterType = true
  reportMissingSuperCall = true
  reportMissingTypeArgument = true
  reportOverlappingOverload = true
  reportPrivateImportUsage = true
  reportPropertyTypeMismatch = true
  reportShadowedImports = true
  reportUninitializedInstanceVariable = true
  reportUnknownArgumentType = false
  reportUnknownLambdaType = false
  reportUnknownMemberType = false
  reportUnknownParameterType = false
  reportUnknownVariableType = false
  reportUnnecessaryCast = true
  reportUnnecessaryComparison = true
  reportUnnecessaryContains = true
  reportUnnecessaryIsInstance = true
  reportUnnecessaryTypeIgnoreComment = true
  reportUntypedBaseClass = true
  reportUntypedClassDecorator = true
  reportUntypedFunctionDecorator = true
  reportUntypedNamedTuple = true
  reportUnusedCallResult = false
  reportUnusedClass = true
  reportUnusedExpression = true
  reportUnusedFunction = true
  reportUnusedVariable = true
  
  [tool.ruff]
  line-length = 100
  
  [tool.ruff.lint]
  preview = true
  select = ["ALL"]
  ignore = [
    "ARG001", # Unused function argument.
    "ARG002", # Unused method argument.
    "ARG003", # Unused class method argument.
    "ARG004", # Unused static method argument.
    "COM812", # Trailing comma missing.
    "CPY001", # Missing copyright.
    "D100", # Missing docstring in public module.
    "D101", # Missing docstring in public class.
    "D102", # Missing docstring in public method.
    "D103", # Missing docstring in public function.
    "D105", # Missing docstring in magic method.
    "D107", # Missing docstring in __init__.
    "DOC201", # return is not documented in docstring.
    "DOC202", # Docstring should not have a returns section because the function doesn"t return anything.
    "DOC402", # DOC402 `yield` is not documented in docstring.
    "DOC501", # Raised exception `ValueError` missing from docstring.
    "ERA001", # Commented-out code.
    "FIX002", # Line contains TODO, consider resolving the issue.
    "G004", # Logging statement uses f-string.
    "I001", # Import block is un-sorted or un-formatted.
    "PD008", # Use .loc instead of .at. If speed is important, use NumPy.
    "PGH003", # Use specific rule codes when ignoring type issues.
    "PLR0913", # Too many arguments in function definition.
    "PLR6301", # Method doesn"t use self.
    "Q000", # Single quotes found but double quotes preferred.
    "RUF021", # Parenthesize `a and b` expressions when chaining `and` and `or` together...
    "S101", # Assert used.
    "TC001", # Move application import into a type-checking block.
    "TC002", # Move third-party import into a type-checking block.
    "TC003", # Move standard library import into a type-checking block.
    "TD002", # Missing author in TODO; try: # TODO(<author_name>): ....
    "TD003", # Missing issue link on the line following this TODO.
    "TID252" # Relative imports from parent modules are banned.
  ]
  
  [tool.ruff.lint.flake8-errmsg]
  max-string-length = 40
  
  [tool.ruff.lint.flake8-import-conventions.extend-aliases]
  "array_api_extra" = "xpx"
  "equinox" = "eqx"
  "itertools" = "it"
  "jax.numpy" = "jnp"
  "jax.random" = "jr"
  "jax.scipy.special" = "jss"
  "networkx" = "nx"
  "numpy.typing" = "npt"
  "optimistix" = "optx"
  "optype.numpy" = "onp"
  "pyqtgraph" = "pg"
  "scipy.special" = "sc"
  "seaborn" = "sns"
  
  [tool.ruff.lint.isort]
  combine-as-imports = true
  
  [tool.ruff.lint.pydocstyle]
  convention = "google"
  
  [tool.ruff.lint.pylint]
  max-args = 8
  