Skip to main content

MinMax Recurrent Neural Cascade

Project description

MinMax Recurrent Neural Cascades

A parallelisable recurrent sequence model built on the MinMax operator — expressively powerful, efficiently implementable, and provably not affected by vanishing or exploding gradient.

Key properties

  • Perfect memory. MinMax neurons can store and retain information arbitrarily long (formal expressivity: all group-free functions).

  • Parallel training. All hidden states across a sequence of length T are computed simultaneously in O(log T) depth, with no sequential bottleneck.

  • Efficient inference. Runs as a true RNN: O(1) compute and O(D) memory per token, making it practical for long-context streaming generation.

  • Stable recurrence. The MinMax operator is bounded and its gradients cannot vanish or explode through the state path.

The model

Each layer contains three sub-modules applied with pre-norm and residual connections:

  1. MinMax Neuron — the recurrent cell, updating a hidden state x_{t+1} = max(min(r_t, x_t), s_t) element-wise in parallel via a prefix scan.
  2. Convolution — one-step causal mixing.
  3. Feed-forward network — feature mixing (gated or standard MLP).

See arxiv.org/abs/2605.06384 for the formal description and analyses. See docs/model.md for the architecture reference.

Installation

pip install minmaxrnc

PyTorch (≥ 2.0) is required. For GPU support, follow the PyTorch installation guide before installing this package.

Quick start

Sequence backbone

import torch
from minmax import MinMaxRNC, MinMaxRNCConfig

model = MinMaxRNC(MinMaxRNCConfig.medium())   # d_model=512

u = torch.randn(batch_size, seq_len, 512)

# Parallel over the full sequence (training)
y = model(u, unroll_steps=seq_len)            # (B, T, 512)

# Carry state across calls (streaming inference)
y, state = model(u, return_state=True)
y_next   = model(u_next, state=state)

# Carry state across multi-step calls (streaming inference, 64 steps in parallel)
y, state = model(u, return_state=True, unroll_steps=64)
y_next   = model(u_next, state=state)

Language model

import torch
from minmax import MinMaxRNC_LM, MinMaxRNCLMConfig, MinMaxRNCConfig

model = MinMaxRNC_LM(
    vocab_size = 50257,
    cfg = MinMaxRNCLMConfig(backbone=MinMaxRNCConfig.medium()),
)

tokens = torch.randint(0, 50257, (batch_size, seq_len))
logits = model(tokens)                     # (B, T, vocab_size)

# Autoregressive generation
logits, state = model(tokens[:, :1], return_state=True)
for _ in range(max_new_tokens):
    next_tok = logits[:, -1].argmax(-1, keepdim=True)
    logits, state = model(next_tok, state=state, return_state=True)

Custom configuration

from minmax import MinMaxRNC, MinMaxRNCConfig

cfg = MinMaxRNCConfig(
    d_model          = 768,
    n_layers         = 12,
    d_state          = 192,       # hidden-state dimension per neuron
    norm             = 'rmsnorm',
    ffn_type         = 'gated',
    ffn_act_fn       = 'swish',   # → SwiGLU
    output_gate      = True,
    use_postlayers_ffn = True,
)
model = MinMaxRNC(cfg)

Preset sizes

Preset d_model n_layers d_state Parameters (backbone) Parameters (LM, GPT-2 vocab)
small 90 2 40 ~0.1 M ~4.6 M
medium 512 8 512 ~16.6 M ~42.4 M
large 728 12 1456 ~75.9 M ~112.5 M

Running the tests

python -m unittest src.minmax.test -v

How to cite

@misc{ronca2026minmaxpaper,
      title={{MinMax} Recurrent Neural Cascades},
      author={Alessandro Ronca},
      year={2026},
      eprint={2605.06384},
      archivePrefix={arXiv},
      primaryClass={cs.LG},
      url={https://arxiv.org/abs/2605.06384},
}
@software{ronca2026minmaxcode,
  author  = {Alessandro Ronca},
  title   = {{MinMax} Recurrent Neural Cascades},
  year    = {2026},
  url     = {https://github.com/minmaxrnc/model},
  version = {0.1.0},
}

License

This project is source-available under the PolyForm Noncommercial License 1.0.0.

You may use, copy, modify, and distribute this software only for non-commercial purposes under the terms of that license.

Commercial use is not permitted without a separate commercial license from the copyright holder.

For commercial licensing, contact:

Alessandro Ronca alessandro.ronca@iris-ai.org

Third-party dependencies

This project depends on third-party software, including Python and PyTorch. These dependencies are licensed separately by their respective copyright holders.

See THIRD_PARTY_NOTICES.md for details.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

minmaxrnc-0.1.0.tar.gz (24.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

minmaxrnc-0.1.0-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file minmaxrnc-0.1.0.tar.gz.

File metadata

  • Download URL: minmaxrnc-0.1.0.tar.gz
  • Upload date:
  • Size: 24.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for minmaxrnc-0.1.0.tar.gz
Algorithm Hash digest
SHA256 0a2db5848ae53feac7e8cf0846915434c098a75879268cdcc2cebae43afb6290
MD5 ed849348eb63dc7495e30aaea9bc3c59
BLAKE2b-256 e7363b3bf1e4f5daddaa520d25307275d979ccbdbf9dfd00981718c3d29d7c2c

See more details on using hashes here.

File details

Details for the file minmaxrnc-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: minmaxrnc-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 22.9 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0

File hashes

Hashes for minmaxrnc-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 9c6826099f2b9fc43efbb4f777c835e3c2b6cb1ea18826913ff43d036e66c6b1
MD5 8a0e851855c73fdc9a8bfb31c88b2c5a
BLAKE2b-256 5d1b98210114d2cfe2ac51f610d7e6656d117656008377aa879d06d44613156f

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page