parse-lp 3.0.2__tar.gz → 3.0.3__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {parse_lp-3.0.2 → parse_lp-3.0.3}/Cargo.lock +150 -15
- {parse_lp-3.0.2 → parse_lp-3.0.3}/PKG-INFO +1 -1
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/Cargo.toml +1 -1
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/python/CHANGELOG.md +7 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/src/lib.rs +4 -1
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/Cargo.toml +7 -4
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/README.md +92 -11
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/rust/CHANGELOG.md +17 -0
- parse_lp-3.0.3/rust/src/bin/lp_parser/cli.rs +214 -0
- parse_lp-3.0.3/rust/src/bin/lp_parser/main.rs +625 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/builder.rs +23 -7
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/compat/lp_solvers.rs +19 -7
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/context.rs +8 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/csv.rs +23 -1
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/error.rs +12 -4
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lexer.rs +24 -21
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lib.rs +13 -2
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/model.rs +4 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/problem.rs +69 -8
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/writer.rs +21 -13
- parse_lp-3.0.2/rust/src/bin/main.rs +0 -111
- {parse_lp-3.0.2 → parse_lp-3.0.3}/Cargo.toml +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/LICENSE-APACHE +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/README.md +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/__init__.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/parse_lp.pyi +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/parse_lp/py.typed +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/pyproject.toml +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/.cargo/config.toml +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/.gitignore +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/CHANGELOG.md +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/LICENSE-APACHE +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/MANIFEST.in +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/Makefile +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/README.md +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/__init__.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/parse_lp.pyi +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/parse_lp/py.typed +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/resources/afiro.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/__init__.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/conftest.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/afiro.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/minimize.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/fixtures/simple.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_csv_writer.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_lp_parser.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/tests/test_lp_writer.py +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/python/uv.lock +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/CHANGELOG.md +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/build.rs +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/1obj_1cons_all_variables_with_bounds.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/2obj_2cons_all_variable_types.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/2obj_2cons_only_binary_vars.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/3obj_2cons.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/AmericanSteelProblem.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/BeerDistributionProblem.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/ComputerPlantProblem.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/WhiskasModel2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/afiro.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/afiro_ext.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/blank_lines.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/boeing1.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/boeing2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/complex_names.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/corrupt.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/cplex.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/diet.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/empty_bounds.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/fit1d.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/fit2d.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/infile_comments.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/infile_comments2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/invalid.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/kb2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/limbo.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/lol.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/milo1.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/missing_signs.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/model.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/model2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/mosek.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/mosek_bounds.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/no_end_section.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/optional_labels.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_1.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_3.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output2_4.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/output_cplex_2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/pulp.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/pulp2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sc50a.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/scientific_notation.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/scientific_notation_2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/semi_continuous.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sos.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/sudoku.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test2.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/test_copy.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/resources/wbm.lp +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/compat/mod.rs +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/lp.lalrpop +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/parser.rs +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__complete_input.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__minified_example.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/src/snapshots/lp_parser_rs__problem__test__small_input.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__afiro.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__afiro_ext.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__american_steel_problem.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__beer_distribution_problem.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__blank_lines.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__boeing1.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__boeing2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__complex_names.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__computer_plant_problem.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__cplex.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__diet.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__empty_bounds.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__fit1d.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__infile_comments.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__infile_comments2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__kb2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__limbo.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__lol.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__milo1.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__missing_signs.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__model.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__model2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__mosek.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__mosek_bounds.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__nom_fit2d.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj3_2cons.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_1cons_all_variables_with_bounds.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_2cons_all_variable_types.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__obj_2cons_only_binary_vars.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_1.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_3.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__output2_4.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__pulp.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__pulp2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sc50a.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__scientific_notation.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__scientific_notation_2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sos.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__sudoku.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__test.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__test2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__wbm.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/snapshots/test_from_file__whiskas_model_2.snap +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/test_from_file.rs +0 -0
- {parse_lp-3.0.2 → parse_lp-3.0.3}/rust/tests/test_lp_solvers_compat.rs +0 -0
|
@@ -11,6 +11,56 @@ dependencies = [
|
|
|
11
11
|
"memchr",
|
|
12
12
|
]
|
|
13
13
|
|
|
14
|
+
[[package]]
|
|
15
|
+
name = "anstream"
|
|
16
|
+
version = "0.6.21"
|
|
17
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
18
|
+
checksum = "43d5b281e737544384e969a5ccad3f1cdd24b48086a0fc1b2a5262a26b8f4f4a"
|
|
19
|
+
dependencies = [
|
|
20
|
+
"anstyle",
|
|
21
|
+
"anstyle-parse",
|
|
22
|
+
"anstyle-query",
|
|
23
|
+
"anstyle-wincon",
|
|
24
|
+
"colorchoice",
|
|
25
|
+
"is_terminal_polyfill",
|
|
26
|
+
"utf8parse",
|
|
27
|
+
]
|
|
28
|
+
|
|
29
|
+
[[package]]
|
|
30
|
+
name = "anstyle"
|
|
31
|
+
version = "1.0.13"
|
|
32
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
33
|
+
checksum = "5192cca8006f1fd4f7237516f40fa183bb07f8fbdfedaa0036de5ea9b0b45e78"
|
|
34
|
+
|
|
35
|
+
[[package]]
|
|
36
|
+
name = "anstyle-parse"
|
|
37
|
+
version = "0.2.7"
|
|
38
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
39
|
+
checksum = "4e7644824f0aa2c7b9384579234ef10eb7efb6a0deb83f9630a49594dd9c15c2"
|
|
40
|
+
dependencies = [
|
|
41
|
+
"utf8parse",
|
|
42
|
+
]
|
|
43
|
+
|
|
44
|
+
[[package]]
|
|
45
|
+
name = "anstyle-query"
|
|
46
|
+
version = "1.1.5"
|
|
47
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
48
|
+
checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc"
|
|
49
|
+
dependencies = [
|
|
50
|
+
"windows-sys 0.61.2",
|
|
51
|
+
]
|
|
52
|
+
|
|
53
|
+
[[package]]
|
|
54
|
+
name = "anstyle-wincon"
|
|
55
|
+
version = "3.0.11"
|
|
56
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
57
|
+
checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
|
|
58
|
+
dependencies = [
|
|
59
|
+
"anstyle",
|
|
60
|
+
"once_cell_polyfill",
|
|
61
|
+
"windows-sys 0.61.2",
|
|
62
|
+
]
|
|
63
|
+
|
|
14
64
|
[[package]]
|
|
15
65
|
name = "ascii-canvas"
|
|
16
66
|
version = "4.0.0"
|
|
@@ -90,6 +140,52 @@ version = "1.0.4"
|
|
|
90
140
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
91
141
|
checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801"
|
|
92
142
|
|
|
143
|
+
[[package]]
|
|
144
|
+
name = "clap"
|
|
145
|
+
version = "4.5.53"
|
|
146
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
147
|
+
checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
|
|
148
|
+
dependencies = [
|
|
149
|
+
"clap_builder",
|
|
150
|
+
"clap_derive",
|
|
151
|
+
]
|
|
152
|
+
|
|
153
|
+
[[package]]
|
|
154
|
+
name = "clap_builder"
|
|
155
|
+
version = "4.5.53"
|
|
156
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
157
|
+
checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
|
|
158
|
+
dependencies = [
|
|
159
|
+
"anstream",
|
|
160
|
+
"anstyle",
|
|
161
|
+
"clap_lex",
|
|
162
|
+
"strsim",
|
|
163
|
+
]
|
|
164
|
+
|
|
165
|
+
[[package]]
|
|
166
|
+
name = "clap_derive"
|
|
167
|
+
version = "4.5.49"
|
|
168
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
169
|
+
checksum = "2a0b5487afeab2deb2ff4e03a807ad1a03ac532ff5a2cee5d86884440c7f7671"
|
|
170
|
+
dependencies = [
|
|
171
|
+
"heck",
|
|
172
|
+
"proc-macro2",
|
|
173
|
+
"quote",
|
|
174
|
+
"syn 2.0.111",
|
|
175
|
+
]
|
|
176
|
+
|
|
177
|
+
[[package]]
|
|
178
|
+
name = "clap_lex"
|
|
179
|
+
version = "0.7.6"
|
|
180
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
181
|
+
checksum = "a1d728cc89cf3aee9ff92b05e62b19ee65a02b5702cff7d5a377e32c6ae29d8d"
|
|
182
|
+
|
|
183
|
+
[[package]]
|
|
184
|
+
name = "colorchoice"
|
|
185
|
+
version = "1.0.4"
|
|
186
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
187
|
+
checksum = "b05b61dc5112cbb17e4b6cd61790d9845d13888356391624cbe7e41efeac1e75"
|
|
188
|
+
|
|
93
189
|
[[package]]
|
|
94
190
|
name = "console"
|
|
95
191
|
version = "0.15.11"
|
|
@@ -302,6 +398,12 @@ dependencies = [
|
|
|
302
398
|
"similar",
|
|
303
399
|
]
|
|
304
400
|
|
|
401
|
+
[[package]]
|
|
402
|
+
name = "is_terminal_polyfill"
|
|
403
|
+
version = "1.70.2"
|
|
404
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
405
|
+
checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695"
|
|
406
|
+
|
|
305
407
|
[[package]]
|
|
306
408
|
name = "itertools"
|
|
307
409
|
version = "0.14.0"
|
|
@@ -368,12 +470,6 @@ dependencies = [
|
|
|
368
470
|
"rustversion",
|
|
369
471
|
]
|
|
370
472
|
|
|
371
|
-
[[package]]
|
|
372
|
-
name = "lazy_static"
|
|
373
|
-
version = "1.5.0"
|
|
374
|
-
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
375
|
-
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
|
|
376
|
-
|
|
377
473
|
[[package]]
|
|
378
474
|
name = "libc"
|
|
379
475
|
version = "0.2.178"
|
|
@@ -403,24 +499,24 @@ checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
|
|
|
403
499
|
|
|
404
500
|
[[package]]
|
|
405
501
|
name = "logos"
|
|
406
|
-
version = "0.
|
|
502
|
+
version = "0.16.0"
|
|
407
503
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
408
|
-
checksum = "
|
|
504
|
+
checksum = "a790d11254054e5dc83902dba85d253ff06ceb0cfafb12be8773435cb9dfb4f4"
|
|
409
505
|
dependencies = [
|
|
410
506
|
"logos-derive",
|
|
411
507
|
]
|
|
412
508
|
|
|
413
509
|
[[package]]
|
|
414
510
|
name = "logos-codegen"
|
|
415
|
-
version = "0.
|
|
511
|
+
version = "0.16.0"
|
|
416
512
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
417
|
-
checksum = "
|
|
513
|
+
checksum = "f60337c43a38313b58871f8d5d76872b8e17aa9d51fad494b5e76092c0ce05f5"
|
|
418
514
|
dependencies = [
|
|
419
515
|
"beef",
|
|
420
516
|
"fnv",
|
|
421
|
-
"lazy_static",
|
|
422
517
|
"proc-macro2",
|
|
423
518
|
"quote",
|
|
519
|
+
"regex-automata",
|
|
424
520
|
"regex-syntax",
|
|
425
521
|
"rustc_version",
|
|
426
522
|
"syn 2.0.111",
|
|
@@ -428,9 +524,9 @@ dependencies = [
|
|
|
428
524
|
|
|
429
525
|
[[package]]
|
|
430
526
|
name = "logos-derive"
|
|
431
|
-
version = "0.
|
|
527
|
+
version = "0.16.0"
|
|
432
528
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
433
|
-
checksum = "
|
|
529
|
+
checksum = "d151b2ae667f69e10b8738f5cac0c746faa22b2e15ea7e83b55476afec3767dc"
|
|
434
530
|
dependencies = [
|
|
435
531
|
"logos-codegen",
|
|
436
532
|
]
|
|
@@ -447,8 +543,9 @@ dependencies = [
|
|
|
447
543
|
|
|
448
544
|
[[package]]
|
|
449
545
|
name = "lp_parser_rs"
|
|
450
|
-
version = "3.0.
|
|
546
|
+
version = "3.0.3"
|
|
451
547
|
dependencies = [
|
|
548
|
+
"clap",
|
|
452
549
|
"csv",
|
|
453
550
|
"diff-struct",
|
|
454
551
|
"float_eq",
|
|
@@ -460,6 +557,7 @@ dependencies = [
|
|
|
460
557
|
"lp-solvers",
|
|
461
558
|
"serde",
|
|
462
559
|
"serde_json",
|
|
560
|
+
"serde_yaml",
|
|
463
561
|
"thiserror",
|
|
464
562
|
"unique_id",
|
|
465
563
|
]
|
|
@@ -564,6 +662,12 @@ version = "1.21.3"
|
|
|
564
662
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
565
663
|
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
|
566
664
|
|
|
665
|
+
[[package]]
|
|
666
|
+
name = "once_cell_polyfill"
|
|
667
|
+
version = "1.70.2"
|
|
668
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
669
|
+
checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe"
|
|
670
|
+
|
|
567
671
|
[[package]]
|
|
568
672
|
name = "parking_lot"
|
|
569
673
|
version = "0.12.5"
|
|
@@ -589,7 +693,7 @@ dependencies = [
|
|
|
589
693
|
|
|
590
694
|
[[package]]
|
|
591
695
|
name = "parse_lp"
|
|
592
|
-
version = "3.0.
|
|
696
|
+
version = "3.0.3"
|
|
593
697
|
dependencies = [
|
|
594
698
|
"lp_parser_rs",
|
|
595
699
|
"pyo3",
|
|
@@ -905,6 +1009,19 @@ dependencies = [
|
|
|
905
1009
|
"serde_core",
|
|
906
1010
|
]
|
|
907
1011
|
|
|
1012
|
+
[[package]]
|
|
1013
|
+
name = "serde_yaml"
|
|
1014
|
+
version = "0.9.34+deprecated"
|
|
1015
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1016
|
+
checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47"
|
|
1017
|
+
dependencies = [
|
|
1018
|
+
"indexmap",
|
|
1019
|
+
"itoa",
|
|
1020
|
+
"ryu",
|
|
1021
|
+
"serde",
|
|
1022
|
+
"unsafe-libyaml",
|
|
1023
|
+
]
|
|
1024
|
+
|
|
908
1025
|
[[package]]
|
|
909
1026
|
name = "sha2"
|
|
910
1027
|
version = "0.10.9"
|
|
@@ -956,6 +1073,12 @@ dependencies = [
|
|
|
956
1073
|
"precomputed-hash",
|
|
957
1074
|
]
|
|
958
1075
|
|
|
1076
|
+
[[package]]
|
|
1077
|
+
name = "strsim"
|
|
1078
|
+
version = "0.11.1"
|
|
1079
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1080
|
+
checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
|
|
1081
|
+
|
|
959
1082
|
[[package]]
|
|
960
1083
|
name = "syn"
|
|
961
1084
|
version = "1.0.109"
|
|
@@ -1066,6 +1189,18 @@ dependencies = [
|
|
|
1066
1189
|
"uuid",
|
|
1067
1190
|
]
|
|
1068
1191
|
|
|
1192
|
+
[[package]]
|
|
1193
|
+
name = "unsafe-libyaml"
|
|
1194
|
+
version = "0.2.11"
|
|
1195
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1196
|
+
checksum = "673aac59facbab8a9007c7f6108d11f63b603f7cabff99fabf650fea5c32b861"
|
|
1197
|
+
|
|
1198
|
+
[[package]]
|
|
1199
|
+
name = "utf8parse"
|
|
1200
|
+
version = "0.2.2"
|
|
1201
|
+
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
1202
|
+
checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821"
|
|
1203
|
+
|
|
1069
1204
|
[[package]]
|
|
1070
1205
|
name = "uuid"
|
|
1071
1206
|
version = "1.19.0"
|
|
@@ -1,5 +1,12 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.0.3](https://github.com/dandxy89/lp_parser_rs/compare/parse_lp-v3.0.2...parse_lp-v3.0.3) (2025-12-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Code Refactoring
|
|
7
|
+
|
|
8
|
+
* Clippy ([#150](https://github.com/dandxy89/lp_parser_rs/issues/150)) ([0ec6a51](https://github.com/dandxy89/lp_parser_rs/commit/0ec6a510fe3bd3a9f6f52194de381a110ad19589))
|
|
9
|
+
|
|
3
10
|
## [3.0.2](https://github.com/dandxy89/lp_parser_rs/compare/parse_lp-v3.0.0...parse_lp-v3.0.2) (2025-12-07)
|
|
4
11
|
|
|
5
12
|
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
// Allow pedantic lints that are unavoidable due to PyO3 macro requirements
|
|
2
|
+
#![allow(clippy::unnecessary_wraps, clippy::needless_pass_by_value, clippy::cast_possible_truncation, clippy::cast_possible_wrap)]
|
|
3
|
+
|
|
1
4
|
use std::borrow::Cow;
|
|
2
5
|
use std::path::{Path, PathBuf};
|
|
3
6
|
|
|
@@ -36,7 +39,7 @@ impl LpParser {
|
|
|
36
39
|
#[pyo3(text_signature = "($self)")]
|
|
37
40
|
fn parse(&mut self) -> PyResult<()> {
|
|
38
41
|
let input = parse_file(&PathBuf::from(&self.lp_file)).map_err(|_| PyRuntimeError::new_err("Unable to read LpFile."))?;
|
|
39
|
-
self.parsed_content = Some(input.
|
|
42
|
+
self.parsed_content = Some(input.clone());
|
|
40
43
|
Ok(())
|
|
41
44
|
}
|
|
42
45
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
[package]
|
|
2
2
|
name = "lp_parser_rs"
|
|
3
|
-
version = "3.0.
|
|
3
|
+
version = "3.0.3"
|
|
4
4
|
edition = "2021"
|
|
5
5
|
authors = ["Dan Dixey", "Dan Dixey <dan@functorml.co.uk>"]
|
|
6
6
|
rust-version = "1.70.0"
|
|
@@ -26,16 +26,19 @@ doctest = false
|
|
|
26
26
|
|
|
27
27
|
[[bin]]
|
|
28
28
|
name = "lp_parser"
|
|
29
|
-
path = "src/bin/main.rs"
|
|
29
|
+
path = "src/bin/lp_parser/main.rs"
|
|
30
30
|
|
|
31
31
|
[dependencies]
|
|
32
|
+
clap = { version = "4.5", features = ["derive"] }
|
|
32
33
|
csv = { version = "1.4.0", optional = true }
|
|
33
34
|
diff-struct = { version = "0.5.3", optional = true }
|
|
34
35
|
lalrpop-util = "0.22.2"
|
|
35
36
|
lp-solvers = { version = "1.1", optional = true }
|
|
36
37
|
log = "0.4.29"
|
|
37
|
-
logos = "0.
|
|
38
|
+
logos = "0.16.0"
|
|
38
39
|
serde = { version = "1.0.228", features = ["derive"], optional = true }
|
|
40
|
+
serde_json = { version = "1.0", optional = true }
|
|
41
|
+
serde_yaml = { version = "0.9", optional = true }
|
|
39
42
|
thiserror = "2.0.17"
|
|
40
43
|
unique_id = { version = "0.1.7", features = ["sequence"] }
|
|
41
44
|
|
|
@@ -52,7 +55,7 @@ csv = ["dep:csv"]
|
|
|
52
55
|
default = []
|
|
53
56
|
diff = ["dep:diff-struct", "serde"]
|
|
54
57
|
lp-solvers = ["dep:lp-solvers"]
|
|
55
|
-
serde = ["dep:serde"]
|
|
58
|
+
serde = ["dep:serde", "dep:serde_json", "dep:serde_yaml"]
|
|
56
59
|
test-cbc = ["lp-solvers"]
|
|
57
60
|
|
|
58
61
|
[package.metadata.cargo-machete]
|
|
@@ -61,16 +61,6 @@ lp_parser_rs = "3.0.0" # x-release-please-version
|
|
|
61
61
|
|
|
62
62
|
### Basic Usage
|
|
63
63
|
|
|
64
|
-
Clone and run with a sample file:
|
|
65
|
-
|
|
66
|
-
```bash
|
|
67
|
-
git clone https://github.com/dandxy89/lp_parser_rs.git
|
|
68
|
-
# Parse a single LP file
|
|
69
|
-
cargo run --bin lp_parser --release -- {{ /path/to/your/file.lp }}
|
|
70
|
-
# Compare two LP files (enabling the 'diff' feature)
|
|
71
|
-
cargo run --bin lp_parser --release --features diff -- {{ /path/to/your/file.lp }} {{ /path/to/your/other/file.lp }}
|
|
72
|
-
```
|
|
73
|
-
|
|
74
64
|
Using the library directly:
|
|
75
65
|
|
|
76
66
|
```rust
|
|
@@ -132,7 +122,98 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|
|
132
122
|
lp_parser_rs = { version = "3.0.0", features = ["serde", "diff"] } # x-release-please-version
|
|
133
123
|
```
|
|
134
124
|
|
|
135
|
-
|
|
125
|
+
## Command-Line Interface
|
|
126
|
+
|
|
127
|
+
The `lp_parser` binary provides a comprehensive CLI for working with LP files.
|
|
128
|
+
|
|
129
|
+
### Installation
|
|
130
|
+
|
|
131
|
+
```bash
|
|
132
|
+
# Install with all features
|
|
133
|
+
cargo install lp_parser_rs --all-features
|
|
134
|
+
|
|
135
|
+
# Or build from source
|
|
136
|
+
git clone https://github.com/dandxy89/lp_parser_rs.git
|
|
137
|
+
cd lp_parser_rs/rust
|
|
138
|
+
cargo build --release --all-features
|
|
139
|
+
```
|
|
140
|
+
|
|
141
|
+
### Commands
|
|
142
|
+
|
|
143
|
+
```
|
|
144
|
+
lp_parser <COMMAND>
|
|
145
|
+
|
|
146
|
+
Commands:
|
|
147
|
+
parse Parse an LP file and display its structure
|
|
148
|
+
info Show detailed statistics about an LP problem
|
|
149
|
+
diff Compare two LP files (requires 'diff' feature)
|
|
150
|
+
convert Convert LP file to another format
|
|
151
|
+
solve Solve an LP problem using external solvers (requires 'lp-solvers' feature)
|
|
152
|
+
|
|
153
|
+
Global Options:
|
|
154
|
+
-v, --verbose Increase output verbosity
|
|
155
|
+
-q, --quiet Suppress non-essential output
|
|
156
|
+
-h, --help Print help
|
|
157
|
+
-V, --version Print version
|
|
158
|
+
```
|
|
159
|
+
|
|
160
|
+
### Examples
|
|
161
|
+
|
|
162
|
+
**Parse and display an LP file:**
|
|
163
|
+
|
|
164
|
+
```bash
|
|
165
|
+
lp_parser parse problem.lp
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
**Get problem statistics:**
|
|
169
|
+
|
|
170
|
+
```bash
|
|
171
|
+
lp_parser info problem.lp
|
|
172
|
+
# With detailed listings
|
|
173
|
+
lp_parser info problem.lp --variables --constraints --objectives
|
|
174
|
+
```
|
|
175
|
+
|
|
176
|
+
**Output as JSON or YAML:**
|
|
177
|
+
|
|
178
|
+
```bash
|
|
179
|
+
lp_parser info problem.lp --format json --pretty
|
|
180
|
+
lp_parser parse problem.lp --format yaml -o problem.yaml
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Compare two LP files:**
|
|
184
|
+
|
|
185
|
+
```bash
|
|
186
|
+
lp_parser diff old_model.lp new_model.lp
|
|
187
|
+
lp_parser diff old.lp new.lp --format json --pretty
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
**Convert between formats:**
|
|
191
|
+
|
|
192
|
+
```bash
|
|
193
|
+
# To LP (with formatting options)
|
|
194
|
+
lp_parser convert problem.lp --format lp --precision 4 --compact
|
|
195
|
+
|
|
196
|
+
# To CSV (creates constraints.csv, objectives.csv, variables.csv)
|
|
197
|
+
lp_parser convert problem.lp --format csv --output ./output_dir
|
|
198
|
+
|
|
199
|
+
# To JSON/YAML
|
|
200
|
+
lp_parser convert problem.lp --format json --pretty -o problem.json
|
|
201
|
+
lp_parser convert problem.lp --format yaml -o problem.yaml
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
**Solve with external solvers:**
|
|
205
|
+
```bash
|
|
206
|
+
# Using CBC (default)
|
|
207
|
+
lp_parser solve problem.lp
|
|
208
|
+
|
|
209
|
+
# Using GLPK
|
|
210
|
+
lp_parser solve problem.lp --solver glpk
|
|
211
|
+
|
|
212
|
+
# Output solution as JSON
|
|
213
|
+
lp_parser solve problem.lp --format json --pretty
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
## Solving with External Solvers (`lp-solvers` feature)
|
|
136
217
|
|
|
137
218
|
Enable the `lp-solvers` feature to solve parsed LP problems using external solvers like CBC, Gurobi, CPLEX, or GLPK via the [lp-solvers](https://crates.io/crates/lp-solvers) crate:
|
|
138
219
|
|
|
@@ -1,5 +1,22 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## [3.0.3](https://github.com/dandxy89/lp_parser_rs/compare/lp_parser_rs-v3.0.2...lp_parser_rs-v3.0.3) (2025-12-11)
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
### Build System
|
|
7
|
+
|
|
8
|
+
* Bump logos crate to 0.16.0 ([690e83c](https://github.com/dandxy89/lp_parser_rs/commit/690e83c69277a9de49bc8579c86db3a433766389))
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
### Bug Fixes
|
|
12
|
+
|
|
13
|
+
* Improvements to the binary / main ([#151](https://github.com/dandxy89/lp_parser_rs/issues/151)) ([0ca04b8](https://github.com/dandxy89/lp_parser_rs/commit/0ca04b81cce55c7fac0b04211a493997ec0892b2))
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
### Code Refactoring
|
|
17
|
+
|
|
18
|
+
* Clippy ([#150](https://github.com/dandxy89/lp_parser_rs/issues/150)) ([0ec6a51](https://github.com/dandxy89/lp_parser_rs/commit/0ec6a510fe3bd3a9f6f52194de381a110ad19589))
|
|
19
|
+
|
|
3
20
|
## [3.0.2](https://github.com/dandxy89/lp_parser_rs/compare/lp_parser_rs-v3.0.1...lp_parser_rs-v3.0.2) (2025-12-07)
|
|
4
21
|
|
|
5
22
|
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
//! CLI argument definitions for `lp_parser`.
|
|
2
|
+
|
|
3
|
+
use std::path::PathBuf;
|
|
4
|
+
|
|
5
|
+
use clap::{Parser, Subcommand, ValueEnum};
|
|
6
|
+
|
|
7
|
+
/// LP Parser - Parse, analyze, convert, and solve Linear Programming files
|
|
8
|
+
#[derive(Parser)]
|
|
9
|
+
#[command(name = "lp_parser")]
|
|
10
|
+
#[command(author, version, about, long_about = None)]
|
|
11
|
+
#[command(propagate_version = true)]
|
|
12
|
+
pub struct Cli {
|
|
13
|
+
#[command(subcommand)]
|
|
14
|
+
pub command: Commands,
|
|
15
|
+
|
|
16
|
+
/// Increase output verbosity
|
|
17
|
+
#[arg(short, long, global = true, action = clap::ArgAction::Count)]
|
|
18
|
+
pub verbose: u8,
|
|
19
|
+
|
|
20
|
+
/// Suppress non-essential output
|
|
21
|
+
#[arg(short, long, global = true)]
|
|
22
|
+
pub quiet: bool,
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
#[derive(Subcommand)]
|
|
26
|
+
pub enum Commands {
|
|
27
|
+
/// Parse an LP file and display its structure
|
|
28
|
+
Parse(ParseArgs),
|
|
29
|
+
|
|
30
|
+
/// Show detailed statistics about an LP problem
|
|
31
|
+
Info(InfoArgs),
|
|
32
|
+
|
|
33
|
+
/// Compare two LP files
|
|
34
|
+
#[cfg(feature = "diff")]
|
|
35
|
+
Diff(DiffArgs),
|
|
36
|
+
|
|
37
|
+
/// Convert LP file to another format
|
|
38
|
+
Convert(ConvertArgs),
|
|
39
|
+
|
|
40
|
+
/// Solve an LP problem using external solvers
|
|
41
|
+
#[cfg(feature = "lp-solvers")]
|
|
42
|
+
Solve(SolveArgs),
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
#[derive(ValueEnum, Clone, Debug, Default)]
|
|
46
|
+
pub enum OutputFormat {
|
|
47
|
+
/// Plain text output
|
|
48
|
+
#[default]
|
|
49
|
+
Text,
|
|
50
|
+
/// JSON output (requires 'serde' feature)
|
|
51
|
+
#[cfg(feature = "serde")]
|
|
52
|
+
Json,
|
|
53
|
+
/// YAML output (requires 'serde' feature)
|
|
54
|
+
#[cfg(feature = "serde")]
|
|
55
|
+
Yaml,
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
#[derive(clap::Args)]
|
|
59
|
+
pub struct ParseArgs {
|
|
60
|
+
/// Path to the LP file
|
|
61
|
+
pub file: PathBuf,
|
|
62
|
+
|
|
63
|
+
/// Write output to file instead of stdout
|
|
64
|
+
#[arg(short, long)]
|
|
65
|
+
pub output: Option<PathBuf>,
|
|
66
|
+
|
|
67
|
+
/// Output format
|
|
68
|
+
#[arg(short, long, value_enum, default_value = "text")]
|
|
69
|
+
pub format: OutputFormat,
|
|
70
|
+
|
|
71
|
+
/// Pretty-print structured output (for JSON/YAML)
|
|
72
|
+
#[arg(long)]
|
|
73
|
+
pub pretty: bool,
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
#[derive(clap::Args)]
|
|
77
|
+
#[allow(clippy::struct_excessive_bools)]
|
|
78
|
+
pub struct InfoArgs {
|
|
79
|
+
/// Path to the LP file
|
|
80
|
+
pub file: PathBuf,
|
|
81
|
+
|
|
82
|
+
/// Write output to file instead of stdout
|
|
83
|
+
#[arg(short, long)]
|
|
84
|
+
pub output: Option<PathBuf>,
|
|
85
|
+
|
|
86
|
+
/// Output format
|
|
87
|
+
#[arg(short, long, value_enum, default_value = "text")]
|
|
88
|
+
pub format: OutputFormat,
|
|
89
|
+
|
|
90
|
+
/// Pretty-print structured output
|
|
91
|
+
#[arg(long)]
|
|
92
|
+
pub pretty: bool,
|
|
93
|
+
|
|
94
|
+
/// List all variables with their types
|
|
95
|
+
#[arg(long)]
|
|
96
|
+
pub variables: bool,
|
|
97
|
+
|
|
98
|
+
/// List all constraints
|
|
99
|
+
#[arg(long)]
|
|
100
|
+
pub constraints: bool,
|
|
101
|
+
|
|
102
|
+
/// List all objectives
|
|
103
|
+
#[arg(long)]
|
|
104
|
+
pub objectives: bool,
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
#[cfg(feature = "diff")]
|
|
108
|
+
#[derive(clap::Args)]
|
|
109
|
+
pub struct DiffArgs {
|
|
110
|
+
/// First LP file (base)
|
|
111
|
+
pub file1: PathBuf,
|
|
112
|
+
|
|
113
|
+
/// Second LP file (to compare against)
|
|
114
|
+
pub file2: PathBuf,
|
|
115
|
+
|
|
116
|
+
/// Write output to file instead of stdout
|
|
117
|
+
#[arg(short, long)]
|
|
118
|
+
pub output: Option<PathBuf>,
|
|
119
|
+
|
|
120
|
+
/// Output format
|
|
121
|
+
#[arg(short, long, value_enum, default_value = "text")]
|
|
122
|
+
pub format: OutputFormat,
|
|
123
|
+
|
|
124
|
+
/// Pretty-print structured output
|
|
125
|
+
#[arg(long)]
|
|
126
|
+
pub pretty: bool,
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
#[derive(ValueEnum, Clone, Debug, Default)]
|
|
130
|
+
pub enum ConvertFormat {
|
|
131
|
+
/// LP file format
|
|
132
|
+
#[default]
|
|
133
|
+
Lp,
|
|
134
|
+
/// CSV files (constraints.csv, objectives.csv, variables.csv)
|
|
135
|
+
#[cfg(feature = "csv")]
|
|
136
|
+
Csv,
|
|
137
|
+
/// JSON format
|
|
138
|
+
#[cfg(feature = "serde")]
|
|
139
|
+
Json,
|
|
140
|
+
/// YAML format
|
|
141
|
+
#[cfg(feature = "serde")]
|
|
142
|
+
Yaml,
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
#[derive(clap::Args)]
|
|
146
|
+
pub struct ConvertArgs {
|
|
147
|
+
/// Path to the LP file
|
|
148
|
+
pub file: PathBuf,
|
|
149
|
+
|
|
150
|
+
/// Output file or directory (required for CSV)
|
|
151
|
+
#[arg(short, long)]
|
|
152
|
+
pub output: Option<PathBuf>,
|
|
153
|
+
|
|
154
|
+
/// Target format
|
|
155
|
+
#[arg(short, long, value_enum, default_value = "lp")]
|
|
156
|
+
pub format: ConvertFormat,
|
|
157
|
+
|
|
158
|
+
/// Pretty-print output (for JSON/YAML)
|
|
159
|
+
#[arg(long)]
|
|
160
|
+
pub pretty: bool,
|
|
161
|
+
|
|
162
|
+
/// Decimal precision for numbers
|
|
163
|
+
#[arg(long, default_value = "6")]
|
|
164
|
+
pub precision: usize,
|
|
165
|
+
|
|
166
|
+
/// Maximum line length before wrapping
|
|
167
|
+
#[arg(long, default_value = "80")]
|
|
168
|
+
pub max_line_length: usize,
|
|
169
|
+
|
|
170
|
+
/// Omit problem name comment in LP output
|
|
171
|
+
#[arg(long)]
|
|
172
|
+
pub no_problem_name: bool,
|
|
173
|
+
|
|
174
|
+
/// Compact output (no spacing between sections)
|
|
175
|
+
#[arg(long)]
|
|
176
|
+
pub compact: bool,
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
#[cfg(feature = "lp-solvers")]
|
|
180
|
+
#[derive(ValueEnum, Clone, Debug, Default)]
|
|
181
|
+
pub enum Solver {
|
|
182
|
+
/// CBC solver
|
|
183
|
+
#[default]
|
|
184
|
+
Cbc,
|
|
185
|
+
/// Gurobi solver
|
|
186
|
+
Gurobi,
|
|
187
|
+
/// CPLEX solver
|
|
188
|
+
Cplex,
|
|
189
|
+
/// GLPK solver
|
|
190
|
+
Glpk,
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
#[cfg(feature = "lp-solvers")]
|
|
194
|
+
#[derive(clap::Args)]
|
|
195
|
+
pub struct SolveArgs {
|
|
196
|
+
/// Path to the LP file
|
|
197
|
+
pub file: PathBuf,
|
|
198
|
+
|
|
199
|
+
/// Solver to use
|
|
200
|
+
#[arg(short, long, value_enum, default_value = "cbc")]
|
|
201
|
+
pub solver: Solver,
|
|
202
|
+
|
|
203
|
+
/// Write solution to file instead of stdout
|
|
204
|
+
#[arg(short, long)]
|
|
205
|
+
pub output: Option<PathBuf>,
|
|
206
|
+
|
|
207
|
+
/// Output format
|
|
208
|
+
#[arg(short, long, value_enum, default_value = "text")]
|
|
209
|
+
pub format: OutputFormat,
|
|
210
|
+
|
|
211
|
+
/// Pretty-print structured output
|
|
212
|
+
#[arg(long)]
|
|
213
|
+
pub pretty: bool,
|
|
214
|
+
}
|