Source code for discrete_optimization.facility.parser

#  Copyright (c) 2022 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.datasets import get_data_home
from discrete_optimization.facility.problem import (
    Customer,
    Facility,
    Facility2DProblem,
    Point,
)


[docs] def get_data_available( data_folder: Optional[str] = None, data_home: Optional[str] = None ) -> list[str]: """Get datasets available for facility. Params: data_folder: folder where datasets for facility whould be find. If None, we look in "facility" 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}/facility" try: datasets = [ os.path.abspath(os.path.join(data_folder, f)) for f in os.listdir(data_folder) ] except FileNotFoundError: datasets = [] return datasets
[docs] def parse(input_data: str) -> Facility2DProblem: # parse the input lines = input_data.split("\n") parts = lines[0].split() facility_count = int(parts[0]) customer_count = int(parts[1]) facilities = [] for i in range(1, facility_count + 1): parts = lines[i].split() facilities.append( Facility( index=i - 1, setup_cost=float(parts[0]), capacity=int(parts[1]), location=Point(x=float(parts[2]), y=float(parts[3])), ) ) customers = [] for i in range(facility_count + 1, facility_count + 1 + customer_count): parts = lines[i].split() customers.append( Customer( index=i - 1 - facility_count, demand=int(parts[0]), location=Point(x=float(parts[1]), y=float(parts[2])), ) ) problem = Facility2DProblem(facility_count, customer_count, facilities, customers) return problem
[docs] def parse_file(file_path: str) -> Facility2DProblem: with open(file_path, "r", encoding="utf-8") as input_data_file: input_data = input_data_file.read() facility_model = parse(input_data) return facility_model