def test_invalid_solver(self, binary_lscp_pulp_problem, binary_coverage): p = Problem(binary_lscp_pulp_problem, binary_coverage, 'lscp') with pytest.raises(TypeError) as e: s = p.solve(None) assert ( e.value.args[0] == "Expected 'LpSolver' type for solver, got '<class 'NoneType'>'")
def test_init_invalid_coverage(self, binary_lscp_pulp_problem): with pytest.raises(TypeError) as e: Problem(binary_lscp_pulp_problem, None, 'lscp') assert ( e.value.args[0] == "Expected 'Coverage' or 'list' type for coverages, got '<class 'NoneType'>'" )
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_multiple_supply_arcgis(self): demand_col = "Population" demand_id_col = "GEOID10" supply_id_col = "ORIG_ID" d = arcgis.GeoAccessor.from_featureclass( os.path.join(self.dir_name, "../test_data/demand_point.shp")) s = arcgis.GeoAccessor.from_featureclass( os.path.join(self.dir_name, "../test_data/facility_service_areas.shp")) s2 = arcgis.GeoAccessor.from_featureclass( os.path.join(self.dir_name, "../test_data/facility2_service_areas.shp")) coverage = Coverage.from_spatially_enabled_dataframes( d, s, demand_id_col, supply_id_col, demand_col=demand_col) coverage2 = Coverage.from_spatially_enabled_dataframes( d, s2, demand_id_col, supply_id_col, demand_name=coverage.demand_name, demand_col=demand_col) problem = Problem.lscp([coverage, coverage2]) 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)]})" ) coverage = math.ceil( (covered_demand[demand_col].sum() / d[demand_col].sum()) * 100) assert (len(selected_locations) >= 5) assert (len(selected_locations2) >= 17) assert (coverage == 100)
def test_init_invalid_problem_type(self, binary_lscp_pulp_problem, binary_coverage): with pytest.raises(TypeError) as e: Problem(binary_lscp_pulp_problem, binary_coverage, None) assert ( e.value.args[0] == "Expected 'str' type for problem_type, got '<class 'NoneType'>'")
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_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_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_single_supply(self): demand_id_col = "GEOID10" supply_id_col = "ORIG_ID" 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) problem = Problem.lscp(coverage) with pytest.raises((InfeasibleException, UndefinedException)) as e: problem.solve(pulp.GLPK())
def test_single_supply_arcgis(self): demand_id_col = "GEOID10" supply_id_col = "ORIG_ID" d = arcgis.GeoAccessor.from_featureclass( os.path.join(self.dir_name, "../test_data/demand_point.shp")) s = arcgis.GeoAccessor.from_featureclass( os.path.join(self.dir_name, "../test_data/facility_service_areas.shp")) coverage = Coverage.from_spatially_enabled_dataframes( d, s, demand_id_col, supply_id_col) problem = Problem.lscp(coverage) with pytest.raises((InfeasibleException, UndefinedException)) as e: problem.solve(pulp.GLPK())
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_init_invalid_problem_type_option(self, binary_lscp_pulp_problem, binary_coverage): with pytest.raises(ValueError) as e: Problem(binary_lscp_pulp_problem, binary_coverage, 'test') assert (e.value.args[0] == f"Invalid problem_type: 'test'")
def test_lscp_invalid_coverages3(self, partial_coverage): with pytest.raises(ValueError) as e: p = Problem.lscp(partial_coverage) assert (e.value.args[0] == "LSCP can only be generated from binary coverage.")
def test_init_invalid_problem(self, binary_coverage): with pytest.raises(TypeError) as e: Problem(None, binary_coverage, 'lscp') assert ( e.value.args[0] == "Expected 'LpProblem' type for problem, got '<class 'NoneType'>'")
def test_lscp(self, binary_coverage, binary_coverage2): p = Problem.lscp([binary_coverage, binary_coverage2]) assert (p.problem_type == "lscp")
def test_lscp_invalid_coverages2(self, binary_coverage, partial_coverage): with pytest.raises(ValueError) as e: p = Problem.lscp([binary_coverage, partial_coverage]) assert ( e.value.args[0] == "Invalid coverages. Coverages must have the same coverage type.")
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.")
def test_init(self, binary_lscp_pulp_problem, binary_coverage): p = Problem(binary_lscp_pulp_problem, binary_coverage, 'lscp') assert (isinstance(p, Problem))
def test_solver(self, binary_lscp_pulp_problem, binary_coverage): p = Problem(binary_lscp_pulp_problem, binary_coverage, 'lscp') p = p.solve(GLPK()) assert (isinstance(p, Problem))
def test_problem_type_property(self, binary_lscp_pulp_problem, binary_coverage): p = Problem(binary_lscp_pulp_problem, binary_coverage, 'lscp') assert (p.problem_type == 'lscp')
def test_coverage_property(self, binary_lscp_pulp_problem, binary_coverage): p = Problem(binary_lscp_pulp_problem, binary_coverage, 'lscp') assert (p.coverages[0] == binary_coverage)
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_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'")