Skip to content

Add closed-form SOC step-size computation#59

Merged
govindchari merged 9 commits intomainfrom
gc/closed-form-soc-step
Apr 16, 2026
Merged

Add closed-form SOC step-size computation#59
govindchari merged 9 commits intomainfrom
gc/closed-form-soc-step

Conversation

@govindchari
Copy link
Copy Markdown
Member

@govindchari govindchari commented Apr 15, 2026

See Issue: #57 by @JonasBreuling

TODO:

  • Re-run QOCO benchmarks as a regression check
  • Implement same change in cone.cu
  • Re-run QOCO-GPU benchmarks as a regression check
  • Remove bisection iteration setting from code and documentation

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • BOYD2: diff=2.1465s, baseline=2.0183s, Δ=+6.4%
  • CVXQP1_S: diff=0.0004s, baseline=0.0004s, Δ=+6.7%
  • LASER: diff=0.0029s, baseline=0.0028s, Δ=+5.9%
  • PRIMALC2: diff=0.0016s, baseline=0.0015s, Δ=+7.5%
  • QRECIPE: diff=0.0010s, baseline=0.0009s, Δ=+5.2%
  • QSCFXM3: diff=0.0197s, baseline=0.0185s, Δ=+6.4%
  • QSHARE1B: diff=0.0018s, baseline=0.0018s, Δ=+5.3%

Runtime improvements (> 5.0%)

  • CONT-300: diff=17.1516s, baseline=18.5397s, Δ=-7.5%
  • DUAL4: diff=0.0011s, baseline=0.0012s, Δ=-7.2%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-7.7%
  • HS35MOD: diff=0.0000s, baseline=0.0000s, Δ=-7.1%
  • HS53: diff=0.0000s, baseline=0.0000s, Δ=-6.7%
  • S268: diff=0.0000s, baseline=0.0000s, Δ=-6.2%

@govindchari govindchari changed the title Added closed-form soc stepsize computation Add closed-form SOC step-size computation Apr 15, 2026
@govindchari
Copy link
Copy Markdown
Member Author

@JonasBreuling Do you see better performance on your SOCPs with this branch?

@JonasBreuling
Copy link
Copy Markdown
Contributor

I can check this tomorrow. But my hope is to improve robustness and getting rid of another paramer that has to be chosen.

@govindchari
Copy link
Copy Markdown
Member Author

I can check this tomorrow. But my hope is to improve robustness and getting rid of another paramer that has to be chosen.

Great let me know when you get around to it and if it works. In the meantime I'll make the changes on the GPU side and check for regressions there. If you see improved performance on your problems tomorrow I'll merge and make a new release.

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • BOYD2: diff=2.7024s, baseline=2.5041s, Δ=+7.9%
  • CVXQP1_M: diff=0.0738s, baseline=0.0667s, Δ=+10.6%
  • CVXQP1_S: diff=0.0007s, baseline=0.0005s, Δ=+31.3%
  • DUALC1: diff=0.0014s, baseline=0.0013s, Δ=+7.5%
  • DUALC5: diff=0.0007s, baseline=0.0007s, Δ=+6.2%
  • DUALC8: diff=0.0017s, baseline=0.0016s, Δ=+5.0%
  • GOULDQP2: diff=0.0022s, baseline=0.0020s, Δ=+5.4%
  • LASER: diff=0.0037s, baseline=0.0035s, Δ=+5.4%
  • PRIMAL1: diff=0.0043s, baseline=0.0041s, Δ=+5.2%
  • QADLITTL: diff=0.0004s, baseline=0.0004s, Δ=+9.8%
  • QGFRDXPN: diff=0.0068s, baseline=0.0064s, Δ=+5.4%
  • QPCBLEND: diff=0.0007s, baseline=0.0006s, Δ=+5.4%
  • QSCFXM2: diff=0.0172s, baseline=0.0162s, Δ=+6.1%
  • QSCFXM3: diff=0.0259s, baseline=0.0245s, Δ=+5.7%
  • QSEBA: diff=0.0102s, baseline=0.0095s, Δ=+6.8%
  • QSHARE1B: diff=0.0024s, baseline=0.0023s, Δ=+5.3%
  • QSHIP04L: diff=0.0074s, baseline=0.0070s, Δ=+5.6%
  • QSHIP04S: diff=0.0053s, baseline=0.0050s, Δ=+5.5%
  • S268: diff=0.0000s, baseline=0.0000s, Δ=+5.3%

