Source code for discrete_optimization.binpack.parser

#  Copyright (c) 2025 AIRBUS and its affiliates.
#  This source code is licensed under the MIT license found in the
#  LICENSE file in the root directory of this source tree.
import os
from typing import Optional

from discrete_optimization.binpack.problem import BinPackProblem, ItemBinPack
from discrete_optimization.datasets import get_data_home


[docs] def get_data_available_bppc( data_folder: Optional[str] = None, data_home: Optional[str] = None ) -> list[str]: """Get datasets available for knapsack. Params: data_folder: folder where datasets for knapsack whould be find. If None, we look in "knapsack" subdirectory of `data_home`. data_home: root directory for all datasets. Is None, set by default to "~/discrete_optimization_data " """ if data_folder is None: data_home = get_data_home(data_home=data_home) data_folder = f"{data_home}/bppc" try: datasets = [ os.path.abspath(os.path.join(data_folder, f)) for f in os.listdir(data_folder) if "txt" in f ] except FileNotFoundError: datasets = [] return datasets
[docs] def parse_bin_packing_constraint_file(file_path): """ Parses a bin packing instance file with incompatibility constraints. (Bin Packing Problem with Conflicts benchmarks from here : https://site.unibo.it/operations-research/en/research/library-of-codes-and-instances-1) """ N = 0 C = 0 items = [] incompatible_items = set() with open(file_path, "r") as f: # Read the first line for N and C first_line = f.readline().strip().split() if len(first_line) == 2: N = int(first_line[0]) C = int(first_line[1]) else: raise ValueError("Invalid format: First line must contain N and C.") # Read the remaining lines for item details for line in f: parts = line.strip().split() if not parts: # Skip empty lines continue if len(parts) >= 2: item_id = int(parts[0]) - 1 weight = int(parts[1]) incompatible = [int(x) - 1 for x in parts[2:]] for inc in incompatible: incompatible_items.add((item_id, inc)) items.append(ItemBinPack(index=item_id, weight=weight)) else: raise ValueError( f"Invalid format: Item line '{line.strip()}' must have at least item ID and weight." ) # Basic validation: Check if the number of parsed items matches N if len(items) != N: print( f"Warning: Number of items parsed ({len(items)}) does not match N ({N}) from the header." ) return BinPackProblem( list_items=items, capacity_bin=C, incompatible_items=incompatible_items )