Skip to main content

A LP file format parser for Python, powered by Rust

Project description

parse_lp

PyPI version

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 coefficient
  • rename_objective(old_name, new_name) - Rename an objective
  • remove_objective(obj_name) - Remove an objective

Constraint Methods

  • update_constraint_coefficient(const_name, var_name, coefficient) - Update or add coefficient
  • update_constraint_rhs(const_name, new_rhs) - Update right-hand side value
  • rename_constraint(old_name, new_name) - Rename a constraint
  • remove_constraint(const_name) - Remove a constraint

Variable Methods

  • rename_variable(old_name, new_name) - Rename variable across problem
  • update_variable_type(var_name, var_type) - Change variable type
  • remove_variable(var_name) - Remove variable from problem

Problem Methods

  • set_problem_name(name) - Set problem name
  • set_sense(sense) - Set optimization sense ("maximize" or "minimize")

Writing Methods

  • to_lp_string() - Generate LP format string
  • to_lp_string_with_options(**options) - Generate with custom formatting
  • save_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


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

parse_lp-2.6.0.tar.gz (1.3 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

parse_lp-2.6.0-cp39-abi3-win_amd64.whl (298.0 kB view details)

Uploaded CPython 3.9+Windows x86-64

parse_lp-2.6.0-cp39-abi3-win32.whl (287.8 kB view details)

Uploaded CPython 3.9+Windows x86

parse_lp-2.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (449.3 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ x86-64

parse_lp-2.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl (484.4 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ s390x

parse_lp-2.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl (566.2 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ppc64le

parse_lp-2.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl (452.3 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARMv7l

parse_lp-2.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl (437.0 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.17+ ARM64

parse_lp-2.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl (480.1 kB view details)

Uploaded CPython 3.9+manylinux: glibc 2.5+ i686

parse_lp-2.6.0-cp39-abi3-macosx_11_0_arm64.whl (403.2 kB view details)

Uploaded CPython 3.9+macOS 11.0+ ARM64

parse_lp-2.6.0-cp39-abi3-macosx_10_12_x86_64.whl (416.9 kB view details)

Uploaded CPython 3.9+macOS 10.12+ x86-64

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

Hashes for parse_lp-2.6.0.tar.gz
Algorithm Hash digest
SHA256 f7aec52cd6804a02c5322d617d102bd9c2de8ad4aea5c80ab0bb69d0d7b4ee2f
MD5 79b145f56d6c5345680c8b5e51a66458
BLAKE2b-256 ef2bce0b390c98861b200ce320160ce64c02215256db60a35008a6ef9c7653aa

See more details on using hashes here.

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

Hashes for parse_lp-2.6.0-cp39-abi3-win_amd64.whl
Algorithm Hash digest
SHA256 da945992d10757163a9f7324bd312cb87ef6e1247707fb36568e18b44fe6e49a
MD5 d36b2c6f9dee034a8dd43ffe65800378
BLAKE2b-256 647e7aacd84e0d7cb0ae19efb0a51d40312e742c40bba823865f5d1ee9514b8e

See more details on using hashes here.

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

Hashes for parse_lp-2.6.0-cp39-abi3-win32.whl
Algorithm Hash digest
SHA256 22e4d980a78644164d6489b334d83ee9325a285ef57d5d45d78d06af9ed25f22
MD5 a76c5d1d8ab47881e2edb190a201e652
BLAKE2b-256 9d9a631a73276f96e65900ca49673cd626e3a66051892f10271fca0e72244104

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
Algorithm Hash digest
SHA256 2e1def0cda71f2c2adf2d1099d4e9f20cfc839b4da6955f9ee502a4f1b0fe728
MD5 b631d56f0ada7f0b5599e6adedf92e33
BLAKE2b-256 533648fb7ad5839874365283068e0da48e6e781739b489ef13cdfafaa91445c9

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl
Algorithm Hash digest
SHA256 ee9100f6a7cb4c35370b46a74059b152a202311d0be1964eba8b234be56c600f
MD5 e54d2cdfaa6f5634b89936a416d09a9c
BLAKE2b-256 41681568b4f0dc69ba23bd0b33b412fb1de4eb257683f7ba62db26ddb1cae14b

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl
Algorithm Hash digest
SHA256 c2cfdbe713e67f3176b7b89e2099c07927834ba97989c22b6c8029b654078131
MD5 10b02d779823fa7424c96ad7e211c83a
BLAKE2b-256 d830c82115b9ebf16052b697c03d634ef81c09a082df5e280e15617c60737faf

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl
Algorithm Hash digest
SHA256 13e0982203f5f0caf0bc4609e0dd190d3cff2e030c7be017bd8e8ff8effafd28
MD5 68a6d5a6e3942e04db449c2eadd870c3
BLAKE2b-256 003345cd983d72b313f5dc40b1ee2b57f7c1885efe91c873f4bad7b4f80e9eaa

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
Algorithm Hash digest
SHA256 17c0ffafca1c95946476cb5b82e6d97b2c4ba0ba1bc8eba1aacb703b7b4c47f9
MD5 bf7b25abf6a4f524700a56b2d59fb6d1
BLAKE2b-256 50a33849ac200cb47c7349a6a12c10352e3207c5e04172bf98c35bd657886b7a

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.whl
Algorithm Hash digest
SHA256 17689116f2a1d7249b80a609cc273490e97bf466f11952d6ec7d83417f45cf3a
MD5 5f0d381511af3b5990aad23fb9d53402
BLAKE2b-256 b9b3ca7cc225e552e0a33d2a71d64b56e596802f6c917dbfe945bf80190d4450

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc26785be0be619dc11df7ae2b2a67cddc7fabefb96a5c3c0b6241adf133387d
MD5 f1e20a53df9913396079be1e851556e8
BLAKE2b-256 cfd74e1ed8d67ad11baec848e7a5659be726aa3d3a7df9c5d85bada87582a479

See more details on using hashes here.

File details

Details for the file parse_lp-2.6.0-cp39-abi3-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for parse_lp-2.6.0-cp39-abi3-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 88ec26c4a52f979e969bd484f441e8422f6b66271779a77321a359f1144c04a6
MD5 c2979368200d23f441fd5c56eec81e4c
BLAKE2b-256 ce46de198367a2c1adecf2ba629cc946614fdc296a3504124013da13e132e397

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page