- 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>