# parse_lp
A LP file format parser for Python, powered by Rust.
## Features
- **Complete LP Support**: Handles all standard LP file format features
- **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
```bash
pip install parse_lp
```
## Quick Start
```python
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()}")
# Export to CSV files
parser.to_csv("output_directory/")
```
## Usage Examples
### Basic Parsing and Information
```python
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
```python
# 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
```python
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 Comparison
```python
# 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
```python
[
{
"name": "objective_name",
"coefficients": [
{"name": "variable_name", "value": 1.5},
{"name": "another_var", "value": -2.0}
]
}
]
```
### Variables Structure
```python
{
"variable_name": {
"name": "variable_name",
"var_type": "Continuous", # or "Binary", "Integer", etc.
"bounds": { # Optional
"lower": 0.0, # Optional
"upper": 100.0 # Optional
}
}
}
```
### Constraints Structure
```python
[
{
"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"]
}
]
```
## 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>
Raw data
{
"_id": null,
"home_page": null,
"name": "parse-lp",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.9",
"maintainer_email": null,
"keywords": "linear-programming, optimization, parser, integer-programming, math",
"author": "Dan Dixey, Dan Dixey <dan@functorml.co.uk>",
"author_email": "Dan Dixey, Dan Dixey <dan@functorml.co.uk>",
"download_url": "https://files.pythonhosted.org/packages/f7/40/8b9682370a223c7624387533a40433818687cd62428b8206ded40d46ed92/parse_lp-2.5.0.tar.gz",
"platform": null,
"description": "# parse_lp\n\nA LP file format parser for Python, powered by Rust.\n\n## Features\n\n- **Complete LP Support**: Handles all standard LP file format features\n- **Easy Data Access**: Direct access to problem components (variables, constraints, objectives)\n- **CSV Export**: Export parsed data to CSV files for further analysis\n- **Problem Comparison**: Compare two LP problems to identify differences\n- **Type Safety**: Full type hints for better IDE support and development experience\n\n## Installation\n\n```bash\npip install parse_lp\n```\n\n## Quick Start\n\n```python\nfrom parse_lp import LpParser\n\n# Parse an LP file\nparser = LpParser(\"path/to/problem.lp\")\nparser.parse()\n\n# Access problem information\nprint(f\"Problem: {parser.name}\")\nprint(f\"Sense: {parser.sense}\")\nprint(f\"Variables: {parser.variable_count()}\")\nprint(f\"Constraints: {parser.constraint_count()}\")\n\n# Export to CSV files\nparser.to_csv(\"output_directory/\")\n```\n\n## Usage Examples\n\n### Basic Parsing and Information\n\n```python\nfrom parse_lp import LpParser\n\nparser = LpParser(\"optimization_problem.lp\")\nparser.parse()\n\n# Get problem overview\nprint(f\"Problem Name: {parser.name}\")\nprint(f\"Optimization Sense: {parser.sense}\")\nprint(f\"Variables: {parser.variable_count()}\")\nprint(f\"Constraints: {parser.constraint_count()}\")\nprint(f\"Objectives: {parser.objective_count()}\")\n```\n\n### Accessing Problem Data\n\n```python\n# Access objectives\nfor i, objective in enumerate(parser.objectives):\n print(f\"Objective {i+1}: {objective['name']}\")\n for coef in objective['coefficients']:\n print(f\" {coef['name']}: {coef['value']}\")\n\n# Access variables\nfor var_name, var_info in parser.variables.items():\n print(f\"Variable {var_name}:\")\n print(f\" Type: {var_info['var_type']}\")\n if 'bounds' in var_info:\n bounds = var_info['bounds']\n if 'lower' in bounds:\n print(f\" Lower bound: {bounds['lower']}\")\n if 'upper' in bounds:\n print(f\" Upper bound: {bounds['upper']}\")\n\n# Access constraints\nfor constraint in parser.constraints:\n print(f\"Constraint {constraint['name']}:\")\n print(f\" Type: {constraint['type']}\")\n if constraint['type'] == 'standard':\n print(f\" Sense: {constraint['sense']}\")\n print(f\" RHS: {constraint['rhs']}\")\n print(f\" Coefficients: {len(constraint['coefficients'])}\")\n```\n\n### CSV Export\n\n```python\nimport os\n\n# Create output directory\nos.makedirs(\"output\", exist_ok=True)\n\n# Export to CSV files\nparser.to_csv(\"output/\")\n\n# Files created:\n# - output/variables.csv\n# - output/constraints.csv\n# - output/objectives.csv\n```\n\n### Problem Comparison\n\n```python\n# Parse two different versions of a problem\nparser1 = LpParser(\"problem_v1.lp\")\nparser1.parse()\n\nparser2 = LpParser(\"problem_v2.lp\")\nparser2.parse()\n\n# Compare the problems\ndiff = parser1.compare(parser2)\n\nprint(\"Comparison Results:\")\nprint(f\"Name changed: {diff['name_changed']}\")\nprint(f\"Sense changed: {diff['sense_changed']}\")\nprint(f\"Variable count difference: {diff['variable_count_diff']}\")\nprint(f\"Added variables: {diff['added_variables']}\")\nprint(f\"Removed variables: {diff['removed_variables']}\")\nprint(f\"Modified variables: {diff['modified_variables']}\")\nprint(f\"Added constraints: {diff['added_constraints']}\")\nprint(f\"Removed constraints: {diff['removed_constraints']}\")\n```\n\n### Objectives Structure\n\n```python\n[\n {\n \"name\": \"objective_name\",\n \"coefficients\": [\n {\"name\": \"variable_name\", \"value\": 1.5},\n {\"name\": \"another_var\", \"value\": -2.0}\n ]\n }\n]\n```\n\n### Variables Structure\n\n```python\n{\n \"variable_name\": {\n \"name\": \"variable_name\",\n \"var_type\": \"Continuous\", # or \"Binary\", \"Integer\", etc.\n \"bounds\": { # Optional\n \"lower\": 0.0, # Optional\n \"upper\": 100.0 # Optional\n }\n }\n}\n```\n\n### Constraints Structure\n\n```python\n[\n {\n \"name\": \"constraint_name\",\n \"type\": \"standard\", # or \"sos\"\n \"sense\": \"LessOrEqual\", # \"Equal\", \"GreaterOrEqual\"\n \"rhs\": 10.0,\n \"coefficients\": [\n {\"name\": \"variable_name\", \"value\": 2.0}\n ]\n },\n {\n \"name\": \"sos_constraint\",\n \"type\": \"sos\",\n \"sos_type\": \"SOS1\", # or \"SOS2\"\n \"variables\": [\"var1\", \"var2\", \"var3\"]\n }\n]\n```\n\n## Supported LP Format Features\n\n- Multiple objective functions\n- Standard constraints (\u2264, =, \u2265)\n- Variable bounds\n- Variable types (continuous, binary, integer)\n- SOS (Special Ordered Sets) constraints\n- Problem names and comments\n- Scientific notation in coefficients\n\n## License\n\nLicensed under either of Apache License, Version 2.0 or MIT license at your option.\n\n## Contributing\n\nIssues and pull requests are welcome at: <https://github.com/dandxy89/lp_parser_rs>\n\n",
"bugtrack_url": null,
"license": "MIT OR Apache-2.0",
"summary": "A LP file format parser for Python, powered by Rust",
"version": "2.5.0",
"project_urls": {
"Source Code": "https://github.com/dandxy89/lp_parser_rs"
},
"split_keywords": [
"linear-programming",
" optimization",
" parser",
" integer-programming",
" math"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "b6002b27043a4c405601c5bf9d70a28049cd82ea3ac6203a030a8b6e0ab976eb",
"md5": "74fa8f6edfb8b7210a8c80289dce3482",
"sha256": "d0e4364a0b632481c1b9385602828d9bcd0e840b1fc76b6ef98b01b0d532c4be"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-macosx_10_12_x86_64.whl",
"has_sig": false,
"md5_digest": "74fa8f6edfb8b7210a8c80289dce3482",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 378695,
"upload_time": "2025-07-24T22:39:42",
"upload_time_iso_8601": "2025-07-24T22:39:42.973991Z",
"url": "https://files.pythonhosted.org/packages/b6/00/2b27043a4c405601c5bf9d70a28049cd82ea3ac6203a030a8b6e0ab976eb/parse_lp-2.5.0-cp39-abi3-macosx_10_12_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "408a1b02f50ad41e69dfb52e0f7ea2712021cd44a47c7089ccbc5c7678a0011d",
"md5": "8b23aa3868947c886e34ebd69fe202d0",
"sha256": "a230628c102f966f0551c8f872d5f884e6fb4cb42c0fd7224ba472832b960868"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-macosx_11_0_arm64.whl",
"has_sig": false,
"md5_digest": "8b23aa3868947c886e34ebd69fe202d0",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 369211,
"upload_time": "2025-07-24T22:39:44",
"upload_time_iso_8601": "2025-07-24T22:39:44.430372Z",
"url": "https://files.pythonhosted.org/packages/40/8a/1b02f50ad41e69dfb52e0f7ea2712021cd44a47c7089ccbc5c7678a0011d/parse_lp-2.5.0-cp39-abi3-macosx_11_0_arm64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c2eefbd6592401f82b69b9df10a66bb33f7e2d04cd466f61334e9a0ba0d9207d",
"md5": "6e49f53be5be9e2b7d478b235846b957",
"sha256": "72d33a6ca8a812892dda862de128c02e8583616904d630d219238c4f94ab142e"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"has_sig": false,
"md5_digest": "6e49f53be5be9e2b7d478b235846b957",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 401711,
"upload_time": "2025-07-24T22:39:45",
"upload_time_iso_8601": "2025-07-24T22:39:45.880412Z",
"url": "https://files.pythonhosted.org/packages/c2/ee/fbd6592401f82b69b9df10a66bb33f7e2d04cd466f61334e9a0ba0d9207d/parse_lp-2.5.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e915f97641e04c08dcb347e39d0d3902ab31454a30f173dd1a667dd52689fabb",
"md5": "9113fe36e8ef9eb883b2d4976058e1c5",
"sha256": "9bb35b59fb8cf57fb9ad83e4c3c7b97a7728c1a3334edd1ca3e368434b6a9dcc"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"has_sig": false,
"md5_digest": "9113fe36e8ef9eb883b2d4976058e1c5",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 414671,
"upload_time": "2025-07-24T22:39:46",
"upload_time_iso_8601": "2025-07-24T22:39:46.961728Z",
"url": "https://files.pythonhosted.org/packages/e9/15/f97641e04c08dcb347e39d0d3902ab31454a30f173dd1a667dd52689fabb/parse_lp-2.5.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e4d47ee0655f3e8a7051fc8e6bb3d11ddf7fe0a6491c460ab4f29b5e748af261",
"md5": "a96a7dc014f702bfdd2a11da4c744bce",
"sha256": "93e593594b80a9d5f9d509d3ff74f4c0502651c2d195345899db8f1256d0c327"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"has_sig": false,
"md5_digest": "a96a7dc014f702bfdd2a11da4c744bce",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 526713,
"upload_time": "2025-07-24T22:39:48",
"upload_time_iso_8601": "2025-07-24T22:39:48.073424Z",
"url": "https://files.pythonhosted.org/packages/e4/d4/7ee0655f3e8a7051fc8e6bb3d11ddf7fe0a6491c460ab4f29b5e748af261/parse_lp-2.5.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "9588ee105bdd325c6202670c0dfa0234b3a579c1b1f61b73905c11a114a6cd3c",
"md5": "f4adcbc2808e030d0c0f56974ef3dd02",
"sha256": "917729cfa7edd96646111171d73e8dcc1e54f7abb9e5d12aba9d7a6aeb87e9a3"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"has_sig": false,
"md5_digest": "f4adcbc2808e030d0c0f56974ef3dd02",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 445204,
"upload_time": "2025-07-24T22:39:49",
"upload_time_iso_8601": "2025-07-24T22:39:49.166662Z",
"url": "https://files.pythonhosted.org/packages/95/88/ee105bdd325c6202670c0dfa0234b3a579c1b1f61b73905c11a114a6cd3c/parse_lp-2.5.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "523ff66cb798b08ab60b8cd5ee0ef25fcd977a25565ac88e5b62d6245acf994a",
"md5": "d41376117c2dbfae8270bd46813cc975",
"sha256": "e90431840daf797db71cfc5102943e12eb230609d408ed7743977d03cbc7bffb"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "d41376117c2dbfae8270bd46813cc975",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 407519,
"upload_time": "2025-07-24T22:39:50",
"upload_time_iso_8601": "2025-07-24T22:39:50.532033Z",
"url": "https://files.pythonhosted.org/packages/52/3f/f66cb798b08ab60b8cd5ee0ef25fcd977a25565ac88e5b62d6245acf994a/parse_lp-2.5.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "abf60ed87f27180c29e8ad9fd157646a61b5c7242bd38c0c386fe06ab8a66f76",
"md5": "1cbb7a26541d72123041ede655e34e83",
"sha256": "1ba86c59661bd54b9c1f74ff4f5af92eeef352c2363b86776b01a84890cc54f5"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
"has_sig": false,
"md5_digest": "1cbb7a26541d72123041ede655e34e83",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 434935,
"upload_time": "2025-07-24T22:39:52",
"upload_time_iso_8601": "2025-07-24T22:39:52.924838Z",
"url": "https://files.pythonhosted.org/packages/ab/f6/0ed87f27180c29e8ad9fd157646a61b5c7242bd38c0c386fe06ab8a66f76/parse_lp-2.5.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "335039ab55ecfeb255c2fc77c115eba74d76e4bd1f5988039bab19c3fae266a9",
"md5": "3df86aeae152de16a7a571623d231b43",
"sha256": "fd972c84a723c126ef691ee6067aed75a9067d1708e63a9ccc37be1b5b89ebd4"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-win32.whl",
"has_sig": false,
"md5_digest": "3df86aeae152de16a7a571623d231b43",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 252498,
"upload_time": "2025-07-24T22:39:53",
"upload_time_iso_8601": "2025-07-24T22:39:53.955810Z",
"url": "https://files.pythonhosted.org/packages/33/50/39ab55ecfeb255c2fc77c115eba74d76e4bd1f5988039bab19c3fae266a9/parse_lp-2.5.0-cp39-abi3-win32.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "51acec61d481d5c9572f02e1264d3918319e1ef531fd61dd485066f499a62563",
"md5": "87233076b1a124194419a3b5f6641ab7",
"sha256": "0b7049560701b800f8d11f5c33a2d41caeb58077216509471ded0db209916f84"
},
"downloads": -1,
"filename": "parse_lp-2.5.0-cp39-abi3-win_amd64.whl",
"has_sig": false,
"md5_digest": "87233076b1a124194419a3b5f6641ab7",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.9",
"size": 262513,
"upload_time": "2025-07-24T22:39:55",
"upload_time_iso_8601": "2025-07-24T22:39:55.369335Z",
"url": "https://files.pythonhosted.org/packages/51/ac/ec61d481d5c9572f02e1264d3918319e1ef531fd61dd485066f499a62563/parse_lp-2.5.0-cp39-abi3-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "f7408b9682370a223c7624387533a40433818687cd62428b8206ded40d46ed92",
"md5": "f22bf18adcebce30482d17440a3620ab",
"sha256": "e99441a6ac02baa1da1a7289d1938cdc75238e43f21aea06d6ba533b000b480a"
},
"downloads": -1,
"filename": "parse_lp-2.5.0.tar.gz",
"has_sig": false,
"md5_digest": "f22bf18adcebce30482d17440a3620ab",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.9",
"size": 1244674,
"upload_time": "2025-07-24T22:39:56",
"upload_time_iso_8601": "2025-07-24T22:39:56.481212Z",
"url": "https://files.pythonhosted.org/packages/f7/40/8b9682370a223c7624387533a40433818687cd62428b8206ded40d46ed92/parse_lp-2.5.0.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-07-24 22:39:56",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "dandxy89",
"github_project": "lp_parser_rs",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "parse-lp"
}