Commit 473e265
Yuma Ichikawa
feat(isco): add paper-faithful iSCO sampler (Sun et al., ICML 2023)
Adds qqa.discrete_langevin (alias qqa.isco_anneal) — a faithful,
GPU-parallel implementation of Algorithm 1 + Appendix C (PAS-MH-Step)
of Sun, Goshvadi, Nova, Schuurmans, Dai, "Revisiting Sampling for
Combinatorial Optimization", ICML 2023 (pmlr-v202-sun23c).
Each MH step samples L ~ Poisson(μ) truncated at L≥1, picks L sites
without replacement via Gumbel-top-L with logits −Δ_j/(2τ), applies
the path-auxiliary MH correction over the ordered permutation σ
(Eq. 30), and adapts μ toward the paper's 0.574 acceptance target
(Eq. 31). Works on single-instance (Q_mat) and batched-instance
(Q_tensor) QUBOs; spin / categorical / structured-shape relaxations
are rejected at the API boundary with an actionable
NotImplementedError. Returns an ISCOResult that mirrors SAResult /
PAResult plus iSCO-specific diagnostics (accept_rate, mu_final,
mean_path_length, t_max_used). Cross-checked against the DISCS
reference (samplers/path_auxiliary.py) and the Zhang et al.
discrete-langevin reference.
Detailed-balance is empirically verified by a permanent CI test
(test_isco_detailed_balance_on_tiny_qubo) that enumerates a 2^4-state
QUBO and asserts TV(empirical, exact Boltzmann) < 0.02 after
4000 inner steps × 200 chains. Offline sweep across
N ∈ {3,4,5} × seed ∈ {0,7,42} × μ ∈ {1,2,3} × {fp32, fp64}
shows TV ≤ 0.0064 in every cell.
Notable bug surfaced and fixed during verification:
_plackett_luce_logprob's diff.clamp(max=-1e-12) round-tripped to 0
in float32 (machine ε ≈ 1.19e-7), sending the recursion into
log(0) = -inf whenever sigma had repeated indices (i.e. every reverse
path with L_per_chain < L_max because _reverse_path clamps the masked
tail to sigma[0]). Subsequent summation via * mask.to(dtype) then
produced (-inf) * 0 = NaN, making log(u) < log_alpha evaluate to
False everywhere and silently rejecting every multi-flip proposal in
the affected chain. Two surgical fixes:
(a) dtype-aware clamp (-1e-6 for fp32, -1e-12 for fp64);
(b) torch.where(mask, value, 0) instead of * mask, so masked
positions can never contaminate the sum via inf * 0 = NaN.
TV on the 4-bit enumerable QUBO drops 0.51 → 0.001-0.002.
Regression test test_plackett_luce_logprob_handles_repeated_indices_in_float32
guards both float32 and float64 against this exact failure mode.
Also adds:
- README "iSCO baseline" section with Algorithm 1 / Appendix C
derivation, Quickstart, batched-instance example, "when to use
which baseline" table, and SA compute-budget parity rule.
- BibTeX entries sun2023revisiting + goshvadi2023discs in the
Reference papers section.
- CHANGELOG [Unreleased] block documenting the new sampler, the
detailed-balance test and the Plackett-Luce NaN fix.1 parent 591493a commit 473e265
5 files changed
Lines changed: 1715 additions & 5 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
6 | 6 | | |
7 | 7 | | |
8 | 8 | | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
9 | 66 | | |
10 | 67 | | |
11 | 68 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
114 | 114 | | |
115 | | - | |
116 | | - | |
117 | | - | |
118 | | - | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
119 | 124 | | |
120 | 125 | | |
121 | 126 | | |
| |||
376 | 381 | | |
377 | 382 | | |
378 | 383 | | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
| 410 | + | |
| 411 | + | |
| 412 | + | |
| 413 | + | |
| 414 | + | |
| 415 | + | |
| 416 | + | |
| 417 | + | |
| 418 | + | |
| 419 | + | |
| 420 | + | |
| 421 | + | |
| 422 | + | |
| 423 | + | |
| 424 | + | |
| 425 | + | |
| 426 | + | |
| 427 | + | |
| 428 | + | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | + | |
| 434 | + | |
| 435 | + | |
| 436 | + | |
| 437 | + | |
| 438 | + | |
| 439 | + | |
| 440 | + | |
| 441 | + | |
| 442 | + | |
| 443 | + | |
| 444 | + | |
| 445 | + | |
| 446 | + | |
| 447 | + | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
| 452 | + | |
| 453 | + | |
| 454 | + | |
| 455 | + | |
| 456 | + | |
| 457 | + | |
| 458 | + | |
| 459 | + | |
| 460 | + | |
| 461 | + | |
| 462 | + | |
| 463 | + | |
| 464 | + | |
| 465 | + | |
| 466 | + | |
| 467 | + | |
| 468 | + | |
| 469 | + | |
| 470 | + | |
| 471 | + | |
| 472 | + | |
| 473 | + | |
| 474 | + | |
| 475 | + | |
| 476 | + | |
| 477 | + | |
| 478 | + | |
| 479 | + | |
| 480 | + | |
| 481 | + | |
| 482 | + | |
| 483 | + | |
| 484 | + | |
| 485 | + | |
| 486 | + | |
| 487 | + | |
| 488 | + | |
| 489 | + | |
| 490 | + | |
| 491 | + | |
| 492 | + | |
| 493 | + | |
| 494 | + | |
| 495 | + | |
| 496 | + | |
| 497 | + | |
| 498 | + | |
| 499 | + | |
| 500 | + | |
| 501 | + | |
| 502 | + | |
| 503 | + | |
| 504 | + | |
379 | 505 | | |
380 | 506 | | |
381 | 507 | | |
| |||
887 | 1013 | | |
888 | 1014 | | |
889 | 1015 | | |
| 1016 | + | |
| 1017 | + | |
| 1018 | + | |
| 1019 | + | |
| 1020 | + | |
| 1021 | + | |
| 1022 | + | |
| 1023 | + | |
| 1024 | + | |
| 1025 | + | |
| 1026 | + | |
| 1027 | + | |
| 1028 | + | |
| 1029 | + | |
| 1030 | + | |
| 1031 | + | |
| 1032 | + | |
| 1033 | + | |
| 1034 | + | |
| 1035 | + | |
| 1036 | + | |
| 1037 | + | |
| 1038 | + | |
| 1039 | + | |
| 1040 | + | |
| 1041 | + | |
| 1042 | + | |
| 1043 | + | |
| 1044 | + | |
| 1045 | + | |
| 1046 | + | |
| 1047 | + | |
| 1048 | + | |
| 1049 | + | |
| 1050 | + | |
890 | 1051 | | |
891 | 1052 | | |
892 | 1053 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
38 | 38 | | |
39 | 39 | | |
40 | 40 | | |
| 41 | + | |
41 | 42 | | |
42 | 43 | | |
43 | 44 | | |
| |||
116 | 117 | | |
117 | 118 | | |
118 | 119 | | |
| 120 | + | |
119 | 121 | | |
120 | 122 | | |
121 | 123 | | |
| |||
147 | 149 | | |
148 | 150 | | |
149 | 151 | | |
| 152 | + | |
150 | 153 | | |
151 | 154 | | |
152 | 155 | | |
| 156 | + | |
153 | 157 | | |
154 | 158 | | |
155 | 159 | | |
| |||
0 commit comments