AlexanderSvarfdal commited on
Commit
b58a1ed
·
1 Parent(s): fc0d8a3

Added multythreading for the point scoring function

Browse files
Gagna/303/276on/PHOTO-2024-11-13-15-14-58 2.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-58 3.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-58 4.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-58 5.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-58.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-59 2.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-59 3.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-59 4.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-59 5.jpg ADDED
Gagna/303/276on/PHOTO-2024-11-13-15-14-59.jpg ADDED
app/data_processing/point_scoring.py CHANGED
@@ -201,32 +201,41 @@ def get_income_score(income_distribution):
201
 
202
  return weighted_sum / total_population
203
 
204
- def calculate_distance(coord1, coord2):
205
- """Calculate Euclidean distance between two coordinates in EPSG:3057 format."""
206
- x1, y1 = coord1
207
- x2, y2 = coord2
208
- return math.sqrt((x2 - x1)**2 + (y2 - y1)**2)
209
-
210
- def calc_score_line(stations_coordinates: List[Tuple[float]], station_scores: dict[str, list[float]], w_density, w_income, w_age, radius):
211
- # print("stations_coords1 ", stations_coordinates)
 
 
212
  PENALTY_SCALE = 1.0
213
  individual_total_scores = [station["total_score"] for station in station_scores]
214
  overlap_factors = [0] * len(stations_coordinates) # Initialize overlap factors for each station
215
- total_penalty = 0
216
-
217
- # Aggregate individual scores
218
  total_individual_score = sum(individual_total_scores) / len(individual_total_scores) if individual_total_scores else 0
219
 
220
- # Calculate overlap factors
221
- for i, coord1 in enumerate(stations_coordinates):
 
222
  for j, coord2 in enumerate(stations_coordinates):
223
  if i != j: # Avoid self-comparison
224
  distance = calculate_distance(coord1, coord2)
225
  if distance < radius:
226
  # Calculate overlap fraction (inverse of distance within the radius)
227
  overlap_factor = (radius - distance) / radius # Normalize overlap to [0, 1]
228
- overlap_factors[i] += overlap_factor
229
- overlap_factors[j] += overlap_factor
 
 
 
 
 
 
 
 
 
230
 
231
  # Scale down individual scores based on overlap factors
232
  adjusted_scores = [
@@ -247,3 +256,4 @@ def calc_score_line(stations_coordinates: List[Tuple[float]], station_scores: di
247
  }
248
  return result
249
 
 
 
201
 
202
  return weighted_sum / total_population
203
 
204
+
205
+ from typing import List, Tuple, Dict
206
+ from concurrent.futures import ThreadPoolExecutor, as_completed
207
+ import math
208
+
209
+ def calculate_distance(coord1: Tuple[float, float], coord2: Tuple[float, float]) -> float:
210
+ """Calculate the Euclidean distance between two coordinates."""
211
+ return math.sqrt((coord1[0] - coord2[0])**2 + (coord1[1] - coord2[1])**2)
212
+
213
+ def calc_score_line(stations_coordinates: List[Tuple[float, float]], station_scores: Dict[str, List[float]], w_density, w_income, w_age, radius):
214
  PENALTY_SCALE = 1.0
215
  individual_total_scores = [station["total_score"] for station in station_scores]
216
  overlap_factors = [0] * len(stations_coordinates) # Initialize overlap factors for each station
 
 
 
217
  total_individual_score = sum(individual_total_scores) / len(individual_total_scores) if individual_total_scores else 0
218
 
219
+ def compute_overlap(i: int, coord1: Tuple[float, float]) -> List[float]:
220
+ """Compute the overlap factors for a single station."""
221
+ local_overlap = [0] * len(stations_coordinates)
222
  for j, coord2 in enumerate(stations_coordinates):
223
  if i != j: # Avoid self-comparison
224
  distance = calculate_distance(coord1, coord2)
225
  if distance < radius:
226
  # Calculate overlap fraction (inverse of distance within the radius)
227
  overlap_factor = (radius - distance) / radius # Normalize overlap to [0, 1]
228
+ local_overlap[i] += overlap_factor
229
+ local_overlap[j] += overlap_factor
230
+ return local_overlap
231
+
232
+ # Multithreading the computation of overlap factors
233
+ with ThreadPoolExecutor() as executor:
234
+ futures = {executor.submit(compute_overlap, i, coord1): i for i, coord1 in enumerate(stations_coordinates)}
235
+ for future in as_completed(futures):
236
+ i = futures[future]
237
+ local_overlap = future.result()
238
+ overlap_factors = [sum(x) for x in zip(overlap_factors, local_overlap)]
239
 
240
  # Scale down individual scores based on overlap factors
241
  adjusted_scores = [
 
256
  }
257
  return result
258
 
259
+