backend/new-overpass #52
@@ -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