faster pulp and more tests
	
		
			
	
		
	
	
		
	
		
			Some checks failed
		
		
	
	
		
			
				
	
				Build and deploy the backend to staging / Build and push image (pull_request) Successful in 2m14s
				
			
		
			
				
	
				Run linting on the backend code / Build (pull_request) Successful in 26s
				
			
		
			
				
	
				Run testing on the backend code / Build (pull_request) Failing after 7m45s
				
			
		
			
				
	
				Build and deploy the backend to staging / Deploy to staging (pull_request) Successful in 24s
				
			
		
		
	
	
				
					
				
			
		
			Some checks failed
		
		
	
	Build and deploy the backend to staging / Build and push image (pull_request) Successful in 2m14s
				
			Run linting on the backend code / Build (pull_request) Successful in 26s
				
			Run testing on the backend code / Build (pull_request) Failing after 7m45s
				
			Build and deploy the backend to staging / Deploy to staging (pull_request) Successful in 24s
				
			This commit is contained in:
		| @@ -28,7 +28,7 @@ jobs: | |||||||
|       working-directory: backend |       working-directory: backend | ||||||
|  |  | ||||||
|     - name: Run Tests |     - name: Run Tests | ||||||
|       run: pipenv run pytest src --html=report.html --self-contained-html |       run: pipenv run pytest src --html=report.html --self-contained-html --log-cli-level=INFO | ||||||
|       working-directory: backend |       working-directory: backend | ||||||
|  |  | ||||||
|     - name: Upload HTML report |     - name: Upload HTML report | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							| @@ -94,21 +94,20 @@ def new_trip(preferences: Preferences, | |||||||
|     landmarks_short.append(end_landmark) |     landmarks_short.append(end_landmark) | ||||||
|  |  | ||||||
|     t_generate_landmarks = time.time() - start_time |     t_generate_landmarks = time.time() - start_time | ||||||
|  |     logger.info(f'Fetched {len(landmarks)} landmarks in  \t: {round(t_generate_landmarks,3)} seconds') | ||||||
|     start_time = time.time() |     start_time = time.time() | ||||||
|  |  | ||||||
|     # First stage optimization |     # First stage optimization | ||||||
|     try: |     try: | ||||||
|         base_tour = optimizer.solve_optimization(preferences.max_time_minute, landmarks_short) |         base_tour = optimizer.solve_optimization(preferences.max_time_minute, landmarks_short) | ||||||
|     except ArithmeticError as exc: |  | ||||||
|         raise HTTPException(status_code=500) from exc |  | ||||||
|     except TimeoutError as exc: |  | ||||||
|         raise HTTPException(status_code=500, detail="Optimzation took too long") from exc |  | ||||||
|     except Exception as exc: |     except Exception as exc: | ||||||
|         raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(exc)}") from exc |         raise HTTPException(status_code=500, detail=f"Optimization failed: {str(exc)}") from exc | ||||||
|  |  | ||||||
|     t_first_stage = time.time() - start_time |     t_first_stage = time.time() - start_time | ||||||
|     start_time = time.time() |     start_time = time.time() | ||||||
|  |  | ||||||
|     # Second stage optimization |     # Second stage optimization | ||||||
|  |     # TODO : only if necessary (not enough landmarks for ex.) | ||||||
|     try : |     try : | ||||||
|         refined_tour = refiner.refine_optimization(landmarks, base_tour, |         refined_tour = refiner.refine_optimization(landmarks, base_tour, | ||||||
|                                                preferences.max_time_minute, |                                                preferences.max_time_minute, | ||||||
| @@ -117,10 +116,10 @@ def new_trip(preferences: Preferences, | |||||||
|         raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(exc)}") from exc |         raise HTTPException(status_code=500, detail=f"An unexpected error occurred: {str(exc)}") from exc | ||||||
|  |  | ||||||
|     t_second_stage = time.time() - start_time |     t_second_stage = time.time() - start_time | ||||||
|     logger.debug(f'Generating landmarks      : {round(t_generate_landmarks,3)} seconds') |     # logger.debug(f'Generating landmarks      : {round(t_generate_landmarks,3)} seconds') | ||||||
|     logger.debug(f'First stage optimization  : {round(t_first_stage,3)} seconds') |     logger.debug(f'First stage optimization\t: {round(t_first_stage,3)} seconds') | ||||||
|     logger.debug(f'Second stage optimization : {round(t_second_stage,3)} seconds') |     logger.debug(f'Second stage optimization\t: {round(t_second_stage,3)} seconds') | ||||||
|     logger.info(f'Total computation time    : {round(t_generate_landmarks + t_first_stage + t_second_stage,3)} seconds') |     logger.info(f'Total computation time\t: {round(t_first_stage + t_second_stage,3)} seconds') | ||||||
|  |  | ||||||
|     linked_tour = LinkedLandmarks(refined_tour) |     linked_tour = LinkedLandmarks(refined_tour) | ||||||
|     # upon creation of the trip, persistence of both the trip and its landmarks is ensured. |     # upon creation of the trip, persistence of both the trip and its landmarks is ensured. | ||||||
|   | |||||||
| @@ -2,5 +2,5 @@ detour_factor: 1.4 | |||||||
| detour_corridor_width: 300 | detour_corridor_width: 300 | ||||||
| average_walking_speed: 4.8 | average_walking_speed: 4.8 | ||||||
| max_landmarks: 10 | max_landmarks: 10 | ||||||
| max_landmarks_refiner: 30 | max_landmarks_refiner: 20 | ||||||
| overshoot: 1.1 | overshoot: 1.1 | ||||||
|   | |||||||
| @@ -35,7 +35,6 @@ def test_turckheim(client, request):    # pylint: disable=redefined-outer-name | |||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|     result = response.json() |     result = response.json() | ||||||
|     # print(result) |  | ||||||
|     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) |     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -80,7 +79,6 @@ def test_bellecour(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|             } |             } | ||||||
|         ) |         ) | ||||||
|     result = response.json() |     result = response.json() | ||||||
|     print(result) |  | ||||||
|     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) |     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) | ||||||
|  |  | ||||||
|     # Get computation time |     # Get computation time | ||||||
| @@ -89,8 +87,8 @@ def test_bellecour(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     # Add details to report |     # Add details to report | ||||||
|     log_trip_details(request, landmarks, result['total_time'], duration_minutes) |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|     for elem in landmarks : |     # for elem in landmarks : | ||||||
|         print(elem) |     #     print(elem) | ||||||
|  |  | ||||||
|     # checks : |     # checks : | ||||||
|     assert response.status_code == 200  # check for successful planning |     assert response.status_code == 200  # check for successful planning | ||||||
| @@ -99,7 +97,127 @@ def test_bellecour(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     # assert 2 == 3 |     # assert 2 == 3 | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_Paris(client, request) :   # pylint: disable=redefined-outer-name | def test_cologne(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|  |     """ | ||||||
|  |     Test n°2 : Custom test in Lyon centre to ensure proper decision making in crowded area. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         client: | ||||||
|  |         request: | ||||||
|  |     """ | ||||||
|  |     start_time = time.time()  # Start timer | ||||||
|  |     duration_minutes = 240 | ||||||
|  |  | ||||||
|  |     response = client.post( | ||||||
|  |         "/trip/new", | ||||||
|  |         json={ | ||||||
|  |             "preferences": {"sightseeing": {"type": "sightseeing", "score": 5}, | ||||||
|  |                             "nature": {"type": "nature", "score": 5}, | ||||||
|  |                             "shopping": {"type": "shopping", "score": 5}, | ||||||
|  |                             "max_time_minute": duration_minutes, | ||||||
|  |                             "detour_tolerance_minute": 0}, | ||||||
|  |             "start": [50.942352665, 6.957777972392] | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |     result = response.json() | ||||||
|  |     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) | ||||||
|  |  | ||||||
|  |     # Get computation time | ||||||
|  |     comp_time = time.time() - start_time | ||||||
|  |  | ||||||
|  |     # Add details to report | ||||||
|  |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|  |     # for elem in landmarks : | ||||||
|  |     #     print(elem) | ||||||
|  |  | ||||||
|  |     # checks : | ||||||
|  |     assert response.status_code == 200  # check for successful planning | ||||||
|  |     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" | ||||||
|  |     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_strasbourg(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|  |     """ | ||||||
|  |     Test n°2 : Custom test in Lyon centre to ensure proper decision making in crowded area. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         client: | ||||||
|  |         request: | ||||||
|  |     """ | ||||||
|  |     start_time = time.time()  # Start timer | ||||||
|  |     duration_minutes = 180 | ||||||
|  |  | ||||||
|  |     response = client.post( | ||||||
|  |         "/trip/new", | ||||||
|  |         json={ | ||||||
|  |             "preferences": {"sightseeing": {"type": "sightseeing", "score": 5}, | ||||||
|  |                             "nature": {"type": "nature", "score": 5}, | ||||||
|  |                             "shopping": {"type": "shopping", "score": 5}, | ||||||
|  |                             "max_time_minute": duration_minutes, | ||||||
|  |                             "detour_tolerance_minute": 0}, | ||||||
|  |             "start": [48.5846589226, 7.74078715721] | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |     result = response.json() | ||||||
|  |     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) | ||||||
|  |  | ||||||
|  |     # Get computation time | ||||||
|  |     comp_time = time.time() - start_time | ||||||
|  |  | ||||||
|  |     # Add details to report | ||||||
|  |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|  |     # for elem in landmarks : | ||||||
|  |     #     print(elem) | ||||||
|  |  | ||||||
|  |     # checks : | ||||||
|  |     assert response.status_code == 200  # check for successful planning | ||||||
|  |     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" | ||||||
|  |     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_zurich(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|  |     """ | ||||||
|  |     Test n°2 : Custom test in Lyon centre to ensure proper decision making in crowded area. | ||||||
|  |      | ||||||
|  |     Args: | ||||||
|  |         client: | ||||||
|  |         request: | ||||||
|  |     """ | ||||||
|  |     start_time = time.time()  # Start timer | ||||||
|  |     duration_minutes = 180 | ||||||
|  |  | ||||||
|  |     response = client.post( | ||||||
|  |         "/trip/new", | ||||||
|  |         json={ | ||||||
|  |             "preferences": {"sightseeing": {"type": "sightseeing", "score": 5}, | ||||||
|  |                             "nature": {"type": "nature", "score": 5}, | ||||||
|  |                             "shopping": {"type": "shopping", "score": 5}, | ||||||
|  |                             "max_time_minute": duration_minutes, | ||||||
|  |                             "detour_tolerance_minute": 0}, | ||||||
|  |             "start": [47.377884227, 8.5395114066] | ||||||
|  |             } | ||||||
|  |         ) | ||||||
|  |     result = response.json() | ||||||
|  |     landmarks = load_trip_landmarks(client, result['first_landmark_uuid']) | ||||||
|  |  | ||||||
|  |     # Get computation time | ||||||
|  |     comp_time = time.time() - start_time | ||||||
|  |  | ||||||
|  |     # Add details to report | ||||||
|  |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|  |     # for elem in landmarks : | ||||||
|  |     #     print(elem) | ||||||
|  |  | ||||||
|  |     # checks : | ||||||
|  |     assert response.status_code == 200  # check for successful planning | ||||||
|  |     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" | ||||||
|  |     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 | ||||||
|  |  | ||||||
|  |  | ||||||
|  | def test_paris(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|     """ |     """ | ||||||
|     Test n°2 : Custom test in Paris (les Halles) centre to ensure proper decision making in crowded area. |     Test n°2 : Custom test in Paris (les Halles) centre to ensure proper decision making in crowded area. | ||||||
|      |      | ||||||
| @@ -130,8 +248,8 @@ def test_Paris(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     # Add details to report |     # Add details to report | ||||||
|     log_trip_details(request, landmarks, result['total_time'], duration_minutes) |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|     for elem in landmarks : |     # for elem in landmarks : | ||||||
|         print(elem) |     #     print(elem) | ||||||
|  |  | ||||||
|     # checks : |     # checks : | ||||||
|     assert response.status_code == 200  # check for successful planning |     assert response.status_code == 200  # check for successful planning | ||||||
| @@ -139,7 +257,7 @@ def test_Paris(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 |     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 | ||||||
|  |  | ||||||
|  |  | ||||||
| def test_New_York(client, request) :   # pylint: disable=redefined-outer-name | def test_new_york(client, request) :   # pylint: disable=redefined-outer-name | ||||||
|     """ |     """ | ||||||
|     Test n°2 : Custom test in New York (les Halles) centre to ensure proper decision making in crowded area. |     Test n°2 : Custom test in New York (les Halles) centre to ensure proper decision making in crowded area. | ||||||
|      |      | ||||||
| @@ -170,8 +288,8 @@ def test_New_York(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     # Add details to report |     # Add details to report | ||||||
|     log_trip_details(request, landmarks, result['total_time'], duration_minutes) |     log_trip_details(request, landmarks, result['total_time'], duration_minutes) | ||||||
|  |  | ||||||
|     for elem in landmarks : |     # for elem in landmarks : | ||||||
|         print(elem) |     #     print(elem) | ||||||
|  |  | ||||||
|     # checks : |     # checks : | ||||||
|     assert response.status_code == 200  # check for successful planning |     assert response.status_code == 200  # check for successful planning | ||||||
| @@ -218,8 +336,7 @@ def test_shopping(client, request) :   # pylint: disable=redefined-outer-name | |||||||
|     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" |     assert comp_time < 30, f"Computation time exceeded 30 seconds: {comp_time:.2f} seconds" | ||||||
|     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 |     assert duration_minutes*0.8 < int(result['total_time']) < duration_minutes*1.2 | ||||||
|  |  | ||||||
| ''' |  | ||||||
| ''' |  | ||||||
| # def test_new_trip_single_prefs(client): | # def test_new_trip_single_prefs(client): | ||||||
| #     response = client.post( | #     response = client.post( | ||||||
| #         "/trip/new", | #         "/trip/new", | ||||||
|   | |||||||
| @@ -125,7 +125,7 @@ class LandmarkManager: | |||||||
|  |  | ||||||
|  |  | ||||||
|         landmarks_constrained = take_most_important(all_landmarks, self.N_important) |         landmarks_constrained = take_most_important(all_landmarks, self.N_important) | ||||||
|         self.logger.info(f'All landmarks generated : {len(all_landmarks)} landmarks around {center_coordinates}, and constrained to {len(landmarks_constrained)} most important ones.') |         # self.logger.info(f'All landmarks generated : {len(all_landmarks)} landmarks around {center_coordinates}, and constrained to {len(landmarks_constrained)} most important ones.') | ||||||
|  |  | ||||||
|         return all_landmarks, landmarks_constrained |         return all_landmarks, landmarks_constrained | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user