From 3b7991f1c44aacb8a6fc15a513011f9bc24f702d Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 17:34:28 +0100 Subject: [PATCH 01/10] feat: workflow for scraping gams site for updates --- .github/workflows/gams-sync.yml | 44 +++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 .github/workflows/gams-sync.yml diff --git a/.github/workflows/gams-sync.yml b/.github/workflows/gams-sync.yml new file mode 100644 index 0000000..02c53be --- /dev/null +++ b/.github/workflows/gams-sync.yml @@ -0,0 +1,44 @@ +name: Verify GAMS solver options + +on: + workflow_dispatch: + +jobs: + verify: + runs-on: ubuntu-latest + steps: + - name: Checkout oximo + uses: actions/checkout@v4 + + - name: Checkout gams_scraper + uses: actions/checkout@v4 + with: + repository: Godwinss24/GAM-SOLVERS + path: gams_scraper + + - name: Install Rust + uses: dtolnay/rust-toolchain@stable + + - name: Run scraper for each solver + run: | + mkdir -p /tmp/scraped + for solver in BARON GUROBI HIGHS; do + echo "Scraping $solver..." + cargo run --manifest-path gams_scraper/Cargo.toml -- "$solver" > "/tmp/scraped/${solver}.txt" + done + + - name: Diff against checked-in snapshots + run: | + for solver in BARON GUROBI HIGHS; do + snapshot="crates/${solver,,}/src/options_snapshot.txt" + new="/tmp/scraped/${solver}.txt" + if [ ! -f "$snapshot" ]; then + echo "No snapshot for $solver yet, skipping diff." + continue + fi + echo "Checking $solver..." + diff "$snapshot" "$new" || { + echo "::error::$solver options are out of date. Regenerate and update options_snapshot.txt and options.rs." + exit 1 + } + done \ No newline at end of file From 188b976fffd01ef97bced9b52e05c253eb28da87 Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 17:44:34 +0100 Subject: [PATCH 02/10] fix: updated cargo toml to stop treating gams scraper as part of workspace --- Cargo.toml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Cargo.toml b/Cargo.toml index c7a777d..436183f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -85,3 +85,5 @@ codegen-units = 1 inherits = "release" lto = "fat" codegen-units = 16 + +exclude = ["gams_scraper"] \ No newline at end of file From 0219fc1fc693c857d6a9a716aa2332a2d01e8c96 Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 17:48:53 +0100 Subject: [PATCH 03/10] fix: added exclude statement --- Cargo.toml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 436183f..e4321a7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -14,6 +14,7 @@ members = [ "crates/oximo-autodiff", "crates/oximo", ] +exclude = ["gams_scraper"] [workspace.package] version = "0.4.0" @@ -85,5 +86,3 @@ codegen-units = 1 inherits = "release" lto = "fat" codegen-units = 16 - -exclude = ["gams_scraper"] \ No newline at end of file From bf2597f9405d25504a99ecbe071e7eabc5f02165 Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 18:02:24 +0100 Subject: [PATCH 04/10] feat: current gams snapshot for supported solvers --- .github/workflows/gams-sync.yml | 4 +- snapshots/baron.txt | 63 ++++++++++ snapshots/gurobi.txt | 210 ++++++++++++++++++++++++++++++++ snapshots/highs.txt | 137 +++++++++++++++++++++ 4 files changed, 412 insertions(+), 2 deletions(-) create mode 100644 snapshots/baron.txt create mode 100644 snapshots/gurobi.txt create mode 100644 snapshots/highs.txt diff --git a/.github/workflows/gams-sync.yml b/.github/workflows/gams-sync.yml index 02c53be..52caad2 100644 --- a/.github/workflows/gams-sync.yml +++ b/.github/workflows/gams-sync.yml @@ -30,7 +30,7 @@ jobs: - name: Diff against checked-in snapshots run: | for solver in BARON GUROBI HIGHS; do - snapshot="crates/${solver,,}/src/options_snapshot.txt" + snapshot="snapshots/${solver,,}.txt" new="/tmp/scraped/${solver}.txt" if [ ! -f "$snapshot" ]; then echo "No snapshot for $solver yet, skipping diff." @@ -38,7 +38,7 @@ jobs: fi echo "Checking $solver..." diff "$snapshot" "$new" || { - echo "::error::$solver options are out of date. Regenerate and update options_snapshot.txt and options.rs." + echo "::error::$solver options are out of date. Regenerate and update ${snapshot} and the corresponding options.rs." exit 1 } done \ No newline at end of file diff --git a/snapshots/baron.txt b/snapshots/baron.txt new file mode 100644 index 0000000..d9a913c --- /dev/null +++ b/snapshots/baron.txt @@ -0,0 +1,63 @@ +// BARON +(dbl, abs_con_feas_tol, AbsConFeasTol), +(dbl, abs_int_feas_tol, AbsIntFeasTol), +(dbl, box_tol, BoxTol), +(str, cut_off, CutOff), +(str, delta_a, DeltaA), +(int, delta_r, DeltaR), +(int, delta_t, DeltaT), +(int, delta_term, DeltaTerm), +(str, eps_a, EpsA), +(str, eps_r, EpsR), +(int, first_feas, FirstFeas), +(int, first_loc, FirstLoc), +(dbl, is_ol_tol, IsOlTol), +(str, max_iter, MaxIter), +(str, max_time, MaxTime), +(int, num_sol, NumSol), +(int, rel_con_feas_tol, RelConFeasTol), +(int, rel_int_feas_tol, RelIntFeasTol), +(int, nouter1, Nouter1), +(int, nout_iter, NoutIter), +(int, nout_per_var, NoutPerVar), +(int, out_grid, OutGrid), +(str, threads, Threads), +(int, lbttd_o, LbttdO), +(int, md_o, MdO), +(int, obttd_o, ObttdO), +(int, pd_o, PdO), +(int, td_o, TdO), +(int, br_pt_stra, BrPtStra), +(int, br_var_stra, BrVarStra), +(int, node_sel, NodeSel), +(int, do_local, DoLocal), +(int, num_loc, NumLoc), +(int, loc_res, LocRes), +(int, prfreq, Prfreq), +(int, prlevel, Prlevel), +(int, prtimefreq, Prtimefreq), +(int, allow_cbc, AllowCbc), +(int, allow_cplex, AllowCplex), +(int, allow_external, AllowExternal), +(int, allow_filter_sd, AllowFilterSd), +(int, allow_filter_sqp, AllowFilterSqp), +(int, allow_hsl, AllowHsl), +(int, allow_ipopt, AllowIpopt), +(int, allow_minos, AllowMinos), +(int, allow_snopt, AllowSnopt), +(int, allow_xpress, AllowXpress), +(str, ext_nlp_solver, ExtNlpSolver), +(int, lpa_lg, LpaLg), +(int, lps_ol, LpsOl), +(int, nlps_ol, NlpsOl), +(int, comp_iis, CompIis), +(int, dual_budget, DualBudget), +(int, iisi_nt, IisiNt), +(int, iiso_rder, IisoRder), +(int, seed, Seed), +(str, want_dual, WantDual), +(str, bar_name, BarName), +(str, clock_type, ClockType), +(int, equ_class, EquClass), +(str, gdxo_ut, GdxoUt), +(int, inf_bnd, InfBnd), diff --git a/snapshots/gurobi.txt b/snapshots/gurobi.txt new file mode 100644 index 0000000..0af6fd0 --- /dev/null +++ b/snapshots/gurobi.txt @@ -0,0 +1,210 @@ +// GUROBI +(dbl, bariterlimit, Bariterlimit), +(str, bestbdstop, Bestbdstop), +(str, bestobjstop, Bestobjstop), +(str, cutoff, Cutoff), +(dbl, iterationlimit, Iterationlimit), +(str, memlimit, Memlimit), +(int, nlbariterlimit, Nlbariterlimit), +(str, nodelimit, Nodelimit), +(str, pdhgiterlimit, Pdhgiterlimit), +(str, softmemlimit, Softmemlimit), +(str, solutionlimit, Solutionlimit), +(str, timelimit, Timelimit), +(str, worklimit, Worklimit), +(dbl, barconvtol, Barconvtol), +(dbl, barqcpconvtol, Barqcpconvtol), +(dbl, feasibilitytol, Feasibilitytol), +(dbl, intfeastol, Intfeastol), +(dbl, markowitztol, Markowitztol), +(str, mipgap, Mipgap), +(str, mipgapabs, Mipgapabs), +(dbl, nlbarcfeastol, Nlbarcfeastol), +(dbl, nlbardfeastol, Nlbardfeastol), +(dbl, nlbarpfeastol, Nlbarpfeastol), +(dbl, optimalitytol, Optimalitytol), +(dbl, pdhgabstol, Pdhgabstol), +(dbl, pdhgconvtol, Pdhgconvtol), +(dbl, pdhgreltol, Pdhgreltol), +(dbl, psdtol, Psdtol), +(int, displayinterval, Displayinterval), +(str, solfiles, Solfiles), +(int, aggfill, Aggfill), +(int, aggregate, Aggregate), +(int, dualreductions, Dualreductions), +(int, precrush, Precrush), +(int, predeprow, Predeprow), +(int, predual, Predual), +(int, premiqcpform, Premiqcpform), +(int, prepasses, Prepasses), +(int, preqlinearize, Preqlinearize), +(int, presolve, Presolve), +(int, presos1bigm, Presos1bigm), +(int, presos1encoding, Presos1encoding), +(int, presos2bigm, Presos2bigm), +(int, presos2encoding, Presos2encoding), +(int, presparsify, Presparsify), +(int, lpwarmstart, Lpwarmstart), +(int, method, Method), +(int, networkalg, Networkalg), +(int, normadjust, Normadjust), +(dbl, perturbvalue, Perturbvalue), +(int, quad, Quad), +(int, sifting, Sifting), +(int, siftmethod, Siftmethod), +(int, simplexpricing, Simplexpricing), +(int, barcorrectors, Barcorrectors), +(int, barhomogeneous, Barhomogeneous), +(int, barorder, Barorder), +(int, crossover, Crossover), +(int, crossoverbasis, Crossoverbasis), +(int, qcpdual, Qcpdual), +(int, objscale, Objscale), +(int, scaleflag, Scaleflag), +(int, branchdir, Branchdir), +(int, concurrentjobs, Concurrentjobs), +(int, concurrentmethod, Concurrentmethod), +(int, concurrentmip, Concurrentmip), +(int, degenmoves, Degenmoves), +(int, disconnected, Disconnected), +(int, distributedmipjobs, Distributedmipjobs), +(str, dumpbcsol, Dumpbcsol), +(str, fixoptfile, Fixoptfile), +(int, fixvarsinindicators, Fixvarsinindicators), +(dbl, heuristics, Heuristics), +(int, improvestartgap, Improvestartgap), +(str, improvestartnodes, Improvestartnodes), +(str, improvestarttime, Improvestarttime), +(str, improvestartwork, Improvestartwork), +(int, integralityfocus, Integralityfocus), +(int, lazy, Lazy), +(int, lazyconstraints, Lazyconstraints), +(int, minrelnodes, Minrelnodes), +(int, mipfocus, Mipfocus), +(int, mipstart, Mipstart), +(str, mipstopexpr, Mipstopexpr), +(int, mipstopexprnodestep, Mipstopexprnodestep), +(dbl, mipstopexprsolutiontol, Mipstopexprsolutiontol), +(int, mipstopexprtimestep, Mipstopexprtimestep), +(int, mipstopexprverbosity, Mipstopexprverbosity), +(int, miqcpmethod, Miqcpmethod), +(str, multimipstart, Multimipstart), +(int, nlpheur, Nlpheur), +(str, nodefiledir, Nodefiledir), +(str, nodefilestart, Nodefilestart), +(int, nodemethod, Nodemethod), +(int, nonconvex, Nonconvex), +(int, norelheursolutions, Norelheursolutions), +(int, norelheurtime, Norelheurtime), +(int, norelheurwork, Norelheurwork), +(int, obbt, Obbt), +(int, partition, Partition), +(int, partitionplace, Partitionplace), +(int, prior, Prior), +(int, pumppasses, Pumppasses), +(int, rins, Rins), +(str, solnpool, Solnpool), +(str, solnpoolmerge, Solnpoolmerge), +(int, solnpoolnumsym, Solnpoolnumsym), +(str, solnpoolprefix, Solnpoolprefix), +(int, solvefixed, Solvefixed), +(int, startnodelimit, Startnodelimit), +(str, starttimelimit, Starttimelimit), +(str, startworklimit, Startworklimit), +(int, submipnodes, Submipnodes), +(int, symmetry, Symmetry), +(int, varbranch, Varbranch), +(int, zeroobjnodes, Zeroobjnodes), +(int, bqpcuts, Bqpcuts), +(int, cliquecuts, Cliquecuts), +(int, covercuts, Covercuts), +(int, cutaggpasses, Cutaggpasses), +(int, cutpasses, Cutpasses), +(int, cuts, Cuts), +(int, dualimpliedcuts, Dualimpliedcuts), +(int, flowcovercuts, Flowcovercuts), +(int, flowpathcuts, Flowpathcuts), +(int, gomorypasses, Gomorypasses), +(int, gubcovercuts, Gubcovercuts), +(int, impliedcuts, Impliedcuts), +(int, infproofcuts, Infproofcuts), +(int, liftprojectcuts, Liftprojectcuts), +(int, masterknapsackcuts, Masterknapsackcuts), +(int, mipsepcuts, Mipsepcuts), +(int, mircuts, Mircuts), +(int, mixingcuts, Mixingcuts), +(int, modkcuts, Modkcuts), +(int, networkcuts, Networkcuts), +(int, projimpliedcuts, Projimpliedcuts), +(int, psdcuts, Psdcuts), +(int, relaxliftcuts, Relaxliftcuts), +(int, rltcuts, Rltcuts), +(int, strongcgcuts, Strongcgcuts), +(int, submipcuts, Submipcuts), +(int, zerohalfcuts, Zerohalfcuts), +(int, numericfocus, Numericfocus), +(int, tunecleanup, Tunecleanup), +(int, tunecriterion, Tunecriterion), +(int, tunedynamicjobs, Tunedynamicjobs), +(int, tunejobs, Tunejobs), +(int, tunemetric, Tunemetric), +(int, tuneoutput, Tuneoutput), +(int, tuneresults, Tuneresults), +(int, tunetargetmipgap, Tunetargetmipgap), +(dbl, tunetargettime, Tunetargettime), +(int, tunetimelimit, Tunetimelimit), +(int, tunetrials, Tunetrials), +(str, poolgap, Poolgap), +(str, poolgapabs, Poolgapabs), +(int, poolsearchmode, Poolsearchmode), +(int, poolsolutions, Poolsolutions), +(int, multiobjmethod, Multiobjmethod), +(int, multiobjpre, Multiobjpre), +(str, threads, Threads), +(str, workerpassword, Workerpassword), +(str, workerpool, Workerpool), +(dbl, dofuncpieceerror, Dofuncpieceerror), +(dbl, dofuncpiecelength, Dofuncpiecelength), +(int, dofuncpieceratio, Dofuncpieceratio), +(int, dofuncpieces, Dofuncpieces), +(int, feasopt, Feasopt), +(int, feasoptmode, Feasoptmode), +(int, feaspref, Feaspref), +(dbl, feasrelaxbigm, Feasrelaxbigm), +(int, freegamsmodel, Freegamsmodel), +(dbl, funcmaxval, Funcmaxval), +(int, funcnonlinear, Funcnonlinear), +(dbl, funcpieceerror, Funcpieceerror), +(dbl, funcpiecelength, Funcpiecelength), +(int, funcpieceratio, Funcpieceratio), +(int, funcpieces, Funcpieces), +(int, iis, Iis), +(int, iismethod, Iismethod), +(int, kappa, Kappa), +(int, kappaexact, Kappaexact), +(str, miptrace, Miptrace), +(dbl, miptraceincumbent, Miptraceincumbent), +(int, miptracenode, Miptracenode), +(int, miptracetime, Miptracetime), +(int, multobj, Multobj), +(int, names, Names), +(str, objnabstol, Objnabstol), +(str, objnreltol, Objnreltol), +(int, optimalitytarget, Optimalitytarget), +(int, pdhggpu, Pdhggpu), +(int, printoptions, Printoptions), +(int, qextractalg, Qextractalg), +(dbl, qextractdenseswitchfactor, Qextractdenseswitchfactor), +(int, qextractdenseswitchlog, Qextractdenseswitchlog), +(str, readparams, Readparams), +(int, rerun, Rerun), +(str, rngrestart, Rngrestart), +(int, seed, Seed), +(int, sensitivity, Sensitivity), +(int, solutiontarget, Solutiontarget), +(int, trynonlin, Trynonlin), +(str, tuning, Tuning), +(str, usebasis, Usebasis), +(int, varhint, Varhint), +(str, writeparams, Writeparams), +(str, writeprob, Writeprob), diff --git a/snapshots/highs.txt b/snapshots/highs.txt new file mode 100644 index 0000000..56851f1 --- /dev/null +++ b/snapshots/highs.txt @@ -0,0 +1,137 @@ +// HIGHS +(dbl, dual_feasibility_tolerance, DualFeasibilityTolerance), +(dbl, dual_residual_tolerance, DualResidualTolerance), +(int, hipo_block_size, HipoBlockSize), +(str, hipo_ordering, HipoOrdering), +(str, hipo_parallel_type, HipoParallelType), +(str, hipo_system, HipoSystem), +(int, iis, Iis), +(int, iis_strategy, IisStrategy), +(str, iis_time_limit, IisTimeLimit), +(dbl, infinite_bound, InfiniteBound), +(dbl, infinite_cost, InfiniteCost), +(str, ipm_iteration_limit, IpmIterationLimit), +(dbl, ipm_optimality_tolerance, IpmOptimalityTolerance), +(dbl, kkt_tolerance, KktTolerance), +(dbl, large_matrix_value, LargeMatrixValue), +(str, mip_abs_gap, MipAbsGap), +(int, mip_allow_cut_separation_at_nodes, MipAllowCutSeparationAtNodes), +(int, mip_allow_restart, MipAllowRestart), +(int, mip_detect_symmetry, MipDetectSymmetry), +(dbl, mip_feasibility_tolerance, MipFeasibilityTolerance), +(dbl, mip_heuristic_effort, MipHeuristicEffort), +(int, mip_heuristic_run_feasibility_jump, MipHeuristicRunFeasibilityJump), +(int, mip_heuristic_run_rens, MipHeuristicRunRens), +(int, mip_heuristic_run_rins, MipHeuristicRunRins), +(int, mip_heuristic_run_root_reduced_cost, MipHeuristicRunRootReducedCost), +(int, mip_heuristic_run_shifting, MipHeuristicRunShifting), +(int, mip_heuristic_run_zi_round, MipHeuristicRunZiRound), +(str, mip_ipm_solver, MipIpmSolver), +(int, mip_lifting_for_probing, MipLiftingForProbing), +(int, mip_lp_age_limit, MipLpAgeLimit), +(str, mip_lp_solver, MipLpSolver), +(str, mip_max_improving_sols, MipMaxImprovingSols), +(str, mip_max_leaves, MipMaxLeaves), +(str, mip_max_nodes, MipMaxNodes), +(str, mip_max_stall_nodes, MipMaxStallNodes), +(int, mip_max_start_nodes, MipMaxStartNodes), +(int, mip_min_cliquetable_entries_for_parallelism, MipMinCliquetableEntriesForParallelism), +(int, mip_min_logging_interval, MipMinLoggingInterval), +(int, mip_pool_age_limit, MipPoolAgeLimit), +(int, mip_pool_soft_limit, MipPoolSoftLimit), +(int, mip_pscost_minreliable, MipPscostMinreliable), +(str, mip_rel_gap, MipRelGap), +(int, mip_root_presolve_only, MipRootPresolveOnly), +(int, mipstart, Mipstart), +(str, objective_bound, ObjectiveBound), +(str, objective_target, ObjectiveTarget), +(dbl, optimality_tolerance, OptimalityTolerance), +(str, output_flag, OutputFlag), +(str, parallel, Parallel), +(str, pdlp_cupdlpc_restart_method, PdlpCupdlpcRestartMethod), +(int, pdlp_gpu, PdlpGpu), +(str, pdlp_iteration_limit, PdlpIterationLimit), +(dbl, pdlp_optimality_tolerance, PdlpOptimalityTolerance), +(int, pdlp_restart_strategy, PdlpRestartStrategy), +(int, pdlp_ruiz_iterations, PdlpRuizIterations), +(int, pdlp_scaling_mode, PdlpScalingMode), +(int, pdlp_step_size_strategy, PdlpStepSizeStrategy), +(str, presolve, Presolve), +(dbl, primal_feasibility_tolerance, PrimalFeasibilityTolerance), +(dbl, primal_residual_tolerance, PrimalResidualTolerance), +(int, random_seed, RandomSeed), +(str, run_crossover, RunCrossover), +(int, sensitivity, Sensitivity), +(int, simplex_dual_edge_weight_strategy, SimplexDualEdgeWeightStrategy), +(str, simplex_iteration_limit, SimplexIterationLimit), +(int, simplex_max_concurrency, SimplexMaxConcurrency), +(int, simplex_primal_edge_weight_strategy, SimplexPrimalEdgeWeightStrategy), +(int, simplex_scale_strategy, SimplexScaleStrategy), +(int, simplex_strategy, SimplexStrategy), +(int, simplex_update_limit, SimplexUpdateLimit), +(dbl, small_matrix_value, SmallMatrixValue), +(str, solution_file, SolutionFile), +(str, solver, Solver), +(str, solvetrace, Solvetrace), +(dbl, solvetraceincumbent, Solvetraceincumbent), +(int, solvetracenodefreq, Solvetracenodefreq), +(int, solvetracetimefreq, Solvetracetimefreq), +(str, threads, Threads), +(str, time_limit, TimeLimit), +(str, write_basis_file, WriteBasisFile), +(str, write_iis_model_file, WriteIisModelFile), +(str, write_model_file, WriteModelFile), +(int, write_solution_style, WriteSolutionStyle), +(int, allow_unbounded_or_infeasible, AllowUnboundedOrInfeasible), +(int, allowed_cost_scale_factor, AllowedCostScaleFactor), +(int, allowed_matrix_scale_factor, AllowedMatrixScaleFactor), +(int, centring_ratio_tolerance, CentringRatioTolerance), +(int, cost_scale_factor, CostScaleFactor), +(int, dual_simplex_cost_perturbation_multiplier, DualSimplexCostPerturbationMultiplier), +(dbl, dual_simplex_pivot_growth_tolerance, DualSimplexPivotGrowthTolerance), +(str, dual_steepest_edge_weight_error_tolerance, DualSteepestEdgeWeightErrorTolerance), +(int, dual_steepest_edge_weight_log_error_threshold, DualSteepestEdgeWeightLogErrorThreshold), +(dbl, factor_pivot_threshold, FactorPivotThreshold), +(dbl, factor_pivot_tolerance, FactorPivotTolerance), +(int, highs_analysis_level, HighsAnalysisLevel), +(int, highs_debug_level, HighsDebugLevel), +(int, icrash, Icrash), +(int, icrash_approx_iter, IcrashApproxIter), +(int, icrash_breakpoints, IcrashBreakpoints), +(int, icrash_dualize, IcrashDualize), +(int, icrash_exact, IcrashExact), +(int, icrash_iterations, IcrashIterations), +(dbl, icrash_starting_weight, IcrashStartingWeight), +(str, icrash_strategy, IcrashStrategy), +(int, ipx_dualize_strategy, IpxDualizeStrategy), +(int, less_infeasible_dse_check, LessInfeasibleDseCheck), +(int, less_infeasible_dse_choose_row, LessInfeasibleDseChooseRow), +(int, log_dev_level, LogDevLevel), +(int, lp_presolve_requires_basis_postsolve, LpPresolveRequiresBasisPostsolve), +(int, max_centring_steps, MaxCentringSteps), +(int, max_dual_simplex_cleanup_level, MaxDualSimplexCleanupLevel), +(int, max_dual_simplex_phase1_cleanup_level, MaxDualSimplexPhase1CleanupLevel), +(int, mip_report_level, MipReportLevel), +(int, no_unnecessary_rebuild_refactor, NoUnnecessaryRebuildRefactor), +(dbl, presolve_pivot_threshold, PresolvePivotThreshold), +(int, presolve_reduction_limit, PresolveReductionLimit), +(int, presolve_remove_slacks, PresolveRemoveSlacks), +(int, presolve_rule_logging, PresolveRuleLogging), +(int, presolve_rule_off, PresolveRuleOff), +(int, presolve_substitution_maxfillin, PresolveSubstitutionMaxfillin), +(int, primal_simplex_bound_perturbation_multiplier, PrimalSimplexBoundPerturbationMultiplier), +(dbl, rebuild_refactor_solution_error_tolerance, RebuildRefactorSolutionErrorTolerance), +(int, restart_presolve_reduction_limit, RestartPresolveReductionLimit), +(int, run_centring, RunCentring), +(int, simplex_crash_strategy, SimplexCrashStrategy), +(int, simplex_dualize_strategy, SimplexDualizeStrategy), +(int, simplex_initial_condition_check, SimplexInitialConditionCheck), +(dbl, simplex_initial_condition_tolerance, SimplexInitialConditionTolerance), +(int, simplex_min_concurrency, SimplexMinConcurrency), +(int, simplex_permute_strategy, SimplexPermuteStrategy), +(int, simplex_price_strategy, SimplexPriceStrategy), +(int, simplex_unscaled_solution_strategy, SimplexUnscaledSolutionStrategy), +(dbl, start_crossover_tolerance, StartCrossoverTolerance), +(int, timeless_log, TimelessLog), +(int, use_implied_bounds_from_presolve, UseImpliedBoundsFromPresolve), +(int, use_original_hf_actor_logic, UseOriginalHfActorLogic), From 354976e20d65d3d1ad26aa9459fee4c189dc319b Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 18:05:14 +0100 Subject: [PATCH 05/10] feat: edited snapshots to be incomplete so i can test actions --- snapshots/baron.txt | 11 ----------- snapshots/gurobi.txt | 14 +------------- 2 files changed, 1 insertion(+), 24 deletions(-) diff --git a/snapshots/baron.txt b/snapshots/baron.txt index d9a913c..c32eda8 100644 --- a/snapshots/baron.txt +++ b/snapshots/baron.txt @@ -50,14 +50,3 @@ (int, lpa_lg, LpaLg), (int, lps_ol, LpsOl), (int, nlps_ol, NlpsOl), -(int, comp_iis, CompIis), -(int, dual_budget, DualBudget), -(int, iisi_nt, IisiNt), -(int, iiso_rder, IisoRder), -(int, seed, Seed), -(str, want_dual, WantDual), -(str, bar_name, BarName), -(str, clock_type, ClockType), -(int, equ_class, EquClass), -(str, gdxo_ut, GdxoUt), -(int, inf_bnd, InfBnd), diff --git a/snapshots/gurobi.txt b/snapshots/gurobi.txt index 0af6fd0..812d5b7 100644 --- a/snapshots/gurobi.txt +++ b/snapshots/gurobi.txt @@ -21,19 +21,7 @@ (str, mipgapabs, Mipgapabs), (dbl, nlbarcfeastol, Nlbarcfeastol), (dbl, nlbardfeastol, Nlbardfeastol), -(dbl, nlbarpfeastol, Nlbarpfeastol), -(dbl, optimalitytol, Optimalitytol), -(dbl, pdhgabstol, Pdhgabstol), -(dbl, pdhgconvtol, Pdhgconvtol), -(dbl, pdhgreltol, Pdhgreltol), -(dbl, psdtol, Psdtol), -(int, displayinterval, Displayinterval), -(str, solfiles, Solfiles), -(int, aggfill, Aggfill), -(int, aggregate, Aggregate), -(int, dualreductions, Dualreductions), -(int, precrush, Precrush), -(int, predeprow, Predeprow), + (int, predual, Predual), (int, premiqcpform, Premiqcpform), (int, prepasses, Prepasses), From cab0e4b88e0a40bfd8b0cf811efe03d8c40bdc6f Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 18:09:13 +0100 Subject: [PATCH 06/10] feat: up to date snapshots --- snapshots/baron.txt | 11 +++++++++++ snapshots/gurobi.txt | 14 +++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/snapshots/baron.txt b/snapshots/baron.txt index c32eda8..d9a913c 100644 --- a/snapshots/baron.txt +++ b/snapshots/baron.txt @@ -50,3 +50,14 @@ (int, lpa_lg, LpaLg), (int, lps_ol, LpsOl), (int, nlps_ol, NlpsOl), +(int, comp_iis, CompIis), +(int, dual_budget, DualBudget), +(int, iisi_nt, IisiNt), +(int, iiso_rder, IisoRder), +(int, seed, Seed), +(str, want_dual, WantDual), +(str, bar_name, BarName), +(str, clock_type, ClockType), +(int, equ_class, EquClass), +(str, gdxo_ut, GdxoUt), +(int, inf_bnd, InfBnd), diff --git a/snapshots/gurobi.txt b/snapshots/gurobi.txt index 812d5b7..0af6fd0 100644 --- a/snapshots/gurobi.txt +++ b/snapshots/gurobi.txt @@ -21,7 +21,19 @@ (str, mipgapabs, Mipgapabs), (dbl, nlbarcfeastol, Nlbarcfeastol), (dbl, nlbardfeastol, Nlbardfeastol), - +(dbl, nlbarpfeastol, Nlbarpfeastol), +(dbl, optimalitytol, Optimalitytol), +(dbl, pdhgabstol, Pdhgabstol), +(dbl, pdhgconvtol, Pdhgconvtol), +(dbl, pdhgreltol, Pdhgreltol), +(dbl, psdtol, Psdtol), +(int, displayinterval, Displayinterval), +(str, solfiles, Solfiles), +(int, aggfill, Aggfill), +(int, aggregate, Aggregate), +(int, dualreductions, Dualreductions), +(int, precrush, Precrush), +(int, predeprow, Predeprow), (int, predual, Predual), (int, premiqcpform, Premiqcpform), (int, prepasses, Prepasses), From ad890c6b55da98256439da6795866280287d9e15 Mon Sep 17 00:00:00 2001 From: Godwins Godwin Date: Sun, 12 Jul 2026 18:21:08 +0100 Subject: [PATCH 07/10] feat: update docs --- README.md | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/README.md b/README.md index 60e3e8c..4fc37f4 100644 --- a/README.md +++ b/README.md @@ -331,6 +331,35 @@ With the `io` feature (default), you can export models to MPS, LP and NL format - GAMS feature: GAMS on `PATH`, valid license - BARON feature: BARON on `PATH`, valid license +## Keeping solver options in sync + +BARON, Gurobi, and HiGHS options in this repo are defined by hand in each +backend's `options.rs` (e.g. [`crates/oximo-gurobi/src/options.rs`](crates/oximo-gurobi/src/options.rs)), +using a `*_params!` macro. Since GAMS periodically adds or renames solver +options in its docs, this repo uses a small external tool, +[gams_scraper](https://github.com/Godwinss24/GAM-SOLVERS), to check whether +those hand-written option lists have fallen out of date. + +A manually-triggered CI workflow +([`.github/workflows/gams-sync.yml`](.github/workflows/gams-options.yml)) +scrapes the current GAMS docs for each supported solver and diffs the result +against a checked-in snapshot in [`snapshots/`](snapshots). If GAMS has added +or changed options since the last snapshot, the workflow fails and flags the +difference. + +This check does **not** auto-update any code. When it fails: + +1. Run the workflow's diff output (or the scraper locally) to see what + changed. +2. Manually update the relevant `*_params!` macro invocation in the + backend's `options.rs`. +3. Update the corresponding file in `snapshots/` to match the new scraper + output. +4. Open a PR with both changes. + +To trigger the check manually, go to **Actions → Verify GAMS solver options +→ Run workflow**. + ## License MIT OR Apache-2.0 From b27de14b98f68f7bd82ca27edc83e0900b3dd4d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Heim?= Date: Mon, 13 Jul 2026 22:25:21 -0300 Subject: [PATCH 08/10] CI: Adjust GAMS-Sync permissions --- .github/workflows/gams-sync.yml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/.github/workflows/gams-sync.yml b/.github/workflows/gams-sync.yml index 52caad2..fd83f93 100644 --- a/.github/workflows/gams-sync.yml +++ b/.github/workflows/gams-sync.yml @@ -3,18 +3,24 @@ name: Verify GAMS solver options on: workflow_dispatch: +permissions: + contents: read + jobs: verify: runs-on: ubuntu-latest steps: - name: Checkout oximo uses: actions/checkout@v4 + with: + persist-credentials: false - name: Checkout gams_scraper uses: actions/checkout@v4 with: repository: Godwinss24/GAM-SOLVERS path: gams_scraper + persist-credentials: false - name: Install Rust uses: dtolnay/rust-toolchain@stable From bef2fb0d0111e4726c8f4998326e9606f4ba0aea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Heim?= Date: Mon, 13 Jul 2026 22:26:31 -0300 Subject: [PATCH 09/10] workspace: Simplify README --- README.md | 29 ----------------------------- 1 file changed, 29 deletions(-) diff --git a/README.md b/README.md index 4fc37f4..60e3e8c 100644 --- a/README.md +++ b/README.md @@ -331,35 +331,6 @@ With the `io` feature (default), you can export models to MPS, LP and NL format - GAMS feature: GAMS on `PATH`, valid license - BARON feature: BARON on `PATH`, valid license -## Keeping solver options in sync - -BARON, Gurobi, and HiGHS options in this repo are defined by hand in each -backend's `options.rs` (e.g. [`crates/oximo-gurobi/src/options.rs`](crates/oximo-gurobi/src/options.rs)), -using a `*_params!` macro. Since GAMS periodically adds or renames solver -options in its docs, this repo uses a small external tool, -[gams_scraper](https://github.com/Godwinss24/GAM-SOLVERS), to check whether -those hand-written option lists have fallen out of date. - -A manually-triggered CI workflow -([`.github/workflows/gams-sync.yml`](.github/workflows/gams-options.yml)) -scrapes the current GAMS docs for each supported solver and diffs the result -against a checked-in snapshot in [`snapshots/`](snapshots). If GAMS has added -or changed options since the last snapshot, the workflow fails and flags the -difference. - -This check does **not** auto-update any code. When it fails: - -1. Run the workflow's diff output (or the scraper locally) to see what - changed. -2. Manually update the relevant `*_params!` macro invocation in the - backend's `options.rs`. -3. Update the corresponding file in `snapshots/` to match the new scraper - output. -4. Open a PR with both changes. - -To trigger the check manually, go to **Actions → Verify GAMS solver options -→ Run workflow**. - ## License MIT OR Apache-2.0 From 32a8cb955f7c4b2078084d39250051d6c2d5fab0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Germ=C3=A1n=20Heim?= Date: Mon, 13 Jul 2026 22:30:19 -0300 Subject: [PATCH 10/10] CI: Update checkout version in GAMS-Sync --- .github/workflows/gams-sync.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/gams-sync.yml b/.github/workflows/gams-sync.yml index fd83f93..ae745bd 100644 --- a/.github/workflows/gams-sync.yml +++ b/.github/workflows/gams-sync.yml @@ -11,12 +11,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Checkout oximo - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: persist-credentials: false - name: Checkout gams_scraper - uses: actions/checkout@v4 + uses: actions/checkout@v6 with: repository: Godwinss24/GAM-SOLVERS path: gams_scraper