diff --git a/backend/report.html b/backend/report.html index 676dcf9..ed91a23 100644 --- a/backend/report.html +++ b/backend/report.html @@ -328,7 +328,7 @@ div.media { </head> <body> <h1 id="title">Backend Testing Report</h1> - <p>Report generated on 27-Jan-2025 at 18:28:17 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> + <p>Report generated on 27-Jan-2025 at 20:47:02 by <a href="https://pypi.python.org/pypi/pytest-html">pytest-html</a> v4.1.1</p> <div id="environment-header"> <h2>Environment</h2> @@ -382,7 +382,7 @@ div.media { <h2>Summary</h2> <div class="additional-summary prefix"> </div> - <p class="run-count">9 tests took 00:00:09.</p> + <p class="run-count">25 tests took 00:00:32.</p> <p class="filter">(Un)check the boxes to filter the results.</p> <div class="summary__reload"> <div class="summary__reload__button hidden" onclick="location.reload()"> @@ -395,7 +395,7 @@ div.media { <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="failed" disabled/> <span class="failed">0 Failed,</span> <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="passed" /> - <span class="passed">9 Passed,</span> + <span class="passed">25 Passed,</span> <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="skipped" disabled/> <span class="skipped">0 Skipped,</span> <input checked="true" class="filter" name="filter_checkbox" type="checkbox" data-test-result="xfailed" disabled/> @@ -432,7 +432,7 @@ div.media { </table> </body> <footer> - <div id="data-container" data-jsonblob="{"environment": {"Python": "3.12.3", "Platform": "Linux-6.8.0-51-generic-x86_64-with-glibc2.39", "Packages": {"pytest": "8.3.4", "pluggy": "1.5.0"}, "Plugins": {"html": "4.1.1", "anyio": "4.8.0", "metadata": "3.1.1"}}, "tests": {"src/tests/test_toilets.py::test_invalid_input[location0-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location0-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location0-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">65 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=%7B%7D&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_invalid_input[location1-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location1-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location1-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">2 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=443&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_invalid_input[location2-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location2-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location2-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=443&amp;location=433&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location0-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location0-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location0-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">00:00:07</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=48.227&amp;location=7.437 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location1-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location1-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location1-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">322 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=10.2012&amp;location=10.123 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location2-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location2-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location2-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">700 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=63.989&amp;location=-19.677 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location0-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location0-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location0-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">513 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=45.7576485&amp;location=4.8330241&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location1-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location1-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location1-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">409 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=-6.913795&amp;location=107.60278&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location2-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location2-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location2-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">305 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=-22.97014&amp;location=-43.18181&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}]}, "renderCollapsed": ["passed"], "initialSort": "result", "title": "Backend Testing Report"}"></div> + <div id="data-container" data-jsonblob="{"environment": {"Python": "3.12.3", "Platform": "Linux-6.8.0-51-generic-x86_64-with-glibc2.39", "Packages": {"pytest": "8.3.4", "pluggy": "1.5.0"}, "Plugins": {"html": "4.1.1", "anyio": "4.8.0", "metadata": "3.1.1"}}, "tests": {"src/tests/test_invalid_input.py::test_input[start0-preferences0-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start0-preferences0-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start0-preferences0-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">66 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start1-preferences1-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start1-preferences1-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start1-preferences1-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start2-preferences2-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start2-preferences2-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start2-preferences2-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start3-preferences3-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start3-preferences3-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start3-preferences3-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">4 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start4-preferences4-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start4-preferences4-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start4-preferences4-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start5-preferences5-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start5-preferences5-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start5-preferences5-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">5 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start6-preferences6-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start6-preferences6-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start6-preferences6-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_invalid_input.py::test_input[start7-preferences7-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_invalid_input.py::test_input[start7-preferences7-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_invalid_input.py::test_input[start7-preferences7-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">4 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_main.py::test_turckheim": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_turckheim", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_turckheim</td>", "<td>start (0 | 0) - 6 - H\u00f4tel de ville (238 | 5) - 1 - H\u00f4tel des Deux-Clefs (217 | 5) - 6 - finish (0 | 0) - 0</td>", "<td>23 min</td>", "<td>20 min</td>", "<td class=\"col-duration\">171 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 25 landmarks in \t: 0.009 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 0 times, objective value : 455\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 0 times, objective value : 455\nINFO src.main:main.py:131 Total computation time\t: 0.157 seconds\nINFO src.main:main.py:136 Generated a trip of 23 minutes with 4 landmarks in 0.166 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_bellecour": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_bellecour", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_bellecour</td>", "<td>start (0 | 0) - 10 - \u00c9glise Saint-Georges (461 | 5) - 9 - Chapelle Saint-Thomas (259 | 5) - 0 - Basilique Notre-Dame de Fourvi\u00e8re (281 | 5) - 0 - Basilique de Fourvi\u00e8re (324 | 5) - 5 - Site historique de Lyon (414 | 5) - 4 - Temple du Change (406 | 5) - 7 - Cath\u00e9drale Saint-Jean (347 | 10) - 1 - Palais archi\u00e9piscopal (217 | 5) - 4 - H\u00f4tel de l'Europe (217 | 5) - 12 - Basilique Saint-Bonaventure (414 | 5) - 12 - finish (0 | 0) - 0</td>", "<td>119 min</td>", "<td>120 min</td>", "<td class=\"col-duration\">00:00:06</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 626 landmarks in \t: 0.099 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 9 times, objective value : 3066\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 6 times, objective value : 3340\nINFO src.main:main.py:131 Total computation time\t: 5.487 seconds\nINFO src.main:main.py:136 Generated a trip of 119 minutes with 12 landmarks in 5.586 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_cologne": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_cologne", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_cologne</td>", "<td>start (0 | 0) - 2 - K\u00f6lner Dom (1474 | 10) - 7 - Gro\u00df St. Martin (582 | 5) - 11 - St. Maria Lyskirchen (662 | 5) - 2 - Trinitatiskirche (604 | 5) - 6 - St. Georg (460 | 5) - 6 - St. Maria im Kapitol (633 | 5) - 6 - Duftmuseum im Farina-Haus (696 | 60) - 7 - AntoniterCityKirche (546 | 5) - 4 - St. Peter (538 | 5) - 1 - St. C\u00e4cilien (546 | 5) - 5 - Schauspielhaus K\u00f6ln (477 | 5) - 5 - Kreissparkasse K\u00f6ln (696 | 5) - 2 - St. Aposteln (825 | 5) - 13 - St. Gereon (1059 | 5) - 9 - St. Maria in der Kupfergasse (518 | 5) - 4 - Oper der Stadt K\u00f6ln (601 | 5) - 2 - Au\u00dfenspielst\u00e4tte am Offenbachplatz (461 | 5) - 10 - St.Andreas (632 | 5) - 7 - St. Ursula (529 | 5) - 7 - Excelsior Hotel Ernst (793 | 5) - 2 - finish (0 | 0) - 0</td>", "<td>278 min</td>", "<td>240 min</td>", "<td class=\"col-duration\">00:00:04</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 498 landmarks in \t: 0.11 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 6 times, objective value : 8935\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 4 times, objective value : 13332\nINFO src.main:main.py:131 Total computation time\t: 3.81 seconds\nINFO src.main:main.py:136 Generated a trip of 278 minutes with 22 landmarks in 3.92 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_strasbourg": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_strasbourg", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_strasbourg</td>", "<td>start (0 | 0) - 8 - \u00c9glise protestante Saint-Pierre-le-Jeune (347 | 5) - 2 - Foss\u00e9 du Faux-Rempart (197 | 5) - 8 - De la Grande \u00eele \u00e0 la Neustadt (414 | 5) - 10 - \u00c9glise catholique Sainte-Madeleine (238 | 5) - 6 - Cath\u00e9drale Notre-Dame (728 | 10) - 7 - Pont Saint-Nicolas (217 | 5) - 4 - \u00c9glise catholique Saint-Louis (176 | 5) - 5 - Circuit \u00ab Petite France \u00bb (414 | 5) - 7 - Ponts Couverts (197 | 5) - 14 - Grande Mosqu\u00e9e de Strasbourg (325 | 5) - 13 - Barrage Vauban (391 | 5) - 10 - \u00c9glise Catholique Saint-Jean-Baptiste (281 | 5) - 1 - finish (0 | 0) - 0</td>", "<td>160 min</td>", "<td>180 min</td>", "<td class=\"col-duration\">00:00:03</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 289 landmarks in \t: 0.103 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 4 times, objective value : 4656\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 11 times, objective value : 3925\nINFO src.main:main.py:131 Total computation time\t: 3.203 seconds\nINFO src.main:main.py:136 Generated a trip of 160 minutes with 14 landmarks in 3.306 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_zurich": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_zurich", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_zurich</td>", "<td>start (0 | 0) - 5 - Globus (369 | 30) - 10 - St. Peter (489 | 5) - 3 - Fraum\u00fcnster (531 | 5) - 7 - Ganymed (217 | 5) - 16 - Predigerkirche (351 | 5) - 2 - Friedenskirche (207 | 5) - 10 - Liebfrauenkirche (281 | 5) - 6 - Russisch-Orthodoxe Auferstehungskirche (369 | 5) - 17 - Johanneskirche (351 | 5) - 14 - finish (0 | 0) - 0</td>", "<td>160 min</td>", "<td>180 min</td>", "<td class=\"col-duration\">00:00:05</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 218 landmarks in \t: 0.041 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 4 times, objective value : 4284\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 9 times, objective value : 3165\nINFO src.main:main.py:131 Total computation time\t: 4.509 seconds\nINFO src.main:main.py:136 Generated a trip of 160 minutes with 11 landmarks in 4.55 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_paris": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_paris", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_paris</td>", "<td>start (0 | 0) - 3 - Palais de Justice de Paris (531 | 5) - 7 - \u00c9glise Saint-S\u00e9verin (437 | 5) - 5 - \u00c9glise Orthodoxe Roumaine des Saints Archanges (378 | 5) - 4 - \u00c9glise Saint-Nicolas du Chardonnet (662 | 5) - 6 - M\u00e9morial des Martyrs de la D\u00e9portation (624 | 5) - 4 - Cath\u00e9drale Notre-Dame de Paris (1469 | 10) - 10 - Tour Saint-Jacques (793 | 5) - 7 - Centre Georges Pompidou (1118 | 5) - 6 - \u00c9glise Saint-Leu - Saint-Gilles (546 | 5) - 13 - \u00c9glise Saint-Germain l'Auxerrois (662 | 5) - 5 - Temple de l'Oratoire du Louvre (840 | 5) - 5 - Pyramide du Louvre (557 | 5) - 20 - \u00c9glise Saint-Sulpice (664 | 5) - 12 - finish (0 | 0) - 0</td>", "<td>177 min</td>", "<td>200 min</td>", "<td class=\"col-duration\">00:00:08</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 707 landmarks in \t: 0.178 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 13 times, objective value : 9362\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 5 times, objective value : 9281\nINFO src.main:main.py:131 Total computation time\t: 7.327 seconds\nINFO src.main:main.py:136 Generated a trip of 177 minutes with 15 landmarks in 7.504 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_new_york": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_new_york", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_new_york</td>", "<td>start (0 | 0) - 12 - Grace Church (518 | 5) - 7 - Union Square Park (646 | 5) - 10 - Flatiron Building (780 | 5) - 5 - Cathedral of St. Sava (518 | 10) - 29 - Whitney Museum of American Art (546 | 60) - 5 - Little Island (406 | 5) - 30 - Church of St. John the Baptist (406 | 5) - 8 - Herald Square (454 | 5) - 5 - Empire State Building (901 | 5) - 13 - Madison Square Park (646 | 5) - 7 - Calvary Church (461 | 5) - 17 - Saint Mark's in-the-Bowery (633 | 5) - 18 - New Museum (406 | 60) - 22 - St. Augustine's Church (461 | 5) - 20 - Capitale (810 | 5) - 7 - Petrosino Square (394 | 5) - 13 - Tribeca Park (455 | 5) - 4 - Albert Capsouto Park (454 | 5) - 1 - Duarte Square (685 | 5) - 11 - St. Anthony of Padua Church (489 | 5) - 11 - Saint Patrick's Old Cathedral (489 | 10) - 7 - finish (0 | 0) - 0</td>", "<td>487 min</td>", "<td>600 min</td>", "<td class=\"col-duration\">00:00:04</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 544 landmarks in \t: 0.066 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 9 times, objective value : 7251\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 3 times, objective value : 11558\nINFO src.main:main.py:131 Total computation time\t: 3.989 seconds\nINFO src.main:main.py:136 Generated a trip of 487 minutes with 23 landmarks in 4.055 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_main.py::test_shopping": [{"extras": [], "result": "Passed", "testId": "src/tests/test_main.py::test_shopping", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_main.py::test_shopping</td>", "<td>start (0 | 0) - 5 - Grand H\u00f4tel-Dieu (546 | 30) - 8 - Shopping Area (538 | 40) - 4 - Grand Bazar (93 | 30) - 20 - Halles de Lyon Paul Bocuse (272 | 30) - 6 - Muji (259 | 30) - 2 - Westfield La Part-Dieu (546 | 30) - 32 - finish (0 | 0) - 0</td>", "<td>267 min</td>", "<td>240 min</td>", "<td class=\"col-duration\">354 ms</td>", "<td class=\"col-links\"></td>"], "log": "----------------------------- Captured stdout call -----------------------------\nLandmark(start): [start @(45.7576485, 4.8330241), score=0, time_to_next=5]\nLandmark(shopping): [Grand H\u00f4tel-Dieu @(45.7586955, 4.8364597), score=546, time_to_next=8]\nLandmark(shopping): [Shopping Area @(np.float64(45.76223053940519), np.float64(4.833794685873603)), score=538, time_to_next=4]\nLandmark(shopping): [Grand Bazar @(45.7632141, 4.8361975), score=93, time_to_next=20]\nLandmark(shopping): [Halles de Lyon Paul Bocuse @(45.7628282, 4.8505601), score=272, time_to_next=6]\nLandmark(shopping): [Muji @(45.7615971, 4.8543781), score=259, time_to_next=2]\nLandmark(shopping): [Westfield La Part-Dieu @(45.761331, 4.855676), score=546, time_to_next=32]\nLandmark(finish): [finish @(45.7576485, 4.8330241), score=0]\n\n------------------------------ Captured log call -------------------------------\nINFO src.main:main.py:66 No end coordinates provided. Using start=end.\nINFO src.main:main.py:103 Fetched 12 landmarks in \t: 0.011 seconds\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 2 times, objective value : 2451\nINFO src.optimization.optimizer:optimizer.py:626 Re-optimized 3 times, objective value : 2254\nINFO src.main:main.py:131 Total computation time\t: 0.338 seconds\nINFO src.main:main.py:136 Generated a trip of 267 minutes with 8 landmarks in 0.349 seconds.\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/trip/new &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_invalid_input[location0-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location0-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location0-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=%7B%7D&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_invalid_input[location1-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location1-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location1-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">2 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=443&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_invalid_input[location2-None-422]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_invalid_input[location2-None-422]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_invalid_input[location2-None-422]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">3 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=443&amp;location=433&amp;radius= &quot;HTTP/1.1 422 Unprocessable Entity&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location0-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location0-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location0-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">534 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=48.227&amp;location=7.437 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location1-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location1-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location1-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">514 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=10.2012&amp;location=10.123 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_no_toilets[location2-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_no_toilets[location2-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_no_toilets[location2-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">828 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=63.989&amp;location=-19.677 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location0-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location0-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location0-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">401 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=45.7576485&amp;location=4.8330241&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location1-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location1-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location1-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">206 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=-6.913795&amp;location=107.60278&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}], "src/tests/test_toilets.py::test_toilets[location2-200]": [{"extras": [], "result": "Passed", "testId": "src/tests/test_toilets.py::test_toilets[location2-200]", "resultsTableRow": ["<td class=\"col-result\">Passed</td>", "<td class=\"col-testId\">src/tests/test_toilets.py::test_toilets[location2-200]</td>", "<td>N/A</td>", "<td>N/A</td>", "<td>N/A</td>", "<td class=\"col-duration\">402 ms</td>", "<td class=\"col-links\"></td>"], "log": "------------------------------ Captured log call -------------------------------\nINFO httpx:_client.py:1025 HTTP Request: POST http://testserver/toilets/new?location=-22.97014&amp;location=-43.18181&amp;radius=600 &quot;HTTP/1.1 200 OK&quot;\n\n"}]}, "renderCollapsed": ["passed"], "initialSort": "result", "title": "Backend Testing Report"}"></div> <script> (function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){ const { getCollapsedCategory, setCollapsedIds } = require('./storage.js') diff --git a/backend/src/optimization/optimizer.py b/backend/src/optimization/optimizer.py index bc36398..5b966ff 100644 --- a/backend/src/optimization/optimizer.py +++ b/backend/src/optimization/optimizer.py @@ -55,6 +55,9 @@ class Optimizer: self.average_walking_speed = parameters['average_walking_speed'] self.max_landmarks = parameters['max_landmarks'] self.overshoot = parameters['overshoot'] + self.time_limit = parameters['time_limit'] + self.gap_rel = parameters['gap_rel'] + self.max_iter = parameters['max_iter'] def init_ub_time(self, prob: pl.LpProblem, x: pl.LpVariable, L: int, landmarks: list[Landmark], max_time: int): @@ -573,7 +576,10 @@ class Optimizer: prob, x = self.pre_processing(L, landmarks, max_time, max_landmarks) # Solve the problem and extract results. - prob.solve(pl.PULP_CBC_CMD(msg=False, gapRel=0.1, timeLimit=3, warmStart=False)) + try : + prob.solve(pl.PULP_CBC_CMD(msg=False, timeLimit=self.time_limit+1, gapRel=self.gap_rel)) + except Exception as exc : + raise Exception(f"No solution found: {exc}") from exc status = pl.LpStatus[prob.status] solution = [pl.value(var) for var in x] # The values of the decision variables (will be 0 or 1) @@ -588,18 +594,21 @@ class Optimizer: circles = self.is_connected(solution) i = 0 - timeout = 15 while circles is not None : i += 1 - if i == timeout : - self.logger.error(f'Timeout: No solution found after {timeout} iterations.') - raise TimeoutError(f"Optimization took too long. No solution found after {timeout} iterations.") + if i == self.max_iter : + self.logger.error(f'Timeout: No solution found after {self.max_iter} iterations.') + raise TimeoutError(f"Optimization took too long. No solution found after {self.max_iter} iterations.") for circle in circles : self.prevent_circle(prob, x, circle, L) # Solve the problem again - prob.solve(pl.PULP_CBC_CMD(msg=False)) + try : + prob.solve(pl.PULP_CBC_CMD(msg=False, timeLimit=self.time_limit, gapRel=self.gap_rel)) + except Exception as exc : + raise Exception(f"No solution found: {exc}") from exc + solution = [pl.value(var) for var in x] if pl.LpStatus[prob.status] != 'Optimal' : diff --git a/backend/src/overpass/overpass.py b/backend/src/overpass/overpass.py index 1ccc4a1..082ed5c 100644 --- a/backend/src/overpass/overpass.py +++ b/backend/src/overpass/overpass.py @@ -42,7 +42,7 @@ class Overpass : out (str): Output format ('center', 'body', etc.). Defaults to 'center'. Returns: - ET.Element: Parsed XML response from the Overpass API, or cached data if available. + ET.Element: Parsed XML response from the Overpass API, or cached data if available. """ # Determine which grid cells overlap with this bounding box. overlapping_cells = Overpass._get_overlapping_cells(bbox) diff --git a/backend/src/parameters/landmark_parameters.yaml b/backend/src/parameters/landmark_parameters.yaml index 0cb8959..581777f 100644 --- a/backend/src/parameters/landmark_parameters.yaml +++ b/backend/src/parameters/landmark_parameters.yaml @@ -8,5 +8,5 @@ image_bonus: 1.1 viewpoint_bonus: 5 wikipedia_bonus: 1.25 name_bonus: 3 -N_important: 40 +N_important: 60 pay_bonus: -1 diff --git a/backend/src/parameters/optimizer_parameters.yaml b/backend/src/parameters/optimizer_parameters.yaml index 79cd24c..5a28e49 100644 --- a/backend/src/parameters/optimizer_parameters.yaml +++ b/backend/src/parameters/optimizer_parameters.yaml @@ -4,3 +4,6 @@ average_walking_speed: 4.8 max_landmarks: 10 max_landmarks_refiner: 20 overshoot: 0.0016 +time_limit: 1 +gap_rel: 0.05 +max_iter: 25 \ No newline at end of file