Runtime improvements (> 5.0%)

  • CVXQP2_L: diff=22.3937s, baseline=26.9272s, Δ=-16.8%
  • GENHS28: diff=0.0000s, baseline=0.0000s, Δ=-16.7%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.2%
  • HS35: diff=0.0000s, baseline=0.0000s, Δ=-7.7%
  • HS35MOD: diff=0.0000s, baseline=0.0000s, Δ=-5.6%
  • HS76: diff=0.0000s, baseline=0.0000s, Δ=-5.6%
  • LOTSCHD: diff=0.0000s, baseline=0.0000s, Δ=-5.0%
  • QPTEST: diff=0.0000s, baseline=0.0000s, Δ=-7.7%
  • TAME: diff=0.0000s, baseline=0.0000s, Δ=-10.0%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • BOYD2: diff=2.5837s, baseline=2.4430s, Δ=+5.8%
  • CONT-300: diff=23.5975s, baseline=22.2537s, Δ=+6.0%
  • CVXQP3_S: diff=0.0007s, baseline=0.0006s, Δ=+5.0%
  • DUALC1: diff=0.0013s, baseline=0.0012s, Δ=+6.7%
  • DUALC8: diff=0.0017s, baseline=0.0015s, Δ=+6.9%
  • GOULDQP2: diff=0.0023s, baseline=0.0020s, Δ=+16.3%
  • GOULDQP3: diff=0.0016s, baseline=0.0015s, Δ=+7.2%
  • PRIMALC1: diff=0.0028s, baseline=0.0023s, Δ=+18.6%
  • QBANDM: diff=0.0049s, baseline=0.0046s, Δ=+6.6%
  • QBEACONF: diff=0.0026s, baseline=0.0025s, Δ=+5.7%
  • QCAPRI: diff=0.0092s, baseline=0.0087s, Δ=+5.3%
  • QGFRDXPN: diff=0.0066s, baseline=0.0063s, Δ=+5.3%
  • QGROW15: diff=0.0090s, baseline=0.0084s, Δ=+6.3%
  • QPCBOEI2: diff=0.0039s, baseline=0.0037s, Δ=+5.5%
  • QRECIPE: diff=0.0012s, baseline=0.0011s, Δ=+6.6%
  • QSCAGR25: diff=0.0024s, baseline=0.0023s, Δ=+5.1%
  • QSCAGR7: diff=0.0006s, baseline=0.0006s, Δ=+9.6%
  • QSCFXM1: diff=0.0068s, baseline=0.0063s, Δ=+6.4%
  • QSCFXM3: diff=0.0258s, baseline=0.0243s, Δ=+6.5%
  • QSCORPIO: diff=0.0018s, baseline=0.0017s, Δ=+5.2%
  • QSCRS8: diff=0.0080s, baseline=0.0076s, Δ=+5.6%
  • QSEBA: diff=0.0099s, baseline=0.0092s, Δ=+7.0%
  • S268: diff=0.0000s, baseline=0.0000s, Δ=+135.3%
  • TAME: diff=0.0000s, baseline=0.0000s, Δ=+12.5%
  • UBH1: diff=0.0308s, baseline=0.0288s, Δ=+6.7%

Runtime improvements (> 5.0%)

  • GENHS28: diff=0.0000s, baseline=0.0000s, Δ=-20.0%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.7%
  • HS268: diff=0.0000s, baseline=0.0000s, Δ=-15.0%
  • HS76: diff=0.0000s, baseline=0.0000s, Δ=-5.9%
  • LOTSCHD: diff=0.0000s, baseline=0.0001s, Δ=-37.5%
  • QPTEST: diff=0.0000s, baseline=0.0000s, Δ=-8.3%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • BOYD2: diff=2.5372s, baseline=2.3708s, Δ=+7.0%
  • CVXQP1_S: diff=0.0005s, baseline=0.0005s, Δ=+6.3%
  • DUALC8: diff=0.0017s, baseline=0.0016s, Δ=+6.4%
  • GOULDQP2: diff=0.0021s, baseline=0.0019s, Δ=+6.5%
  • HS118: diff=0.0001s, baseline=0.0001s, Δ=+6.0%
  • LASER: diff=0.0035s, baseline=0.0033s, Δ=+6.0%
  • PRIMALC8: diff=0.0040s, baseline=0.0038s, Δ=+5.6%
  • QADLITTL: diff=0.0004s, baseline=0.0004s, Δ=+10.8%
  • QAFIRO: diff=0.0002s, baseline=0.0001s, Δ=+14.4%
  • QGFRDXPN: diff=0.0065s, baseline=0.0062s, Δ=+5.0%
  • QISRAEL: diff=0.0041s, baseline=0.0038s, Δ=+9.1%
  • QSCAGR7: diff=0.0006s, baseline=0.0006s, Δ=+5.2%
  • QSCTAP1: diff=0.0025s, baseline=0.0024s, Δ=+5.3%
  • QSEBA: diff=0.0098s, baseline=0.0093s, Δ=+5.4%
  • QSHIP04S: diff=0.0051s, baseline=0.0048s, Δ=+6.3%
  • QSIERRA: diff=0.0200s, baseline=0.0190s, Δ=+5.3%
  • TAME: diff=0.0000s, baseline=0.0000s, Δ=+50.0%

Runtime improvements (> 5.0%)

  • GENHS28: diff=0.0000s, baseline=0.0000s, Δ=-16.7%
  • QPTEST: diff=0.0000s, baseline=0.0000s, Δ=-8.3%
  • ZECEVIC2: diff=0.0000s, baseline=0.0000s, Δ=-7.7%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • CONT-300: diff=26.5011s, baseline=24.2694s, Δ=+9.2%
  • CVXQP2_L: diff=29.7307s, baseline=26.8519s, Δ=+10.7%
  • DUAL1: diff=0.0024s, baseline=0.0021s, Δ=+11.7%
  • DUAL3: diff=0.0037s, baseline=0.0035s, Δ=+6.1%
  • DUALC1: diff=0.0014s, baseline=0.0012s, Δ=+11.6%
  • DUALC2: diff=0.0010s, baseline=0.0008s, Δ=+18.5%
  • DUALC8: diff=0.0018s, baseline=0.0016s, Δ=+18.5%
  • HS118: diff=0.0001s, baseline=0.0001s, Δ=+28.4%
  • LASER: diff=0.0036s, baseline=0.0033s, Δ=+6.6%
  • QADLITTL: diff=0.0004s, baseline=0.0004s, Δ=+5.0%
  • QE226: diff=0.0053s, baseline=0.0050s, Δ=+7.3%
  • QPCBLEND: diff=0.0006s, baseline=0.0006s, Δ=+12.4%
  • QPCBOEI2: diff=0.0040s, baseline=0.0037s, Δ=+7.8%
  • QSC205: diff=0.0010s, baseline=0.0010s, Δ=+5.6%
  • QSCTAP3: diff=0.0199s, baseline=0.0188s, Δ=+5.7%
  • QSEBA: diff=0.0098s, baseline=0.0092s, Δ=+7.3%
  • QSHARE2B: diff=0.0009s, baseline=0.0008s, Δ=+10.3%
  • QSHIP04L: diff=0.0071s, baseline=0.0068s, Δ=+5.2%
  • QSHIP04S: diff=0.0051s, baseline=0.0048s, Δ=+6.7%
  • QSIERRA: diff=0.0201s, baseline=0.0189s, Δ=+6.5%
  • STADAT2: diff=0.0144s, baseline=0.0137s, Δ=+5.2%
  • TAME: diff=0.0000s, baseline=0.0000s, Δ=+12.5%

Runtime improvements (> 5.0%)

  • AUG2D: diff=0.0091s, baseline=0.0118s, Δ=-23.2%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.7%
  • HS53: diff=0.0000s, baseline=0.0000s, Δ=-22.7%
  • HS76: diff=0.0000s, baseline=0.0000s, Δ=-5.9%
  • LOTSCHD: diff=0.0000s, baseline=0.0000s, Δ=-5.4%
  • S268: diff=0.0000s, baseline=0.0000s, Δ=-5.6%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • DUALC1: diff=0.0013s, baseline=0.0012s, Δ=+7.2%
  • DUALC5: diff=0.0007s, baseline=0.0006s, Δ=+9.7%
  • GENHS28: diff=0.0000s, baseline=0.0000s, Δ=+25.0%
  • GOULDQP2: diff=0.0020s, baseline=0.0019s, Δ=+5.3%
  • LASER: diff=0.0035s, baseline=0.0033s, Δ=+5.2%
  • QBORE3D: diff=0.0024s, baseline=0.0023s, Δ=+6.9%
  • QGFRDXPN: diff=0.0066s, baseline=0.0062s, Δ=+7.4%
  • QPCBOEI1: diff=0.0084s, baseline=0.0080s, Δ=+5.5%
  • QPCBOEI2: diff=0.0039s, baseline=0.0037s, Δ=+6.0%
  • QSCFXM2: diff=0.0180s, baseline=0.0171s, Δ=+5.0%
  • QSCFXM3: diff=0.0260s, baseline=0.0246s, Δ=+5.5%
  • QSEBA: diff=0.0098s, baseline=0.0092s, Δ=+6.4%
  • QSHIP04L: diff=0.0072s, baseline=0.0068s, Δ=+6.0%
  • QSHIP04S: diff=0.0052s, baseline=0.0048s, Δ=+8.9%
  • QSIERRA: diff=0.0200s, baseline=0.0187s, Δ=+6.8%
  • QSTANDAT: diff=0.0076s, baseline=0.0072s, Δ=+6.2%
  • STADAT1: diff=0.0166s, baseline=0.0158s, Δ=+5.2%
  • STADAT2: diff=0.0142s, baseline=0.0134s, Δ=+5.4%
  • STADAT3: diff=0.0273s, baseline=0.0259s, Δ=+5.2%
  • UBH1: diff=0.0300s, baseline=0.0284s, Δ=+5.7%

