Skip to content

Add soft_symcover! and soft_cover! refiners - #29

Merged
timholy merged 1 commit into
mainfrom
teh/refine
Jul 18, 2026
Merged

Add soft_symcover! and soft_cover! refiners#29
timholy merged 1 commit into
mainfrom
teh/refine

Conversation

@timholy

@timholy timholy commented Jul 18, 2026

Copy link
Copy Markdown
Member

Every other cover family paired a solver that owns a start menu with a
refiner that takes one start from the caller; the soft covers had only
the solver. The kernels for the missing half already existed as the
single-start coordinate descents the multistart drives, so the refiners
expose what was there rather than adding numerics.

This completes one rule across the whole grid: the plain form owns the
menu, so its result is a property of A, while the ! form refines the one
start it is given, so its result is a property of A and that start.
symcover!/cover! sit outside the rule because they are initializers --
they build a cover from scratch and never read the vector passed in.

The soft refiners take a start that need not cover A, since the soft
objective constrains nothing; callers should build one with
initialize_symcover(...; feasible=:none).

The shared start-validation prologues now take the caller's name, so a
bad start reports the function the user actually called instead of
always naming the *_min form.

Also state the soft tier contract in the manual: soft_* is always native
and best-effort, soft_*_min is a true minimizer that may require an
extension. The claim that the soft *_min solvers were "likewise
JuMP-backed (HiGHS for AbsLog{2})" was wrong on both counts -- AbsLog{2}
is native there and HiGHS is never used for soft covers.

Assisted-by: Claude Opus 4.8 noreply@anthropic.com

Every other cover family paired a solver that owns a start menu with a
refiner that takes one start from the caller; the soft covers had only
the solver. The kernels for the missing half already existed as the
single-start coordinate descents the multistart drives, so the refiners
expose what was there rather than adding numerics.

This completes one rule across the whole grid: the plain form owns the
menu, so its result is a property of A, while the ! form refines the one
start it is given, so its result is a property of A and that start.
symcover!/cover! sit outside the rule because they are initializers --
they build a cover from scratch and never read the vector passed in.

The soft refiners take a start that need not cover A, since the soft
objective constrains nothing; callers should build one with
initialize_symcover(...; feasible=:none).

The shared start-validation prologues now take the caller's name, so a
bad start reports the function the user actually called instead of
always naming the *_min form.

Also state the soft tier contract in the manual: soft_* is always native
and best-effort, soft_*_min is a true minimizer that may require an
extension. The claim that the soft *_min solvers were "likewise
JuMP-backed (HiGHS for AbsLog{2})" was wrong on both counts -- AbsLog{2}
is native there and HiGHS is never used for soft covers.

Assisted-by: Claude Opus 4.8 <noreply@anthropic.com>
@codecov

codecov Bot commented Jul 18, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 98.53%. Comparing base (285b12f) to head (0c35cd8).

Additional details and impacted files
@@            Coverage Diff             @@
##             main      #29      +/-   ##
==========================================
+ Coverage   98.51%   98.53%   +0.02%     
==========================================
  Files          12       12              
  Lines        2016     2052      +36     
==========================================
+ Hits         1986     2022      +36     
  Misses         30       30              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

@timholy
timholy merged commit 5e237dd into main Jul 18, 2026
5 checks passed
@timholy
timholy deleted the teh/refine branch July 18, 2026 10:01
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant