def test_mclp_invalid_coverages(self): with pytest.raises(TypeError) as e: p = Problem.mclp(None, max_supply={}) assert ( e.value.args[0] == "Expected 'Coverage' or 'list' type for coverages, got '<class 'NoneType'>'" )
def test_mclp_invalid_coverages5(self, binary_coverage): with pytest.raises(TypeError) as e: p = Problem.mclp(binary_coverage, max_supply={"test": 5}) assert ( e.value.args[0] == "Expected 'Coverage' type as key in max_supply, got '<class 'str'>'" )
def test_mclp(self, binary_coverage, binary_coverage2): p = Problem.mclp([binary_coverage, binary_coverage2], max_supply={ binary_coverage: 5, binary_coverage2: 10 }) assert (p.problem_type == "mclp")
def test_mclp_invalid_coverages4(self, binary_coverage): with pytest.raises(TypeError) as e: p = Problem.mclp(binary_coverage, max_supply={binary_coverage: 5.5}) assert ( e.value.args[0] == "Expected 'int' type as value in max_supply, got '<class 'float'>'" )
def test_mclp_invalid_coverages2(self, binary_coverage, partial_coverage): with pytest.raises(ValueError) as e: p = Problem.mclp([binary_coverage, partial_coverage], max_supply={ binary_coverage: 5, partial_coverage: 5 }) assert ( e.value.args[0] == "Invalid coverages. Coverages must have the same coverage type.")
def test_multiple_supply(self): demand_id_col = "GEOID10" supply_id_col = "ORIG_ID" demand_col = "Population" d = geopandas.read_file( os.path.join(self.dir_name, "../test_data/demand_point.shp")) s = geopandas.read_file( os.path.join(self.dir_name, "../test_data/facility_service_areas.shp")) s2 = geopandas.read_file( os.path.join(self.dir_name, "../test_data/facility2_service_areas.shp")) coverage = Coverage.from_geodataframes(d, s, demand_id_col, supply_id_col, demand_col=demand_col) coverage2 = Coverage.from_geodataframes( d, s2, demand_id_col, supply_id_col, demand_col=demand_col, demand_name=coverage.demand_name) problem = Problem.mclp([coverage, coverage2], max_supply={ coverage: 5, coverage2: 10 }) problem.solve(pulp.GLPK()) selected_locations = problem.selected_supply(coverage) selected_locations2 = problem.selected_supply(coverage2) covered_demand = d.query( f"{demand_id_col} in ({[f'{i}' for i in problem.selected_demand(coverage)]})" ) result = math.ceil( (covered_demand[demand_col].sum() / d[demand_col].sum()) * 100) assert (len(selected_locations) == 5) assert (len(selected_locations2) == 10) assert result == 96
def test_single_supply(self): demand_id_col = "GEOID10" supply_id_col = "ORIG_ID" demand_col = "Population" d = geopandas.read_file( os.path.join(self.dir_name, "../test_data/demand_point.shp")) s = geopandas.read_file( os.path.join(self.dir_name, "../test_data/facility_service_areas.shp")) coverage = Coverage.from_geodataframes(d, s, demand_id_col, supply_id_col, demand_col=demand_col) problem = Problem.mclp(coverage, max_supply={coverage: 5}) problem.solve(pulp.GLPK()) covered_demand = d.query( f"{demand_id_col} in ({[f'{i}' for i in problem.selected_demand(coverage)]})" ) result = math.ceil( (covered_demand[demand_col].sum() / d[demand_col].sum()) * 100) assert result == 53
def test_mclp_invalid_coverages7(self, binary_coverage_no_demand): with pytest.raises(TypeError) as e: p = Problem.mclp(binary_coverage_no_demand, max_supply={binary_coverage_no_demand: 5}) assert ( e.value.args[0] == "Coverages used in MCLP must have 'demand_col'")
def test_mclp_invalid_coverages6(self, binary_coverage): with pytest.raises(TypeError) as e: p = Problem.mclp(binary_coverage, max_supply=None) assert ( e.value.args[0] == "Expected 'dict' type for max_supply, got '<class 'NoneType'>'")
def test_mclp_invalid_coverages3(self, partial_coverage): with pytest.raises(ValueError) as e: p = Problem.mclp(partial_coverage, max_supply={partial_coverage: 5}) assert (e.value.args[0] == "MCLP can only be generated from binary coverage.")