A LP file format parser for Python, powered by Rust
Project description
parse_lp
A LP file format parser, writer, and modifier for Python, powered by Rust.
Features
- Complete LP Support: Handles all standard LP file format features
- Problem Modification: Programmatically modify objectives, constraints, and variables
- LP File Writing: Generate LP files from modified problems with round-trip compatibility
- Easy Data Access: Direct access to problem components (variables, constraints, objectives)
- CSV Export: Export parsed data to CSV files for further analysis
- Problem Comparison: Compare two LP problems to identify differences
- Type Safety: Full type hints for better IDE support and development experience
Installation
pip install parse_lp
Quick Start
from parse_lp import LpParser
# Parse an LP file
parser = LpParser("path/to/problem.lp")
parser.parse()
# Access problem information
print(f"Problem: {parser.name}")
print(f"Sense: {parser.sense}")
print(f"Variables: {parser.variable_count()}")
print(f"Constraints: {parser.constraint_count()}")
# Modify the problem
parser.update_objective_coefficient("OBJ", "x1", 5.0)
parser.rename_variable("x2", "production")
parser.update_constraint_rhs("C1", 100.0)
# Write back to LP format
modified_lp = parser.to_lp_string()
parser.save_to_file("modified_problem.lp")
# Export to CSV files
parser.to_csv("output_directory/")
Usage Examples
Basic Parsing and Information
from parse_lp import LpParser
parser = LpParser("optimization_problem.lp")
parser.parse()
# Get problem overview
print(f"Problem Name: {parser.name}")
print(f"Optimization Sense: {parser.sense}")
print(f"Variables: {parser.variable_count()}")
print(f"Constraints: {parser.constraint_count()}")
print(f"Objectives: {parser.objective_count()}")
Accessing Problem Data
# Access objectives
for i, objective in enumerate(parser.objectives):
print(f"Objective {i+1}: {objective['name']}")
for coef in objective['coefficients']:
print(f" {coef['name']}: {coef['value']}")
# Access variables
for var_name, var_info in parser.variables.items():
print(f"Variable {var_name}:")
print(f" Type: {var_info['var_type']}")
if 'bounds' in var_info:
bounds = var_info['bounds']
if 'lower' in bounds:
print(f" Lower bound: {bounds['lower']}")
if 'upper' in bounds:
print(f" Upper bound: {bounds['upper']}")
# Access constraints
for constraint in parser.constraints:
print(f"Constraint {constraint['name']}:")
print(f" Type: {constraint['type']}")
if constraint['type'] == 'standard':
print(f" Sense: {constraint['sense']}")
print(f" RHS: {constraint['rhs']}")
print(f" Coefficients: {len(constraint['coefficients'])}")
CSV Export
import os
# Create output directory
os.makedirs("output", exist_ok=True)
# Export to CSV files
parser.to_csv("output/")
# Files created:
# - output/variables.csv
# - output/constraints.csv
# - output/objectives.csv
Problem Modification
from parse_lp import LpParser
# Parse an existing LP file
parser = LpParser("optimization_problem.lp")
parser.parse()
# Modify objectives
parser.update_objective_coefficient("profit", "x1", 5.0)
parser.rename_objective("profit", "total_profit")
# Modify constraints
parser.update_constraint_coefficient("capacity", "x1", 2.0)
parser.update_constraint_rhs("capacity", 200.0)
parser.rename_constraint("capacity", "production_limit")
# Modify variables
parser.rename_variable("x1", "production_a")
parser.update_variable_type("production_a", "integer")
# Set problem properties
parser.set_problem_name("Modified Optimization Problem")
parser.set_sense("minimize")
# Write back to LP format
modified_lp_content = parser.to_lp_string()
parser.save_to_file("modified_problem.lp")
# Verify round-trip compatibility
new_parser = LpParser("modified_problem.lp")
new_parser.parse()
print(f"Successfully modified and re-parsed: {new_parser.name}")
Problem Comparison
# Parse two different versions of a problem
parser1 = LpParser("problem_v1.lp")
parser1.parse()
parser2 = LpParser("problem_v2.lp")
parser2.parse()
# Compare the problems
diff = parser1.compare(parser2)
print("Comparison Results:")
print(f"Name changed: {diff['name_changed']}")
print(f"Sense changed: {diff['sense_changed']}")
print(f"Variable count difference: {diff['variable_count_diff']}")
print(f"Added variables: {diff['added_variables']}")
print(f"Removed variables: {diff['removed_variables']}")
print(f"Modified variables: {diff['modified_variables']}")
print(f"Added constraints: {diff['added_constraints']}")
print(f"Removed constraints: {diff['removed_constraints']}")
Objectives Structure
[
{
"name": "objective_name",
"coefficients": [
{"name": "variable_name", "value": 1.5},
{"name": "another_var", "value": -2.0}
]
}
]
Variables Structure
{
"variable_name": {
"name": "variable_name",
"var_type": "Continuous", # or "Binary", "Integer", etc.
"bounds": { # Optional
"lower": 0.0, # Optional
"upper": 100.0 # Optional
}
}
}
Constraints Structure
[
{
"name": "constraint_name",
"type": "standard", # or "sos"
"sense": "LessOrEqual", # "Equal", "GreaterOrEqual"
"rhs": 10.0,
"coefficients": [
{"name": "variable_name", "value": 2.0}
]
},
{
"name": "sos_constraint",
"type": "sos",
"sos_type": "SOS1", # or "SOS2"
"variables": ["var1", "var2", "var3"]
}
]
Modification Methods
Objective Methods
update_objective_coefficient(obj_name, var_name, coefficient)- Update or add coefficientrename_objective(old_name, new_name)- Rename an objectiveremove_objective(obj_name)- Remove an objective
Constraint Methods
update_constraint_coefficient(const_name, var_name, coefficient)- Update or add coefficientupdate_constraint_rhs(const_name, new_rhs)- Update right-hand side valuerename_constraint(old_name, new_name)- Rename a constraintremove_constraint(const_name)- Remove a constraint
Variable Methods
rename_variable(old_name, new_name)- Rename variable across problemupdate_variable_type(var_name, var_type)- Change variable typeremove_variable(var_name)- Remove variable from problem
Problem Methods
set_problem_name(name)- Set problem nameset_sense(sense)- Set optimization sense ("maximize" or "minimize")
Writing Methods
to_lp_string()- Generate LP format stringto_lp_string_with_options(**options)- Generate with custom formattingsave_to_file(filepath)- Save to LP file
Variable Types
Supported variable types for update_variable_type():
"binary"- Binary variables (0 or 1)"integer"- General integer variables"general"- Continuous variables (default)"free"- Free variables (no bounds)"semicontinuous"- Semi-continuous variables
Supported LP Format Features
- Multiple objective functions
- Standard constraints (≤, =, ≥)
- Variable bounds
- Variable types (continuous, binary, integer)
- SOS (Special Ordered Sets) constraints
- Problem names and comments
- Scientific notation in coefficients
License
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Contributing
Issues and pull requests are welcome at: https://github.com/dandxy89/lp_parser_rs
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file parse_lp-2.6.0.tar.gz.
File metadata
- Download URL: parse_lp-2.6.0.tar.gz
- Upload date:
- Size: 1.3 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f7aec52cd6804a02c5322d617d102bd9c2de8ad4aea5c80ab0bb69d0d7b4ee2f
|
|
| MD5 |
79b145f56d6c5345680c8b5e51a66458
|
|
| BLAKE2b-256 |
ef2bce0b390c98861b200ce320160ce64c02215256db60a35008a6ef9c7653aa
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-win_amd64.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-win_amd64.whl
- Upload date:
- Size: 298.0 kB
- Tags: CPython 3.9+, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
da945992d10757163a9f7324bd312cb87ef6e1247707fb36568e18b44fe6e49a
|
|
| MD5 |
d36b2c6f9dee034a8dd43ffe65800378
|
|
| BLAKE2b-256 |
647e7aacd84e0d7cb0ae19efb0a51d40312e742c40bba823865f5d1ee9514b8e
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-win32.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-win32.whl
- Upload date:
- Size: 287.8 kB
- Tags: CPython 3.9+, Windows x86
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
22e4d980a78644164d6489b334d83ee9325a285ef57d5d45d78d06af9ed25f22
|
|
| MD5 |
a76c5d1d8ab47881e2edb190a201e652
|
|
| BLAKE2b-256 |
9d9a631a73276f96e65900ca49673cd626e3a66051892f10271fca0e72244104
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 449.3 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2e1def0cda71f2c2adf2d1099d4e9f20cfc839b4da6955f9ee502a4f1b0fe728
|
|
| MD5 |
b631d56f0ada7f0b5599e6adedf92e33
|
|
| BLAKE2b-256 |
533648fb7ad5839874365283068e0da48e6e781739b489ef13cdfafaa91445c9
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
- Upload date:
- Size: 484.4 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ s390x
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ee9100f6a7cb4c35370b46a74059b152a202311d0be1964eba8b234be56c600f
|
|
| MD5 |
e54d2cdfaa6f5634b89936a416d09a9c
|
|
| BLAKE2b-256 |
41681568b4f0dc69ba23bd0b33b412fb1de4eb257683f7ba62db26ddb1cae14b
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
- Upload date:
- Size: 566.2 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ ppc64le
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c2cfdbe713e67f3176b7b89e2099c07927834ba97989c22b6c8029b654078131
|
|
| MD5 |
10b02d779823fa7424c96ad7e211c83a
|
|
| BLAKE2b-256 |
d830c82115b9ebf16052b697c03d634ef81c09a082df5e280e15617c60737faf
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
- Upload date:
- Size: 452.3 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ ARMv7l
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13e0982203f5f0caf0bc4609e0dd190d3cff2e030c7be017bd8e8ff8effafd28
|
|
| MD5 |
68a6d5a6e3942e04db449c2eadd870c3
|
|
| BLAKE2b-256 |
003345cd983d72b313f5dc40b1ee2b57f7c1885efe91c873f4bad7b4f80e9eaa
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
- Upload date:
- Size: 437.0 kB
- Tags: CPython 3.9+, manylinux: glibc 2.17+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17c0ffafca1c95946476cb5b82e6d97b2c4ba0ba1bc8eba1aacb703b7b4c47f9
|
|
| MD5 |
bf7b25abf6a4f524700a56b2d59fb6d1
|
|
| BLAKE2b-256 |
50a33849ac200cb47c7349a6a12c10352e3207c5e04172bf98c35bd657886b7a
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl
- Upload date:
- Size: 480.1 kB
- Tags: CPython 3.9+, manylinux: glibc 2.5+ i686
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
17689116f2a1d7249b80a609cc273490e97bf466f11952d6ec7d83417f45cf3a
|
|
| MD5 |
5f0d381511af3b5990aad23fb9d53402
|
|
| BLAKE2b-256 |
b9b3ca7cc225e552e0a33d2a71d64b56e596802f6c917dbfe945bf80190d4450
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-macosx_11_0_arm64.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-macosx_11_0_arm64.whl
- Upload date:
- Size: 403.2 kB
- Tags: CPython 3.9+, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bc26785be0be619dc11df7ae2b2a67cddc7fabefb96a5c3c0b6241adf133387d
|
|
| MD5 |
f1e20a53df9913396079be1e851556e8
|
|
| BLAKE2b-256 |
cfd74e1ed8d67ad11baec848e7a5659be726aa3d3a7df9c5d85bada87582a479
|
File details
Details for the file parse_lp-2.6.0-cp39-abi3-macosx_10_12_x86_64.whl.
File metadata
- Download URL: parse_lp-2.6.0-cp39-abi3-macosx_10_12_x86_64.whl
- Upload date:
- Size: 416.9 kB
- Tags: CPython 3.9+, macOS 10.12+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: maturin/1.9.2
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
88ec26c4a52f979e969bd484f441e8422f6b66271779a77321a359f1144c04a6
|
|
| MD5 |
c2979368200d23f441fd5c56eec81e4c
|
|
| BLAKE2b-256 |
ce46de198367a2c1adecf2ba629cc946614fdc296a3504124013da13e132e397
|