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.
Files changed (161) hide show
  1. {parse_lp-2.6.1 → parse_lp-2.6.2}/Cargo.lock +13 -13
  2. parse_lp-2.6.2/PKG-INFO +308 -0
  3. {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/parse_lp.pyi +193 -0
  4. {parse_lp-2.6.1 → parse_lp-2.6.2}/pyproject.toml +3 -0
  5. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/Cargo.toml +1 -1
  6. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/parse_lp.pyi +193 -0
  7. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/python/CHANGELOG.md +8 -0
  8. parse_lp-2.6.2/python/tests/conftest.py +32 -0
  9. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_lp_parser.py +1 -30
  10. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_lp_writer.py +0 -17
  11. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/Cargo.toml +1 -1
  12. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/rust/CHANGELOG.md +7 -0
  13. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/builder.rs +0 -5
  14. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/context.rs +0 -6
  15. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/csv.rs +0 -2
  16. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/error.rs +8 -9
  17. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/model.rs +6 -5
  18. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parser.rs +0 -6
  19. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/coefficient.rs +0 -6
  20. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/constraint.rs +2 -8
  21. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/number.rs +0 -1
  22. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/objective.rs +0 -9
  23. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/parser_traits.rs +0 -9
  24. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/problem_name.rs +0 -6
  25. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/sense.rs +0 -3
  26. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/sos_constraint.rs +0 -7
  27. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/variable.rs +0 -3
  28. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/perf.rs +100 -39
  29. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/problem.rs +40 -47
  30. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/validation.rs +0 -6
  31. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/writer.rs +11 -8
  32. parse_lp-2.6.1/PKG-INFO +0 -12
  33. {parse_lp-2.6.1 → parse_lp-2.6.2}/Cargo.toml +0 -0
  34. {parse_lp-2.6.1 → parse_lp-2.6.2}/LICENSE-APACHE +0 -0
  35. {parse_lp-2.6.1 → parse_lp-2.6.2}/README.md +0 -0
  36. {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/__init__.py +0 -0
  37. {parse_lp-2.6.1 → parse_lp-2.6.2}/parse_lp/py.typed +0 -0
  38. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/.cargo/config.toml +0 -0
  39. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/.gitignore +0 -0
  40. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/CHANGELOG.md +0 -0
  41. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/LICENSE-APACHE +0 -0
  42. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/MANIFEST.in +0 -0
  43. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/Makefile +0 -0
  44. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/README.md +0 -0
  45. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/__init__.py +0 -0
  46. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/parse_lp/py.typed +0 -0
  47. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/resources/afiro.lp +0 -0
  48. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/src/lib.rs +0 -0
  49. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/__init__.py +0 -0
  50. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/afiro.lp +0 -0
  51. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/minimize.lp +0 -0
  52. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/fixtures/simple.lp +0 -0
  53. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/tests/test_csv_writer.py +0 -0
  54. {parse_lp-2.6.1 → parse_lp-2.6.2}/python/uv.lock +0 -0
  55. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/CHANGELOG.md +0 -0
  56. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/README.md +0 -0
  57. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/benches/lp_parsing.rs +0 -0
  58. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/benches/parsing_micro.rs +0 -0
  59. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/1obj_1cons_all_variables_with_bounds.lp +0 -0
  60. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/2obj_2cons_all_variable_types.lp +0 -0
  61. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/2obj_2cons_only_binary_vars.lp +0 -0
  62. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/3obj_2cons.lp +0 -0
  63. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/AmericanSteelProblem.lp +0 -0
  64. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/BeerDistributionProblem.lp +0 -0
  65. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/ComputerPlantProblem.lp +0 -0
  66. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/WhiskasModel2.lp +0 -0
  67. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/afiro.lp +0 -0
  68. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/afiro_ext.lp +0 -0
  69. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/blank_lines.lp +0 -0
  70. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/boeing1.lp +0 -0
  71. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/boeing2.lp +0 -0
  72. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/complex_names.lp +0 -0
  73. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/corrupt.lp +0 -0
  74. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/cplex.lp +0 -0
  75. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/diet.lp +0 -0
  76. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/empty_bounds.lp +0 -0
  77. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/fit1d.lp +0 -0
  78. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/fit2d.lp +0 -0
  79. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/infile_comments.lp +0 -0
  80. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/infile_comments2.lp +0 -0
  81. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/invalid.lp +0 -0
  82. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/kb2.lp +0 -0
  83. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/limbo.lp +0 -0
  84. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/lol.lp +0 -0
  85. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/milo1.lp +0 -0
  86. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/missing_signs.lp +0 -0
  87. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/model.lp +0 -0
  88. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/model2.lp +0 -0
  89. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/mosek.lp +0 -0
  90. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/mosek_bounds.lp +0 -0
  91. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/no_end_section.lp +0 -0
  92. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/optional_labels.lp +0 -0
  93. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output.lp +0 -0
  94. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_1.lp +0 -0
  95. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_2.lp +0 -0
  96. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_3.lp +0 -0
  97. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output2_4.lp +0 -0
  98. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/output_cplex_2.lp +0 -0
  99. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/pulp.lp +0 -0
  100. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/pulp2.lp +0 -0
  101. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sc50a.lp +0 -0
  102. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/scientific_notation.lp +0 -0
  103. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/scientific_notation_2.lp +0 -0
  104. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/semi_continuous.lp +0 -0
  105. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sos.lp +0 -0
  106. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/sudoku.lp +0 -0
  107. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test.lp +0 -0
  108. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test2.lp +0 -0
  109. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/test_copy.lp +0 -0
  110. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/resources/wbm.lp +0 -0
  111. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/bin/main.rs +0 -0
  112. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/lib.rs +0 -0
  113. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/parsers/mod.rs +0 -0
  114. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/snapshots/lp_parser_rs__problem__test__minified_example.snap +0 -0
  115. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/src/snapshots/lp_parser_rs__problem__test__small_input.snap +0 -0
  116. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__afiro.snap +0 -0
  117. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__afiro_ext.snap +0 -0
  118. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__american_steel_problem.snap +0 -0
  119. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__beer_distribution_problem.snap +0 -0
  120. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__blank_lines.snap +0 -0
  121. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__boeing1.snap +0 -0
  122. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__boeing2.snap +0 -0
  123. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__complex_names.snap +0 -0
  124. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__computer_plant_problem.snap +0 -0
  125. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__cplex.snap +0 -0
  126. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__diet.snap +0 -0
  127. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__empty_bounds.snap +0 -0
  128. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__fit1d.snap +0 -0
  129. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__infile_comments.snap +0 -0
  130. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__infile_comments2.snap +0 -0
  131. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__kb2.snap +0 -0
  132. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__limbo.snap +0 -0
  133. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__lol.snap +0 -0
  134. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__milo1.snap +0 -0
  135. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__missing_signs.snap +0 -0
  136. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__model.snap +0 -0
  137. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__model2.snap +0 -0
  138. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__mosek.snap +0 -0
  139. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__mosek_bounds.snap +0 -0
  140. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__nom_fit2d.snap +0 -0
  141. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__obj3_2cons.snap +0 -0
  142. {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
  143. {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
  144. {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
  145. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output.snap +0 -0
  146. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_1.snap +0 -0
  147. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_2.snap +0 -0
  148. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_3.snap +0 -0
  149. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__output2_4.snap +0 -0
  150. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__pulp.snap +0 -0
  151. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__pulp2.snap +0 -0
  152. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sc50a.snap +0 -0
  153. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__scientific_notation.snap +0 -0
  154. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__scientific_notation_2.snap +0 -0
  155. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sos.snap +0 -0
  156. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__sudoku.snap +0 -0
  157. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__test.snap +0 -0
  158. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__test2.snap +0 -0
  159. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__wbm.snap +0 -0
  160. {parse_lp-2.6.1 → parse_lp-2.6.2}/rust/tests/snapshots/test_nom_from_file__whiskas_model_2.snap +0 -0
  161. {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.110",
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.1"
262
+ version = "1.44.2"
263
263
  source = "registry+https://github.com/rust-lang/crates.io-index"
264
- checksum = "e8732d3774162a0851e3f2b150eb98f31a9885dd75985099421d393385a01dfd"
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.1"
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.1"
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.110",
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.110",
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.110",
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.110",
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.110"
682
+ version = "2.0.111"
683
683
  source = "registry+https://github.com/rust-lang/crates.io-index"
684
- checksum = "a99801b5bd34ede4cf3fc688c5919368fea4e4814a4664359503e6015b280aea"
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.110",
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.110",
819
+ "syn 2.0.111",
820
820
  "wasm-bindgen-shared",
821
821
  ]
822
822
 
@@ -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
+ [![PyPI version](https://badge.fury.io/py/parse-lp.svg)](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
 
@@ -1,6 +1,6 @@
1
1
  [package]
2
2
  name = "parse_lp"
3
- version = "2.6.1"
3
+ version = "2.6.2"
4
4
  edition = "2021"
5
5
  authors = ["Dan Dixey", "Dan Dixey <dan@functorml.co.uk>"]
6
6
  rust-version = "1.74.0"