11# Makefile for problemreductions
22
3- .PHONY : help build test fmt clippy doc mdbook paper examples clean coverage rust-export compare qubo-testdata export-schemas release run-plan diagrams jl-testdata
3+ .PHONY : help build test fmt clippy doc mdbook paper examples clean coverage rust-export compare qubo-testdata export-schemas release run-plan diagrams jl-testdata cli cli-demo
44
55# Default target
66help :
@@ -24,15 +24,17 @@ help:
2424 @echo " qubo-testdata - Regenerate QUBO test data (requires uv)"
2525 @echo " jl-testdata - Regenerate Julia parity test data (requires julia)"
2626 @echo " release V=x.y.z - Tag and push a new release (triggers CI publish)"
27+ @echo " cli - Build the pred CLI tool"
28+ @echo " cli-demo - Run closed-loop CLI demo (build + exercise all commands)"
2729 @echo " run-plan - Execute a plan with Claude autorun (latest plan in docs/plans/)"
2830
2931# Build the project
3032build :
31- cargo build --all- features
33+ cargo build --features ilp-highs
3234
3335# Run all tests (including ignored tests)
3436test :
35- cargo test --all- features -- --include-ignored
37+ cargo test --features ilp-highs -- --include-ignored
3638
3739# Format code
3840fmt :
@@ -44,14 +46,14 @@ fmt-check:
4446
4547# Run clippy
4648clippy :
47- cargo clippy --all-targets --all- features -- -D warnings
49+ cargo clippy --all-targets --features ilp-highs -- -D warnings
4850
4951# Build mdBook documentation
5052doc :
5153 cargo run --example export_graph
5254 cargo run --example export_schemas
5355 mdbook build docs
54- RUSTDOCFLAGS=" --default-theme=dark" cargo doc --all- features --no-deps
56+ RUSTDOCFLAGS=" --default-theme=dark" cargo doc --features ilp-highs --no-deps
5557 rm -rf docs/book/api
5658 cp -r target/doc docs/book/api
5759
@@ -70,7 +72,7 @@ diagrams:
7072mdbook :
7173 cargo run --example export_graph
7274 cargo run --example export_schemas
73- RUSTDOCFLAGS=" --default-theme=dark" cargo doc --all- features --no-deps
75+ RUSTDOCFLAGS=" --default-theme=dark" cargo doc --features ilp-highs --no-deps
7476 mdbook build
7577 rm -rf book/api
7678 cp -r target/doc book/api
@@ -85,9 +87,9 @@ examples:
8587 @mkdir -p docs/paper/examples
8688 @for example in $(REDUCTION_EXAMPLES ) ; do \
8789 echo " Running $$ example..." ; \
88- cargo run --all- features --example $$ example || exit 1; \
90+ cargo run --features ilp-highs --example $$ example || exit 1; \
8991 done
90- cargo run --all- features --example export_petersen_mapping
92+ cargo run --features ilp-highs --example export_petersen_mapping
9193
9294# Export problem schemas to JSON
9395export-schemas :
@@ -102,7 +104,7 @@ paper: examples
102104# Generate coverage report (requires: cargo install cargo-llvm-cov)
103105coverage :
104106 @command -v cargo-llvm-cov > /dev/null 2>&1 || { echo " Installing cargo-llvm-cov..." ; cargo install cargo-llvm-cov; }
105- cargo llvm-cov --all- features --workspace --html --open
107+ cargo llvm-cov --features ilp-highs --workspace --html --open
106108
107109# Clean build artifacts
108110clean :
@@ -135,6 +137,10 @@ endif
135137 git push origin main --tags
136138 @echo "v$(V) pushed — CI will publish to crates.io"
137139
140+ # Build the pred CLI tool
141+ cli :
142+ cargo build -p problemreductions-cli --release
143+
138144# Generate Rust mapping JSON exports for all graphs and modes
139145GRAPHS := diamond bull house petersen
140146MODES := unweighted weighted triangular
@@ -191,3 +197,140 @@ run-plan:
191197 --verbose \
192198 --max-turns 500 \
193199 -p " $$ PROMPT" 2>&1 | tee " $( OUTPUT) "
200+
201+ # Closed-loop CLI demo: exercises all commands end-to-end
202+ PRED := cargo run -p problemreductions-cli --release --
203+ CLI_DEMO_DIR := /tmp/pred-cli-demo
204+ cli-demo : cli
205+ @echo " === pred CLI closed-loop demo ==="
206+ @rm -rf $(CLI_DEMO_DIR ) && mkdir -p $(CLI_DEMO_DIR )
207+ @set -e; \
208+ PRED=" ./target/release/pred" ; \
209+ \
210+ echo " " ; \
211+ echo " --- 1. list: all registered problems ---" ; \
212+ $$ PRED list; \
213+ $$ PRED list -o $(CLI_DEMO_DIR ) /problems.json; \
214+ \
215+ echo " " ; \
216+ echo " --- 2. show: inspect MIS (variants, fields, reductions) ---" ; \
217+ $$ PRED show MIS; \
218+ $$ PRED show MIS -o $(CLI_DEMO_DIR ) /mis_info.json; \
219+ \
220+ echo " " ; \
221+ echo " --- 3. to: explore 2-hop outgoing neighborhood ---" ; \
222+ $$ PRED to MIS --hops 2; \
223+ $$ PRED to MIS --hops 2 -o $(CLI_DEMO_DIR ) /mis_hops.json; \
224+ \
225+ echo " " ; \
226+ echo " --- 4. from: incoming neighbors ---" ; \
227+ $$ PRED from QUBO --hops 1; \
228+ \
229+ echo " " ; \
230+ echo " --- 5. path: find reduction paths ---" ; \
231+ $$ PRED path MIS QUBO; \
232+ $$ PRED path MIS QUBO -o $(CLI_DEMO_DIR ) /path_mis_qubo.json; \
233+ $$ PRED path Factoring SpinGlass; \
234+ $$ PRED path MIS QUBO --cost minimize:num_variables; \
235+ \
236+ echo " " ; \
237+ echo " --- 6. path --all: enumerate all paths ---" ; \
238+ $$ PRED path MIS QUBO --all; \
239+ $$ PRED path MIS QUBO --all -o $(CLI_DEMO_DIR ) /all_paths/; \
240+ \
241+ echo " " ; \
242+ echo " --- 7. export-graph: full reduction graph ---" ; \
243+ $$ PRED export-graph -o $(CLI_DEMO_DIR ) /graph.json; \
244+ \
245+ echo " " ; \
246+ echo " --- 8. create: build problem instances ---" ; \
247+ $$ PRED create MIS --edges 0-1,1-2,2-3,3-4,4-0 -o $(CLI_DEMO_DIR ) /mis.json; \
248+ $$ PRED create MIS --edges 0-1,1-2,2-3 --weights 2,1,3,1 -o $(CLI_DEMO_DIR ) /mis_weighted.json; \
249+ $$ PRED create SAT --num-vars 3 --clauses " 1,2;-1,3;2,-3" -o $(CLI_DEMO_DIR ) /sat.json; \
250+ $$ PRED create 3SAT --num-vars 4 --clauses " 1,2,3;-1,2,-3;1,-2,3" -o $(CLI_DEMO_DIR ) /3sat.json; \
251+ $$ PRED create QUBO --matrix " 1,-0.5;-0.5,2" -o $(CLI_DEMO_DIR ) /qubo.json; \
252+ $$ PRED create KColoring --k 3 --edges 0-1,1-2,2-0 -o $(CLI_DEMO_DIR ) /kcol.json; \
253+ $$ PRED create SpinGlass --edges 0-1,1-2 -o $(CLI_DEMO_DIR ) /sg.json; \
254+ $$ PRED create MaxCut --edges 0-1,1-2,2-0 -o $(CLI_DEMO_DIR ) /maxcut.json; \
255+ $$ PRED create MVC --edges 0-1,1-2,2-3 -o $(CLI_DEMO_DIR ) /mvc.json; \
256+ $$ PRED create MaximumMatching --edges 0-1,1-2,2-3 -o $(CLI_DEMO_DIR ) /matching.json; \
257+ $$ PRED create Factoring --target 15 --bits-m 4 --bits-n 4 -o $(CLI_DEMO_DIR ) /factoring.json; \
258+ $$ PRED create Factoring --target 21 --bits-m 3 --bits-n 3 -o $(CLI_DEMO_DIR ) /factoring2.json; \
259+ \
260+ echo " " ; \
261+ echo " --- 9. evaluate: test configurations ---" ; \
262+ $$ PRED evaluate $(CLI_DEMO_DIR ) /mis.json --config 1,0,1,0,0; \
263+ $$ PRED evaluate $(CLI_DEMO_DIR ) /mis.json --config 1,1,0,0,0; \
264+ $$ PRED evaluate $(CLI_DEMO_DIR ) /sat.json --config 0,1,1; \
265+ $$ PRED evaluate $(CLI_DEMO_DIR ) /mis.json --config 1,0,1,0,0 -o $(CLI_DEMO_DIR ) /eval.json; \
266+ \
267+ echo " " ; \
268+ echo " --- 10. solve: direct ILP (auto-reduces to ILP) ---" ; \
269+ $$ PRED solve $(CLI_DEMO_DIR ) /mis.json; \
270+ $$ PRED solve $(CLI_DEMO_DIR ) /mis.json -o $(CLI_DEMO_DIR ) /sol_ilp.json; \
271+ \
272+ echo " " ; \
273+ echo " --- 11. solve: brute-force ---" ; \
274+ $$ PRED solve $(CLI_DEMO_DIR ) /mis.json --solver brute-force; \
275+ \
276+ echo " " ; \
277+ echo " --- 12. solve: weighted MIS ---" ; \
278+ $$ PRED solve $(CLI_DEMO_DIR ) /mis_weighted.json; \
279+ \
280+ echo " " ; \
281+ echo " --- 13. reduce: MIS → QUBO (auto-discover path) ---" ; \
282+ $$ PRED reduce $(CLI_DEMO_DIR ) /mis.json --to QUBO -o $(CLI_DEMO_DIR ) /bundle_qubo.json; \
283+ \
284+ echo " " ; \
285+ echo " --- 14. solve bundle: brute-force on reduced QUBO ---" ; \
286+ $$ PRED solve $(CLI_DEMO_DIR ) /bundle_qubo.json --solver brute-force; \
287+ \
288+ echo " " ; \
289+ echo " --- 15. reduce --via: use explicit path file ---" ; \
290+ $$ PRED reduce $(CLI_DEMO_DIR ) /mis.json --via $(CLI_DEMO_DIR ) /path_mis_qubo.json -o $(CLI_DEMO_DIR ) /bundle_via.json; \
291+ \
292+ echo " " ; \
293+ echo " --- 16. solve bundle with ILP: MIS → MVC → ILP ---" ; \
294+ $$ PRED reduce $(CLI_DEMO_DIR ) /mis.json --to MVC -o $(CLI_DEMO_DIR ) /bundle_mvc.json; \
295+ $$ PRED solve $(CLI_DEMO_DIR ) /bundle_mvc.json --solver ilp; \
296+ \
297+ echo " " ; \
298+ echo " --- 17. solve: other problem types ---" ; \
299+ $$ PRED solve $(CLI_DEMO_DIR ) /sat.json --solver brute-force; \
300+ $$ PRED solve $(CLI_DEMO_DIR ) /kcol.json --solver brute-force; \
301+ $$ PRED solve $(CLI_DEMO_DIR ) /maxcut.json --solver brute-force; \
302+ $$ PRED solve $(CLI_DEMO_DIR ) /mvc.json; \
303+ \
304+ echo " " ; \
305+ echo " --- 18. closed-loop: create → reduce → solve → verify ---" ; \
306+ echo " Creating a 6-vertex graph..." ; \
307+ $$ PRED create MIS --edges 0-1,1-2,2-3,3-4,4-5,0-5,1-4 -o $(CLI_DEMO_DIR ) /big.json; \
308+ echo " Solving with ILP..." ; \
309+ $$ PRED solve $(CLI_DEMO_DIR ) /big.json -o $(CLI_DEMO_DIR ) /big_sol.json; \
310+ echo " Reducing to QUBO and solving with brute-force..." ; \
311+ $$ PRED reduce $(CLI_DEMO_DIR ) /big.json --to QUBO -o $(CLI_DEMO_DIR ) /big_qubo.json; \
312+ $$ PRED solve $(CLI_DEMO_DIR ) /big_qubo.json --solver brute-force -o $(CLI_DEMO_DIR ) /big_qubo_sol.json; \
313+ echo " Verifying both solutions have the same evaluation..." ; \
314+ ILP_EVAL=$$(jq -r '.evaluation' $(CLI_DEMO_DIR ) /big_sol.json ) ; \
315+ BF_EVAL=$$(jq -r '.evaluation' $(CLI_DEMO_DIR ) /big_qubo_sol.json ) ; \
316+ echo " ILP solution evaluation: $$ ILP_EVAL" ; \
317+ echo " Brute-force (via QUBO) evaluation: $$ BF_EVAL" ; \
318+ if [ " $$ ILP_EVAL" = " $$ BF_EVAL" ]; then \
319+ echo " ✅ Solutions agree!" ; \
320+ else \
321+ echo " ❌ Solutions disagree!" && exit 1; \
322+ fi ; \
323+ \
324+ echo " " ; \
325+ echo " --- 19. show with alias and variant slash syntax ---" ; \
326+ $$ PRED show MIS/UnitDiskGraph; \
327+ \
328+ echo " " ; \
329+ echo " --- 20. completions: generate shell completions ---" ; \
330+ $$ PRED completions bash > /dev/null && echo " bash completions: OK" ; \
331+ $$ PRED completions zsh > /dev/null && echo " zsh completions: OK" ; \
332+ $$ PRED completions fish > /dev/null && echo " fish completions: OK" ; \
333+ \
334+ echo " " ; \
335+ echo " === Demo complete: $$ (ls $( CLI_DEMO_DIR) /*.json | wc -l | tr -d ' ') JSON files in $( CLI_DEMO_DIR) ==="
336+ @echo " === All 20 steps passed ✅ ==="
0 commit comments