diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 435392e..c6e5ecf 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -21,9 +21,9 @@ jobs: uses: astral-sh/setup-uv@v6 - name: Install project run: uv sync --locked --dev - - name: Run ruff + - name: Run ruff lint run: uv run ruff check - - name: Run black - run: uv run black --check . + - name: Run ruff format check + run: uv run ruff format --check - name: Run mypy run: uv run make mypy diff --git a/Makefile b/Makefile index 6d32a45..da7cfbc 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,11 @@ RUFF_FLAGS = -BLACK_FLAGS = +FORMAT_FLAGS = MYPY_FLAGS = MYPY_TARGETS = \ src/odil/history.py \ -default: +default: lint format data: git clone -b data --single-branch git@github.com:cselab/odil.git data @@ -14,10 +14,14 @@ release: V=$$(sed -rn 's/^version = "(.*)"$$/\1/p' pyproject.toml) && git archive --prefix="odil-$$V/" -o "odil-$$V.tar.gz" HEAD lint: - ruff check --fix $(RUFF_FLAGS) . - black $(BLACK_FLAGS) . + ruff check --fix $(RUFF_FLAGS) + +format: + ruff format $(FORMAT_FLAGS) + +check: lint format mypy: mypy $(MYPY_FLAGS) $(MYPY_TARGETS) -.PHONY: default release lint mypy +.PHONY: default data release lint format check mypy diff --git a/examples/basic/fields.py b/examples/basic/fields.py index 7196f87..cb31bf7 100755 --- a/examples/basic/fields.py +++ b/examples/basic/fields.py @@ -57,7 +57,6 @@ def parse_args(): def plot(problem, state, epoch, frame, cbinfo=None): - domain = problem.domain fig, ax = plt.subplots(figsize=(4, 2)) kw = dict(vmin=0, vmax=1, cmap="Greys", clip_on=False, lw=0.5) diff --git a/pyproject.toml b/pyproject.toml index d610b68..2b44843 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,27 +40,27 @@ jax = ["jax[cuda13]>=0.7.0"] [dependency-groups] dev = [ "pytest>=7.4.4", - "black[jupyter]>=25.0.0", "ruff>=0.14.0", "mypy>=1.18.2", ] -[tool.black] +[tool.ruff] line-length = 120 -target-version = ['py312'] +target-version = "py312" -[tool.ruff] -lint.select = [ +[tool.ruff.lint] +select = [ "E", # Style errors "W", # Style warnings "F", # Logical errors "I", # Import sorting ] -lint.ignore = [ +ignore = [ "E741", # Ambiguous variable name ] -output-format = 'concise' -line-length = 120 + +[tool.ruff.format] +quote-style = "double" [tool.mypy] python_version = "3.12" diff --git a/src/odil/backend.py b/src/odil/backend.py index 8722cb6..32e654d 100644 --- a/src/odil/backend.py +++ b/src/odil/backend.py @@ -10,7 +10,6 @@ class ModBase: - def __init__(self, mod=None): assert mod is not None self.mod = mod @@ -43,7 +42,6 @@ def __init__(self, mod=None): class ModNumpy(ModBase): - def __init__(self, mod=None, modsp=None, jax=None): mod = mod or np super().__init__(mod) @@ -183,7 +181,6 @@ def conv_transpose(input, filters, output_shape=None, strides=None, padding=None class ModTensorflow(ModBase): - def __init__(self, mod=None, modsp=None): super().__init__(mod) self.batch_to_space = mod.batch_to_space @@ -280,7 +277,6 @@ def csr_matrix(*args, **kwargs): class ModCupy(ModBase): - def __init__(self, mod=None, modsp=None): super().__init__(mod) self.cast = lambda x, dtype: mod.array(x, dtype=dtype) diff --git a/src/odil/cache.py b/src/odil/cache.py index 7998a63..26db317 100644 --- a/src/odil/cache.py +++ b/src/odil/cache.py @@ -61,7 +61,6 @@ def save(content, path): raise ValueError("Unrecognized extension '{}', expected .pickle.".format(ext)) def decorator(func): - def inner(*args, **kwargs): name, ext = os.path.splitext(targetbase) if len(args) and name_with_arg0: diff --git a/src/odil/core.py b/src/odil/core.py index 0d71276..e78b6c7 100644 --- a/src/odil/core.py +++ b/src/odil/core.py @@ -9,7 +9,6 @@ class Domain: - def __init__( self, cshape, @@ -504,7 +503,6 @@ def get_context(self, state, extra=None, tracers=None): class Field: - def __init__(self, array=None, loc=None, cshape=None): """ array: `ndarray` @@ -527,7 +525,6 @@ def __repr__(self): class MultigridField: - def __init__(self, terms=None, loc=None, factors=None, axes=None, method=None): """ terms: `list` of `Field` @@ -550,7 +547,6 @@ def __init__(self, terms=None, loc=None, factors=None, axes=None, method=None): class NeuralNet: - def __init__(self, weights=None, biases=None, func_in=None, func_out=None, activation=None): """ weights: `list` of `ndarray` @@ -574,7 +570,6 @@ def __init__(self, weights=None, biases=None, func_in=None, func_out=None, activ class Array: - def __init__(self, array=None, shape=None): """ array: `ndarray` @@ -593,7 +588,6 @@ def __repr__(self): class State: - def __init__(self, fields=None, initialized=False): """ fields: A dict mapping field names to state variables @@ -863,9 +857,7 @@ def eval_neural_net(net: NeuralNet, inputs, mod, frozen=False): class Context: - class Raw: - def __init__(self, value): self.value = value @@ -991,7 +983,6 @@ def res(*inputs): class Problem: - def __init__(self, operator, domain, extra=None, tracers=None, jit=None): """ operator: callable(mod, ctx) @@ -1055,7 +1046,8 @@ def func(arrays): assert len(nonempty) == len(set(nonempty)), "Name of fields must be unique, got {}".format(nonempty) values = [f[1] if isinstance(f, tuple) else f for f in ff] terms = [ - mod.mean(v.value) if isinstance(v, Context.Raw) else mod.mean(mod.square(v)) for v in values # + mod.mean(v.value) if isinstance(v, Context.Raw) else mod.mean(mod.square(v)) + for v in values # ] loss = sum(terms) norms = [t if isinstance(v, Context.Raw) else mod.sqrt(t) for t, v in zip(terms, values)] # @@ -1321,7 +1313,6 @@ def _eval_operator_grad_tf(self, state): def func(arrays, tracers): with tf.GradientTape(persistent=True, watch_accessed_variables=False) as tape: - domain.arrays_to_state(arrays, cache["state"]) ctx = Context( domain, @@ -1477,7 +1468,6 @@ def latin_hypercube(ndim, size, dtype): class Approx: - def __init__(self, domain): self.domain = domain self.mod = domain.mod diff --git a/src/odil/core_min.py b/src/odil/core_min.py index 7fea3f6..0054631 100644 --- a/src/odil/core_min.py +++ b/src/odil/core_min.py @@ -4,7 +4,6 @@ class Domain: - def __init__(self, domain=None, ndim=None, lower=None, upper=None, dimnames=None, dtype=None, cshape=None): domain = domain or Namespace(ndim=None, lower=0.0, upper=1.0, dimnames=None, dtype=None, cshape=None) dtype = dtype or domain.dtype diff --git a/src/odil/history.py b/src/odil/history.py index 6894212..928b21e 100644 --- a/src/odil/history.py +++ b/src/odil/history.py @@ -7,7 +7,6 @@ class History: - def __init__(self, csvpath: str | None = None, warmup: int = 0): """ warmup: `int` diff --git a/src/odil/linsolver.py b/src/odil/linsolver.py index 553ffa2..538c23c 100644 --- a/src/odil/linsolver.py +++ b/src/odil/linsolver.py @@ -119,9 +119,7 @@ def add_arguments(parser): parser.add_argument("--smooth_pre", type=int, default=2, help="Pre-smoothing steps") parser.add_argument("--smooth_post", type=int, default=2, help="Post-smoothing steps") parser.add_argument("--omega", type=float, default=0.6, help="Jacobi smoother relaxation factor") - parser.add_argument( - "--ndirect", type=int, default=3, help="Systems on smaller grids " "are solved with direct solver" - ) + parser.add_argument("--ndirect", type=int, default=3, help="Systems on smaller grids are solved with direct solver") parser.add_argument( "--restriction", type=str, diff --git a/src/odil/optimizer.py b/src/odil/optimizer.py index d8bc1c7..47cfeb3 100644 --- a/src/odil/optimizer.py +++ b/src/odil/optimizer.py @@ -4,7 +4,6 @@ class Optimizer: - def __init__(self, name=None, displayname=None, dtype=None): self.name = name self.displayname = displayname if displayname is not None else name @@ -20,14 +19,12 @@ def run(self, x0, loss_grad, epochs, callback=None, epoch_start=0, **kwargs): class EarlyStopError(Exception): - def __init__(self, msg, optinfo): super().__init__(msg) self.optinfo = optinfo class LbfgsbOptimizer(Optimizer): - def __init__(self, pgtol=1e-16, m=50, maxls=50, factr=0, dtype=None, mod=None, **kwargs): """ pgtol: `float` @@ -118,7 +115,6 @@ def func_wrap(x): class LbfgsOptimizer(Optimizer): - def __init__(self, pgtol=1e-16, m=50, maxls=50, factr=0, dtype=None, mod=None, **kwargs): """ pgtol: `float` @@ -206,18 +202,15 @@ def stopping_condition(converged, failed): class AdamTfOptimizer(Optimizer): - def __init__(self, dtype=None, mod=None, **kwargs): super().__init__(name="adam_tf", displayname="AdamTf", dtype=dtype) self.mod = mod def run(self, x0, loss_grad, epochs=None, callback=None, lr=1e-3, epoch_start=0, **kwargs): - mod = self.mod tf = mod.tf class CustomModel(tf.keras.Model): - def __init__(self, x): super().__init__() self.x = x @@ -238,7 +231,6 @@ def train_step(self, _): model = CustomModel(x) class CustomCallback(tf.keras.callbacks.Callback): - def on_epoch_end(self, epoch, logs=None): model.epoch = epoch_start + epoch if epoch > 0 and callback: @@ -254,13 +246,11 @@ def on_epoch_end(self, epoch, logs=None): class GdOptimizer(Optimizer): - def __init__(self, dtype=None, mod=None, **kwargs): super().__init__(name="gd", displayname="GD", dtype=dtype) self.mod = mod def run(self, x0, loss_grad, epochs=None, callback=None, lr=1e-3, epoch_start=0, **kwargs): - mod = self.mod x = [mod.copy(e) for e in x0] for epoch in range(epoch_start + 1, epoch_start + epochs + 1): @@ -278,7 +268,6 @@ def run(self, x0, loss_grad, epochs=None, callback=None, lr=1e-3, epoch_start=0, class AdamNativeOptimizer(Optimizer): - def __init__(self, dtype=None, mod=None, **kwargs): super().__init__(name="adamn", displayname="AdamNative", dtype=dtype) self.mod = mod diff --git a/src/odil/runtime.py b/src/odil/runtime.py index 4aab80b..20a35fc 100644 --- a/src/odil/runtime.py +++ b/src/odil/runtime.py @@ -7,7 +7,7 @@ if not int(os.environ.get("ODIL_MT", 0)): os.environ["OMP_NUM_THREADS"] = "1" - os.environ["XLA_FLAGS"] = "--xla_cpu_multi_thread_eigen=false " "intra_op_parallelism_threads=1" + os.environ["XLA_FLAGS"] = "--xla_cpu_multi_thread_eigen=false intra_op_parallelism_threads=1" os.environ["TENSORFLOW_INTER_OP_PARALLELISM"] = "1" os.environ["TENSORFLOW_INTRA_OP_PARALLELISM"] = "1" diff --git a/src/odil/util.py b/src/odil/util.py index 5810b74..b74e5bb 100644 --- a/src/odil/util.py +++ b/src/odil/util.py @@ -37,7 +37,6 @@ def printlog(*msg): class Timer: - def __init__(self): self._starts = [] # Stack of pairs (key, time). self.counters = dict() # Key to time. @@ -47,9 +46,9 @@ def push(self, key=None): def pop(self, key=None): start = self._starts.pop() - assert ( - start[0] is None or key is None or start[0] == key - ), "Inconsistent keys passed to push() and pop(): " "{:} and {:}".format(start[0], key) + assert start[0] is None or key is None or start[0] == key, ( + "Inconsistent keys passed to push() and pop(): {:} and {:}".format(start[0], key) + ) if key is None: key = start[0] dt = time.time() - start[1] @@ -69,7 +68,7 @@ def get_error(u, v): def add_arguments(parser): parser.add_argument( - "--epochs", type=int, default=None, help="Maximum epochs, " "defaults to product of plot_every and frames" + "--epochs", type=int, default=None, help="Maximum epochs, defaults to product of plot_every and frames" ) parser.add_argument("--every_factor", type=float, default=1, help="Multiplier for all *_every options") parser.add_argument("--plot_every", type=int, default=5, help="Epochs between plots") @@ -82,9 +81,7 @@ def add_arguments(parser): parser.add_argument("--seed", default=1000, type=int, help="Seed for numpy.random and tensorflow.random") parser.add_argument("--plot_title", type=int, default=0, help="Enable title in plots") parser.add_argument("--plotext", type=str, default="pdf", help="Extension of plots") - parser.add_argument( - "--history_full", type=int, default=0, help="Number of epochs to write " "history at every point" - ) + parser.add_argument("--history_full", type=int, default=0, help="Number of epochs to write history at every point") parser.add_argument("--montage", type=int, default=1, help="Run montage after plotting") parser.add_argument("--double", type=int, default=None, help="Double precision. Defaults to runtime.dtype") parser.add_argument("--echo", type=int, default=0, help="Echo log to stderr") @@ -121,11 +118,9 @@ def add_arguments(parser): ) parser.add_argument("--dump_data", type=int, default=1, help="Dump data_*.pickle with every plot") parser.add_argument( - "--jac_nsmp0", type=int, default=50, help="Number of samples " "for initialization of Jacobi optimizer" - ) - parser.add_argument( - "--jac_nsmp1", type=int, default=1, help="Number of samples " "for each step of Jacobi optimizer" + "--jac_nsmp0", type=int, default=50, help="Number of samples for initialization of Jacobi optimizer" ) + parser.add_argument("--jac_nsmp1", type=int, default=1, help="Number of samples for each step of Jacobi optimizer") parser.add_argument( "--jac_factor", type=float, @@ -138,7 +133,7 @@ def add_arguments(parser): "--jac_epsilon", type=float, default=1e-8, - help="Parameter epsilon in Jacobi optimizer. " "Added to the diagonal to avoid division by zero", + help="Parameter epsilon in Jacobi optimizer. Added to the diagonal to avoid division by zero", ) parser.add_argument( "--nn_initializer", diff --git a/tests/test_io.py b/tests/test_io.py index af38efa..9b8fd60 100755 --- a/tests/test_io.py +++ b/tests/test_io.py @@ -8,7 +8,6 @@ class TestIO(unittest.TestCase): - def test_raw_xmf(self): name = "foo" xmfpath = "data.xdmf2" diff --git a/uv.lock b/uv.lock index d676005..8478e41 100644 --- a/uv.lock +++ b/uv.lock @@ -15,15 +15,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8f/aa/ba0014cc4659328dc818a28827be78e6d97312ab0cb98105a770924dc11e/absl_py-2.3.1-py3-none-any.whl", hash = "sha256:eeecf07f0c2a93ace0772c92e596ace6d3d3996c042b2128459aaae2a76de11d", size = 135811, upload-time = "2025-07-03T09:31:42.253Z" }, ] -[[package]] -name = "asttokens" -version = "3.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/4a/e7/82da0a03e7ba5141f05cce0d302e6eed121ae055e0456ca228bf693984bc/asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7", size = 61978, upload-time = "2024-11-30T04:30:14.439Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/25/8a/c46dcc25341b5bce5472c718902eb3d38600a903b14fa6aeecef3f21a46f/asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2", size = 26918, upload-time = "2024-11-30T04:30:10.946Z" }, -] - [[package]] name = "astunparse" version = "1.6.3" @@ -37,37 +28,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2b/03/13dde6512ad7b4557eb792fbcf0c653af6076b81e5941d36ec61f7ce6028/astunparse-1.6.3-py2.py3-none-any.whl", hash = "sha256:c2652417f2c8b5bb325c885ae329bdf3f86424075c4fd1a128674bc6fba4b8e8", size = 12732, upload-time = "2019-12-22T18:12:11.297Z" }, ] -[[package]] -name = "black" -version = "25.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "click" }, - { name = "mypy-extensions" }, - { name = "packaging" }, - { name = "pathspec" }, - { name = "platformdirs" }, - { name = "pytokens" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/4b/43/20b5c90612d7bdb2bdbcceeb53d588acca3bb8f0e4c5d5c751a2c8fdd55a/black-25.9.0.tar.gz", hash = "sha256:0474bca9a0dd1b51791fcc507a4e02078a1c63f6d4e4ae5544b9848c7adfb619", size = 648393, upload-time = "2025-09-19T00:27:37.758Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/8e/319cfe6c82f7e2d5bfb4d3353c6cc85b523d677ff59edc61fdb9ee275234/black-25.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:1b9dc70c21ef8b43248f1d86aedd2aaf75ae110b958a7909ad8463c4aa0880b0", size = 1742012, upload-time = "2025-09-19T00:33:08.678Z" }, - { url = "https://files.pythonhosted.org/packages/94/cc/f562fe5d0a40cd2a4e6ae3f685e4c36e365b1f7e494af99c26ff7f28117f/black-25.9.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8e46eecf65a095fa62e53245ae2795c90bdecabd53b50c448d0a8bcd0d2e74c4", size = 1581421, upload-time = "2025-09-19T00:35:25.937Z" }, - { url = "https://files.pythonhosted.org/packages/84/67/6db6dff1ebc8965fd7661498aea0da5d7301074b85bba8606a28f47ede4d/black-25.9.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9101ee58ddc2442199a25cb648d46ba22cd580b00ca4b44234a324e3ec7a0f7e", size = 1655619, upload-time = "2025-09-19T00:30:49.241Z" }, - { url = "https://files.pythonhosted.org/packages/10/10/3faef9aa2a730306cf469d76f7f155a8cc1f66e74781298df0ba31f8b4c8/black-25.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:77e7060a00c5ec4b3367c55f39cf9b06e68965a4f2e61cecacd6d0d9b7ec945a", size = 1342481, upload-time = "2025-09-19T00:31:29.625Z" }, - { url = "https://files.pythonhosted.org/packages/48/99/3acfea65f5e79f45472c45f87ec13037b506522719cd9d4ac86484ff51ac/black-25.9.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0172a012f725b792c358d57fe7b6b6e8e67375dd157f64fa7a3097b3ed3e2175", size = 1742165, upload-time = "2025-09-19T00:34:10.402Z" }, - { url = "https://files.pythonhosted.org/packages/3a/18/799285282c8236a79f25d590f0222dbd6850e14b060dfaa3e720241fd772/black-25.9.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3bec74ee60f8dfef564b573a96b8930f7b6a538e846123d5ad77ba14a8d7a64f", size = 1581259, upload-time = "2025-09-19T00:32:49.685Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ce/883ec4b6303acdeca93ee06b7622f1fa383c6b3765294824165d49b1a86b/black-25.9.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b756fc75871cb1bcac5499552d771822fd9db5a2bb8db2a7247936ca48f39831", size = 1655583, upload-time = "2025-09-19T00:30:44.505Z" }, - { url = "https://files.pythonhosted.org/packages/21/17/5c253aa80a0639ccc427a5c7144534b661505ae2b5a10b77ebe13fa25334/black-25.9.0-cp313-cp313-win_amd64.whl", hash = "sha256:846d58e3ce7879ec1ffe816bb9df6d006cd9590515ed5d17db14e17666b2b357", size = 1343428, upload-time = "2025-09-19T00:32:13.839Z" }, - { url = "https://files.pythonhosted.org/packages/1b/46/863c90dcd3f9d41b109b7f19032ae0db021f0b2a81482ba0a1e28c84de86/black-25.9.0-py3-none-any.whl", hash = "sha256:474b34c1342cdc157d307b56c4c65bce916480c4a8f6551fdc6bf9b486a7c4ae", size = 203363, upload-time = "2025-09-19T00:27:35.724Z" }, -] - -[package.optional-dependencies] -jupyter = [ - { name = "ipython" }, - { name = "tokenize-rt" }, -] - [[package]] name = "certifi" version = "2025.10.5" @@ -119,18 +79,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, ] -[[package]] -name = "click" -version = "8.3.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/46/61/de6cd827efad202d7057d93e0fed9294b96952e188f7384832791c7b2254/click-8.3.0.tar.gz", hash = "sha256:e7b8232224eba16f4ebe410c25ced9f7875cb5f3263ffc93cc3e8da705e229c4", size = 276943, upload-time = "2025-09-18T17:32:23.696Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/db/d3/9dcc0f5797f070ec8edf30fbadfb200e71d9db6b84d211e3b2085a7589a0/click-8.3.0-py3-none-any.whl", hash = "sha256:9b9f285302c6e3064f4330c05f05b81945b2a39544279343e6e7c5f27a9baddc", size = 107295, upload-time = "2025-09-18T17:32:22.42Z" }, -] - [[package]] name = "colorama" version = "0.4.6" @@ -215,24 +163,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, ] -[[package]] -name = "decorator" -version = "5.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, -] - -[[package]] -name = "executing" -version = "2.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, -] - [[package]] name = "flatbuffers" version = "25.9.23" @@ -384,39 +314,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/2c/e1/e6716421ea10d38022b952c159d5161ca1193197fb744506875fbb87ea7b/iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760", size = 6050, upload-time = "2025-03-19T20:10:01.071Z" }, ] -[[package]] -name = "ipython" -version = "9.6.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, - { name = "decorator" }, - { name = "ipython-pygments-lexers" }, - { name = "jedi" }, - { name = "matplotlib-inline" }, - { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, - { name = "prompt-toolkit" }, - { name = "pygments" }, - { name = "stack-data" }, - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/2a/34/29b18c62e39ee2f7a6a3bba7efd952729d8aadd45ca17efc34453b717665/ipython-9.6.0.tar.gz", hash = "sha256:5603d6d5d356378be5043e69441a072b50a5b33b4503428c77b04cb8ce7bc731", size = 4396932, upload-time = "2025-09-29T10:55:53.948Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/48/c5/d5e07995077e48220269c28a221e168c91123ad5ceee44d548f54a057fc0/ipython-9.6.0-py3-none-any.whl", hash = "sha256:5f77efafc886d2f023442479b8149e7d86547ad0a979e9da9f045d252f648196", size = 616170, upload-time = "2025-09-29T10:55:47.676Z" }, -] - -[[package]] -name = "ipython-pygments-lexers" -version = "1.1.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "pygments" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, -] - [[package]] name = "jax" version = "0.7.2" @@ -515,18 +412,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/0c/e2/47c52aa806e98f00754b1c303f85d0594d623a7ff5c8592923f7bae45fce/jaxlib-0.7.2-cp314-cp314t-manylinux_2_27_x86_64.whl", hash = "sha256:3ecc0b2e76c089cef350f7916275431b299a17615e32ced1ece18cdd47df6bd2", size = 78264963, upload-time = "2025-09-16T16:50:14.613Z" }, ] -[[package]] -name = "jedi" -version = "0.19.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "parso" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, -] - [[package]] name = "keras" version = "3.11.3" @@ -773,18 +658,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/04/5f/e22e08da14bc1a0894184640d47819d2338b792732e20d292bf86e5ab785/matplotlib-3.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:cb783436e47fcf82064baca52ce748af71725d0352e1d31564cbe9c95df92b9c", size = 8172585, upload-time = "2025-10-09T00:27:47.185Z" }, ] -[[package]] -name = "matplotlib-inline" -version = "0.1.7" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "traitlets" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/99/5b/a36a337438a14116b16480db471ad061c36c3694df7c2084a0da7ba538b7/matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", size = 8159, upload-time = "2024-04-15T13:44:44.803Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8f/8e/9ad090d3553c280a8060fbf6e24dc1c0c29704ee7d1c372f0c174aa59285/matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca", size = 9899, upload-time = "2024-04-15T13:44:43.265Z" }, -] - [[package]] name = "mdurl" version = "0.1.2" @@ -1106,7 +979,6 @@ tensorflow = [ [package.dev-dependencies] dev = [ - { name = "black", extra = ["jupyter"] }, { name = "mypy" }, { name = "pytest" }, { name = "ruff" }, @@ -1125,7 +997,6 @@ provides-extras = ["tensorflow", "jax"] [package.metadata.requires-dev] dev = [ - { name = "black", extras = ["jupyter"], specifier = ">=25.0.0" }, { name = "mypy", specifier = ">=1.18.2" }, { name = "pytest", specifier = ">=7.4.4" }, { name = "ruff", specifier = ">=0.14.0" }, @@ -1212,15 +1083,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, ] -[[package]] -name = "parso" -version = "0.8.5" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205, upload-time = "2025-08-23T15:15:28.028Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668, upload-time = "2025-08-23T15:15:25.663Z" }, -] - [[package]] name = "pathspec" version = "0.12.1" @@ -1230,18 +1092,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/cc/20/ff623b09d963f88bfde16306a54e12ee5ea43e9b597108672ff3a408aad6/pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", size = 31191, upload-time = "2023-12-10T22:30:43.14Z" }, ] -[[package]] -name = "pexpect" -version = "4.9.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "ptyprocess" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, -] - [[package]] name = "pillow" version = "11.3.0" @@ -1308,15 +1158,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, ] -[[package]] -name = "platformdirs" -version = "4.5.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/61/33/9611380c2bdb1225fdef633e2a9610622310fed35ab11dac9620972ee088/platformdirs-4.5.0.tar.gz", hash = "sha256:70ddccdd7c99fc5942e9fc25636a8b34d04c24b335100223152c2803e4063312", size = 21632, upload-time = "2025-10-08T17:44:48.791Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/73/cb/ac7874b3e5d58441674fb70742e6c374b28b0c7cb988d37d991cde47166c/platformdirs-4.5.0-py3-none-any.whl", hash = "sha256:e578a81bb873cbb89a41fcc904c7ef523cc18284b7e3b3ccf06aca1403b7ebd3", size = 18651, upload-time = "2025-10-08T17:44:47.223Z" }, -] - [[package]] name = "pluggy" version = "1.6.0" @@ -1326,18 +1167,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, ] -[[package]] -name = "prompt-toolkit" -version = "3.0.52" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "wcwidth" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, -] - [[package]] name = "protobuf" version = "6.32.1" @@ -1368,24 +1197,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/26/65/1070a6e3c036f39142c2820c4b52e9243246fcfc3f96239ac84472ba361e/psutil-7.1.0-cp37-abi3-win_arm64.whl", hash = "sha256:6937cb68133e7c97b6cc9649a570c9a18ba0efebed46d8c5dae4c07fa1b67a07", size = 244971, upload-time = "2025-09-17T20:15:12.262Z" }, ] -[[package]] -name = "ptyprocess" -version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, -] - -[[package]] -name = "pure-eval" -version = "0.2.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, -] - [[package]] name = "pygments" version = "2.19.2" @@ -1432,15 +1243,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, ] -[[package]] -name = "pytokens" -version = "0.1.10" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/30/5f/e959a442435e24f6fb5a01aec6c657079ceaca1b3baf18561c3728d681da/pytokens-0.1.10.tar.gz", hash = "sha256:c9a4bfa0be1d26aebce03e6884ba454e842f186a59ea43a6d3b25af58223c044", size = 12171, upload-time = "2025-02-19T14:51:22.001Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/60/e5/63bed382f6a7a5ba70e7e132b8b7b8abbcf4888ffa6be4877698dcfbed7d/pytokens-0.1.10-py3-none-any.whl", hash = "sha256:db7b72284e480e69fb085d9f251f66b3d2df8b7166059261258ff35f50fb711b", size = 12046, upload-time = "2025-02-19T14:51:18.694Z" }, -] - [[package]] name = "requests" version = "2.32.5" @@ -1574,20 +1376,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, ] -[[package]] -name = "stack-data" -version = "0.6.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "asttokens" }, - { name = "executing" }, - { name = "pure-eval" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, -] - [[package]] name = "tensorboard" version = "2.20.0" @@ -1665,24 +1453,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/4f/bd/de8d508070629b6d84a30d01d57e4a65c69aa7f5abe7560b8fad3b50ea59/termcolor-3.1.0-py3-none-any.whl", hash = "sha256:591dd26b5c2ce03b9e43f391264626557873ce1d379019786f99b0c2bee140aa", size = 7684, upload-time = "2025-04-30T11:37:52.382Z" }, ] -[[package]] -name = "tokenize-rt" -version = "6.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/69/ed/8f07e893132d5051d86a553e749d5c89b2a4776eb3a579b72ed61f8559ca/tokenize_rt-6.2.0.tar.gz", hash = "sha256:8439c042b330c553fdbe1758e4a05c0ed460dbbbb24a606f11f0dee75da4cad6", size = 5476, upload-time = "2025-05-23T23:48:00.035Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/33/f0/3fe8c6e69135a845f4106f2ff8b6805638d4e85c264e70114e8126689587/tokenize_rt-6.2.0-py2.py3-none-any.whl", hash = "sha256:a152bf4f249c847a66497a4a95f63376ed68ac6abf092a2f7cfb29d044ecff44", size = 6004, upload-time = "2025-05-23T23:47:58.812Z" }, -] - -[[package]] -name = "traitlets" -version = "5.14.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, -] - [[package]] name = "typing-extensions" version = "4.15.0" @@ -1701,15 +1471,6 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, ] -[[package]] -name = "wcwidth" -version = "0.2.14" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, -] - [[package]] name = "werkzeug" version = "3.1.3"