diff --git a/.github/workflows/gams-sync.yml b/.github/workflows/gams-sync.yml new file mode 100644 index 0000000..ae745bd --- /dev/null +++ b/.github/workflows/gams-sync.yml @@ -0,0 +1,50 @@ +name: Verify GAMS solver options + +on: + workflow_dispatch: + +permissions: + contents: read + +jobs: + verify: + runs-on: ubuntu-latest + steps: + - name: Checkout oximo + uses: actions/checkout@v6 + with: + persist-credentials: false + + - name: Checkout gams_scraper + uses: actions/checkout@v6 + with: + repository: Godwinss24/GAM-SOLVERS + path: gams_scraper + persist-credentials: false + + - 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="snapshots/${solver,,}.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 ${snapshot} and the corresponding options.rs." + exit 1 + } + done \ No newline at end of file diff --git a/Cargo.toml b/Cargo.toml index c7a777d..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" 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),