Runtime improvements (> 5.0%)

  • CONT-300: diff=21.4202s, baseline=23.0204s, Δ=-7.0%
  • HS118: diff=0.0001s, baseline=0.0001s, Δ=-20.0%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.7%
  • QAFIRO: diff=0.0001s, baseline=0.0002s, Δ=-13.0%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • AUG2DQP: diff=0.1358s, baseline=0.1236s, Δ=+9.9%
  • BOYD2: diff=2.6181s, baseline=2.4642s, Δ=+6.2%
  • CVXQP2_L: diff=24.9942s, baseline=23.1279s, Δ=+8.1%
  • DUALC1: diff=0.0014s, baseline=0.0013s, Δ=+7.3%
  • DUALC8: diff=0.0017s, baseline=0.0016s, Δ=+5.4%
  • GOULDQP2: diff=0.0021s, baseline=0.0020s, Δ=+5.1%
  • HS268: diff=0.0000s, baseline=0.0000s, Δ=+5.3%
  • LISWET5: diff=0.0220s, baseline=0.0204s, Δ=+7.7%
  • QBORE3D: diff=0.0025s, baseline=0.0023s, Δ=+7.2%
  • QE226: diff=0.0052s, baseline=0.0050s, Δ=+5.1%
  • QGFRDXPN: diff=0.0068s, baseline=0.0065s, Δ=+5.1%
  • QGROW7: diff=0.0045s, baseline=0.0042s, Δ=+5.7%
  • QPCBLEND: diff=0.0006s, baseline=0.0006s, Δ=+6.4%
  • QPCBOEI1: diff=0.0082s, baseline=0.0077s, Δ=+6.0%
  • QPCBOEI2: diff=0.0040s, baseline=0.0038s, Δ=+5.6%
  • QPTEST: diff=0.0000s, baseline=0.0000s, Δ=+133.3%
  • QSCAGR25: diff=0.0026s, baseline=0.0024s, Δ=+8.6%
  • QSCFXM2: diff=0.0179s, baseline=0.0169s, Δ=+6.0%
  • QSCFXM3: diff=0.0262s, baseline=0.0248s, Δ=+5.9%
  • QSCSD1: diff=0.0027s, baseline=0.0026s, Δ=+5.3%
  • QSHARE1B: diff=0.0024s, baseline=0.0023s, Δ=+5.7%
  • QSHIP04L: diff=0.0074s, baseline=0.0071s, Δ=+5.2%
  • QSIERRA: diff=0.0207s, baseline=0.0196s, Δ=+5.7%

Runtime improvements (> 5.0%)

  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.2%
  • HS35: diff=0.0000s, baseline=0.0000s, Δ=-7.7%
  • HS35MOD: diff=0.0000s, baseline=0.0000s, Δ=-5.6%
  • HS51: diff=0.0000s, baseline=0.0000s, Δ=-25.0%
  • HS52: diff=0.0000s, baseline=0.0000s, Δ=-25.0%
  • HS53: diff=0.0000s, baseline=0.0000s, Δ=-5.3%
  • TAME: diff=0.0000s, baseline=0.0000s, Δ=-10.0%
  • ZECEVIC2: diff=0.0000s, baseline=0.0000s, Δ=-6.7%

@github-actions
Copy link
Copy Markdown

