parse-lp 2.6.1__tar.gz → 2.6.2__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-2.6.1 → parse_lp-2.6.2}/Cargo.lock +13 -13
- parse_lp-2.6.2/PKG-INFO +308 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/parse_lp.pyi +193 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/pyproject.toml +3 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/Cargo.toml +1 -1
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/parse_lp.pyi +193 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/python/CHANGELOG.md +8 -0
- parse_lp-2.6.2/python/tests/conftest.py +32 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_lp_parser.py +1 -30
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_lp_writer.py +0 -17
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/Cargo.toml +1 -1
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/rust/CHANGELOG.md +7 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/builder.rs +0 -5
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/context.rs +0 -6
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/csv.rs +0 -2
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/error.rs +8 -9
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/model.rs +6 -5
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parser.rs +0 -6
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/coefficient.rs +0 -6
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/constraint.rs +2 -8
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/number.rs +0 -1
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/objective.rs +0 -9
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/parser_traits.rs +0 -9
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/problem_name.rs +0 -6
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/sense.rs +0 -3
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/sos_constraint.rs +0 -7
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/variable.rs +0 -3
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/perf.rs +100 -39
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/problem.rs +40 -47
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/validation.rs +0 -6
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/writer.rs +11 -8
- parse_lp-2.6.1/PKG-INFO +0 -12
- {parse_lp-2.6.1 → parse_lp-2.6.2}/Cargo.toml +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/LICENSE-APACHE +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/README.md +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/__init__.py +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/py.typed +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/.cargo/config.toml +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/.gitignore +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/CHANGELOG.md +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/LICENSE-APACHE +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/MANIFEST.in +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/Makefile +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/README.md +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/__init__.py +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/py.typed +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/resources/afiro.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/src/lib.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/__init__.py +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/afiro.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/minimize.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/simple.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_csv_writer.py +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/python/uv.lock +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/CHANGELOG.md +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/README.md +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/benches/lp_parsing.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/benches/parsing_micro.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/1obj_1cons_all_variables_with_bounds.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/2obj_2cons_all_variable_types.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/2obj_2cons_only_binary_vars.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/3obj_2cons.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/AmericanSteelProblem.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/BeerDistributionProblem.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/ComputerPlantProblem.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/WhiskasModel2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/afiro.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/afiro_ext.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/blank_lines.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/boeing1.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/boeing2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/complex_names.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/corrupt.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/cplex.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/diet.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/empty_bounds.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/fit1d.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/fit2d.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/infile_comments.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/infile_comments2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/invalid.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/kb2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/limbo.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/lol.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/milo1.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/missing_signs.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/model.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/model2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/mosek.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/mosek_bounds.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/no_end_section.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/optional_labels.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_1.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_3.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_4.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output_cplex_2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/pulp.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/pulp2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sc50a.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/scientific_notation.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/scientific_notation_2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/semi_continuous.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sos.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sudoku.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test2.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test_copy.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/wbm.lp +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/bin/main.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/lib.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/mod.rs +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/snapshots/lp_parser_rs__problem__test__minified_example.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/snapshots/lp_parser_rs__problem__test__small_input.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__afiro.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__afiro_ext.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__american_steel_problem.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__beer_distribution_problem.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__blank_lines.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__boeing1.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__boeing2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__complex_names.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__computer_plant_problem.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__cplex.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__diet.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__empty_bounds.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__fit1d.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__infile_comments.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__infile_comments2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__kb2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__limbo.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__lol.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__milo1.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__missing_signs.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__model.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__model2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__mosek.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__mosek_bounds.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__nom_fit2d.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__obj3_2cons.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__obj_1cons_all_variables_with_bounds.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__obj_2cons_all_variable_types.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__obj_2cons_only_binary_vars.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_1.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_3.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_4.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__pulp.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__pulp2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sc50a.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__scientific_notation.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__scientific_notation_2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sos.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sudoku.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__test.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__test2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__wbm.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__whiskas_model_2.snap +0 -0
- {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/test_nom_from_file.rs +0 -0
|
@@ -195,7 +195,7 @@ checksum = "9556bc800956545d6420a640173e5ba7dfa82f38d3ea5a167eb555bc69ac3323"
|
|
|
195
195
|
dependencies = [
|
|
196
196
|
"proc-macro2",
|
|
197
197
|
"quote",
|
|
198
|
-
"syn 2.0.
|
|
198
|
+
"syn 2.0.111",
|
|
199
199
|
]
|
|
200
200
|
|
|
201
201
|
[[package]]
|
|
@@ -259,9 +259,9 @@ dependencies = [
|
|
|
259
259
|
|
|
260
260
|
[[package]]
|
|
261
261
|
name = "insta"
|
|
262
|
-
version = "1.44.
|
|
262
|
+
version = "1.44.2"
|
|
263
263
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
264
|
-
checksum = "
|
|
264
|
+
checksum = "dfd3461e1f00283105bdf97c3a1aca2b3f8456eb809a96938d2b190cd4dbc6d2"
|
|
265
265
|
dependencies = [
|
|
266
266
|
"console",
|
|
267
267
|
"once_cell",
|
|
@@ -307,7 +307,7 @@ checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432"
|
|
|
307
307
|
|
|
308
308
|
[[package]]
|
|
309
309
|
name = "lp_parser_rs"
|
|
310
|
-
version = "2.5.
|
|
310
|
+
version = "2.5.2"
|
|
311
311
|
dependencies = [
|
|
312
312
|
"csv",
|
|
313
313
|
"diff-struct",
|
|
@@ -429,7 +429,7 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
|
|
|
429
429
|
|
|
430
430
|
[[package]]
|
|
431
431
|
name = "parse_lp"
|
|
432
|
-
version = "2.6.
|
|
432
|
+
version = "2.6.2"
|
|
433
433
|
dependencies = [
|
|
434
434
|
"lp_parser_rs",
|
|
435
435
|
"pyo3",
|
|
@@ -465,7 +465,7 @@ dependencies = [
|
|
|
465
465
|
"pest_meta",
|
|
466
466
|
"proc-macro2",
|
|
467
467
|
"quote",
|
|
468
|
-
"syn 2.0.
|
|
468
|
+
"syn 2.0.111",
|
|
469
469
|
]
|
|
470
470
|
|
|
471
471
|
[[package]]
|
|
@@ -538,7 +538,7 @@ dependencies = [
|
|
|
538
538
|
"proc-macro2",
|
|
539
539
|
"pyo3-macros-backend",
|
|
540
540
|
"quote",
|
|
541
|
-
"syn 2.0.
|
|
541
|
+
"syn 2.0.111",
|
|
542
542
|
]
|
|
543
543
|
|
|
544
544
|
[[package]]
|
|
@@ -551,7 +551,7 @@ dependencies = [
|
|
|
551
551
|
"proc-macro2",
|
|
552
552
|
"pyo3-build-config",
|
|
553
553
|
"quote",
|
|
554
|
-
"syn 2.0.
|
|
554
|
+
"syn 2.0.111",
|
|
555
555
|
]
|
|
556
556
|
|
|
557
557
|
[[package]]
|
|
@@ -627,7 +627,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79"
|
|
|
627
627
|
dependencies = [
|
|
628
628
|
"proc-macro2",
|
|
629
629
|
"quote",
|
|
630
|
-
"syn 2.0.
|
|
630
|
+
"syn 2.0.111",
|
|
631
631
|
]
|
|
632
632
|
|
|
633
633
|
[[package]]
|
|
@@ -679,9 +679,9 @@ dependencies = [
|
|
|
679
679
|
|
|
680
680
|
[[package]]
|
|
681
681
|
name = "syn"
|
|
682
|
-
version = "2.0.
|
|
682
|
+
version = "2.0.111"
|
|
683
683
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
684
|
-
checksum = "
|
|
684
|
+
checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87"
|
|
685
685
|
dependencies = [
|
|
686
686
|
"proc-macro2",
|
|
687
687
|
"quote",
|
|
@@ -721,7 +721,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913"
|
|
|
721
721
|
dependencies = [
|
|
722
722
|
"proc-macro2",
|
|
723
723
|
"quote",
|
|
724
|
-
"syn 2.0.
|
|
724
|
+
"syn 2.0.111",
|
|
725
725
|
]
|
|
726
726
|
|
|
727
727
|
[[package]]
|
|
@@ -816,7 +816,7 @@ dependencies = [
|
|
|
816
816
|
"bumpalo",
|
|
817
817
|
"proc-macro2",
|
|
818
818
|
"quote",
|
|
819
|
-
"syn 2.0.
|
|
819
|
+
"syn 2.0.111",
|
|
820
820
|
"wasm-bindgen-shared",
|
|
821
821
|
]
|
|
822
822
|
|
parse_lp-2.6.2/PKG-INFO
ADDED
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: parse_lp
|
|
3
|
+
Version: 2.6.2
|
|
4
|
+
Classifier: License :: OSI Approved :: Apache Software License
|
|
5
|
+
Classifier: Programming Language :: Python :: 3.9
|
|
6
|
+
Classifier: Programming Language :: Python :: 3.10
|
|
7
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
8
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
9
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
10
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
11
|
+
License-File: LICENSE-APACHE
|
|
12
|
+
Summary: A LP file format parser for Python, powered by Rust
|
|
13
|
+
Keywords: linear-programming,optimization,parser,integer-programming,math
|
|
14
|
+
Requires-Python: >=3.9
|
|
15
|
+
Description-Content-Type: text/markdown; charset=UTF-8; variant=GFM
|
|
16
|
+
|
|
17
|
+
# parse_lp
|
|
18
|
+
|
|
19
|
+
[](https://badge.fury.io/py/parse-lp)
|
|
20
|
+
|
|
21
|
+
A LP file format parser, writer, and modifier for Python, powered by Rust.
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
- **Complete LP Support**: Handles all standard LP file format features
|
|
26
|
+
- **Problem Modification**: Programmatically modify objectives, constraints, and variables
|
|
27
|
+
- **LP File Writing**: Generate LP files from modified problems with round-trip compatibility
|
|
28
|
+
- **Easy Data Access**: Direct access to problem components (variables, constraints, objectives)
|
|
29
|
+
- **CSV Export**: Export parsed data to CSV files for further analysis
|
|
30
|
+
- **Problem Comparison**: Compare two LP problems to identify differences
|
|
31
|
+
- **Type Safety**: Full type hints for better IDE support and development experience
|
|
32
|
+
|
|
33
|
+
## Installation
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
pip install parse_lp
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Quick Start
|
|
40
|
+
|
|
41
|
+
```python
|
|
42
|
+
from parse_lp import LpParser
|
|
43
|
+
|
|
44
|
+
# Parse an LP file
|
|
45
|
+
parser = LpParser("path/to/problem.lp")
|
|
46
|
+
parser.parse()
|
|
47
|
+
|
|
48
|
+
# Access problem information
|
|
49
|
+
print(f"Problem: {parser.name}")
|
|
50
|
+
print(f"Sense: {parser.sense}")
|
|
51
|
+
print(f"Variables: {parser.variable_count()}")
|
|
52
|
+
print(f"Constraints: {parser.constraint_count()}")
|
|
53
|
+
|
|
54
|
+
# Modify the problem
|
|
55
|
+
parser.update_objective_coefficient("OBJ", "x1", 5.0)
|
|
56
|
+
parser.rename_variable("x2", "production")
|
|
57
|
+
parser.update_constraint_rhs("C1", 100.0)
|
|
58
|
+
|
|
59
|
+
# Write back to LP format
|
|
60
|
+
modified_lp = parser.to_lp_string()
|
|
61
|
+
parser.save_to_file("modified_problem.lp")
|
|
62
|
+
|
|
63
|
+
# Export to CSV files
|
|
64
|
+
parser.to_csv("output_directory/")
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Usage Examples
|
|
68
|
+
|
|
69
|
+
### Basic Parsing and Information
|
|
70
|
+
|
|
71
|
+
```python
|
|
72
|
+
from parse_lp import LpParser
|
|
73
|
+
|
|
74
|
+
parser = LpParser("optimization_problem.lp")
|
|
75
|
+
parser.parse()
|
|
76
|
+
|
|
77
|
+
# Get problem overview
|
|
78
|
+
print(f"Problem Name: {parser.name}")
|
|
79
|
+
print(f"Optimization Sense: {parser.sense}")
|
|
80
|
+
print(f"Variables: {parser.variable_count()}")
|
|
81
|
+
print(f"Constraints: {parser.constraint_count()}")
|
|
82
|
+
print(f"Objectives: {parser.objective_count()}")
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Accessing Problem Data
|
|
86
|
+
|
|
87
|
+
```python
|
|
88
|
+
# Access objectives
|
|
89
|
+
for i, objective in enumerate(parser.objectives):
|
|
90
|
+
print(f"Objective {i+1}: {objective['name']}")
|
|
91
|
+
for coef in objective['coefficients']:
|
|
92
|
+
print(f" {coef['name']}: {coef['value']}")
|
|
93
|
+
|
|
94
|
+
# Access variables
|
|
95
|
+
for var_name, var_info in parser.variables.items():
|
|
96
|
+
print(f"Variable {var_name}:")
|
|
97
|
+
print(f" Type: {var_info['var_type']}")
|
|
98
|
+
if 'bounds' in var_info:
|
|
99
|
+
bounds = var_info['bounds']
|
|
100
|
+
if 'lower' in bounds:
|
|
101
|
+
print(f" Lower bound: {bounds['lower']}")
|
|
102
|
+
if 'upper' in bounds:
|
|
103
|
+
print(f" Upper bound: {bounds['upper']}")
|
|
104
|
+
|
|
105
|
+
# Access constraints
|
|
106
|
+
for constraint in parser.constraints:
|
|
107
|
+
print(f"Constraint {constraint['name']}:")
|
|
108
|
+
print(f" Type: {constraint['type']}")
|
|
109
|
+
if constraint['type'] == 'standard':
|
|
110
|
+
print(f" Sense: {constraint['sense']}")
|
|
111
|
+
print(f" RHS: {constraint['rhs']}")
|
|
112
|
+
print(f" Coefficients: {len(constraint['coefficients'])}")
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### CSV Export
|
|
116
|
+
|
|
117
|
+
```python
|
|
118
|
+
import os
|
|
119
|
+
|
|
120
|
+
# Create output directory
|
|
121
|
+
os.makedirs("output", exist_ok=True)
|
|
122
|
+
|
|
123
|
+
# Export to CSV files
|
|
124
|
+
parser.to_csv("output/")
|
|
125
|
+
|
|
126
|
+
# Files created:
|
|
127
|
+
# - output/variables.csv
|
|
128
|
+
# - output/constraints.csv
|
|
129
|
+
# - output/objectives.csv
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### Problem Modification
|
|
133
|
+
|
|
134
|
+
```python
|
|
135
|
+
from parse_lp import LpParser
|
|
136
|
+
|
|
137
|
+
# Parse an existing LP file
|
|
138
|
+
parser = LpParser("optimization_problem.lp")
|
|
139
|
+
parser.parse()
|
|
140
|
+
|
|
141
|
+
# Modify objectives
|
|
142
|
+
parser.update_objective_coefficient("profit", "x1", 5.0)
|
|
143
|
+
parser.rename_objective("profit", "total_profit")
|
|
144
|
+
|
|
145
|
+
# Modify constraints
|
|
146
|
+
parser.update_constraint_coefficient("capacity", "x1", 2.0)
|
|
147
|
+
parser.update_constraint_rhs("capacity", 200.0)
|
|
148
|
+
parser.rename_constraint("capacity", "production_limit")
|
|
149
|
+
|
|
150
|
+
# Modify variables
|
|
151
|
+
parser.rename_variable("x1", "production_a")
|
|
152
|
+
parser.update_variable_type("production_a", "integer")
|
|
153
|
+
|
|
154
|
+
# Set problem properties
|
|
155
|
+
parser.set_problem_name("Modified Optimization Problem")
|
|
156
|
+
parser.set_sense("minimize")
|
|
157
|
+
|
|
158
|
+
# Write back to LP format
|
|
159
|
+
modified_lp_content = parser.to_lp_string()
|
|
160
|
+
parser.save_to_file("modified_problem.lp")
|
|
161
|
+
|
|
162
|
+
# Verify round-trip compatibility
|
|
163
|
+
new_parser = LpParser("modified_problem.lp")
|
|
164
|
+
new_parser.parse()
|
|
165
|
+
print(f"Successfully modified and re-parsed: {new_parser.name}")
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Problem Comparison
|
|
169
|
+
|
|
170
|
+
```python
|
|
171
|
+
# Parse two different versions of a problem
|
|
172
|
+
parser1 = LpParser("problem_v1.lp")
|
|
173
|
+
parser1.parse()
|
|
174
|
+
|
|
175
|
+
parser2 = LpParser("problem_v2.lp")
|
|
176
|
+
parser2.parse()
|
|
177
|
+
|
|
178
|
+
# Compare the problems
|
|
179
|
+
diff = parser1.compare(parser2)
|
|
180
|
+
|
|
181
|
+
print("Comparison Results:")
|
|
182
|
+
print(f"Name changed: {diff['name_changed']}")
|
|
183
|
+
print(f"Sense changed: {diff['sense_changed']}")
|
|
184
|
+
print(f"Variable count difference: {diff['variable_count_diff']}")
|
|
185
|
+
print(f"Added variables: {diff['added_variables']}")
|
|
186
|
+
print(f"Removed variables: {diff['removed_variables']}")
|
|
187
|
+
print(f"Modified variables: {diff['modified_variables']}")
|
|
188
|
+
print(f"Added constraints: {diff['added_constraints']}")
|
|
189
|
+
print(f"Removed constraints: {diff['removed_constraints']}")
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Objectives Structure
|
|
193
|
+
|
|
194
|
+
```python
|
|
195
|
+
[
|
|
196
|
+
{
|
|
197
|
+
"name": "objective_name",
|
|
198
|
+
"coefficients": [
|
|
199
|
+
{"name": "variable_name", "value": 1.5},
|
|
200
|
+
{"name": "another_var", "value": -2.0}
|
|
201
|
+
]
|
|
202
|
+
}
|
|
203
|
+
]
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
### Variables Structure
|
|
207
|
+
|
|
208
|
+
```python
|
|
209
|
+
{
|
|
210
|
+
"variable_name": {
|
|
211
|
+
"name": "variable_name",
|
|
212
|
+
"var_type": "Continuous", # or "Binary", "Integer", etc.
|
|
213
|
+
"bounds": { # Optional
|
|
214
|
+
"lower": 0.0, # Optional
|
|
215
|
+
"upper": 100.0 # Optional
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Constraints Structure
|
|
222
|
+
|
|
223
|
+
```python
|
|
224
|
+
[
|
|
225
|
+
{
|
|
226
|
+
"name": "constraint_name",
|
|
227
|
+
"type": "standard", # or "sos"
|
|
228
|
+
"sense": "LessOrEqual", # "Equal", "GreaterOrEqual"
|
|
229
|
+
"rhs": 10.0,
|
|
230
|
+
"coefficients": [
|
|
231
|
+
{"name": "variable_name", "value": 2.0}
|
|
232
|
+
]
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
"name": "sos_constraint",
|
|
236
|
+
"type": "sos",
|
|
237
|
+
"sos_type": "SOS1", # or "SOS2"
|
|
238
|
+
"variables": ["var1", "var2", "var3"]
|
|
239
|
+
}
|
|
240
|
+
]
|
|
241
|
+
```
|
|
242
|
+
|
|
243
|
+
## Modification Methods
|
|
244
|
+
|
|
245
|
+
### Objective Methods
|
|
246
|
+
|
|
247
|
+
- `update_objective_coefficient(obj_name, var_name, coefficient)` - Update or add coefficient
|
|
248
|
+
- `rename_objective(old_name, new_name)` - Rename an objective
|
|
249
|
+
- `remove_objective(obj_name)` - Remove an objective
|
|
250
|
+
|
|
251
|
+
### Constraint Methods
|
|
252
|
+
|
|
253
|
+
- `update_constraint_coefficient(const_name, var_name, coefficient)` - Update or add coefficient
|
|
254
|
+
- `update_constraint_rhs(const_name, new_rhs)` - Update right-hand side value
|
|
255
|
+
- `rename_constraint(old_name, new_name)` - Rename a constraint
|
|
256
|
+
- `remove_constraint(const_name)` - Remove a constraint
|
|
257
|
+
|
|
258
|
+
### Variable Methods
|
|
259
|
+
|
|
260
|
+
- `rename_variable(old_name, new_name)` - Rename variable across problem
|
|
261
|
+
- `update_variable_type(var_name, var_type)` - Change variable type
|
|
262
|
+
- `remove_variable(var_name)` - Remove variable from problem
|
|
263
|
+
|
|
264
|
+
### Problem Methods
|
|
265
|
+
|
|
266
|
+
- `set_problem_name(name)` - Set problem name
|
|
267
|
+
- `set_sense(sense)` - Set optimization sense ("maximize" or "minimize")
|
|
268
|
+
|
|
269
|
+
### Writing Methods
|
|
270
|
+
|
|
271
|
+
- `to_lp_string()` - Generate LP format string
|
|
272
|
+
- `to_lp_string_with_options(**options)` - Generate with custom formatting
|
|
273
|
+
- `save_to_file(filepath)` - Save to LP file
|
|
274
|
+
|
|
275
|
+
### Variable Types
|
|
276
|
+
|
|
277
|
+
Supported variable types for `update_variable_type()`:
|
|
278
|
+
|
|
279
|
+
- `"binary"` - Binary variables (0 or 1)
|
|
280
|
+
- `"integer"` - General integer variables
|
|
281
|
+
- `"general"` - Continuous variables (default)
|
|
282
|
+
- `"free"` - Free variables (no bounds)
|
|
283
|
+
- `"semicontinuous"` - Semi-continuous variables
|
|
284
|
+
|
|
285
|
+
## Supported LP Format Features
|
|
286
|
+
|
|
287
|
+
- Multiple objective functions
|
|
288
|
+
- Standard constraints (≤, =, ≥)
|
|
289
|
+
- Variable bounds
|
|
290
|
+
- Variable types (continuous, binary, integer)
|
|
291
|
+
- SOS (Special Ordered Sets) constraints
|
|
292
|
+
- Problem names and comments
|
|
293
|
+
- Scientific notation in coefficients
|
|
294
|
+
|
|
295
|
+
## License
|
|
296
|
+
|
|
297
|
+
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
|
|
298
|
+
|
|
299
|
+
## Contributing
|
|
300
|
+
|
|
301
|
+
Issues and pull requests are welcome at: <https://github.com/dandxy89/lp_parser_rs>
|
|
302
|
+
|
|
303
|
+
```bash
|
|
304
|
+
make build
|
|
305
|
+
make install
|
|
306
|
+
make unit-test
|
|
307
|
+
```
|
|
308
|
+
|
|
@@ -177,3 +177,196 @@ class LpParser:
|
|
|
177
177
|
RuntimeError: If either parser hasn't been parsed yet.
|
|
178
178
|
"""
|
|
179
179
|
...
|
|
180
|
+
|
|
181
|
+
def to_lp_string(self) -> str:
|
|
182
|
+
"""Write the current problem to LP format string.
|
|
183
|
+
|
|
184
|
+
Returns:
|
|
185
|
+
The LP problem as a formatted string.
|
|
186
|
+
|
|
187
|
+
Raises:
|
|
188
|
+
RuntimeError: If the problem cannot be serialized.
|
|
189
|
+
"""
|
|
190
|
+
...
|
|
191
|
+
|
|
192
|
+
def to_lp_string_with_options(
|
|
193
|
+
self,
|
|
194
|
+
*,
|
|
195
|
+
include_problem_name: bool = True,
|
|
196
|
+
max_line_length: int = 80,
|
|
197
|
+
decimal_precision: int = 6,
|
|
198
|
+
include_section_spacing: bool = True,
|
|
199
|
+
) -> str:
|
|
200
|
+
"""Write the current problem to LP format string with custom options.
|
|
201
|
+
|
|
202
|
+
Args:
|
|
203
|
+
include_problem_name: Whether to include the problem name comment.
|
|
204
|
+
max_line_length: Maximum line length for output formatting.
|
|
205
|
+
decimal_precision: Number of decimal places for coefficients.
|
|
206
|
+
include_section_spacing: Whether to add blank lines between sections.
|
|
207
|
+
|
|
208
|
+
Returns:
|
|
209
|
+
The LP problem as a formatted string.
|
|
210
|
+
|
|
211
|
+
Raises:
|
|
212
|
+
RuntimeError: If the problem cannot be serialized.
|
|
213
|
+
"""
|
|
214
|
+
...
|
|
215
|
+
|
|
216
|
+
def save_to_file(self, filepath: str) -> None:
|
|
217
|
+
"""Save the current problem to an LP file.
|
|
218
|
+
|
|
219
|
+
Args:
|
|
220
|
+
filepath: Path to the output file.
|
|
221
|
+
|
|
222
|
+
Raises:
|
|
223
|
+
RuntimeError: If the file cannot be written.
|
|
224
|
+
"""
|
|
225
|
+
...
|
|
226
|
+
|
|
227
|
+
def update_objective_coefficient(
|
|
228
|
+
self, objective_name: str, variable_name: str, coefficient: float
|
|
229
|
+
) -> None:
|
|
230
|
+
"""Update a coefficient in an objective function.
|
|
231
|
+
|
|
232
|
+
If the variable doesn't exist in the objective, it will be added.
|
|
233
|
+
|
|
234
|
+
Args:
|
|
235
|
+
objective_name: Name of the objective to modify.
|
|
236
|
+
variable_name: Name of the variable whose coefficient to update.
|
|
237
|
+
coefficient: New coefficient value.
|
|
238
|
+
|
|
239
|
+
Raises:
|
|
240
|
+
RuntimeError: If the objective is not found or update fails.
|
|
241
|
+
"""
|
|
242
|
+
...
|
|
243
|
+
|
|
244
|
+
def rename_objective(self, old_name: str, new_name: str) -> None:
|
|
245
|
+
"""Rename an objective function.
|
|
246
|
+
|
|
247
|
+
Args:
|
|
248
|
+
old_name: Current name of the objective.
|
|
249
|
+
new_name: New name for the objective.
|
|
250
|
+
|
|
251
|
+
Raises:
|
|
252
|
+
RuntimeError: If the objective is not found.
|
|
253
|
+
"""
|
|
254
|
+
...
|
|
255
|
+
|
|
256
|
+
def remove_objective(self, objective_name: str) -> None:
|
|
257
|
+
"""Remove an objective function from the problem.
|
|
258
|
+
|
|
259
|
+
Args:
|
|
260
|
+
objective_name: Name of the objective to remove.
|
|
261
|
+
|
|
262
|
+
Raises:
|
|
263
|
+
RuntimeError: If the objective is not found.
|
|
264
|
+
"""
|
|
265
|
+
...
|
|
266
|
+
|
|
267
|
+
def update_constraint_coefficient(
|
|
268
|
+
self, constraint_name: str, variable_name: str, coefficient: float
|
|
269
|
+
) -> None:
|
|
270
|
+
"""Update a coefficient in a constraint.
|
|
271
|
+
|
|
272
|
+
If the variable doesn't exist in the constraint, it will be added.
|
|
273
|
+
|
|
274
|
+
Args:
|
|
275
|
+
constraint_name: Name of the constraint to modify.
|
|
276
|
+
variable_name: Name of the variable whose coefficient to update.
|
|
277
|
+
coefficient: New coefficient value.
|
|
278
|
+
|
|
279
|
+
Raises:
|
|
280
|
+
RuntimeError: If the constraint is not found or update fails.
|
|
281
|
+
"""
|
|
282
|
+
...
|
|
283
|
+
|
|
284
|
+
def update_constraint_rhs(self, constraint_name: str, new_rhs: float) -> None:
|
|
285
|
+
"""Update the right-hand side value of a constraint.
|
|
286
|
+
|
|
287
|
+
Args:
|
|
288
|
+
constraint_name: Name of the constraint to modify.
|
|
289
|
+
new_rhs: New right-hand side value.
|
|
290
|
+
|
|
291
|
+
Raises:
|
|
292
|
+
RuntimeError: If the constraint is not found.
|
|
293
|
+
"""
|
|
294
|
+
...
|
|
295
|
+
|
|
296
|
+
def rename_constraint(self, old_name: str, new_name: str) -> None:
|
|
297
|
+
"""Rename a constraint.
|
|
298
|
+
|
|
299
|
+
Args:
|
|
300
|
+
old_name: Current name of the constraint.
|
|
301
|
+
new_name: New name for the constraint.
|
|
302
|
+
|
|
303
|
+
Raises:
|
|
304
|
+
RuntimeError: If the constraint is not found.
|
|
305
|
+
"""
|
|
306
|
+
...
|
|
307
|
+
|
|
308
|
+
def remove_constraint(self, constraint_name: str) -> None:
|
|
309
|
+
"""Remove a constraint from the problem.
|
|
310
|
+
|
|
311
|
+
Args:
|
|
312
|
+
constraint_name: Name of the constraint to remove.
|
|
313
|
+
|
|
314
|
+
Raises:
|
|
315
|
+
RuntimeError: If the constraint is not found.
|
|
316
|
+
"""
|
|
317
|
+
...
|
|
318
|
+
|
|
319
|
+
def rename_variable(self, old_name: str, new_name: str) -> None:
|
|
320
|
+
"""Rename a variable across all objectives and constraints.
|
|
321
|
+
|
|
322
|
+
Args:
|
|
323
|
+
old_name: Current name of the variable.
|
|
324
|
+
new_name: New name for the variable.
|
|
325
|
+
|
|
326
|
+
Raises:
|
|
327
|
+
RuntimeError: If the variable is not found.
|
|
328
|
+
"""
|
|
329
|
+
...
|
|
330
|
+
|
|
331
|
+
def update_variable_type(self, variable_name: str, var_type: str) -> None:
|
|
332
|
+
"""Update the type of a variable.
|
|
333
|
+
|
|
334
|
+
Args:
|
|
335
|
+
variable_name: Name of the variable to modify.
|
|
336
|
+
var_type: New type for the variable. Supported types:
|
|
337
|
+
'binary', 'integer', 'general', 'free', 'semicontinuous'.
|
|
338
|
+
|
|
339
|
+
Raises:
|
|
340
|
+
RuntimeError: If the variable is not found or type is invalid.
|
|
341
|
+
"""
|
|
342
|
+
...
|
|
343
|
+
|
|
344
|
+
def remove_variable(self, variable_name: str) -> None:
|
|
345
|
+
"""Remove a variable from all objectives and constraints.
|
|
346
|
+
|
|
347
|
+
Args:
|
|
348
|
+
variable_name: Name of the variable to remove.
|
|
349
|
+
|
|
350
|
+
Raises:
|
|
351
|
+
RuntimeError: If the variable is not found.
|
|
352
|
+
"""
|
|
353
|
+
...
|
|
354
|
+
|
|
355
|
+
def set_problem_name(self, name: str) -> None:
|
|
356
|
+
"""Set the problem name.
|
|
357
|
+
|
|
358
|
+
Args:
|
|
359
|
+
name: New name for the problem.
|
|
360
|
+
"""
|
|
361
|
+
...
|
|
362
|
+
|
|
363
|
+
def set_sense(self, sense: str) -> None:
|
|
364
|
+
"""Set the optimization sense.
|
|
365
|
+
|
|
366
|
+
Args:
|
|
367
|
+
sense: 'maximize', 'max', 'minimize', or 'min'.
|
|
368
|
+
|
|
369
|
+
Raises:
|
|
370
|
+
RuntimeError: If the sense value is invalid.
|
|
371
|
+
"""
|
|
372
|
+
...
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
[project]
|
|
2
2
|
name = "parse_lp"
|
|
3
|
+
readme = "README.md"
|
|
3
4
|
description = "A LP file format parser for Python, powered by Rust"
|
|
4
5
|
license = { file = "LICENSE-APACHE" }
|
|
5
6
|
requires-python = ">=3.9"
|
|
@@ -16,6 +17,8 @@ classifiers = [
|
|
|
16
17
|
"Programming Language :: Python :: 3.10",
|
|
17
18
|
"Programming Language :: Python :: 3.11",
|
|
18
19
|
"Programming Language :: Python :: 3.12",
|
|
20
|
+
"Programming Language :: Python :: 3.13",
|
|
21
|
+
"Programming Language :: Python :: 3.14",
|
|
19
22
|
]
|
|
20
23
|
dynamic = ["version"]
|
|
21
24
|
|