Skip to main content

MICE: Multi-Iteration stochastiC Estimator

PyPI version Documentation License: GPL v3

MICE is a gradient estimator for stochastic optimization that uses successive control variates along the optimization path to reduce variance. By adaptively selecting which iterates to include in its index set and optimally distributing samples, MICE achieves accurate mean gradient estimation at minimal computational cost. The article can be found here: Applied Mathematics & Optimization, 93, 93 (2026) (DOI)

Key Features

  • Adaptive variance reduction: Controls relative L² error with user-specified tolerance ε
  • Efficient sample allocation: Minimizes gradient sampling cost subject to error constraints
  • Index-set operators: Add, Drop, Restart, and Clip operations for optimal hierarchy management
  • Flexible integration: Non-intrusive design couples seamlessly with SGD, Adam, and other optimizers
  • Dual problem support: Handles both expectation minimization and finite-sum problems
  • Robust stopping: Resampling-based gradient norm estimation for stable termination criteria

Theoretical Performance

For smooth, strongly convex problems, SGD-MICE achieves a gradient evaluation complexity of O(tol⁻¹) to reach tolerance tol, compared to O(tol⁻¹ log(tol⁻¹)) for standard adaptive batch-size SGD.

Installation

pip install mice

For development or to run experiments:

git clone https://github.com/agcarlon/mice.git
cd mice
pip install -e .

Quick Start

import numpy as np
from mice import MICE
from mice.policy import DropRestartClipPolicy

# Define gradient function: grad(x, thetas) -> gradients array
def gradient(x, thetas):
    """Compute gradients for batch of samples."""
    return x - thetas  # Simple example: minimize E[(x - θ)²]

# Define sampler: sampler(n) -> batch of n samples
def sampler(n):
    return np.random.randn(n, 1)

# Create MICE estimator
estimator = MICE(
    grad=gradient,
    sampler=sampler,
    eps=0.577,              # Relative error tolerance (1/√3)
    min_batch=10,
    policy=DropRestartClipPolicy(
        drop_param=0.5,
        restart_param=0.0,
        max_hierarchy_size=100
    ),
    max_cost=10000,         # Maximum gradient evaluations
    stop_crit_norm=1e-6,    # Stopping criterion
)

# Use in optimization loop
x = np.array([10.0])
for iteration in range(100):
    grad_estimate = estimator(x)
    if estimator.terminate:
        print(f"Terminated early: {estimator.terminate_reason}")
        break
    x = x - 0.1 * grad_estimate  # Gradient descent step
    print(f"Iteration {iteration}: x = {x[0]:.6f}")

Advanced Features

Finite-Sum Problems

For finite datasets (empirical risk minimization):

# Load your dataset
X_train = ...  # Training features
y_train = ...  # Training labels
data = np.column_stack([y_train, X_train])

# MICE automatically handles finite sampling
estimator = MICE(
    grad=your_gradient_function,
    sampler=data,  # Pass data directly
    eps=0.577,
    # ... other parameters
)

Policy Configuration

Control index-set management with DropRestartClipPolicy:

from mice.policy import DropRestartClipPolicy

policy = DropRestartClipPolicy(
    drop_param=0.5,           # Threshold for dropping last iterate
    restart_param=0.0,        # Threshold for restarting hierarchy
    max_hierarchy_size=100,   # Maximum |L_k|
    clip_type="full",         # Clipping strategy ("full", "all", or None)
    aggr_cost=0.1,           # Aggregation cost factor
)

estimator = MICE(grad=..., sampler=..., policy=policy)

Resampling-Based Norm Estimation

Enable robust norm estimation for sizing and stopping:

estimator = MICE(
    grad=gradient,
    sampler=sampler,
    use_resampling=True,
    re_part=5,              # Number of jackknife partitions
    re_quantile=0.05,       # Quantile for tolerance
    re_tot_cost=0.2,        # Resampling cost budget
    # ... other parameters
)

API Reference

MICE

Main estimator class.

Parameters:

  • grad (callable): Gradient function with signature grad(x: ndarray, thetas: Any) -> ndarray
  • sampler (callable or array): Sampler function sampler(n: int) -> Any or finite dataset
  • eps (float): Relative error tolerance parameter (default: 0.577)
  • min_batch (int): Minimum batch size (default: 10)
  • restart_factor (int): Restart batch multiplier (default: 10)
  • max_cost (float): Maximum gradient evaluations (default: inf)
  • stop_crit_norm (float): Stopping criterion for gradient norm (default: 0.0)
  • stop_crit_prob (float): Stopping criterion probability (default: 0.05)
  • convex (bool): Whether problem is convex (default: False)
  • policy (DropRestartClipPolicy): Index-set management policy
  • use_resampling (bool): Enable resampling-based norm estimation (default: True)
  • recorder (Recorder): Optional event recorder for diagnostics

Methods:

  • evaluate(x: ndarray) -> ndarray: Evaluate MICE gradient estimate at point x
  • __call__(x: ndarray) -> ndarray: Alias for evaluate
  • get_log() -> list: Return recorded events (if recorder enabled)

Reproducible Experiments

The repository includes all numerical experiments from the manuscript "Multi-Iteration Stochastic Optimizers". See experiments/README.md for detailed instructions on:

  • Running operator ablations and sensitivity sweeps (quadratic benchmarks)
  • Training logistic regression on mushrooms, gisette, and HIGGS datasets
  • Generating all figures and tables from the paper

Citation

If you use MICE in your research, please cite:

@article{carlon2026multi,
  title={Multi-iteration Stochastic Optimizers},
  author={Carlon, Andr{\'e} and Espath, Luis and Holdorf, Rafael and Tempone, Ra{\'u}l},
  journal={Applied Mathematics \& Optimization},
  volume={93},
  number={93},
  year={2026},
  doi={10.1007/s00245-026-10451-x}
}

Published article: Applied Mathematics & Optimization, 93, 93 (2026) (DOI)

Documentation

Full documentation available at mice.readthedocs.io

Build docs locally:

python -m pip install -r docs/requirements.txt
python -m pip install -e .
sphinx-build -b html docs docs/_build/html

License

This project is licensed under the GNU General Public License v3.0 - see the LICENSE file for details.

Authors

  • André Carlon (RWTH Aachen University)
  • Luis Espath (University of Nottingham)
  • Rafael Holdorf (Federal University of Santa Catarina)
  • Raúl Tempone (KAUST & RWTH Aachen University)

Release files for mice 1.0.5

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for mice 1.0.5
File Size Uploaded
mice-1.0.5.tar.gz 30.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for mice 1.0.5
File Interpreter ABI Platform
mice-1.0.5-py3-none-any.whl Python 3 none any Details

Total release size: 60.3 kB

Release files / mice-1.0.5.tar.gz

Download URL mice-1.0.5.tar.gz
Size 30.8 kB
Tags Source
SHA-256 checksum
How to use checksums
00c620c7090b90386aa9e34915dff949dbcd6a0055ee5c01aac6661b8090b08b
BLAKE2b-256 checksum
How to use checksums
af207bc51f9f1b5726b7f847f8e1a6ad338a41a04895d0a1d849d7efceef6c2a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 29, 2026.

Transparency log

Release files / mice-1.0.5-py3-none-any.whl

Download URL mice-1.0.5-py3-none-any.whl
Size 29.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
fd228904d310cd0f2750e94acd81a1f5e1dee691c068e73a8ee7df6b4352e330
BLAKE2b-256 checksum
How to use checksums
74391af565bcb90670589116d2332adaff805e793f023cf26fac3efee4801a21
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 29, 2026.

Transparency log
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page