Download benchmark artifacts

Benchmark Summary

  • Baseline solved: 129 problems
  • Diff branch solved: 129 problems

Runtime regressions (> 5.0%)

  • BOYD2: diff=2.4959s, baseline=2.3702s, Δ=+5.3%
  • CVXQP2_S: diff=0.0004s, baseline=0.0004s, Δ=+8.0%
  • DPKLO1: diff=0.0002s, baseline=0.0001s, Δ=+17.5%
  • DUAL2: diff=0.0023s, baseline=0.0022s, Δ=+5.6%
  • DUALC2: diff=0.0009s, baseline=0.0008s, Δ=+6.8%
  • DUALC5: diff=0.0007s, baseline=0.0006s, Δ=+7.2%
  • QBORE3D: diff=0.0024s, baseline=0.0022s, Δ=+7.3%
  • QCAPRI: diff=0.0093s, baseline=0.0088s, Δ=+5.9%
  • QGROW15: diff=0.0091s, baseline=0.0085s, Δ=+6.8%
  • QPCBOEI1: diff=0.0085s, baseline=0.0081s, Δ=+5.1%
  • QSCAGR7: diff=0.0006s, baseline=0.0006s, Δ=+8.8%
  • QSCFXM1: diff=0.0066s, baseline=0.0063s, Δ=+5.4%
  • QSCSD6: diff=0.0060s, baseline=0.0057s, Δ=+5.3%
  • QSEBA: diff=0.0097s, baseline=0.0092s, Δ=+6.0%
  • QSHIP04S: diff=0.0051s, baseline=0.0048s, Δ=+5.9%
  • STADAT3: diff=0.0277s, baseline=0.0262s, Δ=+5.6%

Runtime improvements (> 5.0%)

  • CVXQP2_L: diff=22.1191s, baseline=25.3305s, Δ=-12.7%
  • HS21: diff=0.0000s, baseline=0.0000s, Δ=-6.7%
  • HS35: diff=0.0000s, baseline=0.0000s, Δ=-70.3%

@JonasBreuling
Copy link
Copy Markdown
Contributor

I can check this tomorrow. But my hope is to improve robustness and getting rid of another paramer that has to be chosen.

Great let me know when you get around to it and if it works. In the meantime I'll make the changes on the GPU side and check for regressions there. If you see improved performance on your problems tomorrow I'll merge and make a new release.

It works for my systems. The overall runtime is is slightly reduced and the stability is of the same order. I'm also using the Clarabel solver, which seems to be more stable in situations with tight tolerances. Do you know which features they may have implemented that improve stability? Possibly the broken equilibration step?

@govindchari
Copy link
Copy Markdown
Member Author

How much is runtime reduced by?

I think equilibration is one factor that should help. Unfortunately every time I enable it, I see worse robustness on the Maros-Mészáros problem.

Another thing that may be a factor is the accuracy of the linear system solve. If you increase the number of iterative refinement iterations, QOCO should be more robust.

I do have a logging PR out for QOCO as well which I am hoping will help diagnose robustness issues.

@JonasBreuling
Copy link
Copy Markdown
Contributor

How much is runtime reduced by?

I think equilibration is one factor that should help. Unfortunately every time I enable it, I see worse robustness on the Maros-Mészáros problem.

Another thing that may be a factor is the accuracy of the linear system solve. If you increase the number of iterative refinement iterations, QOCO should be more robust.

I do have a logging PR out for QOCO as well which I am hoping will help diagnose robustness issues.

Runtime is reduce by a few percents. So actually it is not really worth it.

I think Clarabel also used qldlt by default. So it should be comparable. But I can use really small static/dynamic regularization. QOCO requires larger values to remain stable. Hence, many iterative refinement steps are required to ensure tight tolerances can be met. But most of the time the solver diverges and cannot met the tolerances unless very specific tuning of regularization and iterative refinement is done

@govindchari
Copy link
Copy Markdown
Member Author

govindchari commented Apr 16, 2026

I suppose the purpose of the exact line search is to remove the bisection parameter, so speedups isn't the primary purpose, so this feature is still useful.

I feel like if there are robustness issues with QOCO it must stem from the linear system solve. Of course Clarabel does Ruiz but QOCO doesn't which is one explanation. I think this will require a bit more digging, since pretty much all solvers but QOCO use Ruiz, so it should be helping.

@govindchari govindchari merged commit 54a2fe1 into main Apr 16, 2026
17 checks passed
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.

2 participants