stan.plugins.get_plugins() calls pkg_resources.iter_entry_points()
from several call sites during model building, each re-emitting
setuptools' deprecation notice since Python's default warning dedup
is keyed per call site, not per message. Not actionable upstream
noise, so filter it by message instead.
setuptools 82 removed pkg_resources entirely, which httpstan still
imports at runtime; CI's prior `pip install --upgrade setuptools`
step grabs the latest, so an unpinned setuptools didn't help.
- Add smoke tests covering data/reader.py, method/_threshold_optim.py,
classification/calibration.py, method/confidence.py, and the pure-numpy
helpers in method/_bayesian.py (skipping the jax/stan-dependent model
code itself, consistent with how the aggregative-method registry already
treats it as optional)
- SVMperf: stop creating a tempfile.TemporaryDirectory() just to discard it
immediately for its .name; generate the path directly instead of doing a
pointless create/delete/recreate cycle (cleanup already happens via the
class's own __del__)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Correctness:
- OneVsAllAggregative.aggregation_fit: fix undefined variable and call to
the nonexistent aggregate_fit (should be aggregation_fit)
- solve_adjustment: stop mutating the caller's fitted arrays in place for
method='invariant-ratio'
- LabelledCollection.join(): fix classes always being None due to
ndarray.sort() returning None; now unions each collection's own classes_
so a class absent from a particular join is kept at zero prevalence
- Rename the duplicate newSVMKLD (nkld variant) to newSVMNKLD so both loss
variants are reachable
- EMQ/DyS/DMy: resolve n_jobs via qp._get_njobs() like the other methods,
so qp.environ['N_JOBS'] is respected
- AggregativeMedianEstimator: drop backend='threading' (global np.random
state mutated via temp_seed is not thread-safe); use the safe process
based default instead
- NeuralClassifier: default device now 'cpu', matching its own docstring
- ConfidenceEllipseSimplex: narrow bare except to np.linalg.LinAlgError
- SVMperf: stop merging stderr into stdout so failures report the actual
subprocess error instead of crashing with AttributeError
- ConfidenceRegionABC: replace @lru_cache on bound methods (leaked every
instance for the process lifetime) with per-instance caching
Style/quality:
- Replace print() with warnings.warn()/logging across aggregative.py,
base.py, meta.py, model_selection.py, classification/neural.py,
method/_neural.py, classification/svmperf.py, data/reader.py,
data/datasets.py; also fixes a `raise RuntimeWarning(...)` in EMQ that
would have crashed instead of warning
- Remove dead duplicate class MedianEstimator2 in meta.py
- Rename misleading _compute_tpr(TP, FP) parameter to FN, matching what
callers actually pass
- Replace argparse.ArgumentError misuse with ValueError
- Remove commented-out dead code in protocol.py
- _lequa.py: fix CSV-parse failure raising an unrelated UnboundLocalError
instead of a clear ValueError
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>