ASTRA — Adaptive Soft-Thresholding Algorithm
PyTorch implementation of the inverse-regularization sparse-recovery method Inverse Regularization for Structured Sparse Recovery with Computable Certificates. ASTRA selects per-scope regularization weights $\boldsymbol\lambda$ online by tracking the fixed point $\boldsymbol\psi(\boldsymbol w(\boldsymbol\lambda)) = \boldsymbol\lambda$ of an order-statistic gauge, rather than sweeping a $\lambda$-grid.
Install
poetry install # core
poetry install -E plotting -E imagenet
Requires Python ≥3.11, PyTorch ≥2.10, and
sparsekit for the BlockSpec /
ScopeSpec algebra used throughout.
Algorithm in one screen
Inner proximal-gradient step on $f(\boldsymbol w) + \sum_j \lambda_j,\Omega_j(\boldsymbol w_{\boldsymbol s_j})$, with outer EMA tracker for $\boldsymbol\lambda$:
for t in 1..T:
direction = optimizer.step() # SGD/Adam/AdamW grad or momentum
g = ema_grad.update(direction) # per-block EMA
psi = kth_mid(|g - alpha * w|; kappa) # order-statistic gauge per scope
lambda = (1 - beta_t) * lambda + beta_t * psi # beta_t = beta_0 / (t + t_0)
w = prox_lambda(w - eta * direction) # soft-threshold under conditioner alpha
# at convergence: OLS refit on the per-scope top-kappa support
Hyperparameters used in the paper: $\beta_0 = 1$, $t_0 = 100$ (effective EMA retention $\approx 0.99$); diagonal / block-diagonal / dense conditioners.
Package layout
adasoft/
├── controllers.py EMAController, LambdaController, AlphaController
├── proximals.py ASTRASparsifier (PASTRA), IHTSparsifier
├── optimizers.py Adam/SGD/AdamW + ASTRA wrappers
├── optimizers/ SASTRA, IHT, Muon-style, dataset-specific variants
├── hess.py per-layer Hessian accumulators
├── linalg.py Cholesky / Newton-Schulz / batched solves
├── prune.py layer-wise OBS / closed-form prune utilities
└── pruners/
├── admm.py dense-conditioner ADMM (Algorithm 3 of the paper)
├── admm_fp16.py fp16/bf16 ADMM with fp32 storage
├── sparsegpt.py SparseGPT baseline
├── wanda.py Wanda baseline
└── base.py PruningStrategy ABC + PrunableLinear
adasoft/data/ dataset loaders (CIFAR, C4, ImageNet, MNIST)
adasoft/models/ ResNet, WideResNet, sparse Linear/Conv layers
adasoft/train/ schedulers, sweep harness, training utils
adasoft/configs.py Hydra/OmegaConf config plumbing
adasoft/evaluate.py lm-eval-harness + classification eval glue
Minimal usage
import torch
from adasoft.proximals import ASTRASparsifier
from adasoft.controllers import EMAController, LambdaController, AlphaController
from sparsekit import BlockSpec, ScopeSpec, View
# Declare structured sparsity: N=2 nonzeros per scope of M=4 (2:4)
view = View.from_existing(linear.weight)
block = BlockSpec(view, (1, 1), "b")
scope = ScopeSpec(block, (1, 4), "s")
# Wrap any torch.optim optimizer (Adam, SGD, AdamW)
opt = torch.optim.Adam(model.parameters(), lr=1e-3)
astra = ASTRASparsifier(
groups=[scope],
kappas=[2],
lambdas=LambdaController(),
ema_grad=EMAController(rho=0.9),
alphas=AlphaController(default=1.0),
optimizer=opt,
)
for batch in loader:
loss = model(batch).loss
loss.backward()
opt.step()
astra.step() # updates λ, applies block soft-threshold
opt.zero_grad()
Layer-wise LLM pruning
adasoft.pruners.admm.admm_prune implements the dense-conditioner ADMM variant
used in the Qwen3 study: closed-form $\mathbf W$-update via Cholesky of
$\mathbf H + \rho \mathbf D$, scope-aware soft-threshold $\mathbf Z$-update,
ADMM dual ascent on $\mathbf U$, and an OLS refit on the converged top-N
support per row. An fp16/bf16 variant (Tensor-Core matmuls, fp32 master
storage) is in admm_fp16.py. SparseGPT and Wanda baselines are included for
comparison under the same calibration set.
License
CC BY-NC 4.0 — non-commercial. Contact the author for commercial licensing.
Metadata
Release files for adasoft 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| adasoft-0.1.2.tar.gz | 63.6 kB | Without provenance | Details for adasoft-0.1.2.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| adasoft-0.1.2-py3-none-any.whl | Python 3 | none | any | Details for adasoft-0.1.2-py3-none-any.whl |
Total release size: 157.1 kB
Release files / adasoft-0.1.2.tar.gz
| Download URL | adasoft-0.1.2.tar.gz |
|---|---|
| Size | 63.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
2187373032eac2a5bc318c55fe44dee27ff3ab851a35fe505e72731c37450010
|
|
BLAKE2b-256 checksum How to use checksums |
7e27f955a968255f58152fcb6ee84a63b6a5cee400379db0e95942d8340c37d8
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.2 CPython/3.13.11 Linux/6.12.74-gentoo-x86_64
|
Release files / adasoft-0.1.2-py3-none-any.whl
| Download URL | adasoft-0.1.2-py3-none-any.whl |
|---|---|
| Size | 93.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
eab918dc66e75a29158885657f2b6d407e137282b1e0b4df72d6bf315b614b82
|
|
BLAKE2b-256 checksum How to use checksums |
fc8b4838cc67bc5a0f49b12b5bd1c996369d5a2351fae946077dbd7f5c070564
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
poetry/2.3.2 CPython/3.13.11 Linux/6.12.74-gentoo-x86_64
|
Security for adasoft 0.1.2
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.