[pgrouting] 01/08: Imported Upstream version 2.4.0
Bas Couwenberg
sebastic at debian.org
Tue Mar 21 10:59:43 UTC 2017
This is an automated email from the git hooks/post-receive script.
sebastic pushed a commit to branch master
in repository pgrouting.
commit 5ddb51c765b29fedbad8510b210c59cc646fb609
Author: Bas Couwenberg <sebastic at xs4all.nl>
Date: Tue Mar 21 07:23:22 2017 +0100
Imported Upstream version 2.4.0
---
.travis.yml | 11 +-
CMakeLists.txt | 470 +-
CONTRIBUTING.md | 42 +
NEWS | 104 +-
README.md | 33 +-
VERSION | 2 +-
Vagrantfile | 24 -
appveyor.yml | 2 +-
cmake/CMakeLists.txt | 3 -
doc/CMakeLists.txt | 94 +-
doc/conf.py.in | 24 +-
doc/deprecated.rst | 112 -
doc/index.rst | 153 +-
doc/src/developer/developer_guide.rst | 174 -
doc/src/developer/discontinued.rst | 26 -
.../{developer => }/images/Fig1-originalData.png | Bin
doc/src/{developer => }/images/Fig2-cost.png | Bin
.../{developer => }/images/Fig4-costUndirected.png | Bin
doc/src/{developer => }/images/Fig6-undirected.png | Bin
.../{introduction => }/images/boost-inside.jpeg | Bin
doc/src/{recipes => }/images/parallelImage.png | Bin
doc/src/{developer => }/images/test1.png | Bin
doc/src/{developer => }/images/trsp-test-image.png | Bin
doc/src/installation/build.rst | 123 -
doc/src/installation/install-dependencies.rst | 155 -
doc/src/installation/installation.rst | 186 -
doc/src/pgRouting-concepts.rst | 705 +
doc/src/pgRouting-installation.rst | 312 +
...introduction.rst => pgRouting-introduction.rst} | 23 +-
doc/src/proposed.rst | 163 +
doc/src/recipes/example_recipe.rst | 29 -
doc/src/recipes/index.rst | 83 -
doc/src/recipes/parallel_handling.rst | 221 -
doc/src/recipes/test/sampledata.data.sql | 59 -
doc/src/recipes/test/test.conf | 19 -
doc/src/recipes/test/zzz-remove_sampledata.result | 0
.../recipes/test/zzz-remove_sampledata.test.sql | 9 -
doc/src/{changelog => }/release_notes.rst | 197 +-
doc/src/routingFunctions.rst | 67 +
doc/src/{developer => }/sampledata.rst | 20 +-
doc/src/{introduction => }/support.rst | 12 +-
doc/src/tutorial/analytics.rst | 138 -
doc/src/tutorial/custom_query.rst | 180 -
doc/src/tutorial/index.rst | 45 -
doc/src/tutorial/performance.rst | 56 -
doc/src/tutorial/topology.rst | 121 -
doc/src/tutorial/tutorial.rst | 131 -
doc/{src/recipes => }/test/example_recipe.result | 0
doc/{src/recipes => }/test/example_recipe.test.sql | 5 +-
.../recipes => }/test/parallel_handling.result | 0
.../recipes => }/test/parallel_handling.test.sql | 7 +-
doc/test/test.conf | 2 +
doc/test/utilities-any.result | 2 +-
doc/test/utilities-any.test.sql | 2 -
doxygen/Doxyfile.in | 4 +-
{src/contraction/src => doxygen}/contraction.dox | 0
{src => doxygen}/mainpage.dox | 0
src/CMakeLists.txt | 62 -
.../doc/{allpairs.rst => allpairs-family.rst} | 19 +-
src/allpairs/doc/doc-floydWarshall.queries | 7 +
src/allpairs/doc/doc-johnson.queries | 7 +
src/allpairs/doc/pgr_floydWarshall.rst | 19 +-
src/allpairs/doc/pgr_johnson.rst | 19 +-
src/allpairs/src/floydWarshall.c | 38 +-
src/allpairs/src/floydWarshall_driver.cpp | 16 +-
src/allpairs/src/floydWarshall_driver.h | 1 -
src/allpairs/src/johnson.c | 39 +-
src/allpairs/src/johnson_driver.cpp | 16 +-
src/allpairs/src/pgr_allpairs.hpp | 54 +-
src/allpairs/test/doc-floydWarshall.result | 1 +
src/allpairs/test/doc-floydWarshall.test.sql | 1 +
src/allpairs/test/doc-johnson.result | 1 +
src/allpairs/test/doc-johnson.test.sql | 1 +
src/alpha_shape/doc/doc-pgr_alphashape.queries | 42 +-
.../doc/doc-pgr_pointsAsPolygon.queries | 2 +
src/alpha_shape/doc/pgr_alphaShape.rst | 79 +-
src/alpha_shape/doc/pgr_pointsAsPolygon.rst | 4 +-
src/alpha_shape/src/alpha.c | 56 +-
src/alpha_shape/src/alpha_driver.cpp | 13 +-
src/alpha_shape/test/doc-pgr_alphashape.result | 13 +-
src/alpha_shape/test/doc-pgr_alphashape.test.sql | 34 +-
.../test/doc-pgr_pointsAsPolygon.test.sql | 2 -
src/apsp_johnson/doc/CMakeLists.txt | 0
src/apsp_johnson/doc/doc-apspJohnson.queries | 4 +
src/apsp_johnson/doc/pgr_apspJohnson.rst | 78 -
src/apsp_johnson/test/doc-apspJohnson.test.sql | 1 -
src/apsp_warshall/doc/CMakeLists.txt | 0
src/apsp_warshall/doc/doc-apspWarshall.queries | 4 +
src/apsp_warshall/doc/pgr_apspWarshall.rst | 84 -
src/apsp_warshall/test/doc-apspWarshall.test.sql | 1 -
src/astar/doc/aStar-family.rst | 109 +
src/astar/doc/doc-aStarCost.queries | 58 +
src/astar/doc/doc-astar-v2.queries | 12 +-
src/astar/doc/doc-astar.queries | 95 +-
src/astar/doc/{pgr_astar.rst => pgr_aStar.rst} | 208 +-
src/astar/doc/pgr_aStarCost.rst | 239 +
src/astar/doc/pgr_astar-v2.rst | 101 -
src/astar/sql/CMakeLists.txt | 9 +-
src/astar/sql/astarCost.sql | 10 +
src/astar/sql/astarV2.0.sql | 2 +-
src/astar/src/CMakeLists.txt | 14 +-
src/astar/src/astarOneToMany_driver.cpp | 182 -
src/astar/src/astarOneToMany_driver.h | 67 -
src/astar/src/astarOneToOne_driver.h | 65 -
...ny_driver.cpp => astar_many_to_many_driver.cpp} | 138 +-
...ToMany_driver.h => astar_many_to_many_driver.h} | 18 +-
.../{astarManyToMany.c => many_to_many_astar.c} | 174 +-
.../src/{astarManyToOne.c => many_to_one_astar.c} | 158 +-
.../src/{astarOneToMany.c => one_to_many_astar.c} | 159 +-
.../src/{astarOneToOne.c => one_to_one_astar.c} | 133 +-
src/astar/src/pgr_astar.hpp | 546 +-
src/astar/test/doc-aStarCost.result | 16 +
src/astar/test/doc-aStarCost.test.sql | 22 +
src/astar/test/doc-astar-v2.result | 4 +-
src/astar/test/doc-astar-v2.test.sql | 6 +-
src/astar/test/doc-astar.result | 64 +-
src/astar/test/doc-astar.test.sql | 20 +-
.../astar_ManyToMany-compare-dijkstra.test.sql | 97 +
.../astar_ManyToOne-compare-dijkstra.test.sql | 99 +
.../astar_oneToMany-compare-dijkstra.test.sql | 99 +
.../test/pgtap/astar_oneToOne-types-check.sql | 26 +-
src/astar/test/test.conf | 2 +
src/bdDijkstra/doc/doc-pgr_bdDijkstra.queries | 52 +
src/bdDijkstra/doc/pgr_bdDijkstra.rst | 113 +
src/bdDijkstra/sql/CMakeLists.txt | 7 +
src/bdDijkstra/sql/bdDijkstra.sql | 93 +
src/bdDijkstra/src/CMakeLists.txt | 4 +
.../src/bdDijkstra.c} | 122 +-
.../src/bdDijkstra_driver.cpp} | 147 +-
.../src/bdDijkstra_driver.h} | 28 +-
src/bdDijkstra/src/pgr_bdDijkstra.hpp | 281 +
src/bdDijkstra/test/bdDijkstra-large.result | 332 +
.../test/bdDijkstra-large.test.sql} | 47 +-
src/bdDijkstra/test/doc-pgr_bdDijkstra.result | 17 +
src/bdDijkstra/test/doc-pgr_bdDijkstra.test.sql | 23 +
src/bdDijkstra/test/large.data | 17280 ++++++++++++++++
.../test/pgtap/bdDijkstra-compare-dijkstra.sql | 73 +
.../test/pgtap/bdDijkstra-innerQuery.sql | 116 +
.../test/pgtap/bdDijkstra-types-check.sql | 54 +
src/bdDijkstra/test/test.conf | 17 +
src/bd_astar/doc/doc-bdAstar.queries | 2 +
src/bd_astar/doc/pgr_bdAstar.rst | 6 +-
src/bd_astar/src/BiDirAStar.cpp | 19 +-
src/bd_astar/src/bdastar.c | 42 +-
src/bd_astar/src/bdastar_driver.cpp | 6 +-
src/bd_astar/test/CMakeLists.txt | 0
src/bd_astar/test/bd_astar-any-01.result | 202 +-
src/bd_astar/test/bd_astar-any-02.result | 120 +-
src/bd_astar/test/bd_astar-any-03.result | 4 +-
src/bd_astar/test/bd_astar-any-04.result | 4 +-
src/bd_astar/test/bd_astar-any-05.result | 202 +-
src/bd_astar/test/bd_astar-any-06.result | 120 +-
src/bd_astar/test/doc-bdAstar.test.sql | 2 -
src/bd_astar/tester/ans1.txt | 202 +-
src/bd_astar/tester/ans2.txt | 120 +-
src/bd_astar/tester/ans3.txt | 4 +-
src/bd_astar/tester/ans4.txt | 4 +-
src/bd_astar/tester/ans5.txt | 202 +-
src/bd_astar/tester/ans6.txt | 120 +-
src/bd_astar/tester/input.txt | 14 +-
src/bd_dijkstra/doc/doc-bdDijkstra.queries | 32 +-
src/bd_dijkstra/doc/pgr_bdDijkstra.rst | 95 -
src/bd_dijkstra/sql/CMakeLists.txt | 3 +-
.../sql/bdDijkstra-v2.sql} | 19 +-
src/bd_dijkstra/sql/routing_bd_dijkstra.sql | 39 -
src/bd_dijkstra/src/BiDirDijkstra.cpp | 460 -
src/bd_dijkstra/src/BiDirDijkstra.h | 120 -
src/bd_dijkstra/src/CMakeLists.txt | 5 -
src/bd_dijkstra/src/bdsp.c | 408 -
src/bd_dijkstra/src/bdsp_driver.cpp | 79 -
src/bd_dijkstra/src/bdsp_driver.h | 55 -
src/bd_dijkstra/test/CMakeLists.txt | 0
src/bd_dijkstra/test/bd_dijkstra-any-01.result | 203 +-
src/bd_dijkstra/test/bd_dijkstra-any-02.result | 121 +-
src/bd_dijkstra/test/bd_dijkstra-any-03.result | 5 +-
src/bd_dijkstra/test/bd_dijkstra-any-04.result | 5 +-
src/bd_dijkstra/test/bd_dijkstra-any-05.result | 203 +-
src/bd_dijkstra/test/bd_dijkstra-any-06.result | 121 +-
src/bd_dijkstra/test/doc-bdDijkstra.result | 22 +-
src/bd_dijkstra/test/doc-bdDijkstra.test.sql | 6 +-
.../test/pgtap/bdDijkstra-types-check.sql | 139 +-
.../test/pgtap/v2-bdDijkstra-compare-dijkstra.sql | 99 +
src/bd_dijkstra/test/test.conf | 1 +
src/common/doc/{types => }/cost_result.rst | 8 +-
src/common/doc/{types => }/geom_result.rst | 6 +-
src/common/doc/pgr_version.rst | 12 +-
.../doc/{types/index.rst => types_index.rst} | 2 +-
src/common/doc/utilities/end_point.rst | 61 -
src/common/doc/utilities/get_column_name.rst | 88 -
src/common/doc/utilities/get_table_name.rst | 106 -
src/common/doc/utilities/is_column_in_table.rst | 89 -
src/common/doc/utilities/is_column_indexed.rst | 90 -
src/common/doc/utilities/point_to_id.rst | 66 -
src/common/doc/utilities/quote_ident.rst | 124 -
src/common/doc/utilities/start_point.rst | 61 -
src/common/doc/utilities/versionless.rst | 68 -
src/common/sql/pgrouting.control.in | 2 +-
src/common/sql/pgrouting_version.sql | 21 +-
src/common/sql/utilities_pgr.sql | 87 -
src/common/src/CMakeLists.txt | 2 +
src/common/src/arrays_input.c | 185 +-
src/common/src/basePath_SSEC.cpp | 71 +-
src/common/src/basePath_SSEC.hpp | 131 +-
src/common/src/basic_edge.cpp | 8 -
src/common/src/basic_edge.h | 1 -
src/common/src/basic_vertex.cpp | 12 +-
src/common/src/basic_vertex.h | 2 +
src/common/src/ch_edge.cpp | 103 +-
src/common/src/ch_edge.h | 35 +-
src/common/src/ch_vertex.cpp | 80 +-
src/common/src/ch_vertex.h | 27 +-
src/common/src/coordinates_input.c | 7 +-
src/common/src/debug_macro.h | 5 +-
src/common/src/e_report.c | 123 +
src/common/src/e_report.h | 136 +
src/common/src/edges_input.c | 106 +-
src/common/src/edges_input.h | 8 +-
src/common/src/get_check_data.c | 23 +-
src/common/src/get_check_data.h | 2 +-
src/common/src/identifiers.hpp | 22 +-
src/common/src/matrixRows_input.c | 6 +-
src/common/src/{debug_macro.h => pgr_alloc.cpp} | 25 +-
src/common/src/pgr_alloc.hpp | 40 +-
src/common/src/pgr_assert.cpp | 13 +-
src/common/src/pgr_base_graph.hpp | 177 +-
src/common/src/pgr_types.h | 58 +-
src/common/src/points_input.c | 2 +-
src/common/src/postgres_connection.c | 34 +-
src/common/src/postgres_connection.h | 40 +-
src/common/src/restrictions_input.c | 7 +-
src/common/src/time_msg.c | 7 +-
src/common/src/xy_vertex.cpp | 9 +-
src/common/src/xy_vertex.h | 7 +
.../{contraction.rst => contraction-family.rst} | 31 +-
src/contraction/doc/doc-contractGraph.queries | 6 +
src/contraction/doc/doc-contraction.queries | 10 +-
src/contraction/doc/pgr_contractGraph.rst | 35 +-
src/contraction/src/contractGraph.c | 284 +-
src/contraction/src/contractGraph_driver.cpp | 462 +-
src/contraction/src/contractGraph_driver.h | 8 +-
src/contraction/src/pgr_contract.hpp | 509 +-
src/contraction/src/pgr_contractionGraph.hpp | 712 +-
src/contraction/src/pgr_deadEndContraction.hpp | 525 +-
src/contraction/src/pgr_linearContraction.hpp | 423 +-
src/contraction/src/structs.h | 48 -
src/contraction/test/directed-deadend.result | 11 +
src/contraction/test/directed-deadend.test.sql | 44 +
src/contraction/test/directed-development.result | 18 +-
src/contraction/test/directed-development.test.sql | 68 +-
src/contraction/test/directed-linear.result | 17 +
src/contraction/test/directed-linear.test.sql | 45 +
src/contraction/test/doc-contractGraph.test.sql | 2 +-
src/contraction/test/doc-contraction.test.sql | 3 +-
src/contraction/test/expand_graph.test.sql | 51 -
.../test/expand_graph_without_function.test.sql | 51 -
.../test/pgtap/contraction-types-check.sql | 4 +-
src/contraction/test/pgtap/directed_dead_end.sql | 287 +-
src/contraction/test/proof_of_concept.test.sql | 2 -
src/contraction/test/proof_of_concept_1.test.sql | 2 -
src/contraction/test/return_types.test.sql | 2 -
src/contraction/test/test.conf | 2 +
src/convenience/doc/doc-conversion.queries | 23 +-
src/convenience/doc/doc-matrix.queries | 5 +
src/convenience/doc/pgr_flipEdges.rst | 73 -
src/convenience/doc/pgr_pointToEdgeNode.rst | 10 +-
src/convenience/doc/pgr_pointsToDMatrix.rst | 84 -
src/convenience/doc/pgr_pointsToVids.rst | 83 -
src/convenience/doc/pgr_textToPoints.rst | 71 -
src/convenience/doc/pgr_vidsToDMatrix.rst | 101 -
src/convenience/doc/pgr_vidsToDMatrix2.rst | 92 -
src/convenience/sql/CMakeLists.txt | 1 -
src/convenience/sql/pgr_fakeContraction.sql | 56 -
src/convenience/sql/pgrouting_conversion_tools.sql | 1 +
src/convenience/test/doc-conversion.result | 1 +
src/convenience/test/doc-conversion.test.sql | 25 -
src/convenience/test/doc-matrix.result | 5 +
src/convenience/test/doc-matrix.test.sql | 4 -
src/convenience/test/test.conf | 4 +-
src/convenience/test/vidstodmatrix-any-01.test.sql | 2 -
.../doc/{costMatrix.rst => cost-category.rst} | 43 +-
.../{costMatrix.rst => costMatrix-category.rst} | 22 +-
src/costMatrix/doc/doc-pgr_fooDmatrix.queries | 66 +-
...kstraCostMatrix.rst => pgr_aStarCostMatrix.rst} | 73 +-
src/costMatrix/doc/pgr_dijkstraCostMatrix.rst | 18 +-
src/costMatrix/doc/pgr_withPointsCostMatrix.rst | 21 +-
src/costMatrix/sql/CMakeLists.txt | 6 +-
src/costMatrix/sql/eucledianCostMatrix.sql | 92 -
.../test/doc-pgr_fooDmatrix-mac.test.sql | 2 -
.../test/doc-pgr_fooDmatrix-windows.test.sql | 2 -
src/costMatrix/test/doc-pgr_fooDmatrix.result | 33 +
src/costMatrix/test/doc-pgr_fooDmatrix.test.sql | 37 +-
.../doc/{dijkstra.rst => dijkstra-family.rst} | 29 +-
src/dijkstra/doc/doc-pgr_dijkstra.queries | 10 +-
src/dijkstra/doc/doc-pgr_dijkstraCost.queries | 4 +-
src/dijkstra/doc/doc-pgr_dijkstraVia.queries | 6 +
src/dijkstra/doc/pgr_dijkstra.rst | 51 +-
src/dijkstra/doc/pgr_dijkstraCost.rst | 33 +-
src/dijkstra/doc/pgr_dijkstraVia.rst | 8 +-
src/dijkstra/doc/pgr_dijkstra_v2.rst | 113 -
src/dijkstra/sql/dijkstra.sql | 4 +-
src/dijkstra/sql/dijkstraVia.sql | 4 +-
src/dijkstra/src/CMakeLists.txt | 4 -
src/dijkstra/src/dijkstraVia.c | 155 +-
src/dijkstra/src/dijkstraVia_driver.cpp | 146 +-
src/dijkstra/src/dijkstraVia_driver.h | 22 +-
src/dijkstra/src/many_to_many_dijkstra.c | 190 +-
src/dijkstra/src/many_to_many_dijkstra_driver.cpp | 139 +-
src/dijkstra/src/many_to_many_dijkstra_driver.h | 31 +-
src/dijkstra/src/many_to_one_dijkstra.c | 158 +-
src/dijkstra/src/many_to_one_dijkstra_driver.cpp | 121 -
src/dijkstra/src/many_to_one_dijkstra_driver.h | 62 -
src/dijkstra/src/one_to_many_dijkstra.c | 169 +-
src/dijkstra/src/one_to_many_dijkstra_driver.cpp | 114 -
src/dijkstra/src/one_to_many_dijkstra_driver.h | 62 -
src/dijkstra/src/one_to_one_dijkstra.c | 129 +-
src/dijkstra/src/one_to_one_dijkstra_driver.cpp | 115 -
src/dijkstra/src/pgr_dijkstra.hpp | 388 +-
src/dijkstra/test/CMakeLists.txt | 0
src/dijkstra/test/dijkstra-v2.test.sql | 2 -
src/dijkstra/test/doc-pgr_dijkstra.result | 8 +-
src/dijkstra/test/doc-pgr_dijkstra.test.sql | 5 -
src/dijkstra/test/doc-pgr_dijkstraCost.test.sql | 2 -
.../test/pgtap/oneToOne_equiv_manyToMany.test.sql | 2 +
.../test/pgtap/oneToOne_equiv_manyToOne.test.sql | 6 +-
.../test/pgtap/oneToOne_equiv_oneToMany.test.sql | 2 +
.../pgtap/v2-equi-v3-undirected-N-reverse.test.sql | 9 +-
.../pgtap/v2-equi-v3-undirected-W-reverse.test.sql | 3 +
src/dijkstra/test/test.conf | 7 +-
src/dijkstra/tester/Makefile | 14 -
src/dijkstra/tester/boost_wrapper.cpp | 216 -
src/dijkstra/tester/dijkstra.h | 72 -
src/dijkstra/tester/testit.c | 139 -
.../doc/doc-pgr_drivingDistance.queries | 10 +-
.../doc/doc-pgr_drivingdistance-v2.queries | 2 +
.../doc/drivingDistance-category.rst} | 23 +-
src/driving_distance/doc/drivingDistance.rst | 37 -
src/driving_distance/doc/pgr_drivingDistance.rst | 12 +-
.../doc/pgr_drivingDistance_v2.rst | 97 -
src/driving_distance/sql/routing_dd.sql | 151 +-
src/driving_distance/sql/withPoints_dd.sql | 23 +-
src/driving_distance/src/CMakeLists.txt | 6 +-
.../src/boost_interface_drivedist.cpp | 173 -
src/driving_distance/src/drivedist.c | 184 -
src/driving_distance/src/drivedist_driver.cpp | 118 +
...st_interface_drivedist.h => drivedist_driver.h} | 24 +-
.../src/many_to_dist_driving_distance.c | 180 +-
.../src/many_to_dist_withPointsDD.c | 171 +-
src/driving_distance/src/withPoints_dd.c | 262 -
src/driving_distance/src/withPoints_dd_driver.cpp | 260 +-
src/driving_distance/src/withPoints_dd_driver.h | 29 +-
.../test/doc-pgr_drivingDistance.test.sql | 3 -
.../test/doc-pgr_drivingdistance-v2.test.sql | 6 +-
.../test/drivingdistance-any-00.test.sql | 19 +-
src/driving_distance/test/issue729.result | 5 +
src/driving_distance/test/issue729.test.sql | 61 +
src/driving_distance/test/test.conf | 1 +
src/internalQueryTests/src/testXYedges.c | 18 +-
src/internalQueryTests/src/testXYedges_driver.cpp | 53 +-
src/internalQueryTests/src/test_c_edges.c | 15 +-
src/internalQueryTests/src/test_c_edges_driver.cpp | 279 +-
src/internalQueryTests/src/test_matrixRows.c | 18 +-
.../src/test_matrixRows_driver.cpp | 8 +-
src/internalQueryTests/test/test.conf | 6 +-
src/internalQueryTests/test/testCHedges.result | 681 -
src/internalQueryTests/test/testCHedges.test.sql | 2 -
src/kdijkstra/doc/pgr_kDijkstra.rst | 128 -
src/kdijkstra/test/doc-kdijkstra.test.sql | 3 -
src/ksp/doc/{ksp.rst.back => KSP-category.rst} | 17 +-
src/ksp/doc/doc-ksp-v2.queries | 4 +
src/ksp/doc/doc-ksp.queries | 32 +-
src/ksp/doc/{pgr_ksp.rst => pgr_KSP.rst} | 34 +-
src/ksp/doc/pgr_ksp_v2.rst | 102 -
src/ksp/src/ksp.c | 206 +-
src/ksp/src/ksp_driver.cpp | 140 +-
src/ksp/src/ksp_driver.h | 20 +-
src/ksp/src/pgr_ksp.cpp | 86 +-
src/ksp/src/pgr_ksp.hpp | 52 +-
src/ksp/src/withPoints_ksp.c | 73 +-
src/ksp/src/withPoints_ksp_driver.cpp | 112 +-
src/ksp/src/withPoints_ksp_driver.h | 5 +-
src/ksp/test/doc-ksp-v2.test.sql | 1 -
src/ksp/test/doc-ksp.test.sql | 31 +-
src/ksp/test/ksp-network.result | 182 -
src/ksp/test/ksp-network.test.sql | 39 +-
src/ksp/test/test.conf | 6 +-
src/label_graph/doc/doc-pgr_labelGraph.queries | 6 +-
src/label_graph/doc/pgr_labelGraph.rst | 16 +-
src/label_graph/test/CMakeLists.txt | 0
src/label_graph/test/doc-pgr_labelGraph.test.sql | 5 +-
src/label_graph/test/pgrouting_labelgraph.test.sql | 2 -
.../doc-pgr_maxFlow.queries} | 137 +-
src/max_flow/doc/{maxFlow.rst => flow-family.rst} | 37 +-
src/max_flow/doc/maxFlowApplications.rst | 6 +-
src/max_flow/doc/pgr_edgeDisjointPaths.rst | 8 +-
...{pgr_maxFlowPushRelabel.rst => pgr_maxFlow.rst} | 87 +-
src/max_flow/doc/pgr_maxFlowBoykovKolmogorov.rst | 16 +-
src/max_flow/doc/pgr_maxFlowEdmondsKarp.rst | 16 +-
src/max_flow/doc/pgr_maxFlowPushRelabel.rst | 22 +-
.../doc/pgr_maximumCardinalityMatching.rst | 16 +-
src/max_flow/sql/CMakeLists.txt | 1 +
src/max_flow/sql/max_flow.sql | 5 +
src/max_flow/sql/only_flow.sql | 86 +
src/max_flow/src/CMakeLists.txt | 12 +-
...y_driver.cpp => edge_disjoint_paths_driver.cpp} | 82 +-
..._many_driver.h => edge_disjoint_paths_driver.h} | 12 +-
.../src/edge_disjoint_paths_many_to_many.c | 169 +-
src/max_flow/src/edge_disjoint_paths_many_to_one.c | 163 +-
.../src/edge_disjoint_paths_many_to_one_driver.cpp | 103 -
.../src/edge_disjoint_paths_many_to_one_driver.h | 56 -
src/max_flow/src/edge_disjoint_paths_one_to_many.c | 118 +-
.../src/edge_disjoint_paths_one_to_many_driver.cpp | 104 -
.../src/edge_disjoint_paths_one_to_many_driver.h | 56 -
src/max_flow/src/edge_disjoint_paths_one_to_one.c | 108 +-
.../src/edge_disjoint_paths_one_to_one_driver.cpp | 99 -
.../src/edge_disjoint_paths_one_to_one_driver.h | 55 -
src/max_flow/src/max_flow_driver.cpp | 152 +
...low_many_to_many_driver.h => max_flow_driver.h} | 13 +-
src/max_flow/src/max_flow_many_to_many.c | 183 +-
src/max_flow/src/max_flow_many_to_many_driver.cpp | 116 -
src/max_flow/src/max_flow_many_to_one.c | 152 +-
src/max_flow/src/max_flow_many_to_one_driver.cpp | 117 -
src/max_flow/src/max_flow_many_to_one_driver.h | 56 -
src/max_flow/src/max_flow_one_to_many.c | 175 +-
src/max_flow/src/max_flow_one_to_many_driver.cpp | 117 -
src/max_flow/src/max_flow_one_to_many_driver.h | 56 -
src/max_flow/src/max_flow_one_to_one.c | 163 +-
src/max_flow/src/max_flow_one_to_one_driver.cpp | 114 -
src/max_flow/src/maximum_cardinality_matching.c | 123 +-
.../src/maximum_cardinality_matching_driver.cpp | 67 +-
.../src/maximum_cardinality_matching_driver.h | 6 +-
src/max_flow/src/pgr_edgedisjointpaths.hpp | 41 +-
src/max_flow/src/pgr_maxflow.hpp | 106 +-
.../src/pgr_maximumcardinalitymatching.hpp | 29 +-
src/max_flow/test/CMakeLists.txt | 0
.../test/doc-pgr_edgeDisjointPaths.test.sql | 3 -
src/max_flow/test/doc-pgr_maxFlow.result | 9 +
...shRelabel.test.sql => doc-pgr_maxFlow.test.sql} | 121 +-
.../test/doc-pgr_maxFlowBoykovKolmogorov.test.sql | 114 +-
.../test/doc-pgr_maxFlowEdmondsKarp.test.sql | 117 +-
.../test/doc-pgr_maxFlowPushRelabel.test.sql | 121 +-
.../doc-pgr_maximumCardinalityMatching.test.sql | 3 -
src/max_flow/test/pgtap/flow-types-check.sql | 34 +-
src/max_flow/test/pgtap/internet_example.sql | 144 +
src/max_flow/test/test.conf | 2 +
src/pickDeliver/doc/CMakeLists.txt | 0
src/pickDeliver/doc/doc-pickDeliver.queries | 6 +
src/pickDeliver/src/customers_input.c | 6 +-
src/pickDeliver/src/optimize.cpp | 4 +-
src/pickDeliver/src/order.cpp | 2 +-
src/pickDeliver/src/pgr_pickDeliver.cpp | 14 +-
src/pickDeliver/src/pgr_pickDeliver.h | 4 -
src/pickDeliver/src/pickDeliver.c | 45 +-
src/pickDeliver/src/pickDeliver_driver.cpp | 11 +-
src/pickDeliver/src/pickDeliver_driver.h | 1 -
src/pickDeliver/src/solution.cpp | 1 -
src/pickDeliver/src/tw_node.cpp | 2 +-
src/pickDeliver/src/vehicle.cpp | 4 +-
src/pickDeliver/src/vehicle.h | 2 +-
src/pickDeliver/src/vehicle_node.cpp | 3 +-
src/pickDeliver/src/vehicle_pickDeliver.cpp | 8 +-
src/pickDeliver/test/jet_customers.result | 60 +-
src/pickDeliver/test/pickDeliver.data | 240 +-
src/proposed.rst | 104 -
src/proposedNext.rst | 71 -
src/routingFunctions.rst | 65 -
src/topology/doc/doc-pgr_analyzeGraph.queries | 8 +-
src/topology/doc/doc-pgr_createTopology.queries | 20 +-
src/topology/doc/pgr_analyzeGraph.rst | 46 +-
src/topology/doc/pgr_analyzeOneWay.rst | 24 +-
src/topology/doc/pgr_createTopology.rst | 26 +-
src/topology/doc/pgr_createVerticesTable.rst | 34 +-
src/topology/doc/pgr_nodeNetwork.rst | 54 +-
.../doc/{topology.rst => topology-functions.rst} | 22 +-
src/topology/test/analyzeOneway-any.test.sql | 3 -
src/topology/test/createVertTab-any.test.sql | 3 -
src/topology/test/doc-pgr_analyzeGraph.test.sql | 89 +-
src/topology/test/doc-pgr_createTopology.test.sql | 232 +-
src/topology/test/nodeNetwork-any.test.sql | 3 -
src/trsp/doc/README.md | 185 +-
src/trsp/doc/doc-trsp.queries | 2 +
src/trsp/doc/pgr_trsp.rst | 10 +-
src/trsp/sql/routing_trsp.sql | 31 -
src/trsp/sql/routing_trsp_vias.sql | 32 +-
src/trsp/sql/trsp_V2.2.sql | 2 +-
src/trsp/sql/viaEdges_v2.2.sql | 85 +
src/trsp/sql/viaVertices_v2.2.sql | 82 +
src/trsp/src/GraphDefinition.cpp | 204 +-
src/trsp/src/GraphDefinition.h | 36 +-
src/trsp/src/trsp.c | 183 +-
src/trsp/src/trsp.h | 42 +-
src/trsp/src/trsp_core.cpp | 61 +-
src/trsp/src/utils.h | 6 +-
src/trsp/test/doc-trsp.test.sql | 2 -
src/trsp/test/issue693.test.sql | 2 -
src/trsp/test/issue704.result | 1 -
src/trsp/test/test.conf | 5 +-
src/trsp/test/trsp-any-02.test.sql | 2 -
...otes_v2.3.2.result => trsp_notes_v2.4.0.result} | 140 +-
..._v2.3.2.test.sql => trsp_notes_v2.4.0.test.sql} | 174 +-
src/trsp/test/trsp_vias-any-04.test.sql | 2 -
src/tsp/doc/{tsp.rst => TSP-family.rst} | 131 +-
src/tsp/doc/doc-pgr_TSP.queries | 6 +-
src/tsp/doc/doc-pgr_eucledianTSP.queries | 6 +-
src/tsp/doc/doc-tsp.queries | 44 +-
src/tsp/doc/{pgr_tsp.rst => pgr_TSP.rst} | 26 +-
src/tsp/doc/pgr_eucledianTSP.rst | 10 +-
src/tsp/doc/pgr_tsp-V2.0.rst | 255 -
src/tsp/doc/tsp_parameters.txt | 4 +-
src/tsp/sql/CMakeLists.txt | 12 +-
src/tsp/sql/TSP.sql | 24 +
src/tsp/sql/_makeMatrix.sql | 69 -
src/tsp/sql/eucledianTSP.sql | 24 +
src/tsp/sql/routing_tsp.sql | 49 -
src/tsp/sql/routing_tsp_wrappers.sql | 44 -
src/tsp/sql/tsp_v2.0_coordinates.sql | 33 +-
src/tsp/sql/tsp_v2.0_matrix.sql | 95 +
src/tsp/src/CMakeLists.txt | 3 -
src/tsp/src/Dmatrix.cpp | 34 +-
src/tsp/src/eucledianDmatrix.cpp | 9 +-
src/tsp/src/eucledianTSP.c | 78 +-
src/tsp/src/eucledianTSP_driver.cpp | 86 +-
src/tsp/src/eucledianTSP_driver.h | 2 +-
src/tsp/src/newTSP.c | 78 +-
src/tsp/src/newTSP_driver.cpp | 73 +-
src/tsp/src/newTSP_driver.h | 1 +
src/tsp/src/pgr_tsp.cpp | 44 +-
src/tsp/src/pgr_tsp.hpp | 5 +
src/tsp/src/tsp.h | 52 -
src/tsp/src/tsp2.c | 345 -
src/tsp/src/tsplib.c | 616 -
src/tsp/test/development/gr9882-tsp.test.sql | 19806 +++++++++---------
src/tsp/test/doc-pgr_TSP-mac.test.sql | 2 -
src/tsp/test/doc-pgr_TSP-windows.test.sql | 2 -
src/tsp/test/doc-pgr_TSP.test.sql | 2 -
src/tsp/test/doc-pgr_eucledianTSP.result | 2 +-
src/tsp/test/doc-pgr_eucledianTSP.test.sql | 7 +-
src/tsp/test/doc-tsp-mac.test.sql | 1 -
src/tsp/test/doc-tsp-windows.test.sql | 2 +-
src/tsp/test/doc-tsp.result | 32 +-
src/tsp/test/doc-tsp.test.sql | 10 +-
src/tsp/test/test.conf | 3 +-
src/tsp/test/tsp-v2-0.result | 134 +-
src/tsp/test/tsp-v2-0.test.sql | 5 +-
src/vrp_basic/doc/pgr_vrpOneDepot.rst | 8 +-
src/vrp_basic/src/CMakeLists.txt | 2 -
src/vrp_basic/src/VRP.c | 58 +-
src/vrp_basic/src/VRP_Solver.cpp | 27 +-
src/vrp_basic/src/VRP_core.cpp | 6 +-
src/vrp_basic/test/CMakeLists.txt | 0
src/vrp_basic/test/Distance.txt | 20200 +++++++++----------
src/vrp_basic/test/Orders.txt | 202 +-
src/vrp_basic/test/Vehicles.txt | 42 +-
src/vrppdtw/doc/doc-gsoc_vrppdtw.queries | 6 +
src/vrppdtw/doc/pgr_gsoc_vrppdtw.rst | 14 +-
src/vrppdtw/test/jet_customers.result | 96 +
src/vrppdtw/test/jet_customers.test.sql | 128 +
src/vrppdtw/test/test.conf | 1 +
src/withPoints/doc/doc-pgr_withPoints.queries | 100 +-
src/withPoints/doc/doc-pgr_withPointsCost.queries | 58 +-
src/withPoints/doc/doc-pgr_withPointsDD.queries | 38 +-
src/withPoints/doc/doc-pgr_withPointsKSP.queries | 38 +-
src/withPoints/doc/pgr_withPoints.rst | 14 +-
src/withPoints/doc/pgr_withPointsCost.rst | 14 +-
src/withPoints/doc/pgr_withPointsDD.rst | 16 +-
src/withPoints/doc/pgr_withPointsKSP.rst | 20 +-
src/withPoints/doc/pgr_withPointsVia.rst | 14 +-
.../doc/{withPoints.rst => withPoints-family.rst} | 40 +-
src/withPoints/src/CMakeLists.txt | 3 -
src/withPoints/src/get_new_queries.cpp | 19 +-
src/withPoints/src/get_new_queries.h | 2 +
src/withPoints/src/many_to_many_withPoints.c | 162 +-
.../src/many_to_many_withPoints_driver.cpp | 210 +-
.../src/many_to_many_withPoints_driver.h | 8 +-
src/withPoints/src/many_to_one_withPoints.c | 145 +-
.../src/many_to_one_withPoints_driver.cpp | 171 -
src/withPoints/src/many_to_one_withPoints_driver.h | 66 -
src/withPoints/src/msg_logger.hpp | 47 -
src/withPoints/src/one_to_many_withPoints.c | 192 +-
.../src/one_to_many_withPoints_driver.cpp | 209 -
src/withPoints/src/one_to_many_withPoints_driver.h | 74 -
src/withPoints/src/one_to_one_withPoints.c | 179 +-
.../src/one_to_one_withPoints_driver.cpp | 191 -
src/withPoints/src/one_to_one_withPoints_driver.h | 65 -
src/withPoints/src/pgr_withPoints.cpp | 103 +-
src/withPoints/src/pgr_withPoints.hpp | 9 +-
src/withPoints/test/doc-pgr_withPoints.test.sql | 130 +-
.../test/doc-pgr_withPointsCost.test.sql | 100 +-
src/withPoints/test/doc-pgr_withPointsDD.test.sql | 61 +-
....result => doc-pgr_withPointsKSP-cygwin.result} | 4 +-
.../test/doc-pgr_withPointsKSP-cygwin.test.sql | 26 +
src/withPoints/test/doc-pgr_withPointsKSP.result | 8 +-
src/withPoints/test/doc-pgr_withPointsKSP.test.sql | 52 +-
src/withPoints/test/doc-pgr_withPointsVia.test.sql | 60 +-
.../many_to_one_eq_one_to_one_withPoint.test.sql | 14 +-
src/withPoints/test/test.conf | 14 +-
...pdate-files => build-extension-update-files.pl} | 52 +-
tools/clean/clean.sh | 2 +-
tools/cpplint.py | 6321 ------
tools/curr-sig/pgrouting--2.3.2.sig | 141 -
tools/curr-sig/pgrouting--2.4.0.sig | 156 +
tools/git-tools/gitattributes | 19 +
tools/{mk-signature-file => mk-signature-file.pl} | 0
tools/release-scripts/check-release.sh | 327 +
tools/release-scripts/compile-release.sh | 51 +
tools/release-scripts/get_signatures.sh | 41 +
tools/scripts/README.txt | 32 +
tools/scripts/code_checker.sh | 78 +
tools/scripts/fix_typos.sh | 9 +-
tools/sigs/pgrouting--2.0.0.sig | 27 +-
tools/sigs/pgrouting--2.0.1.sig | 27 +-
tools/sigs/pgrouting--2.1.0.sig | 138 +-
tools/sigs/pgrouting--2.2.0.sig | 182 +-
tools/sigs/pgrouting--2.2.1.sig | 182 +-
tools/sigs/pgrouting--2.2.2.sig | 182 +-
tools/sigs/pgrouting--2.2.3.sig | 182 +-
tools/sigs/pgrouting--2.2.4.sig | 182 +-
tools/sigs/pgrouting--2.3.0.sig | 240 +-
tools/sigs/pgrouting--2.3.1.sig | 242 +-
tools/sigs/pgrouting--2.3.2.sig | 141 +
tools/template/create.sh | 46 +-
tools/template/doc/CMakeLists.txt | 0
tools/template/doc/doc-pgr_function1.queries | 32 +
tools/template/doc/pgr_function1.rst | 246 +-
tools/template/sql/function1.sql | 8 +-
tools/template/src/CMakeLists.txt | 7 +-
tools/template/src/function1.c | 253 +-
tools/template/src/function1_driver.cpp | 143 +-
tools/template/src/function1_driver.h | 30 +-
tools/template/test/doc-function1.result | 30 +-
tools/template/test/doc-function1.test.sql | 20 +-
.../test/pgtap/function1-compare-dijkstra.sql | 73 +
tools/template/test/pgtap/function1-innerQuery.sql | 116 +
tools/template/test/pgtap/types-check.sql | 165 +-
tools/template/test/test.conf | 14 +-
tools/testers/algorithm-tester.pl | 29 +-
tools/testers/pg_prove_tests.sh | 9 +-
tools/testers/setup.sql | 2 +
tools/testers/update-tester.pl | 12 -
tools/testers/update-tester.sh | 9 +-
tools/travis/before_script.sh | 14 -
tools/travis/install-doxygen.sh | 8 +-
tools/travis/install-postgres9.5.sh | 39 -
tools/travis/install-postgres9.6.sh | 39 -
tools/travis/install_pgtap.sh | 26 -
tools/travis/pgrouting_build.sh | 7 +-
tools/travis/pgrouting_install.sh | 85 -
tools/travis/pgrouting_prepare.sh | 47 -
tools/travis/postGIS_install.sh | 93 -
tools/travis/test-documentation.sh | 9 +-
tools/vagrant/Readme.md | 54 -
tools/vagrant/bootstrap.sh | 95 -
tools/vagrant/build.sh | 18 -
tools/vagrant/install.sh | 16 -
tools/vagrant/packaging.sh | 15 -
tools/vagrant/packaging.sh.sample | 15 -
tools/winnie/build_pgrouting.sh | 18 +-
656 files changed, 55655 insertions(+), 51984 deletions(-)
diff --git a/.travis.yml b/.travis.yml
index e6ac0f4..59e5fe1 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -65,12 +65,17 @@ addons:
- libboost-graph-dev
- libcgal-dev
- python-sphinx
-
+ - graphviz
+ - texlive
+ - texlive-font-utils
+ - texlive-latex-extra
+ - ghostscript
install:
+ - pip install sphinx
- sudo ./tools/travis/install-postgres.sh $POSTGRESQL_VERSION $PG_USER
- if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ./tools/travis/install-doxygen.sh ; fi
@@ -91,8 +96,8 @@ script:
- ./tools/travis/pgrouting_test.sh $POSTGRESQL_VERSION $PG_USER
- ./tools/testers/pg_prove_tests.sh $PG_USER DEBUG
-after_script:
+#after_script:
# blank
#after_success:
- - if [ "$TRAVIS_OS_NAME" == "linux" ]; then sudo ./tools/travis/test-documentation.sh ; fi
+ # blank
diff --git a/CMakeLists.txt b/CMakeLists.txt
index 3327ce2..092c579 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -7,29 +7,31 @@
cmake_minimum_required(VERSION 2.8 FATAL_ERROR)
+if(POLICY CMP0046)
+ cmake_policy(SET CMP0046 OLD)
+endif()
+
+if ( ${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR} )
+ message(FATAL_ERROR "In-source builds not allowed.
+ Please make a new directory (called a build directory) and run CMake from there.
+ You may need to remove CMakeCache.txt." )
+endif()
+
#---------------------------------------------
# Setting kind of build
#---------------------------------------------
#
-# On Master cmake -DMAKE_BUILD_TYPE=Release
+# for developing
+# cmake -DMAKE_BUILD_TYPE=Develop
#----------------------
-
message(STATUS "CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}")
-if(NOT CMAKE_BUILD_TYPE)
- if (UNIX)
- set(CMAKE_BUILD_TYPE Release CACHE STRING
- "Choose the type of build, options are: None Debug Release RelWithDebInfo
- MinSizeRel."
- FORCE)
- message("Running as: Release")
- else()
- set(CMAKE_BUILD_TYPE Release CACHE STRING
- "Choose the type of build, options are: None Debug Release RelWithDebInfo
- MinSizeRel."
- FORCE)
- message("Running as: Release")
- endif()
+if (CMAKE_BUILD_TYPE MATCHES Develop)
+ set(CMAKE_BUILD_TYPE Debug CACHE STRING
+ "Choose the type of build, options are: None Debug Release RelWithDebInfo
+ MinSizeRel."
+ FORCE)
+ set(WITH_INTERNAL_TESTS)
endif()
message(STATUS "CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}")
@@ -92,7 +94,7 @@ set(PgRouting_SOURCE_NAMES
#----------------------
"alpha_shape"
"bd_astar"
- "bd_dijkstra"
+ "bdDijkstra" # 2.4
"trsp"
#----------------------
@@ -131,100 +133,122 @@ set(PgRouting_SQL_DIRECTORIES
#----------------------
# Wrappers for backwards compatibility
#----------------------
+ "bd_dijkstra" # 2.0 wrap of pgr_bdDijkstra
"apsp_johnson" # 2.0 wrap of pgr_johnson
"apsp_warshall" # 2.0 wrap of pgr_warshall
"kdijkstra" # 2.0 wrap of pgr_dijkstra & pgr_dijkstraCost
- "vrppdtw" # 2.1 wraps of _pgr_pickDeliver
-
+ "vrppdtw" # 2.1 wraps of _pgr_pickDeliver
)
#---------------------------------------------
# minimum versions
#---------------------------------------------
-set(DOXYGEN_MINIMUM_VERSION "1.8.6")
+set(DOXYGEN_MINIMUM_VERSION "1.7")
set(SPHINX_MINIMUM_VERSION "1.1")
+set(POSTGRESQL_MINIMUM_VERSION "9.2.0")
+set(BOOST_MINIMUM_VERSION "1.46")
+set(CGAL_CXX_MINIMUM_VERSION "4.4")
+set(POSTGIS_MINIMUM_VERSION "2.0.0")
+set(GNU_CXX_MINIMUM_VERSION "4.6")
+set(MSVC_CXX_MINIMUM_VERSION "18.0")
message(STATUS "DOXYGEN_MINIMUM_VERSION=${DOXYGEN_MINIMUM_VERSION}")
message(STATUS "SPHINX_MINIMUM_VERSION=${SPHINX_MINIMUM_VERSION}")
+message(STATUS "POSTGRESQL_MINIMUM_VERSION=${POSTGRESQL_MINIMUM_VERSION}")
+message(STATUS "POSTGIS_MINIMUM_VERSION=${POSTGIS_MINIMUM_VERSION}")
+message(STATUS "GNU_CXX_MINIMUM_VERSION=${GNU_CXX_MINIMUM_VERSION}")
+message(STATUS "CLANG_CXX_MINIMUM_VERSION=${CLANG_CXX_MINIMUM_VERSION}")
+message(STATUS "MSVC_CXX_MINIMUM_VERSION=${MSVC_CXX_MINIMUM_VERSION}")
#---------------------------------------------
-# C++ Compiler requirements
+# adding cmake modules
#---------------------------------------------
+list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
+foreach(dir ${CMAKE_MODULE_PATH})
+ message(STATUS "dir='${dir}'")
+endforeach()
+
+include(MacroLibrary)
+include(TargetDistclean)
+
+#---------------------------------------------
+# C++ Compiler requirements
+#---------------------------------------------
include(CheckCXXCompilerFlag)
-if (NOT MSVC)
- CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
- message(STATUS "COMPILER_SUPPORTS_CXX0X= ${COMPILER_SUPPORTS_CXX0X}")
- message(STATUS "CMAKE_CXX_COMPILER= ${CMAKE_CXX_COMPILER}")
- if(COMPILER_SUPPORTS_CXX0X)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
- else()
- CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
- message(STATUS "COMPILER_SUPPORTS_CXX11= ${COMPILER_SUPPORTS_CXX11}")
- if(COMPILER_SUPPORTS_CXX11)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
- else()
- message(FATAL_ERROR "The compiler ${CMAKE_CXX_COMPILER} has no C++0x nor C++11 support.
- Please use a different C++ compiler.")
- endif()
+CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
+CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
+if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
+ if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS GNU_CXX_MINIMUM_VERSION)
+ message(FATAL_ERROR "GCC version must be at least ${GNU_CXX_MINIMUM_VERSION}!")
+ endif()
+elseif ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
+ if (CMAKE_CXX_COMPILER_VERSION VERSION_LESS MSVC_CXX_MINIMUM_VERSION)
+ message(FATAL_ERROR "MSVC version must be at least ${MSVC_CXX_MINIMUM_VERSION}!")
endif()
+else()
+ message(STATUS "Unknown compiler minimum version for ${CMAKE_CXX_COMPILER_ID}")
endif()
-#-----------------------------------------------------------------------------
-# PGROUTING version number.
-set(PGROUTING_VERSION_MAJOR "2")
-set(PGROUTING_VERSION_MINOR "3")
-set(PGROUTING_VERSION_PATCH "2")
-
-set(PGROUTING_VERSION_STRING "${PGROUTING_VERSION_MAJOR}.${PGROUTING_VERSION_MINOR}.${PGROUTING_VERSION_PATCH}")
-set(PGROUTING_VERSION "${PGROUTING_VERSION_MAJOR}.${PGROUTING_VERSION_MINOR}")
-
-set(POSTGRESQL_MINIMUM_VERSION "9.1.0")
-set(POSTGIS_MINIMUM_VERSION "2.0.0")
-
-file(STRINGS "${PGROUTING_SOURCE_DIR}/VERSION" PGROUTING_BUILD_STRING)
+if(COMPILER_SUPPORTS_CXX11)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
+elseif(COMPILER_SUPPORTS_CXX0X)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
+else()
+ message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++0x or C++11 flags support.")
+endif()
-set(PGROUTING_GIT_TAG "v2.3.2")
-#string(REGEX REPLACE "^(.+)-([0-9]+)-g([0-9a-f]+) (.*)$" "\\1" PGROUTING_GIT_TAG ${PGROUTING_BUILD_STRING})
-string(REGEX REPLACE "^(.+)-([0-9a-f]+) (.*)$" "\\1" PGROUTING_GIT_BUILD ${PGROUTING_BUILD_STRING})
-string(REGEX REPLACE "^(.+)-([0-9a-f]+) (.*)$" "\\2" PGROUTING_GIT_HASH ${PGROUTING_BUILD_STRING})
-string(REGEX REPLACE "^(.+)-([0-9a-f]+) (.*)$" "\\3" PGROUTING_GIT_BRANCH ${PGROUTING_BUILD_STRING})
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+# PGROUTING version variables
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
-set(PGROUTING_VERSION_REVISION_NAME "${PGROUTING_GIT_HASH} ${PGROUTING_GIT_BRANCH}")
-set(PGROUTING_VERSION_REVISION_HASH "${PGROUTING_GIT_HASH}")
+set(PGROUTING_VERSION_MAJOR "2")
+set(PGROUTING_VERSION_MINOR "4")
+set(PGROUTING_VERSION_PATCH "0")
+set(PGROUTING_VERSION_DEV "")
-message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
-message(STATUS "PGROUTING_BUILD_STRING: ${PGROUTING_BUILD_STRING}")
-message(STATUS "PGROUTING_GIT_TAG: ${PGROUTING_GIT_TAG}")
-message(STATUS "PGROUTING_GIT_BUILD: ${PGROUTING_GIT_BUILD}")
-message(STATUS "PGROUTING_GIT_HASH: ${PGROUTING_GIT_HASH}")
-message(STATUS "PGROUTING_GIT_BRANCH: ${PGROUTING_GIT_BRANCH}")
-message(STATUS "PGROUTING_VERSION_REVISION_NAME: ${PGROUTING_VERSION_REVISION_NAME}")
+set(PGROUTING_SHORT_VERSION "${PGROUTING_VERSION_MAJOR}.${PGROUTING_VERSION_MINOR}")
+set(PGROUTING_VERSION "${PGROUTING_VERSION_MAJOR}.${PGROUTING_VERSION_MINOR}.${PGROUTING_VERSION_PATCH}")
+set(PGROUTING_FULL_VERSION "v${PGROUTING_VERSION}${PGROUTING_VERSION_DEV}")
-message(STATUS "PGROUTING_SOURCE_DIR: ${PGROUTING_SOURCE_DIR}")
-message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
-message(STATUS "PGROUTING_VERSION_REVISION_HASH: ${PGROUTING_VERSION_REVISION_HASH}")
-message(STATUS "POSTGRESQL_BIN: ${POSTGRESQL_BIN}")
+#---------------------------------------------
+# Variables used in pgr_version()
+#---------------------------------------------
+file(STRINGS "${PGROUTING_SOURCE_DIR}/VERSION" PGROUTING_BUILD_STRING)
+#string(REGEX REPLACE "^(.+)-([^-]+)-[0-9]+-([0-9a-f]+) (.*)$" "\\2" PGROUTING_GIT_BUILD ${PGROUTING_BUILD_STRING})
+string(REGEX REPLACE "^([0-9]+)-([0-9a-f]+) (.*)$" "\\2" PGROUTING_GIT_HASH ${PGROUTING_BUILD_STRING})
+string(REGEX REPLACE "^([0-9]+)-([0-9a-f]+) (.*)$" "\\3" PGROUTING_GIT_BRANCH ${PGROUTING_BUILD_STRING})
+
+
+if (PGROUTING_DEBUG)
+ message(STATUS "PGROUTING_VERSION: ${PGROUTING_FULL_VERSION}")
+ message(STATUS "PGROUTING_SHORT_VERSION: ${PGROUTING_FULL_VERSION}")
+ message(STATUS "PGROUTING_FULL_VERSION: ${PGROUTING_FULL_VERSION}")
+ message(STATUS "VERSION file contents: ${PGROUTING_BUILD_STRING}")
+ message(STATUS "PGROUTING_GIT_HASH: ${PGROUTING_GIT_HASH}")
+ message(STATUS "PGROUTING_GIT_BRANCH: ${PGROUTING_GIT_BRANCH}")
+ message(STATUS "CMAKE_VERSION: ${CMAKE_VERSION}")
+ message(STATUS "PGROUTING_SOURCE_DIR: ${PGROUTING_SOURCE_DIR}")
+ message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
+endif()
#-----------------------------------------------------------------------------
-# CMAKE configuration
-# This is for my mingw64 environment, it should go away
-set(CMAKE_PREFIX_PATH /usr:/usr/local)
-set(CMAKE_INCLUDE_PATH /usr:/usr/local)
-set(CMAKE_LIBRARY_PATH /usr:/usr/local)
-
-add_subdirectory(cmake)
-set(CMAKE_MODULE_PATH "${PGROUTING_SOURCE_DIR}/cmake")
+#-----------------------------------------------------------------------------
+# Windows compiler flags
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
-include(MacroLibrary)
-include(TargetDistclean)
if(WIN32 AND NOT MSVC)
set(OS_BUILD $ENV{OS_BUILD})
@@ -243,153 +267,212 @@ if(WIN32 AND NOT MSVC)
if (NOT GMP_ROOT)
set(GMP_ROOT c:/ming${OS_BUILD}/mingw${OS_BUILD})
endif(NOT GMP_ROOT)
- message(STATUS "OS_BUILD=${OS_BUILD}")
- message(STATUS "CGAL_ROOT=${CGAL_ROOT}")
- message(STATUS "GMP_ROOT=${GMP_ROOT}")
- message(STATUS "BOOST_ROOT=${BOOST_ROOT}")
- message(STATUS "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
+ if (PGROUTING_DEBUG)
+ message(STATUS "OS_BUILD=${OS_BUILD}")
+ message(STATUS "CGAL_ROOT=${CGAL_ROOT}")
+ message(STATUS "GMP_ROOT=${GMP_ROOT}")
+ message(STATUS "BOOST_ROOT=${BOOST_ROOT}")
+ message(STATUS "CMAKE_PREFIX_PATH=${CMAKE_PREFIX_PATH}")
+ endif()
endif(WIN32 AND NOT MSVC)
+if(WIN32 AND MSVC)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_DEPRECATE")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_DEPRECATE")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_WARNINGS")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_NONSTDC_NO_DEPRECATE")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -EHsc")
+endif()
+
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+# Finding prerequisites
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+#---------------------------------------------
+#---------------------------------------------
+# Perl
+#---------------------------------------------
+#---------------------------------------------
include(FindPerl)
if(NOT PERL_EXECUTABLE)
message(FATAL_ERROR " Please check your Perl installation.")
endif(NOT PERL_EXECUTABLE)
+#---------------------------------------------
+#---------------------------------------------
+# PostgreSQL
+#---------------------------------------------
+#---------------------------------------------
find_package(PostgreSQL)
if(NOT POSTGRESQL_FOUND)
message(FATAL_ERROR " Please check your PostgreSQL installation.")
endif(NOT POSTGRESQL_FOUND)
-#set(Boost_DEBUG ON)
-find_package(Boost)
+if(NOT POSTGRESQL_VERSION_STRING)
+ message(FATAL_ERROR "pg_config was not found. Please check your PostgreSQL installation!")
+endif(NOT POSTGRESQL_VERSION_STRING)
+string(SUBSTRING "${POSTGRESQL_VERSION_STRING}" 11 -1 POSTGRESQL_VERSION)
+string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*" "\\1\\2" PGSQL_VERSION ${POSTGRESQL_VERSION})
+
+if("${POSTGRESQL_VERSION}" VERSION_LESS "${POSTGRESQL_MINIMUM_VERSION}")
+ message(FATAL_ERROR " PostgreSQL ${POSTGRESQL_MINIMUM_VERSION} or greater is required.")
+endif("${POSTGRESQL_VERSION}" VERSION_LESS "${POSTGRESQL_MINIMUM_VERSION}")
+
+#-------
+include_directories(${POSTGRESQL_INCLUDE_DIR})
+if(WIN32)
+ include_directories(${POSTGRESQL_INCLUDE_DIR}/port/win32)
+ if(MSVC)
+ include_directories(${POSTGRESQL_INCLUDE_DIR}/port/win32_msvc/)
+ endif(MSVC)
+endif(WIN32)
+
+set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPGSQL_VERSION=${PGSQL_VERSION}")
+set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -DPGSQL_VERSION=${PGSQL_VERSION}")
+message(STATUS "PGSQL_VERSION=${PGSQL_VERSION}")
+
+
+
+#---------------------------------------------
+#---------------------------------------------
+# Boost
+#---------------------------------------------
+#---------------------------------------------
+find_package(Boost ${BOOST_MINIMUM_VERSION})
if(Boost_INCLUDE_DIRS)
message(STATUS "Boost headers were found here: ${Boost_INCLUDE_DIRS}")
- #find_file(MYVAR geometry.hpp)
- #message(STATUS "geometry.hpp found here: ${MYVAR}")
else(Boost_INCLUDE_DIRS)
message(FATAL_ERROR " Please check your Boost installation ")
endif(Boost_INCLUDE_DIRS)
-find_package(CGAL)
+#-------
+include_directories(${Boost_INCLUDE_DIRS})
+
+
+#---------------------------------------------
+#---------------------------------------------
+# CGAL
+#---------------------------------------------
+#---------------------------------------------
+find_package(CGAL ${CGAL_MINIMUM_VERSION})
if(NOT CGAL_FOUND)
message(FATAL_ERROR " Please check your CGAL installation, or set correct path to CGAL_INCLUDE_DIR and CGAL_LIBRARIES.")
endif(NOT CGAL_FOUND)
-if(NOT POSTGRESQL_VERSION_STRING)
- message(FATAL_ERROR "pg_config was not found. Please check your PostgreSQL installation!")
-endif(NOT POSTGRESQL_VERSION_STRING)
+#-------
+include_directories(${CGAL_INCLUDE_DIR})
-message(STATUS "POSTGRESQL_VERSION_STRING is ${POSTGRESQL_VERSION_STRING}")
-string(SUBSTRING "${POSTGRESQL_VERSION_STRING}" 11 -1 POSTGRESQL_VERSION)
-message(STATUS "POSTGRESQL_VERSION is ${POSTGRESQL_VERSION}")
-string(REGEX REPLACE "^([0-9]+)\\.([0-9]+).*" "\\1\\2" PGSQL_VERSION ${POSTGRESQL_VERSION})
-message(STATUS "PGSQL_VERSION is ${PGSQL_VERSION}")
+#---------------------------------------------
+#---------------------------------------------
+# PgRouting includes
+#---------------------------------------------
+#---------------------------------------------
-set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -DPGSQL_VERSION=${PGSQL_VERSION}")
+set(PGROUTING_INCLUDE_DIRECTORIES
+ ${PGROUTING_SOURCE_DIR}/src/common/src
+ ${PGROUTING_SOURCE_DIR}/src/dijkstra/src
+ )
-#TODO maybe needs a wrapper for visual studio
-if(WIN32 AND MSVC)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_DEPRECATE")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_DEPRECATE")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_SECURE_NO_WARNINGS")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_SCL_SECURE_NO_WARNINGS")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -D_CRT_NONSTDC_NO_DEPRECATE")
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -EHsc")
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}")
+#-------
+include_directories(${PGROUTING_INCLUDE_DIRECTORIES})
+
+
+#---------------------------------------------
+if (PGROUTING_DEBUG)
+ message(STATUS "PERL_VERSION_STRING = ${PERL_VERSION_STRING}")
+ message(STATUS "POSTGRESQL_VERSION is ${PGSQL_VERSION}")
+ message(STATUS "PGSQL_VERSION is ${PGSQL_VERSION}")
+ message(STATUS "Boost_INCLUDE_DIRS: ${Boost_INCLUDE_DIRS}")
+ message(STATUS "CGAL_INCLUDE_DIR: ${CGAL_INCLUDE_DIR}")
+ message(STATUS "PGROUTING_INCLUDE_DIRECTORIES = ${PGROUTING_INCLUDE_DIRECTORIES}")
+ message(STATUS "POSTGRESQL_INCLUDE_DIR = ${POSTGRESQL_INCLUDE_DIR}")
+ message(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
endif()
-if("${POSTGRESQL_VERSION}" VERSION_LESS "${POSTGRESQL_MINIMUM_VERSION}")
- message(FATAL_ERROR " PostgreSQL ${POSTGRESQL_MINIMUM_VERSION} or greater is required.")
-endif("${POSTGRESQL_VERSION}" VERSION_LESS "${POSTGRESQL_MINIMUM_VERSION}")
+
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+# Posgres installation directories
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+
+#---------------------------------------------
+# library directory
+#---------------------------------------------
execute_process(
COMMAND ${POSTGRESQL_PG_CONFIG} --pkglibdir
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE LIB_DIR)
-if(LIB_DIR)
- message(STATUS "Install directory for libraries is set to ${LIB_DIR}")
-else(LIB_DIR)
+if(NOT LIB_DIR)
message(FATAL_ERROR "pg_config --pkglibdir failed to return a value. Please check your PostgreSQL installation!")
-endif(LIB_DIR)
+endif()
+#-------
set(LIBRARY_INSTALL_PATH ${LIB_DIR})
+#---------------------------------------------
+# extension directory
+#---------------------------------------------
+
execute_process(
COMMAND ${POSTGRESQL_PG_CONFIG} --sharedir
OUTPUT_STRIP_TRAILING_WHITESPACE
OUTPUT_VARIABLE SHARE_DIR)
+#-------
if(SHARE_DIR)
set(SHARE_DIR "${SHARE_DIR}/extension")
- message(STATUS "Extension directory for SQL files is set to ${SHARE_DIR}")
else(SHARE_DIR)
message(FATAL_ERROR "pg_config --sharedir failed to return a value. Please check your PostgreSQL installation!")
endif(SHARE_DIR)
-#-------------------------------------
-# Handles documentation
-#-------------------------------------
-set(PROJECT_NAME "pgRouting")
-set(PROJECT_BRIEF "pgRouting extends the PostGIS / PostgreSQL geospatial database to provide geospatial routing functionality.")
-set(PROJECT_NUMBER "${PGROUTING_GIT_TAG}")
-add_subdirectory(doxygen)
-add_subdirectory(doc)
-#-------------------------------------
-
-#include directories: files in alphabetical order
-set(PGROUTING_INCLUDE_DIRECTORIES
- ${PGROUTING_SOURCE_DIR}/src/common/src
- ${PGROUTING_SOURCE_DIR}/src/dijkstra/src
- )
-
-include_directories(${PGROUTING_INCLUDE_DIRECTORIES} ${POSTGRESQL_INCLUDE_DIR} ${Boost_INCLUDE_DIRS} ${CGAL_INCLUDE_DIR})
-message(STATUS "PGROUTING_INCLUDE_DIRECTORIES = ${PGROUTING_INCLUDE_DIRECTORIES}")
-message(STATUS "POSTGRESQL_INCLUDE_DIR = ${POSTGRESQL_INCLUDE_DIR}")
-message(STATUS "Boost_INCLUDE_DIRS = ${Boost_INCLUDE_DIRS}")
-
-get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
-foreach(dir ${dirs})
- message(STATUS "dir='${dir}'")
-endforeach()
+#---------------------------------------------
+if (PGROUTING_DEBUG)
+ message(STATUS "Install directory for libraries is set to ${LIB_DIR}")
+ message(STATUS "Extension directory for SQL files is set to ${SHARE_DIR}")
+endif()
-if(WIN32)
- include_directories(${POSTGRESQL_INCLUDE_DIR}/port/win32)
- if(MSVC)
- include_directories(${POSTGRESQL_INCLUDE_DIR}/port/win32_msvc/)
- endif(MSVC)
-endif(WIN32)
+#---------------------------------------------
+# Special cases for windows
+#---------------------------------------------
-# we need link libpostgres.a on win32 env
if(WIN32)
message(STATUS "LINK_DIRECTORIES = ${POSTGRESQL_LIBRARIES}")
link_directories(${POSTGRESQL_LIBRARIES} ${LIB_DIR})
link_libraries(postgres)
-endif(WIN32)
+endif()
+
+#-----------------------------------------------------------------------------
+
+if (PGROUTING_DEBUG)
+ get_property(dirs DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR} PROPERTY INCLUDE_DIRECTORIES)
+ foreach(dir ${dirs})
+ message(STATUS "dir='${dir}'")
+ endforeach()
+endif()
-# TODO default compilation with -DNDEBUG
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
#compiler directives
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
if(UNIX OR (WIN32 AND NOT MSVC))
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ")
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99")
endif()
CHECK_C_COMPILER_FLAG("-frounding-math" C_COMPILER_SUPPORTS_ROUNDING_MATH)
CHECK_CXX_COMPILER_FLAG("-frounding-math" CXX_COMPILER_SUPPORTS_ROUNDING_MATH)
-if(C_COMPILER_SUPPORTS_ROUNDING_MATH)
- set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -frounding-math")
-endif()
-if(CXX_COMPILER_SUPPORTS_ROUNDING_MATH)
- set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frounding-math")
-endif()
if(NOT WIN32)
@@ -397,26 +480,35 @@ if(NOT WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC ")
endif()
+if(WIN32 AND MSVC)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CMAKE_C_FLAGS}")
+endif()
+
+if(C_COMPILER_SUPPORTS_ROUNDING_MATH)
+ set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -frounding-math ")
+endif()
+if(CXX_COMPILER_SUPPORTS_ROUNDING_MATH)
+ set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -frounding-math ")
+endif()
-set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wconversion -pedantic -fmax-errors=10 -Wmissing-prototypes")
-#TODO remove the optimizer flag when pgr_bdijkstra gets fixed
-set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -O1 -fno-implicit-inline-templates -Wconversion -pedantic -fmax-errors=10 -Wunused -Wuninitialized -Wextra -Wdouble-promotion -Werror")
+set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wconversion -pedantic -Wmissing-prototypes -Wunused -Wuninitialized -Wextra -Wdouble-promotion")
+set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Wall -fno-implicit-inline-templates -Wconversion -pedantic -Wunused -Wuninitialized -Wextra -Wdouble-promotion")
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
-#if(CDEBUG)
-message(STATUS "CMAKE_CXX_FLAGS_DEBUG= ${CMAKE_CXX_FLAGS_DEBUG}")
-message(STATUS "CMAKE_CXX_FLAGS_RELEASE= ${CMAKE_CXX_FLAGS_RELEASE}")
-message(STATUS "CMAKE_CXX_FLAGS= ${CMAKE_CXX_FLAGS}")
+if (PGROUTING_DEBUG)
+ message(STATUS "CMAKE_CXX_FLAGS_DEBUG= ${CMAKE_CXX_FLAGS_DEBUG}")
+ message(STATUS "CMAKE_CXX_FLAGS_RELEASE= ${CMAKE_CXX_FLAGS_RELEASE}")
+ message(STATUS "CMAKE_CXX_FLAGS= ${CMAKE_CXX_FLAGS}")
-message(STATUS "CMAKE_C_FLAGS_DEBUG= ${CMAKE_C_FLAGS_DEBUG}")
-message(STATUS "CMAKE_C_FLAGS_RELEASE= ${CMAKE_C_FLAGS_RELEASE}")
-message(STATUS "CMAKE_C_FLAGS= ${CMAKE_C_FLAGS}")
+ message(STATUS "CMAKE_C_FLAGS_DEBUG= ${CMAKE_C_FLAGS_DEBUG}")
+ message(STATUS "CMAKE_C_FLAGS_RELEASE= ${CMAKE_C_FLAGS_RELEASE}")
+ message(STATUS "CMAKE_C_FLAGS= ${CMAKE_C_FLAGS}")
-message(STATUS "UNIX=${UNIX}")
-message(STATUS "WIN32=${WIN32}")
-message(STATUS "MSVC=${MSVC}")
-#endif()
+ message(STATUS "UNIX=${UNIX}")
+ message(STATUS "WIN32=${WIN32}")
+ message(STATUS "MSVC=${MSVC}")
+endif()
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
@@ -425,7 +517,7 @@ message(STATUS "MSVC=${MSVC}")
# Include the working directories
#====================================================================
-if(${CMAKE_BUILD_TYPE} MATCHES "Debug")
+if(WITH_INTERNAL_TESTS)
message("Including InternalQueryTests")
set(PgRouting_SOURCE_NAMES ${PgRouting_SOURCE_NAMES} "internalQueryTests")
endif()
@@ -473,14 +565,14 @@ message("Building the library names")
#----------------------
# PGROUTING installation files names have the following name
#----------------------
-set(PGROUTING_LIB_NAME "pgrouting-${PGROUTING_VERSION}")
+set(PGROUTING_LIB_NAME "pgrouting-${PGROUTING_SHORT_VERSION}")
#----------------------
# PGROUTING library name used in the pgr_functions
# '$libdir/${PGROUTING_LIBRARY_NAME}'
#----------------------
-set(PGROUTING_LIBRARY_NAME "libpgrouting-${PGROUTING_VERSION}")
+set(PGROUTING_LIBRARY_NAME "libpgrouting-${PGROUTING_SHORT_VERSION}")
add_library(${PGROUTING_LIB_NAME}
${LIBRARY_MODE_TARGET}
@@ -541,18 +633,26 @@ foreach(file_in ${PACKAGE_SQL_FILES})
add_dependencies(ProcessSQLFiles ${file_in})
file(READ "${file_out}" CONTENTS)
string(REGEX REPLACE "/\\*PGR-(GNU|MIT).*PGR-(GNU|MIT)\\*/" "" STRIP_CONTENTS "${CONTENTS}")
- string(REGEX REPLACE "/\\*/*FOR.*FOR-USER\\*/" "" CONTENTS "${STRIP_CONTENTS}")
+ string(REGEX REPLACE "/\\*FOR.*USER\\*/" "" CONTENTS "${STRIP_CONTENTS}")
file(APPEND ${TEMP_LIB_FILENAME} "${CONTENTS}")
endforeach()
configure_file("${TEMP_LIB_FILENAME}"
- "${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION_STRING}.sql"
+ "${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION}.sql"
)
-message(STATUS "Created ${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION_STRING}.sql")
+message(STATUS "Created ${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION}.sql")
#
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+# DOCUMENTATION
+#-----------------------------------------------------------------------------
+#-----------------------------------------------------------------------------
+add_subdirectory(doxygen)
+add_subdirectory(doc)
+
#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
# Handling pgrouting.control.in files
@@ -568,41 +668,43 @@ message(STATUS "Created ${CMAKE_BINARY_DIR}/lib/pgrouting.control")
# create the signature file for this release
-message(STATUS "Creating lib/pgrouting--${PGROUTING_VERSION_STRING}.sig")
+message(STATUS "Creating lib/pgrouting--${PGROUTING_VERSION}.sig")
execute_process(
- COMMAND ${PERL_EXECUTABLE} ${PGROUTING_SOURCE_DIR}/tools/mk-signature-file ${PGROUTING_VERSION_STRING}
+ COMMAND cp ${PGROUTING_SOURCE_DIR}/tools/curr-sig/pgrouting--${PGROUTING_VERSION}.sig ${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION}.sig
+ #COMMAND ${PERL_EXECUTABLE} ${PGROUTING_SOURCE_DIR}/tools/mk-signature-file.pl ${PGROUTING_VERSION}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
RESULT_VARIABLE SIG_RESULT
)
if(SIG_RESULT)
- message(FATAL_ERROR " SIG_RESULT: ${SIG_RESULT}")
+ message(FATAL_ERROR "SIG_RESULT: ${SIG_RESULT}")
endif(SIG_RESULT)
# create the extension update scripts
execute_process(
- COMMAND ${PERL_EXECUTABLE} ${PGROUTING_SOURCE_DIR}/tools/build-extension-update-files ${PGROUTING_VERSION_STRING} ${PGROUTING_SOURCE_DIR}
+ COMMAND ${PERL_EXECUTABLE} ${PGROUTING_SOURCE_DIR}/tools/build-extension-update-files.pl ${PGROUTING_VERSION} ${PGROUTING_SOURCE_DIR}
WORKING_DIRECTORY "${CMAKE_BINARY_DIR}"
RESULT_VARIABLE UPDATE_RESULT
)
if(UPDATE_RESULT)
- message(FATAL_ERROR " UPDATE_RESULT: ${UPDATE_RESULT}")
-endif(UPDATE_RESULT)
+ message(FATAL_ERROR "UPDATE_RESULT: ${UPDATE_RESULT}")
+endif()
# make a list of the files we need to install for version updates
file(GLOB VERSION_UPDATE_FILES "${CMAKE_BINARY_DIR}/lib/pgrouting--*--*.sql")
+
# this will create the commands in the makefile under the install target
if(UNIX)
file(GLOB_RECURSE LIBS_TO_INSTALL "${CMAKE_BINARY_DIR}/lib/*.so")
-else(UNIX)
+else()
file(GLOB_RECURSE LIBS_TO_INSTALL "${CMAKE_BINARY_DIR}/lib/*.dll")
-endif(UNIX)
+endif()
message(STATUS "LIBS_TO_INSTALL=${LIBS_TO_INSTALL}")
-#install(FILES ${LIBS_TO_INSTALL} DESTINATION ${LIB_DIR})
+install(FILES ${LIBS_TO_INSTALL} DESTINATION ${LIB_DIR})
install(FILES
- "${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION_STRING}.sql"
+ "${CMAKE_BINARY_DIR}/lib/pgrouting--${PGROUTING_VERSION}.sql"
"${CMAKE_BINARY_DIR}/lib/pgrouting.control"
${VERSION_UPDATE_FILES}
DESTINATION "${SHARE_DIR}")
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
new file mode 100644
index 0000000..528083a
--- /dev/null
+++ b/CONTRIBUTING.md
@@ -0,0 +1,42 @@
+# How to contribute
+
+We are really glad you are reading this, because we need volunteer developers to help this project.
+
+If you have not already, come find us in [](https://gitter.im/pgRouting/pgrouting?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) or contact us via [mailing list](http://lists.osgeo.org/mailman/listinfo/pgrouting-dev). We want you working on things you're excited about. Drop a message and if some one can assist you, will contact you back ASAP.
+
+Here are some important resources:
+
+ * [pgRouting for Developers](http://docs.pgrouting.org/doxy/2.4/index.html) has the internals C/C++ code information,
+ * [Wish list on the wiki](https://github.com/pgRouting/pgrouting/wiki/GSoC-Ideas) is the foot view of what we think the community needs.
+ * [Additional wish lst](https://github.com/pgRouting/pgrouting/issues?q=is%3Aopen+is%3Aissue+label%3A%22Functionality+Request%22). (TODO to move the information to the wiki wish list)
+ * Participate on the [discussions](https://github.com/pgRouting/pgrouting/issues?q=is%3Aopen+is%3Aissue+label%3ADiscussion).
+ * Participate fixing [Documentation](https://github.com/pgRouting/pgrouting/issues?q=is%3Aopen+is%3Aissue+label%3ADocumentation).
+ * Find a bug? [Let us know](https://github.com/pgRouting/pgrouting/issues).
+
+## Contribution agreement
+
+Any kind of contribution will automatically fall to the following Licences:
+
+- Code contribution: GNU GENERAL PUBLIC LICENSE Version 2,
+ - Directly by making a pul explicit pull request.
+ - Indirectly by posting code on issues/wiki/gitter/mailng lists
+- Documentation contribution:
+ - Creative Commons Attribution-Share Alike 3.0
+
+## Submitting changes
+
+
+Write a clear log message for your commits. One-line messages are fine for small changes, but bigger changes should have more information.
+Fill the commit message template.
+
+## Coding conventions
+
+Start reading our code and you'll get the hang of it. We optimize for readability:
+This is open source software. Consider the people who will read your code, and make it look nice for them.
+
+ * We indent using four spaces (soft tabs)
+ * We use cpplint for linting C/C++ code.
+
+Thanks,
+pgRouting team
+
diff --git a/NEWS b/NEWS
index 24d59dd..d865619 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,27 @@
+Changes for 2.4.0
+-------------------------------------------------------------------------------
+
+* New Signatures:
+ * pgr_bdDijkstra
+* New Proposed functions
+ * pgr_maxFlow
+ * pgr_astar(one to many)
+ * pgr_astar(many to one)
+ * pgr_astar(many to many)
+ * pgr_astarCost(one to one)
+ * pgr_astarCost(one to many)
+ * pgr_astarCost(many to one)
+ * pgr_astarCost(many to many)
+ * pgr_astarCostMatrix
+* Deprecated Signatures
+ * pgr_bddijkstra - use pgr_bdDijkstra instead
+* Deprecated functions
+ * pgr_pointsToVids
+* Bug fixes on proposed functions
+ * pgr_withPointsKSP: fixed ordering
+* TRSP original code is used with no changes on the compilation warnings
+
Changes for 2.3.2
-------------------------------------------------------------------------------
@@ -20,7 +43,7 @@ Changes for 2.3.1
Changes for 2.3.0
-------------------------------------------------------------------------------
-- New Signatures:
+* New Signatures:
* pgr_TSP
* pgr_aStar
@@ -50,7 +73,7 @@ Changes for 2.3.0
* Deprecated functions
* pgr_flip_edges
- * pgr_vidsToDmatrix
+ * pgr_vidsToDmatrix(2 signatures)
* pgr_pointsToDMatrix
* pgr_textToPoints
@@ -87,55 +110,57 @@ Changes for 2.2.0
- Adding a row_where and outall optional parameters
- Signature fix
- - pgr_dijkstra -- to match what was documented (the pgr_dijkstra from V2.0)
+ - pgr_dijkstra -- to match what was documented on the pgr_dijkstra from V2.0
- New functions
- pgr_floydWarshall
- pgr_Johnson
- - pgr_DijkstraCost
+ - pgr_dijkstraCost(one to one)
+ - pgr_dijkstraCost(one to many)
+ - pgr_dijkstraCost(many to one)
+ - pgr_dijkstraCost(many to many)
- New Proposed functions
- - pgr_withPoints
- - pgr_withPointsCost
- - pgr_withPointsDD
+ - pgr_withPoints(one to one)
+ - pgr_withPoints(one to many)
+ - pgr_withPoints(many to one)
+ - pgr_withPoints(many to many)
+ - pgr_withPointsCost(one to one)
+ - pgr_withPointsCost(one to many)
+ - pgr_withPointsCost(many to one)
+ - pgr_withPointsCost(many to many)
+ - pgr_withPointsDD(single vertex)
+ - pgr_withPointsDD(multiple vertices)
- pgr_withPointsKSP
- pgr_dijkstraVia
- Deprecated functions:
- pgr_apspWarshall use pgr_floydWarshall instead
- - pgr_apspJohnson use pgr_Johnson instead
+ - pgr_apspJohnson use pgr_johnson instead
- pgr_kDijkstraCost use pgr_dijkstraCost instead
- pgr_kDijkstraPath use pgr_dijkstra instead
-
+ - pgr_makeDistanceMatrix
Changes for 2.1.0
-------------------------------------------------------------------------------
- - A C and C++ library for developer was created
-
- - encapsulates postgreSQL related functions
- - encapsulates Boost.Graph graphs
-
- - Directed Boost.Graph
- - Undirected Boost.graph.
- - allow any-integer in the id's
- - allow any-numerical on the cost/reverse_cost columns
+ - New Signatures
+ - pgr_dijkstra(one to many)
+ - pgr_dijkstra(many to one)
+ - pgr_dijkstra(many to many)
+ - pgr_drivingDistance(multiple vertices)
- - Three Functions where completely re-factored using the developers library and functionality was added.
+ - Three Functions where completely re-factored
- - pgr_dijkstra
+ - pgr_dijkstra(one to one)
- pgr_ksp
- - pgr_drivingDistance
+ - pgr_drivingDistance(single vertex)
- Improved
- Alphashape function now can generate better polygons with holes and custom parameter
-
- - Instead of generating many libraries:
- - All functions are encapsulated in one library
- - The library has a the prefix 2-1-0
+ - pgr_alphaShape function now can generate better polygons with holes and custom parameter
- Added proposed functions to be evaluated:
- Proposed functions from Steve Woodbridge, (Classified as Convenience by the author.)
@@ -149,7 +174,33 @@ Changes for 2.1.0
- Added proposed functions from GSoc Projects:
- pgr_vrppdtw
+ - pgr_vrponedepot
+
+ - Deprecated functions
+ - pgr_getColumnName
+ - pgr_getTableName
+ - pgr_isColumnCndexed
+ - pgr_isColumnInTable
+ - pgr_quote_ident
+ - pgr_versionless
+ - pgr_startPoint
+ - pgr_endPoint
+ - pgr_pointToId
+
+ - Instead of generating many libraries:
+ - All functions are encapsulated in one library
+ - The library has a the prefix 2-1-0
+
+ - A C and C++ library for developer was created
+
+ - encapsulates postgreSQL related functions
+ - encapsulates Boost.Graph graphs
+ - Directed Boost.Graph
+ - Undirected Boost.graph
+
+ - allow any-integer in the id's
+ - allow any-numerical on the cost/reverse_cost columns
- Removed the 1.x legacy functions
- Some bug fixes in other functions
@@ -179,6 +230,7 @@ Changes for 2.0.0
* Support for ``st_`` PostGIS function prefix
* Added ``pgr_`` prefix to functions and types
* Better documentation: http://docs.pgrouting.org
+* shooting_star is discontinued
Changes for release 1.05
diff --git a/README.md b/README.md
index a38faae..a5f5e13 100644
--- a/README.md
+++ b/README.md
@@ -6,8 +6,8 @@
### Branches
-* The *master* branch has the latest minor release. (2.3.2)
-* The *develop* branch has the next minor release. (2.4.0)
+* The *master* branch has the latest minor release. (2.4.0)
+* The *develop* branch has the next minor release. (2.5.0-dev)
For the complete list of releases go to:
https://github.com/pgRouting/pgrouting/releases
@@ -51,11 +51,10 @@ https://github.com/pgRouting/pgrouting/releases
</tr>
</table>
-* travis: Postgis 2.3.0 for Postgres 9.4, 9.5, 9.6
+* travis: Postgis 2.2 for Postgres 9.1, 9.2, 9.3, 9.4, 9.5
* precise
- * trusty (except 9.4)
-* jenkins: g++ 4.8 on 32 & 64 bits for Postgis 2.3.0 and Postgres 9.4, 9.5, 9.6
-* appveyor: vs1013 Postgis 2.3.0 Postgres 9.4
+* jenkins: g++ 4.8 on 32 & 64 bits for Postgis 2.3.0dev and Postgres 9.4, 9.5, 9.6
+* appveyor: vs1013 Postgis 2.2 Postgres 9.4
@@ -95,18 +94,24 @@ Family of functions include:
## REQUIREMENTS
+Building reqirements
+--------------------
+* perl
* C and C++ compilers
- * g++ >= 4.6
-* Postgresql version >= 9.1
-* PostGIS version >= 2.0
-* The Boost Graph Library (BGL).
- * Version >= 1.46
-* Version >= 1.55 for linux
-* Version >= 1.58 for MAC
+ * GNU >= 4.6
+ * MSVC >= 18.0
+* Postgresql >= 9.2
+* The Boost Graph Library (BGL) >= 1.46
* CMake >= 2.8.8
* CGAL >= 4.4
* Sphinx >= 1.2
+
+User's reqirements
+--------------------
+
+* PostGIS >= 2.0
+
## INSTALLATION
See online documentation: http://docs.pgrouting.org/
@@ -135,7 +140,7 @@ Build with documentation (requires [Sphinx](http://sphinx-doc.org/))
cmake -DWITH_DOC=ON ..
-Postgresql 9.1+
+Postgresql 9.2+
createdb mydatabase
psql mydatabase -c "CREATE EXTENSION postgis"
diff --git a/VERSION b/VERSION
index d503826..a3d3788 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-4080-1f2af3c52 master
+4681-6cf07edf1 master
diff --git a/Vagrantfile b/Vagrantfile
deleted file mode 100644
index cec0d0d..0000000
--- a/Vagrantfile
+++ /dev/null
@@ -1,24 +0,0 @@
-# -*- mode: ruby -*-
-# vi: set ft=ruby :
-
-pgbox = ENV['BOX'] || "precise64"
-postgres = ENV['POSTGRESQL_VERSION'] || "9.1"
-postgis = ENV['POSTGIS_VERSION'] || "2.0"
-
-Vagrant.configure("2") do |config|
-
- # Vagrant box configuration
- config.vm.box = pgbox
- config.vm.box_url = "http://files.vagrantup.com/%s.box" % [pgbox]
-
- # Bootstrap script
- config.vm.provision :shell, :path => "tools/vagrant/bootstrap.sh", :args => "%s %s" % [postgres, postgis]
-
- # Forward SSH agent to host
- config.ssh.forward_agent = true
-
- # Create synced folder for GnuPG keys and within home directory
- config.vm.synced_folder "../", "/home/vagrant/repos"
- config.vm.synced_folder "~/.gnupg", "/home/vagrant/.gnupg"
-
-end
diff --git a/appveyor.yml b/appveyor.yml
index ce9ef39..e02bc80 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -5,7 +5,7 @@
# Main configuration
# ------------------------------------------------------------------------------
-version: 2.3.{build}
+version: 2.4.{build}
image: Visual Studio 2013
configuration: Release
diff --git a/cmake/CMakeLists.txt b/cmake/CMakeLists.txt
deleted file mode 100644
index 1a27c2a..0000000
--- a/cmake/CMakeLists.txt
+++ /dev/null
@@ -1,3 +0,0 @@
-# install the cmake files
-
-file(GLOB cmakeFiles "${CMAKE_CURRENT_SOURCE_DIR}/*.cmake")
\ No newline at end of file
diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt
index 031f160..e429439 100644
--- a/doc/CMakeLists.txt
+++ b/doc/CMakeLists.txt
@@ -18,21 +18,37 @@ option(BUILD_HTML
option(BUILD_MAN
"Set ON|OFF (default=ON) to build Documentation library tree as MAN page" OFF)
-set(SPHINX_THEME "haiku")
-#set(SPHINX_THEME_DIR "_themes")
+option(DOC_USE_BOOTSTRAP
+ "Set ON|OFF (default=ON) to build Documentation library tree as MAN page" OFF)
+
if(WITH_DOC)
+ #message("PROCESSING DOCUMENTATION------------")
+
+ find_package(Sphinx REQUIRED)
+
+ if (DOC_USE_BOOTSTRAP)
+ set(SPHINX_INCLUDE "import sphinx_bootstrap_theme")
+ set(SPHINX_THEME "bootstrap")
+ set(SPHINX_THEME_DIR "sphinx_bootstrap_theme.get_html_theme_path()")
+ set(SPHINX_THEME_OPTIONS "'source_link_position': \"none\",")
+ else()
+ set(SPHINX_INCLUDE "")
+ set(SPHINX_THEME "haiku")
+ set(SPHINX_THEME_DIR "['']")
+ set(SPHINX_THEME_OPTIONS "")
+ endif()
+
- find_package(Sphinx "${SPHINX_MINIMUM_VERSION}")
if (NOT SPHINX_FOUND)
message(WARNING "Sphinx not found. Cannot generate documentation!")
else()
if (SPHINX_VERSION VERSION_LESS 1.0)
message(WARNING "Your Sphinx version is too old!
- This project requires Sphinx v1.0 or above to produce
- proper documentation (you have v${SPHINX_VERSION}).
- You will get output but it will have errors.")
+ This project requires Sphinx v1.0 or above to produce
+ proper documentation (you have v${SPHINX_VERSION}).
+ You will get output but it will have errors.")
endif()
if(NOT DEFINED SPHINX_THEME)
@@ -44,18 +60,42 @@ if(WITH_DOC)
endif()
# configured documentation tools and intermediate build results
- set(BINARY_BUILD_DIR "${PGROUTING_BINARY_DIR}/doc/_build")
+ set(PGR_DOCUMENTATION_BUILD_DIR "${PGROUTING_BINARY_DIR}/doc/_build")
+ set(PGR_DOCUMENTATION_SOURCE_DIR "${PGROUTING_BINARY_DIR}/doc")
+
+ message(STATUS "PGR_DOCUMENTATION_BUILD_DIR = ${PGR_DOCUMENTATION_BUILD_DIR}")
- message(STATUS "BINARY_BUILD_DIR = ${BINARY_BUILD_DIR}")
- message(STATUS "PGROUTING_BINARY_DIR = ${PGROUTING_BINARY_DIR}")
+ # ---------- TO FLATTEN THE DOCUMENTATION ---------
+
+ file(GLOB PGR_DOCUMENTATION_SOURCES "src/*")
+ foreach (file ${PGR_DOCUMENTATION_SOURCES})
+ #message("${file}")
+ file(COPY "${file}" DESTINATION "${PGR_DOCUMENTATION_SOURCE_DIR}")
+ endforeach()
+
+ file(GLOB PGR_DOCUMENTATION_SOURCES "../src/*/doc/*")
+ foreach (file ${PGR_DOCUMENTATION_SOURCES})
+ #message("${file}")
+ file(COPY "${file}" DESTINATION "${PGR_DOCUMENTATION_SOURCE_DIR}")
+ endforeach()
+
+ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/index.rst" DESTINATION "${PGR_DOCUMENTATION_SOURCE_DIR}")
+ file(COPY "../tools/testers/sampledata.sql" DESTINATION "${PGR_DOCUMENTATION_SOURCE_DIR}/sampledata/")
+
+
+ #message(STATUS "PGROUTING_BINARY_DIR = ${PGROUTING_BINARY_DIR}")
# Sphinx cache with pickled ReST documents
set(SPHINX_CACHE_DIR "${PGROUTING_BINARY_DIR}/doc/_doctrees")
- file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/static" DESTINATION "${BINARY_BUILD_DIR}")
- file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/themes" DESTINATION "${BINARY_BUILD_DIR}")
+ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/static" DESTINATION "${PGR_DOCUMENTATION_BUILD_DIR}")
+ file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/themes" DESTINATION "${PGR_DOCUMENTATION_BUILD_DIR}")
file(COPY "${CMAKE_CURRENT_SOURCE_DIR}/CNAME" DESTINATION "${PGROUTING_BINARY_DIR}")
+ #configure_file(
+ # "${CMAKE_CURRENT_SOURCE_DIR}/index.html.in"
+ # "${PGROUTING_BINARY_DIR}/doc/html/index.html")
+
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/forward.html"
"${PGROUTING_BINARY_DIR}/doc/html/en/index.html")
@@ -63,7 +103,7 @@ if(WITH_DOC)
# Add documentation to targets
set(DOC_TARGETS html)
- option(BUILD_MAN "Create a target for building man pages." ON)
+ #option(BUILD_MAN "Create a target for building man pages." ON)
if (BUILD_MAN)
if (SPHINX_VERSION VERSION_LESS 1.0)
@@ -73,7 +113,7 @@ if(WITH_DOC)
endif()
endif()
- option(BUILD_LATEX "Create a target for building latex docs (to create PDF)." ON)
+ #option(BUILD_LATEX "Create a target for building latex docs (to create PDF)." ON)
if (BUILD_LATEX)
find_package(LATEX)
@@ -96,22 +136,23 @@ if(WITH_DOC)
configure_file(
"${CMAKE_CURRENT_SOURCE_DIR}/conf.py.in"
- "${BINARY_BUILD_DIR}/conf.py"
+ "${PGR_DOCUMENTATION_BUILD_DIR}/conf.py"
@ONLY)
foreach (DOC_TARGET ${DOC_TARGETS})
add_custom_command(
TARGET doc POST_BUILD
COMMAND ${SPHINX_EXECUTABLE}
- # -q # Enable for quiet mode
- # -Q # Enable for even more quiet mode
- -b ${DOC_TARGET}
- -E # don't use a saved environment, always read all file
- -a # write all files; default is to only write new and changed files
- -d "${SPHINX_CACHE_DIR}"
- -c "${BINARY_BUILD_DIR}"
- "${PGROUTING_SOURCE_DIR}"
- "${PGROUTING_BINARY_DIR}/doc/${DOC_TARGET}/en"
+ # -q # Enable for quiet mode
+ # -Q # Enable for even more quiet mode
+ # -v # increase verbosity
+ -b ${DOC_TARGET}
+ -E # don't use a saved environment, always read all file
+ -a # write all files; default is to only write new and changed files
+ -d "${SPHINX_CACHE_DIR}"
+ -c "${PGR_DOCUMENTATION_BUILD_DIR}"
+ "${PGR_DOCUMENTATION_SOURCE_DIR}"
+ "${PGROUTING_BINARY_DIR}/doc/${DOC_TARGET}/en"
COMMENT "Generating ${DOC_TARGET} documentation ...")
endforeach()
@@ -119,9 +160,11 @@ if(WITH_DOC)
if(LATEX_COMPILER)
add_custom_command(
TARGET doc POST_BUILD
+ #fixes: Underfull \hbox (badness 10000) in paragraph
+ #perl -pi -e 's/warning/warning /' pgRoutingDocumentation.tex
COMMAND pdflatex
- -interaction=nonstopmode
- "pgRoutingDocumentation.tex" > /dev/null 2>&1
+ -interaction=nonstopmode
+ "pgRoutingDocumentation.tex" > /dev/null 2>&1
WORKING_DIRECTORY "${PGROUTING_BINARY_DIR}/doc/latex/en"
COMMENT "Converting Latex to PDF format")
@@ -132,4 +175,5 @@ if(WITH_DOC)
message("-- Building documentation enabled for: ${DOC_TARGETS}")
endif()
+ #message("END PROCESSING DOCUMENTATION------------")
endif(WITH_DOC)
diff --git a/doc/conf.py.in b/doc/conf.py.in
index 9f5da17..b9c2bf8 100644
--- a/doc/conf.py.in
+++ b/doc/conf.py.in
@@ -12,6 +12,7 @@
# serve to show the default.
import sys, os
+ at SPHINX_INCLUDE@
# If extensions (or modules to document with autodoc) are in another directory,
# add these directories to sys.path here. If the directory is relative to the
@@ -38,21 +39,20 @@ source_suffix = '.rst'
#source_encoding = 'utf-8-sig'
# The master toctree document.
-master_doc = 'doc/index'
+master_doc = 'index'
# General information about the project.
project = u'pgRouting'
-copyright = u'pgRouting Contributors - Version @PGROUTING_VERSION_STRING@'
+copyright = u'pgRouting Contributors - Version @PGROUTING_FULL_VERSION@'
# The version info for the project you're documenting, acts as replacement for
# |version| and |release|, also used in various other places throughout the
# built documents.
#
# The short X.Y version.
-version = '@PGROUTING_VERSION_STRING@'
+version = '@PGROUTING_FULL_VERSION@'
# The full version, including alpha/beta/rc tags.
-release = '@PGROUTING_VERSION_STRING@ (@PGROUTING_GIT_BRANCH@)'
-#release = '@PGROUTING_VERSION_STRING@ (@PGROUTING_GIT_TAG@)'
+release = '@PGROUTING_FULL_VERSION@'
# The language for content autogenerated by Sphinx. Refer to documentation
# for a list of supported languages.
@@ -70,9 +70,8 @@ gettext_compact = False
# directories to ignore when looking for source files.
exclude_patterns = [
'doc/build',
- 'src/shooting_star/doc/index.rst',
- 'src/withPoints/doc/pgr_withPointsVia.rst',
- 'src/travelingSalesPerson',
+ 'pgr_withPointsVia.rst',
+ 'maxFlowApplications.rst',
'*/notUsed',
'tools/template'
]
@@ -107,16 +106,17 @@ html_theme = '@SPHINX_THEME@'
# Theme options are theme-specific and customize the look and feel of a theme
# further. For a list of options available for each theme, see the
# documentation.
-#html_theme_options = {}
+html_theme_options = {
+ @SPHINX_THEME_OPTIONS@
+ }
# Add any paths that contain custom themes here, relative to this directory.
-html_theme_path = ['@SPHINX_THEME_DIR@']
+html_theme_path = @SPHINX_THEME_DIR@
# The name for this set of Sphinx documents. If None, it defaults to
# "<project> v<release> documentation".
-#html_title = "pgRouting Manual (@PGROUTING_VERSION_STRING@) (@PGROUTING_GIT_BRANCH@)"
-html_title = "pgRouting Manual (@PGROUTING_VERSION@)"
+html_title = "pgRouting Manual (@PGROUTING_SHORT_VERSION@@PGROUTING_VERSION_DEV@)"
# A shorter title for the navigation bar. Default is the same as html_title.
diff --git a/doc/deprecated.rst b/doc/deprecated.rst
deleted file mode 100644
index 27948fa..0000000
--- a/doc/deprecated.rst
+++ /dev/null
@@ -1,112 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _deprecated:
-
-Deprecated Functions
-====================
-
-.. warning:: These functions are deprecated!!!
-
- * That means they have been replaced by new functions or are no longer supported, and may be removed from future versions.
- * All code that uses the functions should be converted to use its replacement if one exists.
-
-
-Deprecated on version 2.3
-----------------------------
-
-Routing functions
-...................
-
-- :ref:`pgr_astar-V2.0` - See new signatures of :ref:`pgr_aStar`
-- :ref:`pgr_tsp-V2.0` - See new signatures of :ref:`tsp`
-
-
-Auxiliary functions
-...................
-
-- :ref:`pgr_flip_edges`
-- :ref:`pgr_vids_to_dmatrix`
-- :ref:`pgr_vids_to_dmatrix2`
-- :ref:`pgr_points_to_dmatrix`
-- :ref:`pgr_text_to_points`
-
-
-.. toctree::
- :hidden:
-
- ../src/astar/doc/pgr_astar-v2
- ../src/tsp/doc/pgr_tsp-V2.0
- ../src/convenience/doc/pgr_flipEdges
- ../src/convenience/doc/pgr_vidsToDMatrix
- ../src/convenience/doc/pgr_vidsToDMatrix2
- ../src/convenience/doc/pgr_pointsToDMatrix
- ../src/convenience/doc/pgr_textToPoints
-
-
-Deprecated on version 2.2
-----------------------------
-
-Routing functions
-...................
-
-- :ref:`pgr_apsp_johnson` - Replaced with :ref:`pgr_johnson`
-- :ref:`pgr_apsp_warshall` - Replaced with :ref:`pgr_floydWarshall`
-- :ref:`pgr_kdijkstra` - Replaced with :ref:`pgr_dijkstraCost` and :ref:`pgr_dijkstra` (one to many)
-
-.. toctree::
- :hidden:
-
- ../src/apsp_johnson/doc/pgr_apspJohnson
- ../src/apsp_warshall/doc/pgr_apspWarshall
- ../src/kdijkstra/doc/pgr_kDijkstra
-
-
-Deprecated on version 2.1
-------------------------------------------
-
-Routing functions
-...................
-
-- :ref:`pgr_dijkstra_v2` - See new signature in :ref:`pgr_dijkstra` (one to one)
-- :ref:`pgr_ksp_v2` - See new signature in :ref:`pgr_ksp`
-- :ref:`pgr_driving_distance_v2` - See new signature in :ref:`pgr_drivingDistance`
-
-
-Auxiliary functions
-...................
-
-- :ref:`pgr_get_column_name`
-- :ref:`pgr_get_table_name`
-- :ref:`pgr_is_column_indexed`
-- :ref:`pgr_is_column_in_table`
-- :ref:`pgr_quote_ident`
-- :ref:`pgr_versionless`
-- :ref:`pgr_start_point`
-- :ref:`pgr_end_point`
-
-
-
-.. toctree::
- :hidden:
-
- ../src/dijkstra/doc/pgr_dijkstra_v2
- ../src/ksp/doc/pgr_ksp_v2
- ../src/driving_distance/doc/pgr_drivingDistance_v2
- ../src/common/doc/utilities/get_column_name
- ../src/common/doc/utilities/get_table_name
- ../src/common/doc/utilities/is_column_indexed
- ../src/common/doc/utilities/is_column_in_table
- ../src/common/doc/utilities/point_to_id
- ../src/common/doc/utilities/quote_ident
- ../src/common/doc/utilities/versionless
- ../src/common/doc/utilities/start_point
- ../src/common/doc/utilities/end_point
-
-
diff --git a/doc/index.rst b/doc/index.rst
index f555655..64c2729 100644
--- a/doc/index.rst
+++ b/doc/index.rst
@@ -17,184 +17,123 @@ pgRouting extends the `PostGIS <http://postgis.net>`_/`PostgreSQL <http://postgr
This is the manual for pgRouting |release|.
-.. image:: static/images/ccbysa.png
+.. image:: _build/static/images/ccbysa.png
:align: left
:alt: Creative Commons Attribution-Share Alike 3.0 License
The pgRouting Manual is licensed under a `Creative Commons Attribution-Share Alike 3.0 License <http://creativecommons.org/licenses/by-sa/3.0/>`_. Feel free to use this material any way you like, but we ask that you attribute credit to the pgRouting Project and wherever possible, a link back to http://pgrouting.org. For other licenses used in pgRouting see the :ref:`license` page.
-*******************************************************************************
General
-*******************************************************************************
+===============================================================================
.. toctree::
:maxdepth: 2
- src/introduction/introduction
- src/installation/installation
- src/installation/build
- src/introduction/support
-
-
-*******************************************************************************
-Tutorial
-*******************************************************************************
+ pgRouting-introduction
+ pgRouting-installation
+ support
-:ref:`Tutorial <tutorial1>`
-
- - :ref:`Getting started <tutorial>`
- - :ref:`topology` for an overview of a topology for routing algorithms.
- - :ref:`analytics` for an overview of the analysis of a graph.
- - :ref:`custom_query` that is used in the routing algorithms.
- - :ref:`performance` to improve your performance.
- - :ref:`recipes`
- - :ref:`developer`
-
-For a more complete introduction how to build a routing application read the `pgRouting Workshop <http://workshop.pgrouting.org>`_.
+- :ref:`sampledata` that is used in the examples of this manual.
.. toctree::
:hidden:
- src/tutorial/index
- src/recipes/index
- src/developer/developer_guide
-
-*******************************************************************************
-Sample Data
-*******************************************************************************
-
- - :ref:`sampledata` that is used in the examples of this manual.
+ sampledata
-.. toctree::
- :hidden:
+:ref:`Pgrouting Concepts <pgrouting_concepts>`
+===============================================================================
- src/developer/sampledata
+.. include:: pgRouting-concepts.rst
+ :start-after: concepts_start
+ :end-before: concepts_end
+.. toctree::
+ :hidden:
-*******************************************************************************
-Functions
-*******************************************************************************
+ pgRouting-concepts
+
-Version
-===============================================================================
+.. rubric:: Reference
:ref:`pgr_version` - to get pgRouting's version information.
.. toctree::
:hidden:
- ../src/common/doc/pgr_version
-
+ pgr_version
-
-Data Types
+:ref:`Data Types <data_types>`
===============================================================================
-:ref:`data_types`
- - :ref:`type_cost_result` - A set of records to describe a path result with cost attribute.
- - :ref:`pgr_costResult3[]<type_cost_result3>` - A set of records to describe a path result with cost attribute.
- - :ref:`pgr_geomResult<type_geom_result>` - A set of records to describe a path result with geometry attribute.
+- :ref:`type_cost_result` - A set of records to describe a path result with cost attribute.
+- :ref:`pgr_costResult3[]<type_cost_result3>` - A set of records to describe a path result with cost attribute.
+- :ref:`pgr_geomResult<type_geom_result>` - A set of records to describe a path result with geometry attribute.
.. toctree::
:hidden:
- ../src/common/doc/types/index
+ types_index
-*******************************************************************************
-Topology functions
-*******************************************************************************
-
-:ref:`topology_functions`
+:ref:`Topology Functions <topology_functions>`
+===============================================================================
- - :ref:`pgr_create_topology` - to create a topology based on the geometry.
- - :ref:`pgr_create_vert_table` - to reconstruct the vertices table based on the source and target information.
- - :ref:`pgr_analyze_graph` - to analyze the edges and vertices of the edge table.
- - :ref:`pgr_analyze_oneway` - to analyze directionality of the edges.
- - :ref:`pgr_node_network` -to create nodes to a not noded edge table.
+- :ref:`pgr_create_topology` - to create a topology based on the geometry.
+- :ref:`pgr_create_vert_table` - to reconstruct the vertices table based on the source and target information.
+- :ref:`pgr_analyze_graph` - to analyze the edges and vertices of the edge table.
+- :ref:`pgr_analyze_oneway` - to analyze directionality of the edges.
+- :ref:`pgr_node_network` -to create nodes to a not noded edge table.
.. toctree::
:hidden:
- ../src/topology/doc/topology
+ topology-functions
-*******************************************************************************
-Routing Functions
-*******************************************************************************
+:ref:`Routing functions <routing_functions>`
+===============================================================================
-..
- ROUTING FUNCTIONS SECTION
- :hidden:
- :maxdepth: 0
-
.. toctree::
+ :hidden:
+
+ routingFunctions
- ../src/routingFunctions
-.. include:: ../src/routingFunctions.rst
+.. include:: routingFunctions.rst
:start-after: from-here
:end-before: to-here
-*******************************************************************************
Available Functions but not official pgRouting functions
-*******************************************************************************
+===============================================================================
-- :ref:`proposedNext`
+- :ref:`stable`
- :ref:`proposed`
.. toctree::
:hidden:
- ../src/proposedNext
- ../src/proposed
-
-
-*******************************************************************************
-Discontinued & Deprecated Functions
-*******************************************************************************
-
- - :ref:`discontinued`
- - :ref:`deprecated`
-
-.. toctree::
- :hidden:
-
- src/developer/discontinued
- deprecated
+ proposed
+:ref:`Change Log <change_log>`
+===============================================================================
-*******************************************************************************
-Change Log
-*******************************************************************************
+.. include:: release_notes.rst
+ :start-after: changelog start
+ :end-before: changelog end
-:ref:`change_log`
-
- - :ref:`changelog_2_3_2`
- - :ref:`changelog_2_3_1`
- - :ref:`changelog_2_3_0`
- - :ref:`changelog_2_2_4`
- - :ref:`changelog_2_2_3`
- - :ref:`changelog_2_2_2`
- - :ref:`changelog_2_2_1`
- - :ref:`changelog_2_2_0`
- - :ref:`changelog_2_1_0`
- - :ref:`changelog_2_0_1`
- - :ref:`changelog_2_0_0`
- - :ref:`changelog_1_x`
.. toctree::
:hidden:
- src/changelog/release_notes
+ release_notes
.. rubric:: Indices and tables
diff --git a/doc/src/developer/developer_guide.rst b/doc/src/developer/developer_guide.rst
deleted file mode 100644
index a49fa80..0000000
--- a/doc/src/developer/developer_guide.rst
+++ /dev/null
@@ -1,174 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _developer:
-
-Developer's Guide
-===============================================================================
-
-This contains some basic comments about developing.
-More detailed information can be found on:
-
-http://docs.pgrouting.org/doxy/2.2/index.html
-
-Source Tree Layout
--------------------------------------------------------------------------------
-
-*cmake/*
- cmake scripts used as part of our build system.
-
-*src/*
- This is the algorithm source tree. Each algorithm is to be contained
- in its on sub-tree with /doc, /sql, /src, and /test sub-directories.
-
-For example:
-
- - ``src/dijkstra`` Main direcotry for dijkstra algorithm.
- - ``src/dijkstra/doc`` Dijkstra's documentation directory.
- - ``src/dijkstra/src`` Dijkstra's C and/or C++ code.
- - ``src/dijkstra/sql`` Dijkstra's sql code.
- - ``src/dijkstra/test`` Dijkstra's tests.
- - ``src/dijkstra/test/pgtap`` Dijkstra's pgTaptests.
-
-
-Tools
--------------------------------------------------------------------------------
-
-*tools/*
- Miscellaneous scripts and tools.
-
-pre-commit
-**********
-
-To keep version/branch/commit up to date install pelase do the following:
-
-.. code-block:: bash
-
- cp tools/pre-commit .git/hooks/pre-commit
-
-After each commit a the file **VERSION** will remain. (The hash number will be one behind)
-
-
-
-doxygen
-*******
-
-To use doxygen:
-
-
-.. code-block:: bash
-
- cd tools/doxygen/
- make
-
-The code's documentation can be found in:
-
-
-.. code-block:: bash
-
- build/doxy/html/index.html
-
-
-cpplint
-*******
-
-We try to follow the following guidelines for C++ coding:
-
-https://google-styleguide.googlecode.com/svn/trunk/cppguide.html
-
-Sample use:
-
-.. code-block:: bash
-
- python cpplint.py ../src/dijkstra/src/dijkstra_driver.h
- ../src/dijkstra/src/dijkstra_driver.h:34: Lines should be <= 80 characters long [whitespace/line_length] [2]
- ../src/dijkstra/src/dijkstra_driver.h:40: Line ends in whitespace. Consider deleting these extra spaces. [whitespace/end_of_line] [4]
- Done processing ../src/dijkstra/src/dijkstra_driver.h
- Total errors found: 2
-
-
-- Maybe line 34 is a very complicated calculation so you can just ignore the message
-- Delete whitespace at end of line is easy fix.
-- Use your judgement!!!
-
-Some files like ``postgres.h`` are system dependent so don't include the directory.
-
-
-Other tools
-***********
-
-Tools like:
- - doit
- - winnie
- - publish_doc.sh
-
-are very specific for the deployment of new versions, so please ask first!
-
-Documentation Layout
--------------------------------------------------------------------------------
-
-.. note::
- All documentation should be in reStructuredText format.
- See: <http://docutils.sf.net/rst.html> for introductory docs.
-
-
-Documentation is distributed into the source tree. This top level "doc"
-directory is intended for high level documentation cover subjects like:
-
- * Compiling and testing
- * Installation
- * Tutorials
- * Users' Guide front materials
- * Reference Manual front materials
- * etc
-
-Since the algorithm specific documentation is contained in the source
-tree with the algorithm specific files, the process of building the
-documentation and publishing it will need to assemble the details with
-the front material as needed.
-
-Also, to keep the "doc" directory from getting cluttered, each major book
-like those listed above, should be contained in a separate directory under
-"doc". Any images or other materials related to the book should also be kept
-in that directory.
-
-
-Testing Infrastructure
-************************************
-
-Tests are part of the tree layout:
-
- - ``src/dijkstra/test`` Dijkstra's tests.
-
- - ``test.conf`` Configuration file.
- - ``<name>.test.sql`` Test file
- - ``<name>.result`` Results file bash
-
- - ``src/dijkstra/test/pgtap`` Dijkstra's pgTaptests.
-
- - ``<name>.sql`` pgTap test file
-
-
-.. rubric:: Testing
-
-Testing is executed from the top level of the tree layout:
-
-.. code-block:: bash
-
- tools/testers/algorithm-tester.pl
- createdb -U <user> ___pgr___test___
- sh ./tools/testers/pg_prove_tests.sh <user>
- dropdb -U <user> ___pgr___test___
-
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/doc/src/developer/discontinued.rst b/doc/src/developer/discontinued.rst
deleted file mode 100644
index 444815e..0000000
--- a/doc/src/developer/discontinued.rst
+++ /dev/null
@@ -1,26 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _discontinued:
-
-Discontinued Functions
-===============================================================================
-
-Especially with new major releases functionality may change and functions may be discontinued for various reasons.
-Functionality that has been discontinued will be listed here.
-
-
-.. _shooting_star:
-
-Shooting Star algorithm
-********************************************************************************
-
-:Version: Discontinued on 2.0.0
-:Reasons: Unresolved bugs, no maintainer, replaced with :ref:`trsp`
-:Comment: Please :ref:`contact us <support>` if you're interested to sponsor or maintain this algorithm.
diff --git a/doc/src/developer/images/Fig1-originalData.png b/doc/src/images/Fig1-originalData.png
similarity index 100%
rename from doc/src/developer/images/Fig1-originalData.png
rename to doc/src/images/Fig1-originalData.png
diff --git a/doc/src/developer/images/Fig2-cost.png b/doc/src/images/Fig2-cost.png
similarity index 100%
rename from doc/src/developer/images/Fig2-cost.png
rename to doc/src/images/Fig2-cost.png
diff --git a/doc/src/developer/images/Fig4-costUndirected.png b/doc/src/images/Fig4-costUndirected.png
similarity index 100%
rename from doc/src/developer/images/Fig4-costUndirected.png
rename to doc/src/images/Fig4-costUndirected.png
diff --git a/doc/src/developer/images/Fig6-undirected.png b/doc/src/images/Fig6-undirected.png
similarity index 100%
rename from doc/src/developer/images/Fig6-undirected.png
rename to doc/src/images/Fig6-undirected.png
diff --git a/doc/src/introduction/images/boost-inside.jpeg b/doc/src/images/boost-inside.jpeg
similarity index 100%
rename from doc/src/introduction/images/boost-inside.jpeg
rename to doc/src/images/boost-inside.jpeg
diff --git a/doc/src/recipes/images/parallelImage.png b/doc/src/images/parallelImage.png
similarity index 100%
rename from doc/src/recipes/images/parallelImage.png
rename to doc/src/images/parallelImage.png
diff --git a/doc/src/developer/images/test1.png b/doc/src/images/test1.png
similarity index 100%
rename from doc/src/developer/images/test1.png
rename to doc/src/images/test1.png
diff --git a/doc/src/developer/images/trsp-test-image.png b/doc/src/images/trsp-test-image.png
similarity index 100%
rename from doc/src/developer/images/trsp-test-image.png
rename to doc/src/images/trsp-test-image.png
diff --git a/doc/src/installation/build.rst b/doc/src/installation/build.rst
deleted file mode 100644
index 8cdb842..0000000
--- a/doc/src/installation/build.rst
+++ /dev/null
@@ -1,123 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _build:
-
-###########
-Build Guide
-###########
-
-Dependencies
-===============================================================================
-
-To be able to compile pgRouting make sure that the following dependencies are met:
-
-* C and C++0x compilers
-* Postgresql version >= 9.1
-* PostGIS version >= 2.0
-* The Boost Graph Library (BGL). Version >= 1.46
-* CMake >= 2.8.8
-* CGAL >= 4.2
-* (optional, for Documentation) Sphinx >= 1.1
-* (optional, for Documentation as PDF) Latex >= [TBD]
-
-Configuration
-===============================================================================
-
-PgRouting uses the `cmake` system to do the configuration.
-
-The following instructions start from *path/to/pgrouting/*
-
-Ccreate the build directory
-
-.. code-block:: bash
-
- $ mkdir build
-
-
-To configure:
-
-.. code-block:: bash
-
- $ cd build
- $ cmake -L ..
-
-Configurable variables
-----------------------
-
-The documentation configurable variables are:
-
-:WITH_DOC: BOOL=OFF -- Turn on/off building the documentation
-:BUILD_HTML: BOOL=ON -- If WITH_DOC=ON, turn on/off building HTML
-:BUILD_LATEX: BOOL=OFF -- If WITH_DOC=ON, turn on/off building PDF
-:BUILD_MAN: BOOL=OFF -- If WITH_DOC=ON, turn on/off building MAN pages
-
-Configuring with documentation
-
-.. code-block:: bash
-
- $ cmake -DWITH_DOC=ON ..
-
-.. note:: Most of the effort of the documentation has being on the html files.
-
-
-Building
-===============================================================================
-
-Using ``make`` to build the code and the docuemtnation
-
-The following instructions start from *path/to/pgrouting/build*
-
-.. code-block:: bash
-
- $ make # build the code but not the documentation
- $ make doc # build only the documentation
- $ make all doc # build both the code and the documentation
-
-Installation and reinstallation
-===============================================================================
-
-We have tested on several plataforms, For installing or reinstalling all the steps are needed.
-
-.. warning:: The sql signatures are configured and build in the ``cmake`` command.
-
-For MinGW on Windows
-----------------------------------------------------------------
-
-.. code-block:: bash
-
- $ mkdir build
- $ cd build
- $ cmake -G"MSYS Makefiles" ..
- $ make
- $ make install
-
-
-For Linux
-----------------------------------------------------------------
-
-The following instructions start from *path/to/pgrouting*
-
-.. code-block:: bash
-
- $ mkdir build
- $ cd build
- $ cmake ..
- $ make
- $ sudo make install
-
-Dependencies Installation
-===============================================================================
-
-.. toctree::
- :maxdepth: 1
-
- install-dependencies
-
-
diff --git a/doc/src/installation/install-dependencies.rst b/doc/src/installation/install-dependencies.rst
deleted file mode 100644
index d501097..0000000
--- a/doc/src/installation/install-dependencies.rst
+++ /dev/null
@@ -1,155 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _dependencies:
-
-##########################
-Dependencies Installation
-##########################
-
-This guide was made while making a fresh ubuntu desktop 14.04.02 installation.
-Make the neceszry adjustments to fit your operative system.
-
-Dependencies
-===============================================================================
-
-
-To be able to compile pgRouting make sure that the following dependencies are met:
-
-* C and C++0x compilers
-* Postgresql version >= 9.1
-* PostGIS version >= 2.0
-* The Boost Graph Library (BGL). Version >= 1.46
-* CMake >= 2.8.8
-* CGAL >= 4.2
-* (optional, for Documentation) Sphinx >= 1.1
-* (optional, for Documentation as PDF) Latex >= [TBD]
-
-Before starting, on a terminal window:
-
-sudo apt-get update
-
-
-CMake >= 2.8.8
----------------------
-
-trusty provides: 2.8.8
-
-.. code-block:: none
-
- sudo apt-get install cmake
-
-
-C and (C++0x or c++11) compilers
-----------------------------------
-
-trusty provides: 4.8
-
-.. code-block:: none
-
- sudo apt-get install g++
-
-
-Postgresql version >= 9.1
---------------------------
-
-For example in trusty 9.3 is provided:
-
-.. code-block:: none
-
- sudo apt-get install postgreSQL
- sudo apt-get install postgresql-server-dev-9.3
-
-
-PostGIS version >= 2.0
------------------------
-
-For example in trusty 2.1 is provided:
-
-.. code-block:: none
-
- sudo apt-get install postgresql-9.3-postgis-2.1
-
-
-
-The Boost Graph Library (BGL). Version >= 1.46
-----------------------------------------------
-
-trusty provides: 1.54.0
-
-.. code-block:: none
-
- sudo apt-get install libboost-graph-dev
-
-
-CGAL >= 4.2
----------------------
-
-.. code-block:: none
-
- sudo apt-get install libcgal-dev
-
-(optional, for Documentation) Sphinx >= 1.1
---------------------------------------------
-
-http://sphinx-doc.org/latest/install.html
-
-trusty provides: 1.2.2
-
-.. code-block:: none
-
- sudo apt-get install python-sphinx
-
-
-(optional, for Documentation as PDF) Latex >= [TBD]
----------------------------------------------------
-
-https://latex-project.org/ftp.html
-
-trusty provides: 1.2.2
-
-.. code-block:: none
-
- sudo apt-get install texlive
-
-
-pgTap & pg_prove & perl for tests
------------------------------------
-
-.. warning:: cmake does not test for this packages.
-
-.. code-block:: none
-
- sudo apt-get install -y perl
- wget https://github.com/theory/pgtap/archive/master.zip
- unzip master.zip
- cd pgtap-master
- make
- sudo make install
- sudo ldconfig
- sudo apt-get install -y libtap-parser-sourcehandler-pgtap-perl
-
-To run the tests:
-
-.. code-block:: none
-
- tools/testers/algorithm-tester.pl
- createdb -U <user> ___pgr___test___
- sh ./tools/testers/pg_prove_tests.sh <user>
- dropdb -U <user> ___pgr___test___
-
-See Also
--------------------------------------------------------------------------------
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
-
diff --git a/doc/src/installation/installation.rst b/doc/src/installation/installation.rst
deleted file mode 100644
index 9f86092..0000000
--- a/doc/src/installation/installation.rst
+++ /dev/null
@@ -1,186 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _installation:
-
-Installation
-===============================================================================
-
-This is a basic guide to download and install pgRouting.
-
-The specific instructions for any given OS distribution may vary depending on the various package maintainers.
-Contact the specific OS package maintainer for details.
-
-.. note:: The following are only general instructions.
-
-Additional notes and corrections can be found in `Installation wiki <https://github.com/pgRouting/pgrouting/wiki/Notes-on-Download%2C-Installation-and-building-pgRouting>`__
-
-Also PostGIS provides some information about installation in this `Install Guide <http://www.postgis.us/presentations/postgis_install_guide_22.html>`__
-
-
-
-Download
---------
-
-Binary packages are provided for the current version on the following platforms:
-
-
-Windows
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Winnie Bot Builds:
-
-* `Winnie Bot Builds <http://postgis.net/windows_downloads>`_
-
-Production Builds:
-
-* Production builds are part of the Spatial Extensions/PostGIS Bundle available via Application StackBuilder
-* Can also get PostGIS Bundle from http://download.osgeo.org/postgis/windows/
-
-
-Ubuntu
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-pgRouting on Ubuntu can be installed using packages from a PostgreSQL repository:
-
-Using a terminal window:
-
-.. code-block:: bash
-
- # Create /etc/apt/sources.list.d/pgdg.list. The distributions are called codename-pgdg.
- sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
-
- # Import the repository key, update the package lists
- sudo apt-get install wget ca-certificates
- wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
- sudo apt-get update
-
- # Install pgrouting based on your postgres Installation: for this example is 9.3
- sudo apt-get install postgresql-9.3-pgrouting
-
-
-* To be up-to-date with changes and improvements
-
-.. code-block:: bash
-
- sudo apt-get update & sudo apt-get upgrade
-
-
-RHEL/CentOS
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-* Add repositories for dependencies:
-
- .. code-block:: bash
-
- wget http://repo.enetres.net/enetres.repo -O /etc/yum.repos.d/enetres.repo
- wget http://nextgis.ru/programs/centos/nextgis.repo -O /etc/yum.repos.d/nextgis.repo
- yum install epel-release
-
-* Install PostgreSQL and PostGIS according to `this <https://trac.osgeo.org/postgis/wiki/UsersWikiPostGIS21CentOS6pgdg>`__ instructions.
-
-* Install CGAL:
-
- .. code-block:: bash
-
- yum install libCGAL10
-
-* Install pgRouting:
-
- .. code-block:: bash
-
- yum install pgrouting_94
-
-More info (and packages for CentOS) can be found `here <https://github.com/nextgis/gis_packages_centos/wiki/Using-this-repo>`__.
-
-
-
-Fedora
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-* Fedora RPM's: https://admin.fedoraproject.org/pkgdb/package/rpms/pgRouting/
-
-
-FreeBSD
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-pgRouting can be installed via ports:
-
-.. code-block:: bash
-
- cd /usr/ports/databases/pgRouting
- make install clean
-
-
-OS X
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-.. See `builds from KingChaos <http://www.kyngchaos.com/software/postgres>`_.
-
-* Homebrew
-
-.. code-block:: bash
-
- brew install pgrouting
-
-
-Source Package
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-You can find all the pgRouting Releases:
-
-https://github.com/pgRouting/pgrouting/releases
-
-See :ref:`build` to build the binaries from the source.
-
-Using Git
-^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-
-Git protocol (read-only):
-
-.. code-block:: bash
-
- git clone git://github.com/pgRouting/pgrouting.git
-
-
-HTTPS protocol (read-only):
-
-.. code-block:: bash
-
- git clone https://github.com/pgRouting/pgrouting.git
-
-See :ref:`build` to build the binaries from the source.
-
-Installing in the database
---------------------------
-
-pgRouting is an extension.
-
-.. code-block:: sql
-
- CREATE EXTENSION postgis;
- CREATE EXTENSION pgrouting;
-
-
-Upgrading the database
-----------------------
-
-To upgrade pgRouting to version 2.x.y use the following command:
-
-.. code-block:: sql
-
- ALTER EXTENSION pgrouting UPDATE TO "2.x.y";
-
- For example to upgrade to 2.2.3
-
- .. code-block:: sql
-
- ALTER EXTENSION pgrouting UPDATE TO "2.2.3";
-
-
diff --git a/doc/src/pgRouting-concepts.rst b/doc/src/pgRouting-concepts.rst
new file mode 100644
index 0000000..9d2be2b
--- /dev/null
+++ b/doc/src/pgRouting-concepts.rst
@@ -0,0 +1,705 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _pgrouting_concepts:
+
+pgRouting Concepts
+===============================================================================
+
+.. rubric:: Table of Contents
+
+.. concepts_start
+
+* :ref:`Getting_started`
+
+ * :ref:`create_database`
+ * :ref:`load_data`
+ * :ref:`build_topology`
+ * :ref:`check_graph`
+ * :ref:`compute_path`
+ * `pgRouting Workshop <http://workshop.pgrouting.org>`_
+
+* :ref:`inner_queries`
+* :ref:`return_values`
+* :ref:`Advanced_Topics`
+
+ * :ref:`topology`
+ * :ref:`analytics`
+ * :ref:`performance`
+
+* :ref:`how_contribute`
+
+
+
+
+.. concepts_end
+
+.. _Getting_started:
+
+Getting Started
+-------------------------------------------------------------------------------
+
+This is a simple guide to walk you through the steps of getting started
+with pgRouting. In this guide we will cover:
+
+* :ref:`create_database`
+* :ref:`load_data`
+* :ref:`build_topology`
+* :ref:`check_graph`
+
+
+.. _create_database:
+
+Create a routing Database
+...............................................................................
+
+The first thing we need to do is create a database and load pgrouting in
+the database. Typically you will create a database for each project. Once
+you have a database to work in, your can load your data and build your
+application in that database. This makes it easy to move your project
+later if you want to to say a production server.
+
+For Postgresql 9.2 and later versions
+
+.. code-block:: bash
+
+ createdb mydatabase
+ psql mydatabase -c "create extension postgis"
+ psql mydatabase -c "create extension pgrouting"
+
+.. _load_data:
+
+Load Data
+...............................................................................
+
+How you load your data will depend in what form it comes it. There are
+various OpenSource tools that can help you, like:
+
+:osm2pgrouting: - this is a tool for loading OSM data into postgresql with pgRouting requirements
+:shp2pgsql: - this is the postgresql shapefile loader
+:ogr2ogr: - this is a vector data conversion utility
+:osm2pgsql: - this is a tool for loading OSM data into postgresql
+
+So these tools and probably others will allow you to read vector data so that
+you may then load that data into your database as a table of some kind. At this
+point you need to know a little about your data structure and content. One easy
+way to browse your new data table is with pgAdmin3 or phpPgAdmin.
+
+.. _build_topology:
+
+Build a Routing Topology
+...............................................................................
+
+Next we need to build a topology for our street data. What this means is that
+for any given edge in your street data the ends of that edge will be connected
+to a unique node and to other edges that are also connected to that same unique
+node. Once all the edges are connected to nodes we have a graph that can be
+used for routing with pgrouting. We provide a tool that will help with this:
+
+.. note:: this step is not needed if data is loaded with `osm2pgrouting`
+
+.. code-block:: sql
+
+ select pgr_createTopology('myroads', 0.000001);
+
+* :ref:`pgr_create_topology`
+
+.. _check_graph:
+
+Check the Routing Topology
+...............................................................................
+
+There are lots of possible sources for errors in a graph. The data that you
+started with may not have been designed with routing in mind. A graph has some
+very specific requirements. One is that it is *NODED*, this means that except
+for some very specific use cases, each road segment starts and ends at a node
+and that in general is does not cross another road segment that it should be
+connected to.
+
+There can be other errors like the direction of a one-way street being entered
+in the wrong direction. We do not have tools to search for all possible errors
+but we have some basic tools that might help.
+
+.. code-block:: sql
+
+ select pgr_analyzegraph('myroads', 0.000001);
+ select pgr_analyzeoneway('myroads', s_in_rules, s_out_rules,
+ t_in_rules, t_out_rules
+ direction)
+ select pgr_nodeNetwork('myroads', 0.001);
+
+* :ref:`pgr_analyze_graph`
+* :ref:`pgr_analyze_oneway`
+* :ref:`pgr_node_network`
+
+
+.. _compute_path:
+
+Compute a Path
+...............................................................................
+
+Once you have all the preparation work done above, computing a route is fairly easy.
+We have a lot of different algorithms that can work with your prepared road
+network. The general form of a route query is:
+
+.. code-block:: sql
+
+ select pgr_dijkstra(`SELECT * FROM myroads', 1, 2)
+
+As you can see this is fairly straight forward and you can look and the
+specific algorithms for the details of the signatures and how to use them.
+These results have information like edge id and/or the
+node id along with the cost or geometry for the step in the path from *start*
+to *end*. Using the ids you can join these result back to your edge table
+to get more information about each step in the path.
+
+* :ref:`pgr_dijkstra`
+
+
+
+.. _inner_queries:
+
+Inner Queries
+-------------------------------------------------------------------------------
+
+There are several kinds of valid inner queries and also the columns returned are depending of the function..
+Which kind of **edges_sql** will depend on the function(s) requirements.
+
+.. basic_edges_sql_start
+
+Description of the edges_sql query for dijkstra like functions
+...............................................................................
+
+:edges_sql: an SQL query, which should return a set of rows with the following columns:
+
+================= =================== ======== =================================================
+Column Type Default Description
+================= =================== ======== =================================================
+**id** ``ANY-INTEGER`` Identifier of the edge.
+**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
+**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
+**cost** ``ANY-NUMERICAL`` Weight of the edge `(source, target)`
+
+ - When negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
+
+**reverse_cost** ``ANY-NUMERICAL`` -1 Weight of the edge `(target, source)`,
+
+ - When negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
+
+================= =================== ======== =================================================
+
+Where:
+
+:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
+:ANY-NUMERICAL: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
+
+
+.. basic_edges_sql_end
+
+.. no_id_edges_sql_start
+
+Description of the edges_sql query (id is not necessary)
+...............................................................................
+
+:edges_sql: an SQL query, which should return a set of rows with the following columns:
+
+================ =================== ======== =================================================
+Column Type Default Description
+================ =================== ======== =================================================
+**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
+**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
+**cost** ``ANY-NUMERICAL`` Weight of the edge `(source, target)`
+
+ * When negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
+
+**reverse_cost** ``ANY-NUMERICAL`` -1 Weight of the edge `(target, source)`,
+
+ - When negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
+
+================ =================== ======== =================================================
+
+Where:
+
+:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
+:ANY-NUMERICAL: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
+
+.. no_id_edges_sql_end
+
+
+.. xy_edges_sql_start
+
+Description of the edges_sql query for astar like functions
+...............................................................................
+
+:edges_sql: an SQL query, which should return a set of rows with the following columns:
+
+================ =================== ======== =================================================
+Column Type Default Description
+================ =================== ======== =================================================
+**id** ``ANY-INTEGER`` Identifier of the edge.
+**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
+**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
+**cost** ``ANY-NUMERICAL`` Weight of the edge `(source, target)`
+
+ - When negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
+
+**reverse_cost** ``ANY-NUMERICAL`` -1 Weight of the edge `(target, source)`,
+
+ - When negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
+
+**x1** ``ANY-NUMERICAL`` X coordinate of `source` vertex.
+**y1** ``ANY-NUMERICAL`` Y coordinate of `source` vertex.
+**x2** ``ANY-NUMERICAL`` X coordinate of `target` vertex.
+**y2** ``ANY-NUMERICAL`` Y coordinate of `target` vertex.
+================ =================== ======== =================================================
+
+Where:
+
+:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
+:ANY-NUMERICAL: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
+
+
+.. xy_edges_sql_end
+
+.. flow_edges_sql_start
+
+Description of the edges_sql query for Max-flow like functions
+...............................................................................
+
+:edges_sql: an SQL query, which should return a set of rows with the following columns:
+
+==================== =================== ======== =================================================
+Column Type Default Description
+==================== =================== ======== =================================================
+**id** ``ANY-INTEGER`` Identifier of the edge.
+**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
+**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
+**capacity** ``ANY-INTEGER`` Weight of the edge `(source, target)`
+
+ - When negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
+
+**reverse_capacity** ``ANY-INTEGER`` -1 Weight of the edge `(target, source)`,
+
+ - When negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
+
+==================== =================== ======== =================================================
+
+Where:
+
+:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
+
+
+.. flow_edges_sql_end
+
+
+
+.. points_sql_start
+
+Description of the Points SQL query
+...............................................................................
+
+:points_sql: an SQL query, which should return a set of rows with the following columns:
+
+============ ================= =================================================
+Column Type Description
+============ ================= =================================================
+**pid** ``ANY-INTEGER`` (optional) Identifier of the point.
+
+ - If column present, it can not be NULL.
+ - If column not present, a sequential identifier will be given automatically.
+
+**edge_id** ``ANY-INTEGER`` Identifier of the "closest" edge to the point.
+**fraction** ``ANY-NUMERICAL`` Value in <0,1> that indicates the relative postition from the first end point of the edge.
+**side** ``CHAR`` (optional) Value in ['b', 'r', 'l', NULL] indicating if the point is:
+
+ - In the right, left of the edge or
+ - If it doesn't matter with 'b' or NULL.
+ - If column not present 'b' is considered.
+
+============ ================= =================================================
+
+Where:
+
+:ANY-INTEGER: smallint, int, bigint
+:ANY-NUMERICAL: smallint, int, bigint, real, float
+
+.. points_sql_end
+
+.. _return_values:
+
+Return columns & values
+--------------------------------------------------------------------------------
+
+There are several kinds of columns returned are depending of the function.
+
+.. return_path_start
+
+Description of the return values for a path
+...............................................................................
+
+Returns set of ``(seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)``
+
+============== ========== =================================================
+Column Type Description
+============== ========== =================================================
+**seq** ``INT`` Sequential value starting from **1**.
+**path_id** ``INT`` Path identifier. Has value **1** for the first of a path. Used when there are multiple paths for the same ``start_vid`` to ``end_vid`` combination.
+**path_seq** ``INT`` Relative position in the path. Has value **1** for the beginning of a path.
+**start_vid** ``BIGINT`` Identifier of the starting vertex. Used when multiple starting vetrices are in the query.
+**end_vid** ``BIGINT`` Identifier of the ending vertex. Used when multiple ending vertices are in the query.
+**node** ``BIGINT`` Identifier of the node in the path from ``start_vid`` to ``end_vid``.
+**edge** ``BIGINT`` Identifier of the edge used to go from ``node`` to the next node in the path sequence. ``-1`` for the last node of the path.
+**cost** ``FLOAT`` Cost to traverse from ``node`` using ``edge`` to the next node in the path sequence.
+**agg_cost** ``FLOAT`` Aggregate cost from ``start_v`` to ``node``.
+============== ========== =================================================
+
+.. return_path_end
+
+.. return_cost_start
+
+Description of the return values for a Cost function
+...............................................................................
+
+Returns set of ``(start_vid, end_vid, agg_cost)``
+
+============== ========== =================================================
+Column Type Description
+============== ========== =================================================
+**start_vid** ``BIGINT`` Identifier of the starting vertex. Used when multiple starting vetrices are in the query.
+**end_vid** ``BIGINT`` Identifier of the ending vertex. Used when multiple ending vertices are in the query.
+**agg_cost** ``FLOAT`` Aggregate cost from ``start_vid`` to ``end_vid``.
+============== ========== =================================================
+
+.. return_cost_end
+
+
+
+.. result_flow_start
+
+Description of the Return Values
+.....................................................................
+
+===================== ==================== =================================================
+Column Type Description
+===================== ==================== =================================================
+**seq** ``INT`` Sequential value starting from **1**.
+**edge_id** ``BIGINT`` Identifier of the edge in the original query(edges_sql).
+**source** ``BIGINT`` Identifier of the first end point vertex of the edge.
+**target** ``BIGINT`` Identifier of the second end point vertex of the edge.
+**flow** ``BIGINT`` Flow through the edge in the direction (source, target).
+**residual_capacity** ``BIGINT`` Residual capacity of the edge in the direction (source, target).
+===================== ==================== =================================================
+
+.. result_flow_end
+
+
+.. _advanced_topics:
+
+Advanced Topics
+-------------------------------------------------------------------------------
+
+.. _topology:
+
+Routing Topology
+...............................................................................
+
+
+.. rubric:: Overview
+
+Typically when GIS files are loaded into the data database for use with pgRouting they do not have topology information associated with them. To create a useful topology the data needs to be "noded". This means that where two or more roads form an intersection there it needs to be a node at the intersection and all the road segments need to be broken at the intersection, assuming that you can navigate from any of these segments to any other segment via that intersection.
+
+You can use the :ref:`graph analysis functions <analytics>` to help you see where you might have topology problems in your data. If you need to node your data, we also have a function :ref:`pgr_nodeNetwork() <pgr_node_network>` that might work for you. This function splits ALL crossing segments and nodes them. There are some cases where this might NOT be the right thing to do.
+
+For example, when you have an overpass and underpass intersection, you do not want these noded, but pgr_nodeNetwork does not know that is the case and will node them which is not good because then the router will be able to turn off the overpass onto the underpass like it was a flat 2D intersection. To deal with this problem some data sets use z-levels at these types of intersections and other data might not node these intersection which would be ok.
+
+For those cases where topology needs to be added the following functions may be useful. One way to prep the data for pgRouting is to add the following columns to your table and then populate them as appropriate. This example makes a lot of assumption like that you original data tables already has certain columns in it like ``one_way``, ``fcc``, and possibly others and that they contain specific data values. This is only to give you an idea of what you can do with your data.
+
+.. code-block:: sql
+
+ ALTER TABLE edge_table
+ ADD COLUMN source integer,
+ ADD COLUMN target integer,
+ ADD COLUMN cost_len double precision,
+ ADD COLUMN cost_time double precision,
+ ADD COLUMN rcost_len double precision,
+ ADD COLUMN rcost_time double precision,
+ ADD COLUMN x1 double precision,
+ ADD COLUMN y1 double precision,
+ ADD COLUMN x2 double precision,
+ ADD COLUMN y2 double precision,
+ ADD COLUMN to_cost double precision,
+ ADD COLUMN rule text,
+ ADD COLUMN isolated integer;
+
+ SELECT pgr_createTopology('edge_table', 0.000001, 'the_geom', 'id');
+
+The function :ref:`pgr_createTopology() <pgr_create_topology>` will create the ``vertices_tmp`` table and populate the ``source`` and ``target`` columns. The following example populated the remaining columns. In this example, the ``fcc`` column contains feature class code and the ``CASE`` statements converts it to an average speed.
+
+.. code-block:: sql
+
+ UPDATE edge_table SET x1 = st_x(st_startpoint(the_geom)),
+ y1 = st_y(st_startpoint(the_geom)),
+ x2 = st_x(st_endpoint(the_geom)),
+ y2 = st_y(st_endpoint(the_geom)),
+ cost_len = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
+ rcost_len = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
+ len_km = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')/1000.0,
+ len_miles = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')
+ / 1000.0 * 0.6213712,
+ speed_mph = CASE WHEN fcc='A10' THEN 65
+ WHEN fcc='A15' THEN 65
+ WHEN fcc='A20' THEN 55
+ WHEN fcc='A25' THEN 55
+ WHEN fcc='A30' THEN 45
+ WHEN fcc='A35' THEN 45
+ WHEN fcc='A40' THEN 35
+ WHEN fcc='A45' THEN 35
+ WHEN fcc='A50' THEN 25
+ WHEN fcc='A60' THEN 25
+ WHEN fcc='A61' THEN 25
+ WHEN fcc='A62' THEN 25
+ WHEN fcc='A64' THEN 25
+ WHEN fcc='A70' THEN 15
+ WHEN fcc='A69' THEN 10
+ ELSE null END,
+ speed_kmh = CASE WHEN fcc='A10' THEN 104
+ WHEN fcc='A15' THEN 104
+ WHEN fcc='A20' THEN 88
+ WHEN fcc='A25' THEN 88
+ WHEN fcc='A30' THEN 72
+ WHEN fcc='A35' THEN 72
+ WHEN fcc='A40' THEN 56
+ WHEN fcc='A45' THEN 56
+ WHEN fcc='A50' THEN 40
+ WHEN fcc='A60' THEN 50
+ WHEN fcc='A61' THEN 40
+ WHEN fcc='A62' THEN 40
+ WHEN fcc='A64' THEN 40
+ WHEN fcc='A70' THEN 25
+ WHEN fcc='A69' THEN 15
+ ELSE null END;
+
+ -- UPDATE the cost information based on oneway streets
+
+ UPDATE edge_table SET
+ cost_time = CASE
+ WHEN one_way='TF' THEN 10000.0
+ ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
+ END,
+ rcost_time = CASE
+ WHEN one_way='FT' THEN 10000.0
+ ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
+ END;
+
+ -- clean up the database because we have updated a lot of records
+
+ VACUUM ANALYZE VERBOSE edge_table;
+
+
+Now your database should be ready to use any (most?) of the pgRouting algorithms.
+
+
+.. _analytics:
+
+Graph Analytics
+-------------------------------------------------------------------------------
+
+
+.. rubric:: Overview
+
+It is common to find problems with graphs that have not been constructed fully noded or in graphs with z-levels at intersection that have been entered incorrectly. An other problem is one way streets that have been entered in the wrong direction. We can not detect errors with respect to "ground" truth, but we can look for inconsistencies and some anomalies in a graph and report them for additional inspections.
+
+We do not current have any visualization tools for these problems, but I have used mapserver to render the graph and highlight potential problem areas. Someone familiar with graphviz might contribute tools for generating images with that.
+
+
+Analyze a Graph
+...............................................................................
+
+With :ref:`pgr_analyze_graph` the graph can be checked for errors. For example for table "mytab" that has "mytab_vertices_pgr" as the vertices table:
+
+.. code-block:: sql
+
+ SELECT pgr_analyzeGraph('mytab', 0.000002);
+ NOTICE: Performing checks, pelase wait...
+ NOTICE: Analyzing for dead ends. Please wait...
+ NOTICE: Analyzing for gaps. Please wait...
+ NOTICE: Analyzing for isolated edges. Please wait...
+ NOTICE: Analyzing for ring geometries. Please wait...
+ NOTICE: Analyzing for intersections. Please wait...
+ NOTICE: ANALYSIS RESULTS FOR SELECTED EDGES:
+ NOTICE: Isolated segments: 158
+ NOTICE: Dead ends: 20028
+ NOTICE: Potential gaps found near dead ends: 527
+ NOTICE: Intersections detected: 2560
+ NOTICE: Ring geometries: 0
+ pgr_analyzeGraph
+ ----------
+ OK
+ (1 row)
+
+
+In the vertices table "mytab_vertices_pgr":
+
+ - Deadends are identified by ``cnt=1``
+ - Potencial gap problems are identified with ``chk=1``.
+
+.. code-block:: sql
+
+ SELECT count(*) as deadends FROM mytab_vertices_pgr WHERE cnt = 1;
+ deadends
+ ----------
+ 20028
+ (1 row)
+
+ SELECT count(*) as gaps FROM mytab_vertices_pgr WHERE chk = 1;
+ gaps
+ -----
+ 527
+ (1 row)
+
+
+
+For isolated road segments, for example, a segment where both ends are deadends. you can find these with the following query:
+
+.. code-block:: sql
+
+ SELECT *
+ FROM mytab a, mytab_vertices_pgr b, mytab_vertices_pgr c
+ WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1;
+
+
+If you want to visualize these on a graphic image, then you can use something like mapserver to render the edges and the vertices and style based on ``cnt`` or if they are isolated, etc. You can also do this with a tool like graphviz, or geoserver or other similar tools.
+
+
+Analyze One Way Streets
+...............................................................................
+
+:ref:`pgr_analyze_oneway` analyzes one way streets in a graph and identifies any flipped segments. Basically if you count the edges coming into a node and the edges exiting a node the number has to be greater than one.
+
+This query will add two columns to the vertices_tmp table ``ein int`` and ``eout int`` and populate it with the appropriate counts. After running this on a graph you can identify nodes with potential problems with the following query.
+
+
+The rules are defined as an array of text strings that if match the ``col`` value would be counted as true for the source or target in or out condition.
+
+
+Example
+...............................................................................
+
+Lets assume we have a table "st" of edges and a column "one_way" that might have values like:
+
+ * 'FT' - oneway from the source to the target node.
+ * 'TF' - oneway from the target to the source node.
+ * 'B' - two way street.
+ * '' - empty field, assume twoway.
+ * <NULL> - NULL field, use two_way_if_null flag.
+
+Then we could form the following query to analyze the oneway streets for errors.
+
+.. code-block:: sql
+
+ SELECT pgr_analyzeOneway('mytab',
+ ARRAY['', 'B', 'TF'],
+ ARRAY['', 'B', 'FT'],
+ ARRAY['', 'B', 'FT'],
+ ARRAY['', 'B', 'TF'],
+ );
+
+ -- now we can see the problem nodes
+ SELECT * FROM mytab_vertices_pgr WHERE ein=0 OR eout=0;
+
+ -- and the problem edges connected to those nodes
+ SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.source=b.id AND ein=0 OR eout=0
+ UNION
+ SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.target=b.id AND ein=0 OR eout=0;
+
+Typically these problems are generated by a break in the network, the one way direction set wrong, maybe an error related to z-levels or a network that is not properly noded.
+
+The above tools do not detect all network issues, but they will identify some common problems. There are other problems that are hard to detect because they are more global in nature like multiple disconnected networks. Think of an island with a road network that is not connected to the mainland network because the bridge or ferry routes are missing.
+
+
+
+
+.. _performance:
+
+Performance Tips
+-------------------------------------------------------------------------------
+
+For the Routing functions
+...............................................................................
+
+To get faster results bound your queries to the area of interest of routing to have, for example, no more than one million rows.
+
+Use an inner query SQL that does not include some edges in the routing function
+
+.. code-block:: sql
+
+ SELECT id, source, target from edge_table WHERE
+ id < 17 and
+ the_geom && (select st_buffer(the_geom,1) as myarea FROM edge_table where id = 5)
+
+Integrating the inner query to the pgRouting function:
+
+.. code-block:: sql
+
+ SELECT * FROM pgr_dijkstra(
+ 'SELECT id, source, target from edge_table WHERE
+ id < 17 and
+ the_geom && (select st_buffer(the_geom,1) as myarea FROM edge_table where id = 5)',
+ 1, 2)
+
+
+
+
+For the topology functions:
+...............................................................................
+
+When "you know" that you are going to remove a set of edges from the edges table, and without those edges you are going to use a routing function you can do the following:
+
+Analize the new topology based on the actual topology:
+
+.. code-block:: sql
+
+ pgr_analyzegraph('edge_table',rows_where:='id < 17');
+
+Or create a new topology if the change is permanent:
+
+.. code-block:: sql
+
+ pgr_createTopology('edge_table',rows_where:='id < 17');
+ pgr_analyzegraph('edge_table',rows_where:='id < 17');
+
+
+.. _how_contribute:
+
+How to contribute
+-------------------------------------------------------------------------------
+
+.. rubric:: Wiki
+
+* Edit an existing `pgRouting Wiki <https://github.com/pgRouting/pgrouting/wiki>`_ page.
+* Or create a new Wiki page
+
+ * Create a page on the `pgRouting Wiki <https://github.com/pgRouting/pgrouting/wiki>`_
+ * Give the title an appropriate name
+
+
+* `Example <https://github.com/pgRouting/pgrouting/wiki/How-to:-Handle-parallel-edges-(KSP)>`_
+
+.. rubric:: Adding Functionaity to pgRouting
+
+
+Consult the `developer's documentation <http://docs.pgrouting.org/doxy/2.4/index.html>`_
+
+
+
+.. rubric:: Indices and tables
+
+* :ref:`genindex`
+* :ref:`search`
+
diff --git a/doc/src/pgRouting-installation.rst b/doc/src/pgRouting-installation.rst
new file mode 100644
index 0000000..e2060ba
--- /dev/null
+++ b/doc/src/pgRouting-installation.rst
@@ -0,0 +1,312 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _installation:
+
+Installation
+===============================================================================
+
+.. rubric:: Table of Contents
+
+* :ref:`install-short`
+* :ref:`install_get_sources`
+* :ref:`install_enable_db`
+* :ref:`install_dependencies`
+* :ref:`install_configuring`
+* :ref:`install_build`
+* :ref:`install_testing`
+
+Instructions for downloading and installing binaries for different Operative systems instructions and additional notes and corrections not included in this documentation can be found in `Installation wiki <https://github.com/pgRouting/pgrouting/wiki/Notes-on-Download%2C-Installation-and-building-pgRouting>`__
+
+To use pgRouting postGIS needs to be installed, please read the information about installation in this `Install Guide <http://www.postgis.us/presentations/postgis_install_guide_22.html>`__
+
+.. _install-short:
+
+Short Version
+-------------------------------------------------------------------------------
+
+
+.. TODO: pumpup release must change this value
+
+Extracting the tar ball
+
+.. code-block:: bash
+
+ tar xvfz pgrouting-2.4.0.tar.gz
+ cd pgrouting-2.4.0
+
+To compile assuming you have all the dependencies in your search path:
+
+.. code-block:: bash
+
+ mkdir build
+ cd build
+ cmake ..
+ make
+ sudo make install
+
+Once pgRouting is installed, it needs to be enabled in each individual database you want to use it in.
+
+.. code-block:: bash
+
+ createdb routing
+ psql routing -c 'CREATE EXTENSION postGIS'
+ psql routing -c 'CREATE EXTENSION pgRouting'
+
+
+.. _install_get_sources:
+
+Get the sources
+-------------------------------------------------------------------------------
+
+
+The pgRouting latest release can be found in https://github.com/pgRouting/pgrouting/releases/latest
+
+.. rubric:: wget
+
+To download this release:
+
+.. TODO: pumpup release must change this value
+
+.. code-block:: bash
+
+ wget -O pgrouting-v2.4.0.tar.gz https://github.com/pgRouting/pgrouting/archive/v2.4.0.tar.gz
+
+Goto :ref:`install-short` to the extract and compile instructions.
+
+.. rubric:: git
+
+To download the repository
+
+.. code-block:: bash
+
+ git clone git://github.com/pgRouting/pgrouting.git
+ cd pgrouting
+ git checkout |release|
+
+Goto :ref:`install-short` to the compile instructions (there is no tar ball).
+
+
+
+.. _install_enable_db:
+
+Enabeling and upgrading in the database
+----------------------------------------------
+
+.. rubric:: Enabeling the database
+
+pgRouting is an extension and depends on postGIS. Enabling postGIS before enabling pgRouting in the database
+
+.. code-block:: sql
+
+ CREATE EXTENSION postgis;
+ CREATE EXTENSION pgrouting;
+
+
+.. rubric:: Upgrading the database
+
+To upgrade pgRouting in the database to version 2.4.0 use the following command:
+
+.. TODO: pumpup release must change this value
+
+.. code-block:: sql
+
+ ALTER EXTENSION pgrouting UPDATE TO "2.4.0";
+
+More information can be found in https://www.postgresql.org/docs/current/static/sql-createextension.html
+
+
+.. _install_dependencies:
+
+Dependencies
+-------------------------------------------------------------------------------
+
+.. rubric:: Compilation Dependencies
+
+To be able to compile pgRouting, make sure that the following dependencies are met:
+
+* C and C++0x compilers
+ * g++ version >= 4.8
+* Postgresql version >= 9.1
+* PostGIS version >= 2.0
+* The Boost Graph Library (BGL). Version >= 1.46
+* CMake >= 2.8.8
+* CGAL >= 4.2
+
+
+.. rubric:: optional dependencies
+
+For user's documentation
+
+* Sphinx >= 1.1
+* Latex
+
+For developer's documentation
+
+* Doxygen >= 1.7
+
+For testing
+
+* pgtap
+* pg_prove
+
+
+.. rubric:: Example: Installing dependencies on linux
+
+Installing the compilation dependencies
+
+.. code-block:: none
+
+ sudo apt-get install
+ cmake \
+ g++ \
+ postgresql-9.3 \
+ postgresql-server-dev-9.3 \
+ libboost-graph-dev \
+ libcgal-dev
+
+Installing the optional dependencies
+
+.. code-block:: none
+
+ sudo apt-get install -y python-sphinx \
+ texlive \
+ doxygen \
+ libtap-parser-sourcehandler-pgtap-perl \
+ postgresql-9.3-pgtap
+
+
+.. _install_configuring:
+
+Configuring
+-------------------------
+
+pgRouting uses the `cmake` system to do the configuration.
+
+The build directory is different from the source directory
+
+Create the build directory
+
+.. code-block:: bash
+
+ $ mkdir build
+
+Configurable variables
+.......................
+
+.. rubric:: To see the variables that can be configured
+
+
+.. code-block:: bash
+
+ $ cd build
+ $ cmake -L ..
+
+
+.. rubric:: Configuring The Documentation
+
+Most of the effort of the documentation has being on the HTML files.
+Some variables for the documentation:
+
+================== ========= ============================
+Variable Default Comment
+================== ========= ============================
+WITH_DOC BOOL=OFF Turn on/off building the documentation
+BUILD_HTML BOOL=ON If ON, turn on/off building HTML for user's documentation
+BUILD_DOXY BOOL=ON If ON, turn on/off building HTML for developer's documentation
+BUILD_LATEX BOOL=OFF If ON, turn on/off building PDF
+BUILD_MAN BOOL=OFF If ON, turn on/off building MAN pages
+DOC_USE_BOOTSTRAP BOOL=OFF If ON, use sphinx-bootstrap for HTML pages of the users documentation
+================== ========= ============================
+
+Configuring with documentation
+
+.. code-block:: bash
+
+ $ cmake -DWITH_DOC=ON ..
+
+.. note:: Most of the effort of the documentation has being on the html files.
+
+
+.. _install_build:
+
+Building
+----------------------------------------------------------------
+
+Using ``make`` to build the code and the documentation
+
+The following instructions start from *path/to/pgrouting/build*
+
+.. code-block:: bash
+
+ $ make # build the code but not the documentation
+ $ make doc # build only the documentation
+ $ make all doc # build both the code and the documentation
+
+
+We have tested on several platforms, For installing or reinstalling all the steps are needed.
+
+.. warning:: The sql signatures are configured and build in the ``cmake`` command.
+
+.. rubric:: MinGW on Windows
+
+.. code-block:: bash
+
+ $ mkdir build
+ $ cd build
+ $ cmake -G"MSYS Makefiles" ..
+ $ make
+ $ make install
+
+
+.. rubric:: Linux
+
+The following instructions start from *path/to/pgrouting*
+
+.. code-block:: bash
+
+ mkdir build
+ cd build
+ cmake ..
+ make
+ sudo make install
+
+When the configuration changes:
+
+.. code-block:: bash
+
+ rm -rf build
+
+and start the build process as mentioned above.
+
+.. _install_testing:
+
+Testing
+-------------------------
+
+Currently there is no :code:`make test` and testing is done as follows
+
+The following instructions start from *path/to/pgrouting/*
+
+.. code-block:: none
+
+ tools/testers/algorithm-tester.pl
+ createdb -U <user> ___pgr___test___
+ sh ./tools/testers/pg_prove_tests.sh <user>
+ dropdb -U <user> ___pgr___test___
+
+See Also
+-------------------------------------------------------------------------------
+
+.. rubric:: Indices and tables
+
+* :ref:`genindex`
+* :ref:`search`
+
+
diff --git a/doc/src/introduction/introduction.rst b/doc/src/pgRouting-introduction.rst
similarity index 90%
rename from doc/src/introduction/introduction.rst
rename to doc/src/pgRouting-introduction.rst
index 9cdb097..e2daeb9 100644
--- a/doc/src/introduction/introduction.rst
+++ b/doc/src/pgRouting-introduction.rst
@@ -1,9 +1,9 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
- This documentation is licensed under a Creative Commons Attribution-Share
+ This documentation is licensed under a Creative Commons Attribution-Share
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
@@ -14,7 +14,7 @@ Introduction
pgRouting is an extension of `PostGIS <http://postgis.net>`_ and `PostgreSQL <http://postgresql.org>`_ geospatial database and adds routing and other network analysis functionality. A predecessor of pgRouting – pgDijkstra, written by Sylvain Pasche from `Camptocamp <http://camptocamp.com>`_, was later extended by `Orkney <http://www.orkney.co.jp>`_ and renamed to pgRouting. The project is now supported and maintained by `Georepublic <http://georepublic.info>`_, `iMaptools <http://imaptoo [...]
-pgRouting is an `OSGeo Labs <http://wiki.osgeo.org/wiki/OSGeo_Labs>`_ project of the `OSGeo Foundation <http://osgeo.org>`_ and included on `OSGeo Live <http://live.osgeo.org/>`_.
+pgRouting is an `OSGeo Labs <http://wiki.osgeo.org/wiki/OSGeo_Labs>`_ project of the `OSGeo Foundation <http://osgeo.org>`_ and included on `OSGeo Live <http://live.osgeo.org/>`_.
.. _license:
@@ -28,7 +28,7 @@ The following licenses can be found in pgRouting:
:widths: 250 500
* - **License**
- -
+ -
* - GNU General Public License, version 2
- Most features of pgRouting are available under `GNU General Public License, version 2 <http://www.gnu.org/licenses/gpl-2.0.html>`_.
* - Boost Software License - Version 1.0
@@ -50,9 +50,9 @@ This Release Contributors
Individuals (in alphabetical order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
-Andrea Nardellli, Daniel Kastl, Ko Nagase, Mario Basa, Regina Obe, Rohith Reddy, Stephen Woodbridge, Virginia Vergara
+Virginia Vergara
-And all the people that gives us a little of their time making comments, finding issues, making pull requests etc.
+And all the people that give us a little of their time making comments, finding issues, making pull requests etc.
Corporate Sponsors (in alphabetical order)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -86,16 +86,6 @@ These are corporate entities that have contributed developer time, hosting, or d
- Paragon Corporation
-Inside
-------
-
-.. _boost-inside:
-
-.. figure:: ./images/boost-inside.jpeg
- :target: http://www.boost.org/libs/graph
-
- Boost Graph Inside
-
More Information
-------------------------------------------------------------------------------
@@ -104,4 +94,5 @@ More Information
* PostGIS extension at the PostGIS project web site http://postgis.net.
* Boost C++ source libraries at http://www.boost.org.
* Computational Geometry Algorithms Library (CGAL) at http://www.cgal.org.
+* The Migration guide can be found at https://github.com/pgRouting/pgrouting/wiki/Migration-Guide.
diff --git a/doc/src/proposed.rst b/doc/src/proposed.rst
new file mode 100644
index 0000000..bbefe9c
--- /dev/null
+++ b/doc/src/proposed.rst
@@ -0,0 +1,163 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _Stable:
+
+Stable proposed Functions
+==================================
+
+.. stable-begin-warning
+
+.. warning:: These are proposed functions for next mayor release.
+
+ - They are not officially in the current release.
+ - They will likely officially be part of the next mayor release:
+
+ - The functions make use of ANY-INTEGER and ANY-NUMERICAL
+ - Name might not change. (But still can)
+ - Signature might not change. (But still can)
+ - Functionality might not change. (But still can)
+ - pgTap tests have being done. But might need more.
+ - Documentation might need refinement.
+
+.. stable-end-warning
+
+
+
+As part of the :ref:`dijkstra`
+
+- :ref:`pgr_dijkstraCostMatrix` Use pgr_dijkstra to calculate a cost matrix.
+- :ref:`pgr_dijkstraVia` - Use pgr_dijkstra to make a route via vertices.
+
+.. rubric:: Families
+
+:ref:`astar`
+
+.. include:: aStar-family.rst
+ :start-after: index from here
+ :end-before: index to here
+
+
+:ref:`withPoints`
+
+.. include:: withPoints-family.rst
+ :start-after: index from here
+ :end-before: index to here
+
+.. rubric:: categories
+
+:ref:`Cost`
+
+.. include:: cost-category.rst
+ :start-after: index from here
+ :end-before: index to here
+
+:ref:`CostMatrix`
+
+.. include:: costMatrix-category.rst
+ :start-after: index from here
+ :end-before: index to here
+
+:ref:`KSP`
+
+.. include:: KSP-category.rst
+ :start-after: index from here
+ :end-before: index to here
+
+.. toctree::
+ :hidden:
+
+ aStar-family
+ withPoints-family
+
+ cost-category
+ costMatrix-category
+ KSP-category
+
+
+.. _proposed:
+
+Experimental and Proposed functions
+===============================================================================
+
+
+.. begin-warn-expr
+
+.. warning:: These are proposed functions
+
+ - They are not officially of the current release.
+ - They likely will not be officially be part of the next release:
+
+ - The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
+ - Name might change.
+ - Signature might change.
+ - Functionality might change.
+ - pgTap tests might be missing.
+ - Might need c/c++ coding.
+ - May lack documentation.
+ - Documentation if any might need to be rewritten.
+ - Documentation examples might need to be automatically generated.
+ - Might need a lot of feedback from the comunity.
+ - Might depend on a proposed function of pgRouting
+ - Might depend on a deprecated function of pgRouting
+
+.. end-warn-expr
+
+
+:ref:`contraction` - Reduce network size using contraction techniques
+
+- :ref:`pgr_contractgraph` - Reduce network size using contraction techniques
+
+:ref:`maxFlow`
+
+.. include:: flow-family.rst
+ :start-after: index from here
+ :end-before: index to here
+
+
+.. rubric:: Convenience
+
+- :ref:`pgr_point_to_edgenode` - convert a point geometry to a ``vertex_id`` based on closest edge.
+
+.. rubric:: Graph Analysis
+
+- :ref:`pgr_labelGraph` - Analyze / label subgraphs within a network
+
+.. rubric:: Vehicle Routing Problems
+
+- :ref:`pgr_gsocvrppdtw` - VRP Pickup & Delivery (Euclidean)
+- :ref:`pgr_vrp_basic` - VRP One Depot
+
+
+.. toctree::
+ :hidden:
+
+ contraction-family
+ flow-family
+ pgr_pointToEdgeNode
+ pgr_labelGraph
+ pgr_gsoc_vrppdtw
+ pgr_vrpOneDepot
+
+
+
+
+
+
+
+
+..
+ The template
+ ------------
+ - :ref:`pgr_funnyDijkstra`
+ .. toctree::
+ :hidden:
+ ..
+ ../src/funnyDijkstra/doc/pgr_funnyDijkstra.rst
+
diff --git a/doc/src/recipes/example_recipe.rst b/doc/src/recipes/example_recipe.rst
deleted file mode 100644
index a7bca43..0000000
--- a/doc/src/recipes/example_recipe.rst
+++ /dev/null
@@ -1,29 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _example_recipe:
-
-Comparing topology of a unnoded network with a noded network
--------------------------------------------------------------
-
-:Author: pgRouting team.
-:Licence: Open Source
-
-This recipe uses the :ref:`sampledata` network.
-
-The purpose of this recipe is to compare a not nodded network with a nodded network.
-
-.. code-block:: sql
-
- SELECT pgr_createTopology('edge_table', 0.001);
- SELECT pgr_analyzegraph('edge_table', 0.001);
- SELECT pgr_nodeNetwork('edge_table', 0.001);
- SELECT pgr_createTopology('edge_table_noded', 0.001);
- SELECT pgr_analyzegraph('edge_table_noded', 0.001);
-
diff --git a/doc/src/recipes/index.rst b/doc/src/recipes/index.rst
deleted file mode 100644
index 50ed137..0000000
--- a/doc/src/recipes/index.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _recipes:
-
-User's Recipes List
-===============================================================================
-
-
-.. toctree::
-
- ./example_recipe.rst
- ./parallel_handling.rst
-
-
-*No more contributions*
-
-
-How to contribute.
-==================
-
-.. rubric:: To add a recipie or a wrapper
-
-The first steps are:
-
- - Fork the repository
- - Create a branch for your recipe or wrapper
- - Create your recipe file
-
-.. code-block:: bash
-
- cd doc/src/recipes/
- vi myrecipe.rst
- git add myrecipe.rst
- # include the recipe in this file
- vi index.rst
-
-.. rubric:: To create the test file of your recipe
-
-.. code-block:: bash
-
- cd test
- cp myrecipe.rst myrecipe.sql.test
-
- # make your test based on your recipe
- vi myrecipe.sql.test
- git add myrecipe.sql.test
-
- # create your test results file
- touch myrecipe.result
- git add myrecipe.result
-
- # add your test to the file
- vi test.conf
-
-Leave only the SQL code on ``myrecipe.sql.test`` by deleting lines or by commenting lines.
-
-
-.. rubric:: To get the results of your recipe
-
-From the root directory execute:
-
-.. code-block:: bash
-
- tools/test-runner.pl -alg recipes -ignorenotice
-
-Copy the results of your recipe and paste them in the file ``myrecipe.result``, and remove the "> " from the file.
-
-.. rubric:: make a pull request.
-
-.. code-block:: bash
-
- git commit -a -m 'myrecipe is for this and that'
- git push
-
-From your fork in github make a pull request over develop
-
diff --git a/doc/src/recipes/parallel_handling.rst b/doc/src/recipes/parallel_handling.rst
deleted file mode 100644
index f20ddb3..0000000
--- a/doc/src/recipes/parallel_handling.rst
+++ /dev/null
@@ -1,221 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _parallel_handling:
-
-Handling parallels after getting a path (pgr_ksp focus)
--------------------------------------------------------
-
-:Author: pgRouting team.
-:Licence: Open Source
-
-
-.. rubric:: The graph
-
-
-.. image:: ./images/parallelImage.png
-
-
-.. rubric:: Data
-
-.. code-block:: sql
-
- drop table if exists parallel;
- CREATE TABLE parallel (
- id serial,
- source integer,
- target integer,
- cost double precision,
- reverse_cost double precision,
- x1 double precision,
- y1 double precision,
- x2 double precision,
- y2 double precision,
- the_geom geometry
- );
-
- INSERT INTO parallel (x1,y1,x2,y2)
- VALUES (1,0,1,1),(1,1,1,3),(1,1,1,3),(1,1,1,3),(1,3,1,4),(1,1,-1,1),(-1,1,-1,3),(-1,3,1,3);
- UPDATE parallel SET the_geom = ST_makeline(ST_point(x1,y1),ST_point(x2,y2));
- UPDATE parallel SET the_geom = ST_makeline(ARRAY[ST_point(1,1),ST_point(0,2),ST_point(1,3)]) WHERE id = 3;
- UPDATE parallel SET the_geom = ST_makeline(ARRAY[ST_point(1,1),ST_point(2,1),ST_point(2,3),ST_point(1,3)])
- WHERE id = 4;
- UPDATE parallel SET cost = ST_length(the_geom), reverse_cost = ST_length(the_geom);
- SELECT pgr_createTopology('parallel',0.001);
-
-.. rubric:: pgr_ksp results
-
-We ignore the costs because we want all the parallels
-
-.. code-block:: sql
-
- SELECT seq, path_id AS route, node, edge INTO routes
- from pgr_ksp('select id, source, target, cost, reverse_cost from parallel',
- 1, 4, 3);
-
- select route, node, edge from routes;
- route | node | edge
- -------+------+------
- 1 | 1 | 1
- 1 | 2 | 2
- 1 | 3 | 5
- 1 | 4 | -1
- 2 | 1 | 1
- 2 | 2 | 6
- 2 | 5 | 7
- 2 | 6 | 8
- 2 | 3 | 5
- 2 | 4 | -1
- (10 rows)
-
-
-.. rubric:: We need an aggregate function:
-
-.. code-block:: sql
-
- CREATE AGGREGATE array_accum (anyelement)
- (
- sfunc = array_append,
- stype = anyarray,
- initcond = '{}'
- );
-
-
-.. rubric:: Now lets generate a table with the parallel edges.
-
-.. code-block:: sql
-
- select distinct seq,route,source,target, array_accum(id) as edges into paths
- from (select seq, route, source, target
- from parallel, routes where id = edge) as r
- join parallel using (source, target)
- group by seq,route,source,target order by seq;
-
- select route, source, targets, edges from paths;
- route | source | target | edges
- -------+--------+--------+---------
- 1 | 1 | 2 | {1}
- 2 | 1 | 2 | {1}
- 2 | 2 | 5 | {6}
- 1 | 2 | 3 | {2,3,4}
- 2 | 5 | 6 | {7}
- 1 | 3 | 4 | {5}
- 2 | 6 | 3 | {8}
- 2 | 3 | 4 | {5}
- (8 rows)
-
-
-.. rubric:: Some more aggregate functions
-
-To generate a table with all the combinations for parallel routes, we need some more aggregates
-
-.. code-block:: sql
-
- create or replace function multiply( integer, integer )
- returns integer as
- $$
- select $1 * $2;
- $$
- language sql stable;
-
- create aggregate prod(integer)
- (
- sfunc = multiply,
- stype = integer,
- initcond = 1
- );
-
-.. rubric:: And a function that "Expands" the table
-
-
-
-.. code-block:: sql
-
- CREATE OR REPLACE function expand_parallel_edge_paths(tab text)
- returns TABLE (
- seq INTEGER,
- route INTEGER,
- source INTEGER, target INTEGER, -- this ones are not really needed
- edge INTEGER ) AS
- $body$
- DECLARE
- nroutes INTEGER;
- newroutes INTEGER;
- rec record;
- seq2 INTEGER := 1;
- rnum INTEGER := 0;
-
- BEGIN -- get the number of distinct routes
- execute 'select count(DISTINCT route) from ' || tab INTO nroutes;
- FOR i IN 0..nroutes-1
- LOOP
- -- compute the number of new routes this route will expand into
- -- this is the product of the lengths of the edges array for each route
- execute 'select prod(array_length(edges, 1))-1 from '
- || quote_ident(tab) || ' where route=' || i INTO newroutes;
- -- now we generate the number of new routes for this route
- -- by repeatedly listing the route and swapping out the parallel edges
- FOR j IN 0..newroutes
- LOOP
- -- query the specific route
- FOR rec IN execute 'select * from ' || quote_ident(tab) ||' where route=' || i
- || ' order by seq'
- LOOP
- seq := seq2;
- route := rnum;
- source := rec.source;
- target := rec.target;
- -- using module arithmetic iterate through the various edge choices
- edge := rec.edges[(j % (array_length(rec.edges, 1)))+1];
- -- return a new record
- RETURN next;
- seq2 := seq2 + 1; -- increment the record count
- END LOOP;
- seq := seq2;
- route := rnum;
- source := rec.target;
- target := -1;
- edge := -1;
- RETURN next; -- Insert the ending record of the route
- seq2 := seq2 + 1;
-
- rnum := rnum + 1; -- increment the route count
- END LOOP;
- END LOOP;
- END;
- $body$
- language plpgsql volatile strict cost 100 rows 100;
-
-.. rubric:: Test it
-
-.. code-block:: sql
-
- select * from expand_parallel_edge_paths( 'paths' );
- seq | route | source | target | edge
- -----+-------+--------+--------+------
- 1 | 0 | 1 | 2 | 1
- 2 | 0 | 2 | 3 | 2
- 3 | 0 | 3 | 4 | 5
- 4 | 0 | 4 | -1 | -1
- 5 | 1 | 1 | 2 | 1
- 6 | 1 | 2 | 3 | 3
- 7 | 1 | 3 | 4 | 5
- 8 | 1 | 4 | -1 | -1
- 9 | 2 | 1 | 2 | 1
- 10 | 2 | 2 | 3 | 4
- 11 | 2 | 3 | 4 | 5
- 12 | 2 | 4 | -1 | -1
- 13 | 3 | 1 | 2 | 1
- 14 | 3 | 2 | 5 | 6
- 15 | 3 | 5 | 6 | 7
- 16 | 3 | 6 | 3 | 8
- 17 | 3 | 3 | 4 | 5
- 18 | 3 | 4 | -1 | -1
- (18 rows)
-
diff --git a/doc/src/recipes/test/sampledata.data.sql b/doc/src/recipes/test/sampledata.data.sql
deleted file mode 100644
index db6f2cb..0000000
--- a/doc/src/recipes/test/sampledata.data.sql
+++ /dev/null
@@ -1,59 +0,0 @@
-
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
--- SAMPLE DATA
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-drop table if exists edge_table;
-
-CREATE TABLE edge_table (
- id serial,
- dir character varying,
- source integer,
- target integer,
- cost double precision,
- reverse_cost double precision,
- x1 double precision,
- y1 double precision,
- x2 double precision,
- y2 double precision,
- the_geom geometry
-);
-
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 2,0, 2,1);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES (-1, 1, 2,1, 3,1);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES (-1, 1, 3,1, 4,1);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 2,1, 2,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1,-1, 3,1, 3,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 0,2, 1,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 1,2, 2,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 2,2, 3,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 3,2, 4,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 2,2, 2,3);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1,-1, 3,2, 3,3);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1,-1, 2,3, 3,3);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1,-1, 3,3, 4,3);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 2,3, 2,4);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 4,2, 4,3);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 4,1, 4,2);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 0.5,3.5, 1.999999999999,3.5);
-INSERT INTO edge_table (cost,reverse_cost,x1,y1,x2,y2) VALUES ( 1, 1, 3.5,2.3, 3.5,4);
-
-UPDATE edge_table SET the_geom = st_makeline(st_point(x1,y1),st_point(x2,y2)),
- dir = CASE WHEN (cost>0 and reverse_cost>0) THEN 'B' -- both ways
- WHEN (cost>0 and reverse_cost<0) THEN 'FT' -- direction of the LINESSTRING
- WHEN (cost<0 and reverse_cost>0) THEN 'TF' -- reverse direction of the LINESTRING
- ELSE '' END; -- unknown
-
-select pgr_createTopology('edge_table',0.001);
-
-drop table if exists vertex_table;
-CREATE TABLE vertex_table (
- id serial,
- x double precision,
- y double precision
-);
-
-INSERT INTO vertex_table VALUES
- (1,2,0), (2,2,1), (3,3,1), (4,4,1), (5,0,2), (6,1,2), (7,2,2),
- (8,3,2), (9,4,2), (10,2,3), (11,3,3), (12,4,3), (13,2,4);
diff --git a/doc/src/recipes/test/test.conf b/doc/src/recipes/test/test.conf
deleted file mode 100644
index 54fc6f3..0000000
--- a/doc/src/recipes/test/test.conf
+++ /dev/null
@@ -1,19 +0,0 @@
-#!/usr/bin/perl -w
-
-%main::tests = (
- 'any' => {
- 'comment' => 'Recipes test for any versions.',
- 'data' => ['sampledata.data.sql'],
- 'tests' => [qw(
-parallel_handling
-example_recipe
-)]
- },
-
-# 'data' => ['sampledata.data.sql'],
-# 'vpg-vpgis' => {}, # for version specific tests
-# '8-1' => {}, # for pg 8.x and postgis 1.x
-# '9.2-2.1' => {}, # for pg 9.2 and postgis 2.1
-);
-
-1;
diff --git a/doc/src/recipes/test/zzz-remove_sampledata.result b/doc/src/recipes/test/zzz-remove_sampledata.result
deleted file mode 100644
index e69de29..0000000
diff --git a/doc/src/recipes/test/zzz-remove_sampledata.test.sql b/doc/src/recipes/test/zzz-remove_sampledata.test.sql
deleted file mode 100644
index 9ceaa20..0000000
--- a/doc/src/recipes/test/zzz-remove_sampledata.test.sql
+++ /dev/null
@@ -1,9 +0,0 @@
-BEGIN;
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
--- REMOVE SAMPLE DATA
-------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------
-drop table if exists edge_table;
-drop table if exists vertex_table;
-ROLLBACK;
diff --git a/doc/src/changelog/release_notes.rst b/doc/src/release_notes.rst
similarity index 74%
rename from doc/src/changelog/release_notes.rst
rename to doc/src/release_notes.rst
index 81daf70..6a50b65 100644
--- a/doc/src/changelog/release_notes.rst
+++ b/doc/src/release_notes.rst
@@ -14,34 +14,77 @@ Release Notes
To see the full list of changes check the list of `Git commits <https://github.com/pgRouting/pgrouting/commits>`_ on Github.
-Table of contents
---------------------------
-
- - :ref:`changelog_2_3_2`
- - :ref:`changelog_2_3_1`
- - :ref:`changelog_2_3_0`
- - :ref:`changelog_2_2_4`
- - :ref:`changelog_2_2_3`
- - :ref:`changelog_2_2_2`
- - :ref:`changelog_2_2_1`
- - :ref:`changelog_2_2_0`
- - :ref:`changelog_2_1_0`
- - :ref:`changelog_2_0_1`
- - :ref:`changelog_2_0_0`
- - :ref:`changelog_1_x`
+.. rubric:: Table of contents
+.. changelog start
+
+* :ref:`changelog_2_4_0`
+* :ref:`changelog_2_3_2`
+* :ref:`changelog_2_3_1`
+* :ref:`changelog_2_3_0`
+* :ref:`changelog_2_2_4`
+* :ref:`changelog_2_2_3`
+* :ref:`changelog_2_2_2`
+* :ref:`changelog_2_2_1`
+* :ref:`changelog_2_2_0`
+* :ref:`changelog_2_1_0`
+* :ref:`changelog_2_0_1`
+* :ref:`changelog_2_0_0`
+* :ref:`changelog_1_x`
+
+.. changelog end
+
+.. _changelog_2_4_0:
+
+pgRouting 2.4.0 Release Notes
+-------------------------------------------------------------------------------
+
+To see the issues closed by this release see the `Git closed issues for 2.4.0 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.4.0%22+is%3Aclosed>`_ on Github.
+
+.. rubric:: New Signatures
+
+* pgr_bdDijkstra
+
+
+.. rubric:: New Proposed Signatures
+
+* pgr_maxFlow
+* pgr_astar(one to many)
+* pgr_astar(many to one)
+* pgr_astar(many to many)
+* pgr_astarCost(one to one)
+* pgr_astarCost(one to many)
+* pgr_astarCost(many to one)
+* pgr_astarCost(many to many)
+* pgr_astarCostMatrix
+
+.. rubric:: Deprecated Signatures
+
+* pgr_bddijkstra - use pgr_bdDijkstra instead
+
+.. rubric:: Deprecated Functions
+
+* pgr_pointsToVids
+
+.. rubric:: Bug fix
+
+* Bug fixes on proposed functions
+
+ * pgr_withPointsKSP: fixed ordering
+
+* TRSP original code is used with no changes on the compilation warnings
.. _changelog_2_3_2:
pgRouting 2.3.2 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.3.2 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.3.2%22+is%3Aclosed>`_ on Github.
.. rubric:: Bug Fixes
* Fixed pgr_gsoc_vrppdtw crash when all orders fit on one truck.
-* Fixed pgr_trsp:
+* Fixed pgr_trsp:
* Alternate code is not executed when the point is in reality a vertex
* Fixed ambiguity on seq
@@ -50,7 +93,7 @@ To see the issues closed by this release see the `Git closed issues for 2.3.2 <h
.. _changelog_2_3_1:
pgRouting 2.3.1 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.3.1 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.3.1%22+is%3Aclosed>`_ on Github.
@@ -64,14 +107,12 @@ To see the issues closed by this release see the `Git closed issues for 2.3.1 <h
.. _changelog_2_3_0:
pgRouting 2.3.0 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
-To see the issues closed by this release see the `Git closed issues for 2.3.0 <https://github.com/pgRouting/pgrouting/issues?q=is%3Aissue+milestone%3A%22Release+2.3.0%22+is%3Aclosed>`_ on Github.
+To see the issues closed by this release see the `Git closed issues for 2.3.0 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.3.0%22+is%3Aclosed>`_ on Github.
.. rubric:: New Signatures
-Indentifiers can be `ANY-INTEGER` and costs can be `ANY-NUMERICAL`
-
* pgr_TSP
* pgr_aStar
@@ -84,11 +125,23 @@ Indentifiers can be `ANY-INTEGER` and costs can be `ANY-NUMERICAL`
* pgr_dijkstraCostMatrix
* pgr_withPointsCostMatrix
-* pgr_maxFlowPushRelabel
-* pgr_maxFlowEdmondsKarp
-* pgr_maxFlowBoykovKolmogorov
+* pgr_maxFlowPushRelabel(one to one)
+* pgr_maxFlowPushRelabel(one to many)
+* pgr_maxFlowPushRelabel(many to one)
+* pgr_maxFlowPushRelabel(many to many)
+* pgr_maxFlowEdmondsKarp(one to one)
+* pgr_maxFlowEdmondsKarp(one to many)
+* pgr_maxFlowEdmondsKarp(many to one)
+* pgr_maxFlowEdmondsKarp(many to many)
+* pgr_maxFlowBoykovKolmogorov (one to one)
+* pgr_maxFlowBoykovKolmogorov (one to many)
+* pgr_maxFlowBoykovKolmogorov (many to one)
+* pgr_maxFlowBoykovKolmogorov (many to many)
* pgr_maximumCardinalityMatching
-* pgr_edgeDisjointPaths
+* pgr_edgeDisjointPaths(one to one)
+* pgr_edgeDisjointPaths(one to many)
+* pgr_edgeDisjointPaths(many to one)
+* pgr_edgeDisjointPaths(many to many)
* pgr_contractGraph
@@ -110,9 +163,9 @@ Indentifiers can be `ANY-INTEGER` and costs can be `ANY-NUMERICAL`
.. _changelog_2_2_4:
pgRouting 2.2.4 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
-To see the issues closed by this release see the `Git closed issues for 2.2.4 <https://github.com/pgRouting/pgrouting/issues?q=is%3Aissue+milestone%3A%22Release+2.2.4%22+is%3Aclosed>`_ on Github.
+To see the issues closed by this release see the `Git closed issues for 2.2.4 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.2.4%22+is%3Aclosed>`_ on Github.
.. rubric:: Bug Fixes
@@ -123,7 +176,7 @@ To see the issues closed by this release see the `Git closed issues for 2.2.4 <h
.. _changelog_2_2_3:
pgRouting 2.2.3 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.2.3 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.2.3%22+is%3Aclosed>`_ on Github.
@@ -134,7 +187,7 @@ To see the issues closed by this release see the `Git closed issues for 2.2.3 <h
.. _changelog_2_2_2:
pgRouting 2.2.2 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.2.2 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.2.2%22+is%3Aclosed>`_ on Github.
@@ -146,7 +199,7 @@ To see the issues closed by this release see the `Git closed issues for 2.2.2 <h
.. _changelog_2_2_1:
pgRouting 2.2.1 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.2.1 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A2.2.1+is%3Aclosed>`_ on Github.
@@ -159,9 +212,9 @@ To see the issues closed by this release see the `Git closed issues for 2.2.1 <h
.. _changelog_2_2_0:
pgRouting 2.2.0 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
-To see the issues closed by this release see the `Git closed issues for 2.2.0 <https://github.com/pgRouting/pgrouting/issues?utf8=%E2%9C%93&q=is%3Aissue+milestone%3A%22Release+2.2.0%22+is%3Aclosed>`_ on Github.
+To see the issues closed by this release see the `Git closed issues for 2.2.0 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.2.0%22+is%3Aclosed>`_ on Github.
.. rubric:: Improvements
@@ -179,13 +232,23 @@ To see the issues closed by this release see the `Git closed issues for 2.2.0 <h
- pgr_floydWarshall
- pgr_Johnson
-- pgr_DijkstraCost
+- pgr_dijkstraCost(one to one)
+- pgr_dijkstraCost(one to many)
+- pgr_dijkstraCost(many to one)
+- pgr_dijkstraCost(many to many)
.. rubric:: Proposed functionality
-- pgr_withPoints
-- pgr_withPointsCost
-- pgr_withPointsDD
+- pgr_withPoints(one to one)
+- pgr_withPoints(one to many)
+- pgr_withPoints(many to one)
+- pgr_withPoints(many to many)
+- pgr_withPointsCost(one to one)
+- pgr_withPointsCost(one to many)
+- pgr_withPointsCost(many to one)
+- pgr_withPointsCost(many to many)
+- pgr_withPointsDD(single vertex)
+- pgr_withPointsDD(multiple vertices)
- pgr_withPointsKSP
- pgr_dijkstraVia
@@ -197,23 +260,34 @@ To see the issues closed by this release see the `Git closed issues for 2.2.0 <h
- pgr_kDijkstraCost use pgr_dijkstraCost instead
- pgr_kDijkstraPath use pgr_dijkstra instead
+.. rubric:: Renamed and deprecated function
+
+- pgr_makeDistanceMatrix renamed to _pgr_makeDistanceMatrix
+
.. _changelog_2_1_0:
pgRouting 2.1.0 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.1.0 <https://github.com/pgRouting/pgrouting/issues?q=is%3Aissue+milestone%3A%22Release+2.1.0%22+is%3Aclosed>`_ on Github.
+.. rubric:: New Signatures
+
+- pgr_dijkstra(one to many)
+- pgr_dijkstra(many to one)
+- pgr_dijkstra(many to many)
+- pgr_drivingDistance(multiple vertices)
+
.. rubric:: Refactored
-- pgr_dijkstra
+- pgr_dijkstra(one to one)
- pgr_ksp
-- pgr_drivingDistance
+- pgr_drivingDistance(single vertex)
.. rubric:: Improvements
-- Alphashape function now can generate better (multi)polygon with holes and alpha parameter.
+- pgr_alphaShape function now can generate better (multi)polygon with holes and alpha parameter.
.. rubric:: Proposed functionality
@@ -230,6 +304,19 @@ To see the issues closed by this release see the `Git closed issues for 2.1.0 <h
- Added proposed functions from GSoc Projects:
- pgr_vrppdtw
+ - pgr_vrponedepot
+
+.. rubric:: Deprecated functions
+
+- pgr_getColumnName
+- pgr_getTableName
+- pgr_isColumnCndexed
+- pgr_isColumnInTable
+- pgr_quote_ident
+- pgr_versionless
+- pgr_startPoint
+- pgr_endPoint
+- pgr_pointToId
.. rubric:: No longer supported
@@ -262,7 +349,7 @@ To see the issues closed by this release see the `Git closed issues for 2.1.0 <h
.. _changelog_2_0_1:
pgRouting 2.0.1 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
Minor bug fixes.
@@ -274,7 +361,7 @@ Minor bug fixes.
.. _changelog_2_0_0:
pgRouting 2.0.0 Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 2.0.0 <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+2.0.0%22+is%3Aclosed>`_ on Github.
@@ -284,7 +371,7 @@ The main Goals for this release are:
* Major restructuring of pgRouting.
* Standardiziation of the function naming
* Prepararation of the project for future development.
-
+
As a result of this effort:
* pgRouting has a simplified structure
@@ -318,45 +405,47 @@ As a result of this effort:
* Support for ``st_`` PostGIS function prefix
* Added ``pgr_`` prefix to functions and types
* Better documentation: http://docs.pgrouting.org
+* shooting_star is discontinued
+
.. _changelog_1_x:
pgRouting 1.x Release Notes
-===============================================================================
+-------------------------------------------------------------------------------
To see the issues closed by this release see the `Git closed issues for 1.x <https://github.com/pgRouting/pgrouting/issues?q=milestone%3A%22Release+1.x%22+is%3Aclosed>`_ on Github.
The following release notes have been copied from the previous ``RELEASE_NOTES`` file and are kept as a reference.
Changes for release 1.05
--------------------------------------------------------------------------------
+...............................................................................
* Bugfixes
Changes for release 1.03
--------------------------------------------------------------------------------
+...............................................................................
* Much faster topology creation
* Bugfixes
Changes for release 1.02
--------------------------------------------------------------------------------
+...............................................................................
* Shooting* bugfixes
* Compilation problems solved
Changes for release 1.01
--------------------------------------------------------------------------------
+...............................................................................
* Shooting* bugfixes
Changes for release 1.0
--------------------------------------------------------------------------------
+...............................................................................
* Core and extra functions are separated
* Cmake build process
@@ -364,28 +453,28 @@ Changes for release 1.0
Changes for release 1.0.0b
--------------------------------------------------------------------------------
+...............................................................................
* Additional SQL file with more simple names for wrapper functions
* Bugfixes
Changes for release 1.0.0a
--------------------------------------------------------------------------------
+...............................................................................
* Shooting* shortest path algorithm for real road networks
* Several SQL bugs were fixed
Changes for release 0.9.9
--------------------------------------------------------------------------------
+...............................................................................
* PostgreSQL 8.2 support
* Shortest path functions return empty result if they couldn’t find any path
Changes for release 0.9.8
--------------------------------------------------------------------------------
+...............................................................................
* Renumbering scheme was added to shortest path functions
* Directed shortest path functions were added
diff --git a/doc/src/routingFunctions.rst b/doc/src/routingFunctions.rst
new file mode 100644
index 0000000..fd4b2b6
--- /dev/null
+++ b/doc/src/routingFunctions.rst
@@ -0,0 +1,67 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+
+.. _routing_functions:
+
+*******************************************************************************
+Routing Functions
+*******************************************************************************
+
+..
+ from-here
+
+
+:ref:`all_pairs`
+
+- :ref:`pgr_floydWarshall` - Floyd-Warshall's Algorithm
+- :ref:`pgr_johnson`- Johnson’s Algorithm
+
+:ref:`pgr_astar` - Shortest Path A*
+
+:ref:`pgr_bdAstar<bd_astar>` - Bi-directional A* Shortest Path
+
+:ref:`pgr_bdDijkstra` - Bi-directional Dijkstra Shortest Path
+
+
+:ref:`dijkstra`
+
+.. include:: dijkstra-family.rst
+ :start-after: index from here
+ :end-before: index to here
+
+:ref:`pgr_ksp` - K-Shortest Path
+
+:ref:`pgr_trsp<trsp>` - Turn Restriction Shortest Path (TRSP)
+
+:ref:`tsp`
+
+.. include:: TSP-family.rst
+ :start-after: index from here
+ :end-before: index to here
+
+:ref:`drivingDistance`
+
+.. include:: drivingDistance-category.rst
+ :start-after: index from here
+ :end-before: index to here
+
+.. to-here
+
+.. toctree::
+ :hidden:
+
+ allpairs-family
+ pgr_bdAstar
+ pgr_bdDijkstra
+ dijkstra-family
+ pgr_KSP
+ pgr_trsp
+ TSP-family
+ drivingDistance-category
diff --git a/doc/src/developer/sampledata.rst b/doc/src/sampledata.rst
similarity index 85%
rename from doc/src/developer/sampledata.rst
rename to doc/src/sampledata.rst
index 2c143a8..c7733d0 100644
--- a/doc/src/developer/sampledata.rst
+++ b/doc/src/sampledata.rst
@@ -18,14 +18,14 @@ To be able to execute the sample queries, run the following SQL commands to crea
.. rubric:: Create table
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --EDGE TABLE CREATE
:end-before: --EDGE TABLE ADD DATA
.. rubric:: Insert data
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --EDGE TABLE ADD DATA
:end-before: --EDGE TABLE TOPOLOGY
@@ -34,7 +34,7 @@ To be able to execute the sample queries, run the following SQL commands to crea
- Before you test a routing function use this query to create a topology (fills the ``source`` and ``target`` columns).
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --EDGE TABLE TOPOLOGY
:end-before: --POINTS CREATE
@@ -43,7 +43,7 @@ To be able to execute the sample queries, run the following SQL commands to crea
- When points outside of the graph.
- Used with the :ref:`withPoints` functions.
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --POINTS CREATE
:end-before: --RESTRICTIONS CREATE
@@ -51,7 +51,7 @@ To be able to execute the sample queries, run the following SQL commands to crea
- Used with the :ref:`trsp` functions.
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --RESTRICTIONS CREATE
:end-before: --RESTRICTIONS END
@@ -59,7 +59,7 @@ To be able to execute the sample queries, run the following SQL commands to crea
- Used with the :ref:`maxFlow` functions.
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --RESTRICTIONS END
:end-before: --CATEGORIES END
@@ -67,7 +67,7 @@ To be able to execute the sample queries, run the following SQL commands to crea
- Used in some deprecated signatures or deprecated functions.
-.. literalinclude:: ../../../tools/testers/sampledata.sql
+.. literalinclude:: ../../tools/testers/sampledata.sql
:start-after: --CATEGORIES END
:end-before: --VERTEX TABLE END
@@ -80,7 +80,7 @@ Images
* Points are outside the graph.
* Click on the graph to enlarge.
-.. note:: On all graphs,
+.. note:: On all graphs,
.. rubric:: Network for queries marked as ``directed`` and ``cost`` and ``reverse_cost`` columns are used:
@@ -122,7 +122,7 @@ When working with city networks, this is recommended for point of view of pedest
.. figure:: images/Fig4-costUndirected.png
:scale: 20%
-
+
**Graph 4: Undirected, with cost**
@@ -131,6 +131,6 @@ When working with city networks, this is recommended for point of view of pedest
Pick & Deliver Data
.........................
-.. literalinclude:: ../../../src/pickDeliver/test/pickDeliver.data
+.. literalinclude:: ../../src/pickDeliver/test/pickDeliver.data
diff --git a/doc/src/introduction/support.rst b/doc/src/support.rst
similarity index 95%
rename from doc/src/introduction/support.rst
rename to doc/src/support.rst
index cd1da04..025343b 100644
--- a/doc/src/introduction/support.rst
+++ b/doc/src/support.rst
@@ -1,9 +1,9 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
- This documentation is licensed under a Creative Commons Attribution-Share
+ This documentation is licensed under a Creative Commons Attribution-Share
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
@@ -22,16 +22,16 @@ Bugs are reported and managed in an `issue tracker <https://github.com/pgrouting
1. Search the tickets to see if your problem has already been reported. If so, add any extra context you might have found, or at least indicate that you too are having the problem. This will help us prioritize common issues.
2. If your problem is unreported, create a `new issue <https://github.com/pgRouting/pgrouting/issues/new>`_ for it.
-3. In your report include explicit instructions to replicate your issue. The best tickets include the exact SQL necessary to replicate a problem.
+3. In your report include explicit instructions to replicate your issue. The best tickets include the exact SQL necessary to replicate a problem.
4. If you can test older versions of PostGIS for your problem, please do. On your ticket, note the earliest version the problem appears.
5. For the versions where you can replicate the problem, note the operating system and version of pgRouting, PostGIS and PostgreSQL.
-6. It is recommended to use the following wrapper on the problem to pin point the step that is causing the problem.
+6. It is recommended to use the following wrapper on the problem to pin point the step that is causing the problem.
.. code-block:: sql
- SET client_min_messages TO debug;
+ SET client_min_messages TO debug;
<your code>
- SET client_min_messages TO notice;
+ SET client_min_messages TO notice;
diff --git a/doc/src/tutorial/analytics.rst b/doc/src/tutorial/analytics.rst
deleted file mode 100644
index 97ff85e..0000000
--- a/doc/src/tutorial/analytics.rst
+++ /dev/null
@@ -1,138 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _analytics:
-
-Graph Analytics
-===============================================================================
-
-:Author: Stephen Woodbridge <woodbri at swoodbridge.com>
-:Copyright: Stephen Woodbridge. The source code is released under the MIT-X license.
-
-
-Overview
--------------------------------------------------------------------------------
-
-It is common to find problems with graphs that have not been constructed fully noded or in graphs with z-levels at intersection that have been entered incorrectly. An other problem is one way streets that have been entered in the wrong direction. We can not detect errors with respect to "ground" truth, but we can look for inconsistencies and some anomalies in a graph and report them for additional inspections.
-
-We do not current have any visualization tools for these problems, but I have used mapserver to render the graph and highlight potential problem areas. Someone familiar with graphviz might contribute tools for generating images with that.
-
-
-Analyze a Graph
--------------------------------------------------------------------------------
-
-With :ref:`pgr_analyze_graph` the graph can be checked for errors. For example for table "mytab" that has "mytab_vertices_pgr" as the vertices table:
-
-.. code-block:: sql
-
- SELECT pgr_analyzeGraph('mytab', 0.000002);
- NOTICE: Performing checks, pelase wait...
- NOTICE: Analyzing for dead ends. Please wait...
- NOTICE: Analyzing for gaps. Please wait...
- NOTICE: Analyzing for isolated edges. Please wait...
- NOTICE: Analyzing for ring geometries. Please wait...
- NOTICE: Analyzing for intersections. Please wait...
- NOTICE: ANALYSIS RESULTS FOR SELECTED EDGES:
- NOTICE: Isolated segments: 158
- NOTICE: Dead ends: 20028
- NOTICE: Potential gaps found near dead ends: 527
- NOTICE: Intersections detected: 2560
- NOTICE: Ring geometries: 0
- pgr_analyzeGraph
- ----------
- OK
- (1 row)
-
-
-In the vertices table "mytab_vertices_pgr":
-
- - Deadends are identified by ``cnt=1``
- - Potencial gap problems are identified with ``chk=1``.
-
-.. code-block:: sql
-
- SELECT count(*) as deadends FROM mytab_vertices_pgr WHERE cnt = 1;
- deadends
- ----------
- 20028
- (1 row)
-
- SELECT count(*) as gaps FROM mytab_vertices_pgr WHERE chk = 1;
- gaps
- -----
- 527
- (1 row)
-
-
-
-For isolated road segments, for example, a segment where both ends are deadends. you can find these with the following query:
-
-.. code-block:: sql
-
- SELECT *
- FROM mytab a, mytab_vertices_pgr b, mytab_vertices_pgr c
- WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1;
-
-
-If you want to visualize these on a graphic image, then you can use something like mapserver to render the edges and the vertices and style based on ``cnt`` or if they are isolated, etc. You can also do this with a tool like graphviz, or geoserver or other similar tools.
-
-
-Analyze One Way Streets
--------------------------------------------------------------------------------
-
-:ref:`pgr_analyze_oneway` analyzes one way streets in a graph and identifies any flipped segments. Basically if you count the edges coming into a node and the edges exiting a node the number has to be greater than one.
-
-This query will add two columns to the vertices_tmp table ``ein int`` and ``eout int`` and populate it with the appropriate counts. After running this on a graph you can identify nodes with potential problems with the following query.
-
-
-The rules are defined as an array of text strings that if match the ``col`` value would be counted as true for the source or target in or out condition.
-
-
-Example
--------------------------------------------------------------------------------
-
-Lets assume we have a table "st" of edges and a column "one_way" that might have values like:
-
- * 'FT' - oneway from the source to the target node.
- * 'TF' - oneway from the target to the source node.
- * 'B' - two way street.
- * '' - empty field, assume twoway.
- * <NULL> - NULL field, use two_way_if_null flag.
-
-Then we could form the following query to analyze the oneway streets for errors.
-
-.. code-block:: sql
-
- SELECT pgr_analyzeOneway('mytab',
- ARRAY['', 'B', 'TF'],
- ARRAY['', 'B', 'FT'],
- ARRAY['', 'B', 'FT'],
- ARRAY['', 'B', 'TF'],
- );
-
- -- now we can see the problem nodes
- SELECT * FROM mytab_vertices_pgr WHERE ein=0 OR eout=0;
-
- -- and the problem edges connected to those nodes
- SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.source=b.id AND ein=0 OR eout=0
- UNION
- SELECT gid FROM mytab a, mytab_vertices_pgr b WHERE a.target=b.id AND ein=0 OR eout=0;
-
-Typically these problems are generated by a break in the network, the one way direction set wrong, maybe an error related to z-levels or a network that is not properly noded.
-
-The above tools do not detect all network issues, but they will identify some common problems. There are other problems that are hard to detect because they are more global in nature like multiple disconnected networks. Think of an island with a road network that is not connected to the mainland network because the bridge or ferry routes are missing.
-
-
-See Also
-----------------------------------------------------------------------------
-
-* :ref:`pgr_analyze_graph`
-* :ref:`pgr_analyze_oneway`
-* :ref:`pgr_node_network`
-
diff --git a/doc/src/tutorial/custom_query.rst b/doc/src/tutorial/custom_query.rst
deleted file mode 100644
index 559f5d9..0000000
--- a/doc/src/tutorial/custom_query.rst
+++ /dev/null
@@ -1,180 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _custom_query:
-
-Dictionary of columns & Custom Query
-===============================================================================
-
-:path: a sequence of vertices/edges from A to B.
-:route: a sequence of paths.
-:ANY-INTEGER: Any of the following types: SMALLINT, INTEGER, BIGINT
-:ANY-NUMERICAL: Any of the following types: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
-
-
-
-Custom Queries
-===============================================================================
-
-
-
-Edges queries
--------------------------------------------------------------------------------
-
-
-Columns of the edges_sql queries
-...............................................................................
-
-
-Depending on the function used the following columns are expected
-
-================ =================== ======== =================================================
-Column Type Default Description
-================ =================== ======== =================================================
-**id** ``ANY-INTEGER`` Identifier of the edge.
-**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
-**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
-**cost** ``ANY-NUMERICAL`` Weight of the edge `(source, target)`
- - When negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
-**reverse_cost** ``ANY-NUMERICAL`` -1 Weight of the edge `(target, source)`,
- - When negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
-================ =================== ======== =================================================
-
-
-Where:
-
-:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
-:ANY-NUMERICAL: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
-
-
-
-
-
-Description of the edges_sql query
--------------------------------------------------------------------------------
-
-:edges_sql: an SQL query, which should return a set of rows with the following columns:
-
- :id: ``ANY-INTEGER`` identifier of the edge.
- :source: ``ANY-INTEGER`` identifier of the first end point vertex of the edge.
- :target: ``ANY-INTEGER`` identifier of the second end pont vertex of the edge.
- :cost: ``ANY-NUMERICAL`` weight of the edge `(source, target)`, if negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
- :reverse_cost: ``ANY-NUMERICAL`` (optional) weight of the edge `(target, source)`, if negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
-
-Where:
-
-:ANY-INTEGER: smallint, int, bigint
-:ANY-NUMERICAL: smallint, int, bigint, real, float
-
-
-Description of the parameters of the signatures
--------------------------------------------------------------------------------
-
-:edges_sql: ``TEXT`` SQL query as described above.
-:start_vid: ``BIGINT`` identifier of the starting vertex of the path.
-:start_vids: ``array[ANY-INTEGER]`` array of identifiers of starting vertices.
-:end_vid: ``BIGINT`` identifier of the ending vertex of the path.
-:end_vids: ``array[ANY-INTEGER]`` array of identifiers of ending vertices.
-:directed: ``boolean`` (optional). When ``false`` the graph is considered as Undirected. Default is ``true`` which considers the graph as Directed.
-
-
-Description of the return values
--------------------------------------------------------------------------------
-
-Returns set of ``(seq [, start_vid] [, end_vid] , node, edge, cost, agg_cost)``
-
-:seq: ``INTEGER`` is a sequential value starting from **1**.
-:route_seq: ``INTEGER`` relative position in the route. Has value **1** for the beginning of a route.
-:route_id: ``INTEGER`` id of the route.
-:path_seq: ``INTEGER`` relative position in the path. Has value **1** for the beginning of a path.
-:path_id: ``INTEGER`` id of the path.
-:start_vid: ``BIGINT`` id of the starting vertex. Used when multiple starting vetrices are in the query.
-:end_vid: ``BIGINT`` id of the ending vertex. Used when multiple ending vertices are in the query.
-:node: ``BIGINT`` id of the node in the path from start_vid to end_v.
-:edge: ``BIGINT`` id of the edge used to go from ``node`` to the next node in the path sequence. ``-1`` for the last node of the path.
-:cost: ``FLOAT`` cost to traverse from ``node`` using ``edge`` to the next node in the path sequence.
-:agg_cost: ``FLOAT`` total cost from ``start_vid`` to ``node``.
-
-
-
-Descriptions for version 2.0 signatures
----------------------------------------
-
-In general, the routing algorithms need an SQL query that contain one or more of the following required columns with the preferred type:
-
-:id: int4
-:source: int4
-:target: int4
-:cost: float8
-:reverse_cost: float8
-:x: float8
-:y: float8
-:x1: float8
-:y1: float8
-:x2: float8
-:y2: float8
-
-
-
-.. code-block:: sql
-
- SELECT source, target, cost FROM edge_table;
- SELECT id, source, target, cost FROM edge_table;
- SELECT id, source, target, cost, x1, y1, x2, y2 ,reverse_cost FROM edge_table
-
-When the edge table has a different name to represent the required columns:
-
-.. code-block:: sql
-
- SELECT src as source, target, cost FROM othertable;
- SELECT gid as id, src as source, target, cost FROM othertable;
- SELECT gid as id, src as source, target, cost, fromX as x1, fromY as y1, toX as x2, toY as y2 ,Rcost as reverse_cost
- FROM othertable;
-
-
-.. Topology functions
-
-The topology functions use the same names for ``id``, ``source`` and ``target`` columns of the edge table, The fowllowing parameters have as default value:
-
-:id: int4 Default ``id``
-:source: int4 Default ``source``
-:target: int4 Default ``target``
-:the_geom: text Default ``the_geom``
-:oneway: text Default ``oneway``
-:rows_where: text Default ``true`` to indicate all rows (this is not a column)
-
-The following parameters do not have a default value and when used they have to be inserted in strict order:
-
-:edge_table: text
-:tolerance: float8
-:s_in_rules: text[]
-:s_out_rules: text[]
-:t_in_rules: text[]
-:t_out_rules: text[]
-
-When the columns required have the default names this can be used (pgr_func is to represent a topology function)
-
-.. code-block:: sql
-
- pgr_func('edge_table') -- when tolerance is not required
- pgr_func('edge_table',0.001) -- when tolerance is required
- -- s_in_rule, s_out_rule, st_in_rules, t_out_rules are required
- SELECT pgr_analyzeOneway('edge_table', ARRAY['', 'B', 'TF'], ARRAY['', 'B', 'FT'],
- ARRAY['', 'B', 'FT'], ARRAY['', 'B', 'TF'])
-
-When the columns required do not have the default names its strongly recommended to use the *named notation*.
-
-.. code-block:: sql
-
- pgr_func('othertable', id:='gid',source:='src',the_geom:='mygeom')
- pgr_func('othertable',0.001,the_geom:='mygeom',id:='gid',source:='src')
- SELECT pgr_analyzeOneway('othertable', ARRAY['', 'B', 'TF'], ARRAY['', 'B', 'FT'],
- ARRAY['', 'B', 'FT'], ARRAY['', 'B', 'TF']
- source:='src',oneway:='dir')
-
diff --git a/doc/src/tutorial/index.rst b/doc/src/tutorial/index.rst
deleted file mode 100644
index 9d6fe27..0000000
--- a/doc/src/tutorial/index.rst
+++ /dev/null
@@ -1,45 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _tutorial1:
-
-Tutorial
-===============================================================================
-
-
-:ref:`Getting started <tutorial>`
-
- - How to create a database to use for our project
- - How to load some data
- - How to build a topology
- - How to check your graph for errors
- - How to compute a route
- - How to use other tools to view your graph and route
- - How to create a web app
-
-Advanced Topics
-
- - :ref:`topology` for an overview of a topology for routing algorithms.
- - :ref:`analytics` for an overview of the analysis of a graph.
- - :ref:`custom_query` that is used in the routing algorithms.
- - :ref:`performance` to improve your performance.
-
-.. toctree::
- :hidden:
-
- Getting started <tutorial>
-
-.. toctree::
- :hidden:
-
- An overview of a topology for routing algorithms. <topology>
- An overview of the analysis of a graph. <analytics>
- How to write a query for the routing algorithms <custom_query>
- How to handle performance <performance>
-
diff --git a/doc/src/tutorial/performance.rst b/doc/src/tutorial/performance.rst
deleted file mode 100644
index 391c971..0000000
--- a/doc/src/tutorial/performance.rst
+++ /dev/null
@@ -1,56 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _performance:
-
-Performance Tips
-===============================================================================
-
-For the Routing functions:
---------------------------
-
-.. Note:: To get faster results bound your queries to the area of interest of routing to have, for example, no more than one million rows.
-
-
-For the topology functions:
----------------------------
-When "you know" that you are going to remove a set of edges from the edges table, and without those edges you are going to use a routing function you can do the following:
-
-Analize the new topology based on the actual topology:
-
-.. code-block:: sql
-
- pgr_analyzegraph('edge_table',rows_where:='id < 17');
-
-Or create a new topology if the change is permanent:
-
-.. code-block:: sql
-
- pgr_createTopology('edge_table',rows_where:='id < 17');
- pgr_analyzegraph('edge_table',rows_where:='id < 17');
-
-Use an SQL that "removes" the edges in the routing function
-
-.. code-block:: sql
-
- SELECT id, source, target from edge_table WHERE id < 17
-
-When "you know" that the route will not go out of a particular area, to speed up the process you can use a more complex SQL query like
-
-.. code-block:: sql
-
- SELECT id, source, target from edge_table WHERE
- id < 17 and
- the_geom && (select st_buffer(the_geom,1) as myarea FROM edge_table where id=5)
-
-
-Note that the same condition ``id < 17`` is used in all cases.
-
-
-
diff --git a/doc/src/tutorial/topology.rst b/doc/src/tutorial/topology.rst
deleted file mode 100644
index 86cbe16..0000000
--- a/doc/src/tutorial/topology.rst
+++ /dev/null
@@ -1,121 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _topology:
-
-Routing Topology
-===============================================================================
-
-:Author: Stephen Woodbridge <woodbri at swoodbridge.com>
-:Copyright: Stephen Woodbridge. The source code is released under the MIT-X license.
-
-
-Overview
--------------------------------------------------------------------------------
-
-Typically when GIS files are loaded into the data database for use with pgRouting they do not have topology information associated with them. To create a useful topology the data needs to be "noded". This means that where two or more roads form an intersection there it needs to be a node at the intersection and all the road segments need to be broken at the intersection, assuming that you can navigate from any of these segments to any other segment via that intersection.
-
-You can use the :ref:`graph analysis functions <analytics>` to help you see where you might have topology problems in your data. If you need to node your data, we also have a function :ref:`pgr_nodeNetwork() <pgr_node_network>` that might work for you. This function splits ALL crossing segments and nodes them. There are some cases where this might NOT be the right thing to do.
-
-For example, when you have an overpass and underpass intersection, you do not want these noded, but pgr_nodeNetwork does not know that is the case and will node them which is not good because then the router will be able to turn off the overpass onto the underpass like it was a flat 2D intersection. To deal with this problem some data sets use z-levels at these types of intersections and other data might not node these intersection which would be ok.
-
-For those cases where topology needs to be added the following functions may be useful. One way to prep the data for pgRouting is to add the following columns to your table and then populate them as appropriate. This example makes a lot of assumption like that you original data tables already has certain columns in it like ``one_way``, ``fcc``, and possibly others and that they contain specific data values. This is only to give you an idea of what you can do with your data.
-
-.. code-block:: sql
-
- ALTER TABLE edge_table
- ADD COLUMN source integer,
- ADD COLUMN target integer,
- ADD COLUMN cost_len double precision,
- ADD COLUMN cost_time double precision,
- ADD COLUMN rcost_len double precision,
- ADD COLUMN rcost_time double precision,
- ADD COLUMN x1 double precision,
- ADD COLUMN y1 double precision,
- ADD COLUMN x2 double precision,
- ADD COLUMN y2 double precision,
- ADD COLUMN to_cost double precision,
- ADD COLUMN rule text,
- ADD COLUMN isolated integer;
-
- SELECT pgr_createTopology('edge_table', 0.000001, 'the_geom', 'id');
-
-The function :ref:`pgr_createTopology() <pgr_create_topology>` will create the ``vertices_tmp`` table and populate the ``source`` and ``target`` columns. The following example populated the remaining columns. In this example, the ``fcc`` column contains feature class code and the ``CASE`` statements converts it to an average speed.
-
-.. code-block:: sql
-
- UPDATE edge_table SET x1 = st_x(st_startpoint(the_geom)),
- y1 = st_y(st_startpoint(the_geom)),
- x2 = st_x(st_endpoint(the_geom)),
- y2 = st_y(st_endpoint(the_geom)),
- cost_len = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
- rcost_len = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]'),
- len_km = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')/1000.0,
- len_miles = st_length_spheroid(the_geom, 'SPHEROID["WGS84",6378137,298.25728]')
- / 1000.0 * 0.6213712,
- speed_mph = CASE WHEN fcc='A10' THEN 65
- WHEN fcc='A15' THEN 65
- WHEN fcc='A20' THEN 55
- WHEN fcc='A25' THEN 55
- WHEN fcc='A30' THEN 45
- WHEN fcc='A35' THEN 45
- WHEN fcc='A40' THEN 35
- WHEN fcc='A45' THEN 35
- WHEN fcc='A50' THEN 25
- WHEN fcc='A60' THEN 25
- WHEN fcc='A61' THEN 25
- WHEN fcc='A62' THEN 25
- WHEN fcc='A64' THEN 25
- WHEN fcc='A70' THEN 15
- WHEN fcc='A69' THEN 10
- ELSE null END,
- speed_kmh = CASE WHEN fcc='A10' THEN 104
- WHEN fcc='A15' THEN 104
- WHEN fcc='A20' THEN 88
- WHEN fcc='A25' THEN 88
- WHEN fcc='A30' THEN 72
- WHEN fcc='A35' THEN 72
- WHEN fcc='A40' THEN 56
- WHEN fcc='A45' THEN 56
- WHEN fcc='A50' THEN 40
- WHEN fcc='A60' THEN 50
- WHEN fcc='A61' THEN 40
- WHEN fcc='A62' THEN 40
- WHEN fcc='A64' THEN 40
- WHEN fcc='A70' THEN 25
- WHEN fcc='A69' THEN 15
- ELSE null END;
-
- -- UPDATE the cost information based on oneway streets
-
- UPDATE edge_table SET
- cost_time = CASE
- WHEN one_way='TF' THEN 10000.0
- ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
- END,
- rcost_time = CASE
- WHEN one_way='FT' THEN 10000.0
- ELSE cost_len/1000.0/speed_kmh::numeric*3600.0
- END;
-
- -- clean up the database because we have updated a lot of records
-
- VACUUM ANALYZE VERBOSE edge_table;
-
-
-Now your database should be ready to use any (most?) of the pgRouting algorithms.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_create_topology`
-* :ref:`pgr_node_network`
-* :ref:`pgr_point_to_id`
-
diff --git a/doc/src/tutorial/tutorial.rst b/doc/src/tutorial/tutorial.rst
deleted file mode 100644
index a496fed..0000000
--- a/doc/src/tutorial/tutorial.rst
+++ /dev/null
@@ -1,131 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _tutorial:
-
-Getting Started
-===============================================================================
-
-This is a simple guide to walk you through the steps of getting started
-with pgRouting. In this guide we will cover:
-
- * How to create a database to use for our project
- * How to load some data
- * How to build a topology
- * How to check your graph for errors
- * How to compute a route
- * How to use other tools to view your graph and route
- * How to create a web app
-
-How to create a database
--------------------------------------------------------------------------------
-
-The first thing we need to do is create a database and load pgrouting in
-the database. Typically you will create a database for each project. Once
-you have a database to work in, your can load your data and build your
-application in that database. This makes it easy to move your project
-later if you want to to say a production server.
-
-For Postgresql 9.1 and later versions
-
-.. code-block:: bash
-
- createdb mydatabase
- psql mydatabase -c "create extension postgis"
- psql mydatabase -c "create extension pgrouting"
-
-
-How to load some data
--------------------------------------------------------------------------------
-
-How you load your data will depend in what form it comes it. There are
-various OpenSource tools that can help you, like:
-
-:osm2pgrouting-alpha: - this is a tool for loading OSM data into postgresql with pgRouting requirements
-:shp2pgsql: - this is the postgresql shapefile loader
-:ogr2ogr: - this is a vector data conversion utility
-:osm2pgsql: - this is a tool for loading OSM data into postgresql
-
-So these tools and probably others will allow you to read vector data so that
-you may then load that data into your database as a table of some kind. At this
-point you need to know a little about your data structure and content. One easy
-way to browse your new data table is with pgAdmin3 or phpPgAdmin.
-
-
-How to build a topology
--------------------------------------------------------------------------------
-
-Next we need to build a topology for our street data. What this means is that
-for any given edge in your street data the ends of that edge will be connected
-to a unique node and to other edges that are also connected to that same unique
-node. Once all the edges are connected to nodes we have a graph that can be
-used for routing with pgrouting. We provide a tool that will help with this:
-
-.. note:: this step is not needed if data is loaded with `osm2pgrouting-alpha`
-
-.. code-block:: sql
-
- select pgr_createTopology('myroads', 0.000001);
-
-See :ref:`pgr_create_topology` for more information.
-
-
-How to check your graph for errors
--------------------------------------------------------------------------------
-
-There are lots of possible sources for errors in a graph. The data that you
-started with may not have been designed with routing in mind. A graph has some
-very specific requirments. One is that it is *NODED*, this means that except
-for some very specific use cases, each road segment starts and ends at a node
-and that in general is does not cross another road segment that it should be
-connected to.
-
-There can be other errors like the direction of a one-way street being entered
-in the wrong direction. We do not have tools to search for all possible errors
-but we have some basic tools that might help.
-
-.. code-block:: sql
-
- select pgr_analyzegraph('myroads', 0.000001);
- select pgr_analyzeoneway('myroads', s_in_rules, s_out_rules,
- t_in_rules, t_out_rules
- direction)
-
-See :ref:`analytics` for more information.
-
-If your data needs to be *NODED*, we have a tool that can help for that also.
-
-See :ref:`pgr_node_network` for more information.
-
-
-How to compute a route
--------------------------------------------------------------------------------
-
-Once you have all the preparation work done above, computing a route is fairly easy.
-We have a lot of different algorithms that can work with your prepared road
-network. The general form of a route query is:
-
-.. code-block:: sql
-
- select pgr_<algorithm>(<SQL for edges>, start, end, <additional options>)
-
-As you can see this is fairly straight forward and you can look and the
-specific algorithms for the details of the signatures and how to use them.
-These results have information like edge id and/or the
-node id along with the cost or geometry for the step in the path from *start*
-to *end*. Using the ids you can join these result back to your edge table
-to get more information about each step in the path.
-
-
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/doc/src/recipes/test/example_recipe.result b/doc/test/example_recipe.result
similarity index 100%
rename from doc/src/recipes/test/example_recipe.result
rename to doc/test/example_recipe.result
diff --git a/doc/src/recipes/test/example_recipe.test.sql b/doc/test/example_recipe.test.sql
similarity index 95%
rename from doc/src/recipes/test/example_recipe.test.sql
rename to doc/test/example_recipe.test.sql
index eeba9f0..5fdaf1f 100644
--- a/doc/src/recipes/test/example_recipe.test.sql
+++ b/doc/test/example_recipe.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
/*..
****************************************************************************
pgRouting Manual
@@ -21,11 +20,11 @@ BEGIN;
--The purpose of this recipe is to compare a not nodded network with a nodded network.
--.. code-block:: sql
-set client_min_messages = warning;
+
+SET client_min_messages TO WARNING;
SELECT pgr_createTopology('edge_table', 0.001);
SELECT pgr_analyzegraph('edge_table', 0.001);
SELECT pgr_nodeNetwork('edge_table', 0.001);
SELECT pgr_createTopology('edge_table_noded', 0.001);
SELECT pgr_analyzegraph('edge_table_noded', 0.001);
-ROLLBACK;
diff --git a/doc/src/recipes/test/parallel_handling.result b/doc/test/parallel_handling.result
similarity index 100%
rename from doc/src/recipes/test/parallel_handling.result
rename to doc/test/parallel_handling.result
diff --git a/doc/src/recipes/test/parallel_handling.test.sql b/doc/test/parallel_handling.test.sql
similarity index 99%
rename from doc/src/recipes/test/parallel_handling.test.sql
rename to doc/test/parallel_handling.test.sql
index 006de02..5e6753a 100644
--- a/doc/src/recipes/test/parallel_handling.test.sql
+++ b/doc/test/parallel_handling.test.sql
@@ -1,5 +1,5 @@
-BEGIN;
- SET client_min_messages = WARNING;
+SET client_min_messages = WARNING;
+
drop table if exists parallel;
CREATE TABLE parallel (
id serial,
@@ -21,6 +21,8 @@ BEGIN;
UPDATE parallel SET the_geom = ST_makeline(ARRAY[ST_point(1,1),ST_point(2,1),ST_point(2,3),ST_point(1,3)])
WHERE id = 4;
UPDATE parallel SET cost = ST_length(the_geom), reverse_cost = ST_length(the_geom);
+
+ SET client_min_messages = WARNING;
SELECT pgr_createTopology('parallel',0.001);
@@ -121,4 +123,3 @@ BEGIN;
select * from expand_parallel_edge_paths( 'paths' );
-ROLLBACK;
diff --git a/doc/test/test.conf b/doc/test/test.conf
index 790e81f..a918f4f 100644
--- a/doc/test/test.conf
+++ b/doc/test/test.conf
@@ -7,6 +7,8 @@
'comment' => 'documentation SQL tests for any versions.',
'data' => ['tsp.data'],
'tests' => [qw(
+ example_recipe
+ parallel_handling
utilities-any
)]
},
diff --git a/doc/test/utilities-any.result b/doc/test/utilities-any.result
index f90b1af..197c4d5 100644
--- a/doc/test/utilities-any.result
+++ b/doc/test/utilities-any.result
@@ -1 +1 @@
-2.3.2
+2.4.0
diff --git a/doc/test/utilities-any.test.sql b/doc/test/utilities-any.test.sql
index 32455ae..99ad04b 100644
--- a/doc/test/utilities-any.test.sql
+++ b/doc/test/utilities-any.test.sql
@@ -1,8 +1,6 @@
-BEGIN;
--------------------------------------------------------------------------------
-- pgr_version
--------------------------------------------------------------------------------
-- SELECT pgr_version(); -- DON'T USE THIS IT CHANGES WITH EVERY COMMIT
SELECT version FROM pgr_version(); -- This changes infrequently
-ROLLBACK;
diff --git a/doxygen/Doxyfile.in b/doxygen/Doxyfile.in
index 7149f56..c02b5ca 100644
--- a/doxygen/Doxyfile.in
+++ b/doxygen/Doxyfile.in
@@ -38,7 +38,7 @@ PROJECT_NAME = "@PROJECT_NAME@"
# could be handy for archiving the generated documentation or if some version
# control system is used.
-PROJECT_NUMBER = @PGROUTING_NUMBER@
+PROJECT_NUMBER = "@PGROUTING_SHORT_VERSION@@PGROUTING_VERSION_DEV@"
# Using the PROJECT_BRIEF tag one can provide an optional one line description
# for a project that appears at the top of each page and should give viewer a
@@ -754,7 +754,7 @@ WARN_LOGFILE = ./LOG
# spaces.
# Note: If this tag is empty the current directory is searched.
-INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../src @CMAKE_CURRENT_SOURCE_DIR@/../doc
+INPUT = @CMAKE_CURRENT_SOURCE_DIR@/../src @CMAKE_CURRENT_SOURCE_DIR@
# This tag can be used to specify the character encoding of the source files
# that doxygen parses. Internally doxygen uses the UTF-8 encoding. Doxygen uses
diff --git a/src/contraction/src/contraction.dox b/doxygen/contraction.dox
similarity index 100%
rename from src/contraction/src/contraction.dox
rename to doxygen/contraction.dox
diff --git a/src/mainpage.dox b/doxygen/mainpage.dox
similarity index 100%
rename from src/mainpage.dox
rename to doxygen/mainpage.dox
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
deleted file mode 100644
index d7ec5e3..0000000
--- a/src/CMakeLists.txt
+++ /dev/null
@@ -1,62 +0,0 @@
-SET(PACKAGE_SQL_FILES "")
-SET(L_PACKAGE_SQL_FILES "")
-
-
-
-ADD_SUBDIRECTORY(apsp_johnson)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(apsp_warshall)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(astar)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(bd_dijkstra)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(bd_astar)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(common)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(dijkstra)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(kdijkstra)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(ksp)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(trsp)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(tsp)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(driving_distance)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(label_graph)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(vrp_basic)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(vrppdtw)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-ADD_SUBDIRECTORY(allpairs)
-LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-
-#ADD_SUBDIRECTORY(shooting_star)
-#LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-#ADD_SUBDIRECTORY(contraction)
-#LIST(APPEND L_PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}")
-
-# Make sure this is after all the ADD_SUBDIRECTORY
-SET(PACKAGE_SQL_FILES "${L_PACKAGE_SQL_FILES}" PARENT_SCOPE)
diff --git a/src/allpairs/doc/allpairs.rst b/src/allpairs/doc/allpairs-family.rst
similarity index 97%
rename from src/allpairs/doc/allpairs.rst
rename to src/allpairs/doc/allpairs-family.rst
index fa51059..d372724 100644
--- a/src/allpairs/doc/allpairs.rst
+++ b/src/allpairs/doc/allpairs-family.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -10,20 +10,23 @@
.. _all_pairs:
-All pairs
+All Pairs - Family of Functions
===============================================================================
The following functions work an all vertices pair combinations
+.. index from here
+
- :ref:`pgr_floydWarshall` - Floyd-Warshall's algorithm.
- :ref:`pgr_johnson` - Johnson's algorithm
-
+.. index to here
+
.. toctree::
:hidden:
- ./pgr_floydWarshall
- ./pgr_johnson
+ pgr_floydWarshall
+ pgr_johnson
Performance
@@ -81,10 +84,10 @@ The results of this tests are presented as:
:SIZE: is the number of edges given as input.
:EDGES: is the total number of records in the query.
-:DENSITY: is the density of the data :math:`\dfrac{E}{V \times (V-1)}`.
+:DENSITY: is the density of the data :math:`\dfrac{E}{V \times (V-1)}`.
:OUT ROWS: is the number of records returned by the queries.
:Floyd-Warshall: is the average execution time in seconds of pgr_floydWarshall.
-:Johnson: is the average execution time in seconds of pgr_johnson.
+:Johnson: is the average execution time in seconds of pgr_johnson.
====== ====== ========== ======== ============== =============
@@ -122,7 +125,7 @@ The tested edge query is:
.. code-block:: none
- WITH
+ WITH
buffer AS (SELECT ST_Buffer(ST_Centroid(ST_Extent(the_geom)), SIZE) AS geom FROM ways),
bbox AS (SELECT ST_Envelope(ST_Extent(geom)) as box from buffer)
SELECT gid as id, source, target, cost, reverse_cost FROM ways where the_geom && (SELECT box from bbox);
diff --git a/src/allpairs/doc/doc-floydWarshall.queries b/src/allpairs/doc/doc-floydWarshall.queries
index c127371..4d2f2b8 100644
--- a/src/allpairs/doc/doc-floydWarshall.queries
+++ b/src/allpairs/doc/doc-floydWarshall.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
-- q1
SELECT * FROM pgr_floydWarshall(
'SELECT id, source, target, cost FROM edge_table where id < 5'
@@ -24,3 +28,6 @@ SELECT * FROM pgr_floydWarshall(
5 | 2 | 1
(6 rows)
+-- q3
+ROLLBACK;
+ROLLBACK
diff --git a/src/allpairs/doc/doc-johnson.queries b/src/allpairs/doc/doc-johnson.queries
index 31ff135..5c9f684 100644
--- a/src/allpairs/doc/doc-johnson.queries
+++ b/src/allpairs/doc/doc-johnson.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
-- q1
SELECT * FROM pgr_johnson(
'SELECT source, target, cost FROM edge_table WHERE id < 5
@@ -26,3 +30,6 @@ SELECT * FROM pgr_johnson(
5 | 2 | 1
(6 rows)
+-- q3
+ROLLBACK;
+ROLLBACK
diff --git a/src/allpairs/doc/pgr_floydWarshall.rst b/src/allpairs/doc/pgr_floydWarshall.rst
index 8f413fc..2271446 100644
--- a/src/allpairs/doc/pgr_floydWarshall.rst
+++ b/src/allpairs/doc/pgr_floydWarshall.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -18,11 +18,15 @@ Synopsis
``pgr_floydWarshall`` - Returns the sum of the costs of the shortest path for each
pair of nodes in the graph using Floyd-Warshall algorithm.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/floyd_warshall_shortest.html
Boost Graph Inside
+.. rubric:: Availability: 2.0.0
+
+* Renamed on 2.2.0, previous name pgr_apspWarshall
+
The Floyd-Warshall algorithm, also known as Floyd's algorithm,
is a good choice to calculate the sum of the costs of the shortest path for each
@@ -55,9 +59,9 @@ The main Characteristics are:
Signature Summary
--------------------------------------------
-
+
.. code-block:: none
-
+
pgr_floydWarshall(edges_sql)
pgr floydWarshall(edges_sql, directed)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -73,7 +77,7 @@ Minimal Signature
...................
.. code-block:: none
-
+
pgr_floydWarshall(edges_sql)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -91,7 +95,7 @@ Complete Signature
...................
.. code-block:: none
-
+
pgr_floydWarshall(edges_sql, directed)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -100,11 +104,12 @@ Complete Signature
.. literalinclude:: doc-floydWarshall.queries
:start-after: -- q2
+ :end-before: -- q3
Description of the Signatures
------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: no_id_edges_sql_start
:end-before: no_id_edges_sql_end
diff --git a/src/allpairs/doc/pgr_johnson.rst b/src/allpairs/doc/pgr_johnson.rst
index 5e66170..4a81289 100644
--- a/src/allpairs/doc/pgr_johnson.rst
+++ b/src/allpairs/doc/pgr_johnson.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -18,11 +18,15 @@ Synopsis
``pgr_johnson`` - Returns the sum of the costs of the shortest path for each
pair of nodes in the graph using Floyd-Warshall algorithm.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/johnson_all_pairs_shortest.html
Boost Graph Inside
+.. rubric:: Availability: 2.0.0
+
+* Renamed on 2.2.0, previous name pgr_apspJohnson
+
The Johnson algorithm, is a good choice to calculate the sum of the costs
of the shortest path for each pair of nodes in the graph, for *sparse graphs*.
@@ -54,9 +58,9 @@ The main Characteristics are:
Signature Summary
--------------------------------------------
-
+
.. code-block:: none
-
+
pgr_johnson(edges_sql)
pgr johnson(edges_sql, directed)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -72,7 +76,7 @@ Minimal Signature
...................
.. code-block:: none
-
+
pgr_johnson(edges_sql)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -90,7 +94,7 @@ Complete Signature
...................
.. code-block:: none
-
+
pgr_johnson(edges_sql, directed)
RETURNS SET OF (start_vid, end_vid, agg_cost) or EMPTY SET
@@ -99,11 +103,12 @@ Complete Signature
.. literalinclude:: doc-johnson.queries
:start-after: -- q2
+ :end-before: -- q3
Description of the Signatures
------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: no_id_edges_sql_start
:end-before: no_id_edges_sql_end
diff --git a/src/allpairs/src/floydWarshall.c b/src/allpairs/src/floydWarshall.c
index 4575d03..bc80773 100644
--- a/src/allpairs/src/floydWarshall.c
+++ b/src/allpairs/src/floydWarshall.c
@@ -27,23 +27,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "fmgr.h"
-#include "funcapi.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
+#include "./../../common/src/postgres_connection.h"
-// #define DEBUG
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
+
#include "./floydWarshall_driver.h"
PGDLLEXPORT Datum floydWarshall(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(floydWarshall);
static
void
@@ -99,17 +94,14 @@ process(
}
-PG_FUNCTION_INFO_V1(floydWarshall);
PGDLLEXPORT Datum
floydWarshall(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
/* */
- Matrix_cell_t *result_tuples = 0;
+ Matrix_cell_t *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -134,7 +126,7 @@ floydWarshall(PG_FUNCTION_ARGS) {
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_BOOL(1),
&result_tuples,
&result_count);
@@ -142,9 +134,14 @@ floydWarshall(PG_FUNCTION_ARGS) {
/* */
/*********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -155,12 +152,10 @@ floydWarshall(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (Matrix_cell_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -171,11 +166,11 @@ floydWarshall(PG_FUNCTION_ARGS) {
nulls = palloc(3 * sizeof(bool));
// postgres starts counting from 1
- values[0] = Int64GetDatum(result_tuples[call_cntr].from_vid);
+ values[0] = Int64GetDatum(result_tuples[funcctx->call_cntr].from_vid);
nulls[0] = false;
- values[1] = Int64GetDatum(result_tuples[call_cntr].to_vid);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].to_vid);
nulls[1] = false;
- values[2] = Float8GetDatum(result_tuples[call_cntr].cost);
+ values[2] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
nulls[2] = false;
/*********************************************************************/
@@ -183,9 +178,6 @@ floydWarshall(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/allpairs/src/floydWarshall_driver.cpp b/src/allpairs/src/floydWarshall_driver.cpp
index 36e2040..542725d 100644
--- a/src/allpairs/src/floydWarshall_driver.cpp
+++ b/src/allpairs/src/floydWarshall_driver.cpp
@@ -27,20 +27,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
-
+#include "./floydWarshall_driver.h"
#include <sstream>
#include <deque>
#include <vector>
+
#include "./pgr_allpairs.hpp"
-#include "./floydWarshall_driver.h"
+
#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
@@ -70,13 +64,13 @@ do_pgr_floydWarshall(
if (directedFlag) {
log << "Processing Directed graph\n";
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
+ digraph.insert_edges(data_edges, total_tuples);
log << digraph;
pgr_floydWarshall(digraph, *return_count, return_tuples);
} else {
log << "Processing Undirected graph\n";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
+ undigraph.insert_edges(data_edges, total_tuples);
log << undigraph;
pgr_floydWarshall(undigraph, *return_count, return_tuples);
}
diff --git a/src/allpairs/src/floydWarshall_driver.h b/src/allpairs/src/floydWarshall_driver.h
index 252e6ce..fe2a90d 100644
--- a/src/allpairs/src/floydWarshall_driver.h
+++ b/src/allpairs/src/floydWarshall_driver.h
@@ -29,7 +29,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#ifndef SRC_ALLPAIRS_SRC_FLOYDWARSHALL_DRIVER_H_
#define SRC_ALLPAIRS_SRC_FLOYDWARSHALL_DRIVER_H_
-
#pragma once
#include "./../../common/src/pgr_types.h"
diff --git a/src/allpairs/src/johnson.c b/src/allpairs/src/johnson.c
index 1e0658a..f252b41 100644
--- a/src/allpairs/src/johnson.c
+++ b/src/allpairs/src/johnson.c
@@ -27,22 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include <unistd.h>
-
-#include "postgres.h"
-#include "funcapi.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
-
-// #define DEBUG
+#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
+
#include "./johnson_driver.h"
PGDLLEXPORT Datum johnson(PG_FUNCTION_ARGS);
@@ -96,14 +87,12 @@ PG_FUNCTION_INFO_V1(johnson);
PGDLLEXPORT Datum
johnson(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
/* MODIFY AS NEEDED */
/* */
- Matrix_cell_t *result_tuples = 0;
+ Matrix_cell_t *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -122,7 +111,7 @@ johnson(PG_FUNCTION_ARGS) {
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_BOOL(1),
&result_tuples,
&result_count);
@@ -130,9 +119,14 @@ johnson(PG_FUNCTION_ARGS) {
/* */
/*********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -143,12 +137,10 @@ johnson(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (Matrix_cell_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -165,11 +157,11 @@ johnson(PG_FUNCTION_ARGS) {
nulls = palloc(3 * sizeof(bool));
// postgres starts counting from 1
- values[0] = Int64GetDatum(result_tuples[call_cntr].from_vid);
+ values[0] = Int64GetDatum(result_tuples[funcctx->call_cntr].from_vid);
nulls[0] = false;
- values[1] = Int64GetDatum(result_tuples[call_cntr].to_vid);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].to_vid);
nulls[1] = false;
- values[2] = Float8GetDatum(result_tuples[call_cntr].cost);
+ values[2] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
nulls[2] = false;
/*********************************************************************/
@@ -178,9 +170,6 @@ johnson(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/allpairs/src/johnson_driver.cpp b/src/allpairs/src/johnson_driver.cpp
index 4fe939d..b2a014a 100644
--- a/src/allpairs/src/johnson_driver.cpp
+++ b/src/allpairs/src/johnson_driver.cpp
@@ -27,20 +27,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
-
+#include "./johnson_driver.h"
#include <sstream>
#include <deque>
#include <vector>
+
#include "./pgr_allpairs.hpp"
-#include "./johnson_driver.h"
+
#include "./../../common/src/pgr_types.h"
// CREATE OR REPLACE FUNCTION pgr_johnson(edges_sql TEXT, directed BOOLEAN,
@@ -69,12 +63,12 @@ do_pgr_johnson(
if (directed) {
log << "Working with directed Graph\n";
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
+ digraph.insert_edges(data_edges, total_tuples);
pgr_johnson(digraph, *return_count, return_tuples);
} else {
log << "Working with Undirected Graph\n";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
+ undigraph.insert_edges(data_edges, total_tuples);
pgr_johnson(undigraph, *return_count, return_tuples);
}
diff --git a/src/allpairs/src/pgr_allpairs.hpp b/src/allpairs/src/pgr_allpairs.hpp
index 3d9d1fe..ce43547 100644
--- a/src/allpairs/src/pgr_allpairs.hpp
+++ b/src/allpairs/src/pgr_allpairs.hpp
@@ -28,15 +28,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#define SRC_ALLPAIRS_SRC_PGR_ALLPAIRS_HPP_
#pragma once
-#if 0
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
-#endif
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
@@ -52,10 +43,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./../../common/src/pgr_types.h"
-#include "../../common/src/pgr_alloc.hpp"
#include "./../../common/src/basePath_SSEC.hpp"
#include "./../../common/src/pgr_base_graph.hpp"
+// TODO(vicky) don't keep it here
+#include "../../common/src/pgr_alloc.hpp"
+
template < class G > class Pgr_allpairs;
// user's functions
@@ -150,7 +143,7 @@ class Pgr_allpairs {
template <typename T>
struct inf_plus {
T operator()(const T& a, const T& b) const {
- T inf = std::numeric_limits<T>::max();
+ T inf = (std::numeric_limits<T>::max)();
if (a == inf || b == inf)
return inf;
return a + b;
@@ -175,7 +168,7 @@ void Pgr_allpairs< G >::floydWarshall(
matrix,
weight_map(get(&pgrouting::Basic_edge::cost, graph.graph)).
distance_combine(combine).
- distance_inf(std::numeric_limits<double>::max()).
+ distance_inf((std::numeric_limits<double>::max)()).
distance_zero(0));
make_result(graph, matrix, result_tuple_count, postgres_rows);
@@ -187,14 +180,14 @@ void Pgr_allpairs< G >::floydWarshall(
G &graph,
std::vector< Matrix_cell_t> &rows) {
std::vector< std::vector<double>> matrix;
- make_matrix(boost::num_vertices(graph.graph), matrix);
+ make_matrix(graph.num_vertices(), matrix);
inf_plus<double> combine;
boost::floyd_warshall_all_pairs_shortest_paths(
graph.graph,
matrix,
weight_map(get(&pgrouting::Basic_edge::cost, graph.graph)).
distance_combine(combine).
- distance_inf(std::numeric_limits<double>::max()).
+ distance_inf((std::numeric_limits<double>::max)()).
distance_zero(0));
make_result(graph, matrix, rows);
@@ -213,7 +206,7 @@ void Pgr_allpairs< G >::johnson(
matrix,
weight_map(get(&pgrouting::Basic_edge::cost, graph.graph)).
distance_combine(combine).
- distance_inf(std::numeric_limits<double>::max()).
+ distance_inf((std::numeric_limits<double>::max)()).
distance_zero(0));
make_result(graph, matrix, result_tuple_count, postgres_rows);
@@ -225,14 +218,14 @@ void Pgr_allpairs< G >::johnson(
G &graph,
std::vector< Matrix_cell_t> &rows) {
std::vector< std::vector<double>> matrix;
- make_matrix(boost::num_vertices(graph.graph), matrix);
+ make_matrix(graph.num_vertices(), matrix);
inf_plus<double> combine;
boost::johnson_all_pairs_shortest_paths(
graph.graph,
matrix,
weight_map(get(&pgrouting::Basic_edge::cost, graph.graph)).
distance_combine(combine).
- distance_inf(std::numeric_limits<double>::max()).
+ distance_inf((std::numeric_limits<double>::max)()).
distance_zero(0));
make_result(graph, matrix, rows);
@@ -250,6 +243,7 @@ void
Pgr_allpairs< G >::make_matrix(
size_t v_size,
std::vector< std::vector<double>> &matrix) const {
+ // TODO(vicky) in one step
matrix.resize(v_size);
for (size_t i=0; i < v_size; i++)
matrix[i].resize(v_size);
@@ -264,7 +258,7 @@ Pgr_allpairs< G >::count_rows(
for (size_t i = 0; i < graph.num_vertices(); i++) {
for (size_t j = 0; j < graph.num_vertices(); j++) {
if (i == j) continue;
- if (matrix[i][j] != std::numeric_limits<double>::max()) {
+ if (matrix[i][j] != (std::numeric_limits<double>::max)()) {
result_tuple_count++;
} // if
} // for j
@@ -272,7 +266,7 @@ Pgr_allpairs< G >::count_rows(
return result_tuple_count;
}
-// for postgres
+// TODO(vicky) don't keep it here for postgres
template < class G >
void
Pgr_allpairs< G >::make_result(
@@ -285,13 +279,13 @@ Pgr_allpairs< G >::make_result(
size_t seq = 0;
- for (size_t i = 0; i < graph.num_vertices(); i++) {
- for (size_t j = 0; j < graph.num_vertices(); j++) {
- if (i == j) continue;
- if (matrix[i][j] != std::numeric_limits<double>::max()) {
- (*postgres_rows)[seq].from_vid = graph.graph[i].id;
- (*postgres_rows)[seq].to_vid = graph.graph[j].id;
- (*postgres_rows)[seq].cost = matrix[i][j];
+ for (typename G::V v_i = 0; v_i < graph.num_vertices(); v_i++) {
+ for (typename G::V v_j = 0; v_j < graph.num_vertices(); v_j++) {
+ if (v_i == v_j) continue;
+ if (matrix[v_i][v_j] != (std::numeric_limits<double>::max)()) {
+ (*postgres_rows)[seq].from_vid = graph[v_i].id;
+ (*postgres_rows)[seq].to_vid = graph[v_j].id;
+ (*postgres_rows)[seq].cost = matrix[v_i][v_j];
seq++;
} // if
} // for j
@@ -309,11 +303,11 @@ Pgr_allpairs< G >::make_result(
rows.resize(count);
size_t seq = 0;
- for (size_t i = 0; i < graph.num_vertices(); i++) {
- for (size_t j = 0; j < graph.num_vertices(); j++) {
- if (matrix[i][j] != std::numeric_limits<double>::max()) {
+ for (typename G::V v_i = 0; v_i < graph.num_vertices(); v_i++) {
+ for (typename G::V v_j = 0; v_j < graph.num_vertices(); v_j++) {
+ if (matrix[v_i][v_j] != (std::numeric_limits<double>::max)()) {
rows[seq] =
- {graph.graph[i].id, graph.graph[j].id, matrix[i][j]};
+ {graph[v_i].id, graph[v_j].id, matrix[v_i][v_j]};
seq++;
} // if
} // for j
diff --git a/src/allpairs/test/doc-floydWarshall.result b/src/allpairs/test/doc-floydWarshall.result
index 07c4312..ea5e596 100644
--- a/src/allpairs/test/doc-floydWarshall.result
+++ b/src/allpairs/test/doc-floydWarshall.result
@@ -9,3 +9,4 @@
2|5|1
5|1|2
5|2|1
+-- q3
diff --git a/src/allpairs/test/doc-floydWarshall.test.sql b/src/allpairs/test/doc-floydWarshall.test.sql
index 19443ef..e9be87a 100644
--- a/src/allpairs/test/doc-floydWarshall.test.sql
+++ b/src/allpairs/test/doc-floydWarshall.test.sql
@@ -7,3 +7,4 @@ SELECT * FROM pgr_floydWarshall(
'SELECT id, source, target, cost FROM edge_table where id < 5',
false
);
+\echo -- q3
diff --git a/src/allpairs/test/doc-johnson.result b/src/allpairs/test/doc-johnson.result
index 07c4312..ea5e596 100644
--- a/src/allpairs/test/doc-johnson.result
+++ b/src/allpairs/test/doc-johnson.result
@@ -9,3 +9,4 @@
2|5|1
5|1|2
5|2|1
+-- q3
diff --git a/src/allpairs/test/doc-johnson.test.sql b/src/allpairs/test/doc-johnson.test.sql
index 70f5cd0..bd765aa 100644
--- a/src/allpairs/test/doc-johnson.test.sql
+++ b/src/allpairs/test/doc-johnson.test.sql
@@ -9,3 +9,4 @@ SELECT * FROM pgr_johnson(
ORDER BY id',
false
);
+\echo -- q3
diff --git a/src/alpha_shape/doc/doc-pgr_alphashape.queries b/src/alpha_shape/doc/doc-pgr_alphashape.queries
index 54e10f7..0b4282a 100644
--- a/src/alpha_shape/doc/doc-pgr_alphashape.queries
+++ b/src/alpha_shape/doc/doc-pgr_alphashape.queries
@@ -1,25 +1,39 @@
BEGIN;
BEGIN
-SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
-FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
-(SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
-FROM pgr_alphaShape('SELECT id, x, y FROM vertex_table')
-) AS a) AS foo;
- st_area
----------
- 10.00
-(1 row)
+SET client_min_messages TO NOTICE;
+SET
+-- q1
+SELECT * FROM pgr_alphaShape(
+ 'SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
+ FROM edge_table_vertices_pgr') ORDER BY x, y;
+ x | y
+-----+-----
+ 0 | 2
+ 0.5 | 3.5
+ 2 | 0
+ 2 | 4
+ 3.5 | 4
+ 4 | 1
+ 4 | 2
+ 4 | 3
+(8 rows)
------------------------------
+-- q2
SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
-FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
-(SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
-FROM pgr_alphaShape('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y FROM edge_table_vertices_pgr')
-) AS a) AS foo;
+FROM (
+ SELECT ST_MakeLine(points ORDER BY id) AS openline
+ FROM (
+ SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
+ FROM pgr_alphaShape(
+ 'SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
+ FROM edge_table_vertices_pgr')
+ ) AS a
+ ) AS foo;
st_area
---------
11.75
(1 row)
+-- q3
ROLLBACK;
ROLLBACK
diff --git a/src/alpha_shape/doc/doc-pgr_pointsAsPolygon.queries b/src/alpha_shape/doc/doc-pgr_pointsAsPolygon.queries
index 32fefa9..c6c0a7b 100644
--- a/src/alpha_shape/doc/doc-pgr_pointsAsPolygon.queries
+++ b/src/alpha_shape/doc/doc-pgr_pointsAsPolygon.queries
@@ -1,5 +1,7 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT ST_AsText(pgr_pointsAsPolygon('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
FROM edge_table_vertices_pgr'));
diff --git a/src/alpha_shape/doc/pgr_alphaShape.rst b/src/alpha_shape/doc/pgr_alphaShape.rst
index 44e48ab..5b3b66e 100644
--- a/src/alpha_shape/doc/pgr_alphaShape.rst
+++ b/src/alpha_shape/doc/pgr_alphaShape.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -12,7 +12,7 @@
pgr_alphaShape
===============================================================================
-.. index::
+.. index::
single: pgr_alphashape(text,float8)
Name
@@ -62,61 +62,32 @@ If a result includes multiple outer/inner rings, return those with separator row
Examples
-------------------------------------------------------------------------------
-In the alpha shape code we have no way to control the order of the points so the actual output you might get could be similar but different. The simple query is followed by a more complex one that constructs a polygon and computes the areas of it. This should be the same as the result on your system. We leave the details of the complex query to the reader as an exercise if they wish to decompose it into understandable pieces or to just copy and paste it into a SQL window to run.
+PgRouting's alpha shape implementation has no way to control the order of the output points, so the actual output might different for the same input data.
+The first query, has the output ordered, he second query shows an example usage:
-.. code-block:: sql
- SELECT * FROM pgr_alphaShape('SELECT id, x, y FROM vertex_table');
-
- x | y
- ---+---
- 2 | 4
- 0 | 2
- 2 | 0
- 4 | 1
- 4 | 2
- 4 | 3
- (6 rows)
-
- SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
- FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
- (SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
- FROM pgr_alphaShape('SELECT id, x, y FROM vertex_table')
- ) AS a) AS foo;
-
- st_area
- ---------
- 10.00
- (1 row)
-
-
- SELECT * FROM pgr_alphaShape('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y FROM edge_table_vertices_pgr');
- x | y
- -----+-----
- 2 | 4
- 0.5 | 3.5
- 0 | 2
- 2 | 0
- 4 | 1
- 4 | 2
- 4 | 3
- 3.5 | 4
- (8 rows)
-
- SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
- FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
- (SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
- FROM pgr_alphaShape('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y FROM edge_table_vertices_pgr')
- ) AS a) AS foo;
-
- st_area
- ---------
- 11.75
- (1 row)
-
-
-The queries use the :ref:`sampledata` network.
+.. rubric:: Example: the (ordered) results
+
+.. literalinclude:: doc-pgr_alphashape.queries
+ :start-after: -- q1
+ :end-before: -- q2
+
+.. rubric:: Example: calculating the area
+
+Steps:
+ - Calculates the alpha shape
+ - the :code:`ORDER BY` clause is not used.
+ - constructs a polygon
+ - and computes the area
+
+.. literalinclude:: doc-pgr_alphashape.queries
+ :start-after: -- q2
+ :end-before: -- q3
+
+
+
+The queries use the :ref:`sampledata` network.
See Also
-------------------------------------------------------------------------------
diff --git a/src/alpha_shape/doc/pgr_pointsAsPolygon.rst b/src/alpha_shape/doc/pgr_pointsAsPolygon.rst
index 57024a5..e39d84b 100644
--- a/src/alpha_shape/doc/pgr_pointsAsPolygon.rst
+++ b/src/alpha_shape/doc/pgr_pointsAsPolygon.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -12,7 +12,7 @@
pgr_pointsAsPolygon
===============================================================================
-.. index::
+.. index::
single: pgr_pointsAsPolygon(text,float8)
Name
diff --git a/src/alpha_shape/src/alpha.c b/src/alpha_shape/src/alpha.c
index aa344ca..69346ff 100644
--- a/src/alpha_shape/src/alpha.c
+++ b/src/alpha_shape/src/alpha.c
@@ -22,18 +22,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
+
#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
#include "../../common/src/pgr_types.h"
#include "alpha_driver.h"
-#include "fmgr.h"
/*
@@ -42,8 +37,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// #define PROFILE
-PGDLLEXPORT
-Datum alphashape(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum alphashape(PG_FUNCTION_ARGS);
#undef DEBUG
#include "../../common/src/debug_macro.h"
@@ -51,14 +45,6 @@ Datum alphashape(PG_FUNCTION_ARGS);
// The number of tuples to fetch from the SPI cursor at each iteration
#define TUPLIMIT 1000
-static char *
-text2char(text *in) {
- char *out = palloc(VARSIZE(in));
-
- memcpy(out, VARDATA(in), VARSIZE(in) - VARHDRSZ);
- out[VARSIZE(in) - VARHDRSZ] = '\0';
- return out;
-}
static int
finish(int code, int ret) {
@@ -82,6 +68,7 @@ typedef struct vertex_columns {
static int
fetch_vertices_columns(SPITupleTable *tuptable,
vertex_columns_t *vertex_columns) {
+ if (tuptable) {}; // TODO this is unused parameter
vertex_columns->id = SPI_fnumber(SPI_tuptable->tupdesc, "id");
vertex_columns->x = SPI_fnumber(SPI_tuptable->tupdesc, "x");
vertex_columns->y = SPI_fnumber(SPI_tuptable->tupdesc, "y");
@@ -230,10 +217,8 @@ PG_FUNCTION_INFO_V1(alphashape);
PGDLLEXPORT
Datum alphashape(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- vertex_t *res = 0;
+ vertex_t *res = NULL;
/* stuff done only on the first call of the function */
if (SRF_IS_FIRSTCALL()) {
@@ -247,12 +232,16 @@ Datum alphashape(PG_FUNCTION_ARGS) {
/* switch to memory context appropriate for multiple function calls */
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- compute_alpha_shape(text2char(PG_GETARG_TEXT_P(0)),
+ compute_alpha_shape(text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_FLOAT8(1), &res, &res_count);
/* total number of tuples to be returned */
PGR_DBG("Conting tuples number\n");
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = res_count;
+#else
funcctx->max_calls = (uint32_t)res_count;
+#endif
funcctx->user_fctx = res;
PGR_DBG("Total count %lu", res_count);
@@ -272,14 +261,12 @@ Datum alphashape(PG_FUNCTION_ARGS) {
PGR_DBG("Strange stuff doing\n");
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
- res = (vertex_t*) funcctx->user_fctx;
+ res = (vertex_t*)funcctx->user_fctx;
PGR_DBG("Trying to allocate some memory\n");
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
/* do when there is more left to send */
HeapTuple tuple;
Datum result;
@@ -288,24 +275,11 @@ Datum alphashape(PG_FUNCTION_ARGS) {
double x;
double y;
- /* This will work for some compilers. If it crashes with segfault, try to change the following block with this one
-
- values = palloc(3 * sizeof(Datum));
- nulls = palloc(3 * sizeof(char));
-
- values[0] = call_cntr;
- nulls[0] = ' ';
- values[1] = Float8GetDatum(res[call_cntr].x);
- nulls[1] = ' ';
- values[2] = Float8GetDatum(res[call_cntr].y);
- nulls[2] = ' ';
- */
-
values = palloc(2 * sizeof(Datum));
nulls = palloc(2 * sizeof(bool));
- x = res[call_cntr].x;
- y = res[call_cntr].y;
+ x = res[funcctx->call_cntr].x;
+ y = res[funcctx->call_cntr].y;
if (x == DBL_MAX && y == DBL_MAX) {
values[0] = 0;
values[1] = 0;
@@ -335,8 +309,6 @@ Datum alphashape(PG_FUNCTION_ARGS) {
SRF_RETURN_NEXT(funcctx, result);
} else {
- /* do when there is no more left */
- if (res) free(res);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/alpha_shape/src/alpha_driver.cpp b/src/alpha_shape/src/alpha_driver.cpp
index 0e9e151..ba68459 100644
--- a/src/alpha_shape/src/alpha_driver.cpp
+++ b/src/alpha_shape/src/alpha_driver.cpp
@@ -34,17 +34,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Takes a list of points and returns a list of segments
corresponding to the Alpha shape.
************************************************************************/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-#ifdef __MINGW64__
-
-namespace boost {
- void tss_cleanup_implemented() { }
-}
-#endif
#include "./alpha_driver.h"
#include <CGAL/Simple_cartesian.h>
@@ -69,6 +59,7 @@ namespace boost {
#include <algorithm>
#include <set>
+#include "./../../common/src/pgr_alloc.hpp"
typedef double coord_type;
@@ -250,7 +241,7 @@ int alpha_shape(vertex_t *vertices, size_t count, double alpha,
result_count += ring.size();
}
result_count += rings.size() - 1;
- *res = (vertex_t *) malloc(sizeof(vertex_t) * result_count);
+ *res = pgr_alloc(result_count, (*res));
*res_count = result_count;
int idx = 0;
diff --git a/src/alpha_shape/test/doc-pgr_alphashape.result b/src/alpha_shape/test/doc-pgr_alphashape.result
index 11bcba8..66f7a5f 100644
--- a/src/alpha_shape/test/doc-pgr_alphashape.result
+++ b/src/alpha_shape/test/doc-pgr_alphashape.result
@@ -1,3 +1,12 @@
-10.00
------------------------------
+-- q1
+0|2
+0.5|3.5
+2|0
+2|4
+3.5|4
+4|1
+4|2
+4|3
+-- q2
11.75
+-- q3
diff --git a/src/alpha_shape/test/doc-pgr_alphashape.test.sql b/src/alpha_shape/test/doc-pgr_alphashape.test.sql
index 0c4d48d..d16718a 100644
--- a/src/alpha_shape/test/doc-pgr_alphashape.test.sql
+++ b/src/alpha_shape/test/doc-pgr_alphashape.test.sql
@@ -1,26 +1,22 @@
-BEGIN;
--------------------------------------------------------------------------------
-- PGR_alphaShape
--------------------------------------------------------------------------------
--- testing with areas
---SELECT * FROM pgr_alphaShape('SELECT id, x, y FROM vertex_table');
---SELECT * FROM pgr_alphaShape('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y FROM edge_table_vertices_pgr');
-SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
-FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
-(SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
-
-FROM pgr_alphaShape('SELECT id, x, y FROM vertex_table')
-
-) AS a) AS foo;
-
-\echo '-----------------------------'
+\echo -- q1
+SELECT * FROM pgr_alphaShape(
+ 'SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
+ FROM edge_table_vertices_pgr') ORDER BY x, y;
+\echo -- q2
SELECT round(ST_Area(ST_MakePolygon(ST_AddPoint(foo.openline, ST_StartPoint(foo.openline))))::numeric, 2) AS st_area
-FROM (SELECT ST_MakeLine(points ORDER BY id) AS openline FROM
-(SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
-
-FROM pgr_alphaShape('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y FROM edge_table_vertices_pgr')
+FROM (
+ SELECT ST_MakeLine(points ORDER BY id) AS openline
+ FROM (
+ SELECT ST_MakePoint(x, y) AS points, row_number() over() AS id
+ FROM pgr_alphaShape(
+ 'SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
+ FROM edge_table_vertices_pgr')
+ ) AS a
+ ) AS foo;
-) AS a) AS foo;
-ROLLBACK;
+\echo -- q3
diff --git a/src/alpha_shape/test/doc-pgr_pointsAsPolygon.test.sql b/src/alpha_shape/test/doc-pgr_pointsAsPolygon.test.sql
index 56fa863..6209eca 100644
--- a/src/alpha_shape/test/doc-pgr_pointsAsPolygon.test.sql
+++ b/src/alpha_shape/test/doc-pgr_pointsAsPolygon.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
-------------------------------------------------------------------------------
-- PGR_pointsAsPolygon
-------------------------------------------------------------------------------
@@ -7,4 +6,3 @@ BEGIN;
SELECT ST_AsText(pgr_pointsAsPolygon('SELECT id::integer, ST_X(the_geom)::float AS x, ST_Y(the_geom)::float AS y
FROM edge_table_vertices_pgr'));
\echo --q2
-ROLLBACK;
diff --git a/src/apsp_johnson/doc/CMakeLists.txt b/src/apsp_johnson/doc/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/apsp_johnson/doc/doc-apspJohnson.queries b/src/apsp_johnson/doc/doc-apspJohnson.queries
index 27bce4b..1116eb4 100644
--- a/src/apsp_johnson/doc/doc-apspJohnson.queries
+++ b/src/apsp_johnson/doc/doc-apspJohnson.queries
@@ -1,3 +1,5 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
--q1
@@ -13,3 +15,5 @@ NOTICE: Deprecated function: Use pgr_johnson instead
(3 rows)
--q2
+ROLLBACK;
+ROLLBACK
diff --git a/src/apsp_johnson/doc/pgr_apspJohnson.rst b/src/apsp_johnson/doc/pgr_apspJohnson.rst
deleted file mode 100644
index adbba2e..0000000
--- a/src/apsp_johnson/doc/pgr_apspJohnson.rst
+++ /dev/null
@@ -1,78 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_apsp_johnson:
-
-pgr_apspJohnson - Deprecated function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * It has been replaced by a new functions, is no longer supported, and may be removed from future versions.
- * All code that uses this function should be converted to use its replacement: :ref:`pgr_johnson`.
-
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_apspJohnson`` - Returns all costs for each pair of nodes in the graph.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Johnson's algorithm is a way to find the shortest paths between all pairs of vertices in a sparse, edge weighted, directed graph. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows for every pair of nodes in the graph.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_apspJohnson(sql text);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query that should return the edges for the graph that will be analyzed:
-
- .. code-block:: sql
-
- SELECT source, target, cost FROM edge_table;
-
- :source: ``int4`` identifier of the source vertex for this edge
- :target: ``int4`` identifier of the target vertex for this edge
- :cost: ``float8`` a positive value for the cost to traverse this edge
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: source node ID
-:id2: target node ID
-:cost: cost to traverse from ``id1`` to ``id2``
-
-.. rubric:: History
-
-* Deprecated in version 2.2.0
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. literalinclude:: doc-apspJohnson.queries
- :start-after: --q1
- :end-before: --q2
-
-The query uses the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`type_cost_result`
-* :ref:`pgr_johnson`
-* http://en.wikipedia.org/wiki/Johnson%27s_algorithm
diff --git a/src/apsp_johnson/test/doc-apspJohnson.test.sql b/src/apsp_johnson/test/doc-apspJohnson.test.sql
index 6e471cf..1d48764 100644
--- a/src/apsp_johnson/test/doc-apspJohnson.test.sql
+++ b/src/apsp_johnson/test/doc-apspJohnson.test.sql
@@ -3,7 +3,6 @@
-- PGR_apspJohnson
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
\echo --q1
SELECT * FROM pgr_apspJohnson(
'SELECT source::INTEGER, target::INTEGER, cost FROM edge_table WHERE id < 5'
diff --git a/src/apsp_warshall/doc/CMakeLists.txt b/src/apsp_warshall/doc/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/apsp_warshall/doc/doc-apspWarshall.queries b/src/apsp_warshall/doc/doc-apspWarshall.queries
index 2352af3..fd61fb6 100644
--- a/src/apsp_warshall/doc/doc-apspWarshall.queries
+++ b/src/apsp_warshall/doc/doc-apspWarshall.queries
@@ -1,3 +1,5 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
--q1
@@ -17,3 +19,5 @@ NOTICE: Deprecated function: Use pgr_floydWarshall instead
(6 rows)
--q2
+ROLLBACK;
+ROLLBACK
diff --git a/src/apsp_warshall/doc/pgr_apspWarshall.rst b/src/apsp_warshall/doc/pgr_apspWarshall.rst
deleted file mode 100644
index d246362..0000000
--- a/src/apsp_warshall/doc/pgr_apspWarshall.rst
+++ /dev/null
@@ -1,84 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_apsp_warshall:
-
-pgr_apspWarshall - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * It has been replaced by a new function, is no longer supported, and may be removed from future versions.
- * All code that uses this function should be converted to use its replacement: :ref:`pgr_FloydWarshall`.
-
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_apspWarshall`` - Returns all costs for each pair of nodes in the graph.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-The Floyd-Warshall algorithm (also known as Floyd's algorithm and other names) is a graph analysis algorithm for finding the shortest paths between all pairs of nodes in a weighted graph. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows for every pair of nodes in the graph.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_apspWarshall(sql text, directed boolean, reverse_cost boolean);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query that should return the edges for the graph that will be analyzed:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost FROM edge_table;
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex for this edge
- :target: ``int4`` identifier of the target vertex for this edge
- :cost: ``float8`` a positive value for the cost to traverse this edge
- :reverse_cost: ``float8`` (optional) a positive value for the reverse cost to traverse this edge
-
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: source node ID
-:id2: target node ID
-:cost: cost to traverse from ``id1`` to ``id2``
-
-
-.. rubric:: History
-
-* Deprecated in version 2.0.0
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. literalinclude:: doc-apspWarshall.queries
- :start-after: --q1
- :end-before: --q2
-
-The query uses the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`type_cost_result`
-* :ref:`pgr_floydWarshall`
-* http://en.wikipedia.org/wiki/Floyd%E2%80%93Warshall_algorithm
diff --git a/src/apsp_warshall/test/doc-apspWarshall.test.sql b/src/apsp_warshall/test/doc-apspWarshall.test.sql
index e6e8095..892e55f 100644
--- a/src/apsp_warshall/test/doc-apspWarshall.test.sql
+++ b/src/apsp_warshall/test/doc-apspWarshall.test.sql
@@ -3,7 +3,6 @@
-- PGR_apspWarshall
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
\echo --q1
SELECT * FROM pgr_apspWarshall(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table WHERE id < 5',
diff --git a/src/astar/doc/aStar-family.rst b/src/astar/doc/aStar-family.rst
new file mode 100644
index 0000000..58d92c2
--- /dev/null
+++ b/src/astar/doc/aStar-family.rst
@@ -0,0 +1,109 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _astar:
+
+aStar - Family of functions
+===============================================================================
+
+The A* (pronounced "A Star") algorithm is based on Dijkstra's algorithm with a heuristic that allow it to solve most shortest path problems by evaluation only a sub-set of the overall graph.
+
+.. index from here
+
+- :ref:`pgr_aStar` - A* algorithm for the shortest path.
+- :ref:`pgr_aStarCost` - Get the aggregate cost of the shortest paths.
+- :ref:`pgr_aStarCostMatrix` - Get the cost matrix of the shortest paths.
+
+.. index to here
+
+.. toctree::
+ :hidden:
+
+ pgr_aStar
+ pgr_aStarCost
+ pgr_aStarCostMatrix
+
+
+The problem definition (Advanced documentation)
+-----------------------------------------------
+
+The A* (pronounced "A Star") algorithm is based on Dijkstra's algorithm with a heuristic, that is an estimation of the remaining cost from the vertex to the goal,
+that allows to solve most shortest path problems by evaluation only a sub-set of the overall graph.
+Running time: :math:`O((E + V) * \log V)`
+
+
+
+
+.. _astar_heuristics:
+
+Heuristic
+..........
+
+Currently the heuristic functions available are:
+
+- 0: :math:`h(v) = 0` (Use this value to compare with pgr_dijkstra)
+- 1: :math:`h(v) = abs(max(\Delta x, \Delta y))`
+- 2: :math:`h(v) = abs(min(\Delta x, \Delta y))`
+- 3: :math:`h(v) = \Delta x * \Delta x + \Delta y * \Delta y`
+- 4: :math:`h(v) = sqrt(\Delta x * \Delta x + \Delta y * \Delta y)`
+- 5: :math:`h(v) = abs(\Delta x) + abs(\Delta y)`
+
+where :math:`\Delta x = x_1 - x_0` and :math:`\Delta y = y_1 - y_0`
+
+
+.. _astar_factor:
+
+Factor
+-------------------------------------------------------------------------------
+
+.. rubric:: Analysis 1
+
+Working with cost/reverse_cost as length in degrees, x/y in lat/lon:
+Factor = 1 (no need to change units)
+
+.. rubric:: Analysis 2
+
+Working with cost/reverse_cost as length in meters, x/y in lat/lon:
+Factor = would depend on the location of the points:
+
+======== ================================= ==========
+latitude conversion Factor
+======== ================================= ==========
+45 1 longitude degree is 78846.81 m 78846
+ 0 1 longitude degree is 111319.46 m 111319
+======== ================================= ==========
+
+.. rubric:: Analysis 3
+
+Working with cost/reverse_cost as time in seconds, x/y in lat/lon:
+Factor: would depend on the location of the points and on the average speed
+say 25m/s is the speed.
+
+======== =========================================== ==========
+latitude conversion Factor
+======== =========================================== ==========
+45 1 longitude degree is (78846.81m)/(25m/s) 3153 s
+ 0 1 longitude degree is (111319.46 m)/(25m/s) 4452 s
+======== =========================================== ==========
+
+
+
+See Also
+-------------------------------------------------------------------------------
+
+* :ref:`pgr_aStar`
+* :ref:`pgr_aStarCost`
+* :ref:`pgr_aStarCostMatrix`
+* http://www.boost.org/libs/graph/doc/astar_search.html
+* http://en.wikipedia.org/wiki/A*_search_algorithm
+
+.. rubric:: Indices and tables
+
+* :ref:`genindex`
+* :ref:`search`
diff --git a/src/astar/doc/doc-aStarCost.queries b/src/astar/doc/doc-aStarCost.queries
new file mode 100644
index 0000000..0b95a8e
--- /dev/null
+++ b/src/astar/doc/doc-aStarCost.queries
@@ -0,0 +1,58 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
+--q1
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, 12);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 2 | 12 | 4
+(1 row)
+
+--q2
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, 12,
+ directed := false, heuristic := 2);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 2 | 12 | 4
+(1 row)
+
+--q3
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, ARRAY[3, 12], heuristic := 2);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 2 | 3 | 5
+ 2 | 12 | 4
+(2 rows)
+
+--q4
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], 12, heuristic := 0);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 2 | 12 | 4
+ 7 | 12 | 5
+(2 rows)
+
+--q5
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], ARRAY[3, 12], heuristic := 2);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 2 | 3 | 5
+ 2 | 12 | 4
+ 7 | 3 | 6
+ 7 | 12 | 5
+(4 rows)
+
+--q6
+ROLLBACK;
+ROLLBACK
diff --git a/src/astar/doc/doc-astar-v2.queries b/src/astar/doc/doc-astar-v2.queries
index 8ad9d5c..31b594d 100644
--- a/src/astar/doc/doc-astar-v2.queries
+++ b/src/astar/doc/doc-astar-v2.queries
@@ -1,11 +1,13 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
-- q1
-SELECT * FROM pgr_AStar(
+SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2
FROM edge_table',
4, 1, false, false);
-NOTICE: Deprecated signature of function pgr_astar
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
seq | id1 | id2 | cost
-----+-----+-----+------
0 | 4 | 16 | 1
@@ -17,11 +19,11 @@ NOTICE: Deprecated signature of function pgr_astar
(6 rows)
-- q2
-SELECT * FROM pgr_AStar(
+SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost
FROM edge_table ',
4, 1, true, true);
-NOTICE: Deprecated signature of function pgr_astar
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
seq | id1 | id2 | cost
-----+-----+-----+------
0 | 4 | 3 | 1
@@ -31,3 +33,5 @@ NOTICE: Deprecated signature of function pgr_astar
(4 rows)
-- q3
+ROLLBACK;
+ROLLBACK
diff --git a/src/astar/doc/doc-astar.queries b/src/astar/doc/doc-astar.queries
index 47f8f39..b0032bc 100644
--- a/src/astar/doc/doc-astar.queries
+++ b/src/astar/doc/doc-astar.queries
@@ -1,3 +1,5 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
--q1
@@ -16,33 +18,92 @@ SELECT * FROM pgr_astar(
--q2
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
- 2, 12, heuristic := 1);
+ 2, 12,
+ directed := false, heuristic := 2);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | 2 | 4 | 1 | 0
- 2 | 2 | 5 | 8 | 1 | 1
- 3 | 3 | 6 | 9 | 1 | 2
- 4 | 4 | 9 | 15 | 1 | 3
+ 2 | 2 | 5 | 10 | 1 | 1
+ 3 | 3 | 10 | 12 | 1 | 2
+ 4 | 4 | 11 | 13 | 1 | 3
5 | 5 | 12 | -1 | 0 | 4
(5 rows)
+--q3
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
- 2, 12, heuristic := 2);
- seq | path_seq | node | edge | cost | agg_cost
------+----------+------+------+------+----------
- 1 | 1 | 2 | 4 | 1 | 0
- 2 | 2 | 5 | 8 | 1 | 1
- 3 | 3 | 6 | 9 | 1 | 2
- 4 | 4 | 9 | 15 | 1 | 3
- 5 | 5 | 12 | -1 | 0 | 4
-(5 rows)
+ 2, ARRAY[3, 12], heuristic := 2);
+ seq | path_seq | end_vid | node | edge | cost | agg_cost
+-----+----------+---------+------+------+------+----------
+ 1 | 1 | 3 | 2 | 4 | 1 | 0
+ 2 | 2 | 3 | 5 | 8 | 1 | 1
+ 3 | 3 | 3 | 6 | 9 | 1 | 2
+ 4 | 4 | 3 | 9 | 16 | 1 | 3
+ 5 | 5 | 3 | 4 | 3 | 1 | 4
+ 6 | 6 | 3 | 3 | -1 | 0 | 5
+ 7 | 1 | 12 | 2 | 4 | 1 | 0
+ 8 | 2 | 12 | 5 | 8 | 1 | 1
+ 9 | 3 | 12 | 6 | 9 | 1 | 2
+ 10 | 4 | 12 | 9 | 15 | 1 | 3
+ 11 | 5 | 12 | 12 | -1 | 0 | 4
+(11 rows)
---q3
+--q4
+SELECT * FROM pgr_astar(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], 12, heuristic := 0);
+ seq | path_seq | start_vid | node | edge | cost | agg_cost
+-----+----------+-----------+------+------+------+----------
+ 1 | 1 | 2 | 2 | 4 | 1 | 0
+ 2 | 2 | 2 | 5 | 10 | 1 | 1
+ 3 | 3 | 2 | 10 | 12 | 1 | 2
+ 4 | 4 | 2 | 11 | 13 | 1 | 3
+ 5 | 5 | 2 | 12 | -1 | 0 | 4
+ 6 | 1 | 7 | 7 | 6 | 1 | 0
+ 7 | 2 | 7 | 8 | 7 | 1 | 1
+ 8 | 3 | 7 | 5 | 10 | 1 | 2
+ 9 | 4 | 7 | 10 | 12 | 1 | 3
+ 10 | 5 | 7 | 11 | 13 | 1 | 4
+ 11 | 6 | 7 | 12 | -1 | 0 | 5
+(11 rows)
+
+--q5
+SELECT * FROM pgr_astar(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], ARRAY[3, 12], heuristic := 2);
+ seq | path_seq | start_vid | end_vid | node | edge | cost | agg_cost
+-----+----------+-----------+---------+------+------+------+----------
+ 1 | 1 | 2 | 3 | 2 | 4 | 1 | 0
+ 2 | 2 | 2 | 3 | 5 | 8 | 1 | 1
+ 3 | 3 | 2 | 3 | 6 | 9 | 1 | 2
+ 4 | 4 | 2 | 3 | 9 | 16 | 1 | 3
+ 5 | 5 | 2 | 3 | 4 | 3 | 1 | 4
+ 6 | 6 | 2 | 3 | 3 | -1 | 0 | 5
+ 7 | 1 | 2 | 12 | 2 | 4 | 1 | 0
+ 8 | 2 | 2 | 12 | 5 | 8 | 1 | 1
+ 9 | 3 | 2 | 12 | 6 | 9 | 1 | 2
+ 10 | 4 | 2 | 12 | 9 | 15 | 1 | 3
+ 11 | 5 | 2 | 12 | 12 | -1 | 0 | 4
+ 12 | 1 | 7 | 3 | 7 | 6 | 1 | 0
+ 13 | 2 | 7 | 3 | 8 | 7 | 1 | 1
+ 14 | 3 | 7 | 3 | 5 | 8 | 1 | 2
+ 15 | 4 | 7 | 3 | 6 | 9 | 1 | 3
+ 16 | 5 | 7 | 3 | 9 | 16 | 1 | 4
+ 17 | 6 | 7 | 3 | 4 | 3 | 1 | 5
+ 18 | 7 | 7 | 3 | 3 | -1 | 0 | 6
+ 19 | 1 | 7 | 12 | 7 | 6 | 1 | 0
+ 20 | 2 | 7 | 12 | 8 | 7 | 1 | 1
+ 21 | 3 | 7 | 12 | 5 | 8 | 1 | 2
+ 22 | 4 | 7 | 12 | 6 | 9 | 1 | 3
+ 23 | 5 | 7 | 12 | 9 | 15 | 1 | 4
+ 24 | 6 | 7 | 12 | 12 | -1 | 0 | 5
+(24 rows)
+
+--q6
SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
2, 12, true, true);
-NOTICE: Deprecated signature of function pgr_astar
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
seq | id1 | id2 | cost
-----+-----+-----+------
0 | 2 | 4 | 1
@@ -52,4 +113,6 @@ NOTICE: Deprecated signature of function pgr_astar
4 | 12 | -1 | 0
(5 rows)
---q4
+--q7
+ROLLBACK;
+ROLLBACK
diff --git a/src/astar/doc/pgr_astar.rst b/src/astar/doc/pgr_aStar.rst
similarity index 58%
rename from src/astar/doc/pgr_astar.rst
rename to src/astar/doc/pgr_aStar.rst
index efe15be..89bb5ee 100644
--- a/src/astar/doc/pgr_astar.rst
+++ b/src/astar/doc/pgr_aStar.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -12,22 +12,21 @@
pgr_aStar
===============================================================================
-
Name
-------------------------------------------------------------------------------
``pgr_aStar`` — Returns the shortest path using A* algorithm.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
- :target: http://www.boost.org/libs/graph
+.. figure:: images/boost-inside.jpeg
+ :target: http://www.boost.org//libs/graph/doc/astar_search.html
Boost Graph Inside
+.. rubric:: Availability:
-Synopsis
--------------------------------------------------------------------------------
+* pgr_astar(one to one) 2.0.0, Signature changed 2.3.0
+* pgr_astar(other signatures) 2.4.0
-The A* (pronounced "A Star") algorithm is based on Dijkstra's algorithm with a heuristic that allow it to solve most shortest path problems by evaluation only a sub-set of the overall graph.
Characteristics
@@ -39,7 +38,6 @@ The main Characteristics are:
- Vertices of the graph are:
- **positive** when it belongs to the edges_sql
- - **negative** when it belongs to the points_sql
- Values are returned when there is a path.
@@ -66,24 +64,29 @@ Signature Summary
pgr_aStar(edges_sql, start_vid, end_vid)
pgr_aStar(edges_sql, start_vid, end_vid, directed, heuristic, factor, epsilon)
- RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
-.. NOTE:: This signature is deprecated
+.. include:: proposed.rst
+ :start-after: begin-warning
+ :end-before: end-warning
+
- .. code-block:: sql
+.. code-block:: none
- pgr_aStar(sql, source integer, target integer, directed boolean, has_rcost boolean)
- RETURNS SET OF pgr_costResult
+ pgr_aStar(edges_sql, start_vid, end_vids, directed, heuristic, factor, epsilon) -- proposed
+ pgr_aStar(edges_sql, starts_vid, end_vid, directed, heuristic, factor, epsilon) -- proposed
+ pgr_aStar(edges_sql, starts_vid, end_vids, directed, heuristic, factor, epsilon) -- proposed
+ RETURNS SET OF (seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)
+ OR EMPTY SET
- - See :ref:`pgr_costResult <type_cost_result>`
- - See :ref:`pgr_aStar-V2.0`
Signatures
-----------------
-.. index::
- single: pgr_aStar(Minimal Signature)
+
+.. index::
+ single: aStar(Minimal Use) -- New Signature
+
Minimal Signature
...............................................................................
@@ -100,17 +103,19 @@ Minimal Signature
:end-before: --q2
-.. index::
- single: pgr_aStar(Complete Singature)
-Complete Signature
+.. index::
+ single: aStar(One to One) -- New Signature
+
+
+One to One
...............................................................................
.. code-block:: none
pgr_aStar(edges_sql, start_vid, end_vid, directed, heuristic, factor, epsilon)
RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
-:Example: Setting a Heuristic
+:Example: Undirected using Heuristic 2
.. literalinclude:: doc-astar.queries
:start-after: --q2
@@ -118,16 +123,103 @@ Complete Signature
+.. index::
+ single: astar(One to Many) -- Proposed
+
+One to many
+.......................................
+
+.. code-block:: none
+
+ pgr_aStar(edges_sql, start_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (seq, path_seq, end_vid, node, edge, cost, agg_cost) or EMPTY SET
+
+This signature finds the shortest path from one ``start_vid`` to each ``end_vid`` in ``end_vids``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform a one to one `pgr_astar`
+where the starting vertex is fixed, and stop when all ``end_vids`` are reached.
+
+ - The result is equivalent to the union of the results of the one to one `pgr_astar`.
+ - The extra ``end_vid`` in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-astar.queries
+ :start-after: --q3
+ :end-before: --q4
+
+.. index::
+ single: aStar(Many to One) -- Proposed
+
+Many to One
+.......................................
+
+.. code-block:: none
+
+ pgr_aStar(edges_sql, starts_vid, end_vid, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (seq, path_seq, start_vid, node, edge, cost, agg_cost) or EMPTY SET
+
+This signature finds the shortest path from each ``start_vid`` in ``start_vids`` to one ``end_vid``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform several one to one `pgr_aStar`
+where the ending vertex is fixed.
+
+ - The result is the union of the results of the one to one `pgr_aStar`.
+ - The extra ``start_vid`` in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-astar.queries
+ :start-after: --q4
+ :end-before: --q5
+
+
+
+.. index::
+ single: aStar(Many to Many) -- Proposed
+
+Many to Many
+.......................................
+
+.. code-block:: none
+
+ pgr_aStar(edges_sql, starts_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost) or EMPTY SET
+
+This signature finds the shortest path from each ``start_vid`` in ``start_vids`` to each ``end_vid`` in ``end_vids``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform several one to Many `pgr_dijkstra`
+for all ``start_vids``.
+
+ - The result is the union of the results of the one to one `pgr_dijkstra`.
+ - The extra ``start_vid`` in the result is used to distinguish to which path it belongs.
+
+The extra ``start_vid`` and ``end_vid`` in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-astar.queries
+ :start-after: --q5
+ :end-before: --q6
+
+
+
+
+
Description of the Signatures
--------------------------------
-.. NOTE:: The following only aplies to the new signature(s)
-
..
description of the edges_sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: xy_edges_sql_start
:end-before: xy_edges_sql_end
@@ -155,11 +247,11 @@ Parameter Type Description
- 4: h(v) = sqrt(dx * dx + dy * dy)
- 5: h(v) = abs(dx) + abs(dy)
-**factor** ``FLOAT`` (optional). For units manipulation. :math:`factor > 0`. Default ``1``.
-**epsilon** ``FLOAT`` (optional). For less restricted results. :math:`factor >= 1`. Default ``1``.
+**factor** ``FLOAT`` (optional). For units manipulation. :math:`factor > 0`. Default ``1``. see :ref:`astar_factor`
+**epsilon** ``FLOAT`` (optional). For less restricted results. :math:`epsilon >= 1`. Default ``1``.
================ ====================== =================================================
-
+
Description of the return values
@@ -188,63 +280,17 @@ Column Type Description
============= =========== =================================================
-About factor
--------------------------------------------------------------------------------
-
-.. rubric:: Analysis 1
-
-Working with cost/reverse_cost as length in degrees, x/y in lat/lon:
-Factor = 1 (no need to change units)
-
-.. rubric:: Analysis 2
-
-Working with cost/reverse_cost as length in meters, x/y in lat/lon:
-Factor = would depend on the location of the points:
-
-======== ================================= ==========
-latitude conversion Factor
-======== ================================= ==========
-45 1 longitude degree is 78846.81 m 78846
- 0 1 longitude degree is 111319.46 m 111319
-======== ================================= ==========
-
-.. rubric:: Analysis 3
-
-Working with cost/reverse_cost as time in seconds, x/y in lat/lon:
-Factor: would depend on the location of the points and on the average speed
-say 25m/s is the speed.
-
-======== =========================================== ==========
-latitude conversion Factor
-======== =========================================== ==========
-45 1 longitude degree is (78846.81m)/(25m/s) 3153 s
- 0 1 longitude degree is (111319.46 m)/(25m/s) 4452 s
-======== =========================================== ==========
-
-
-
-
-.. rubric:: History
-
-* Functionality added version 2.3.0
-* Renamed in version 2.0.0
-
-
-Deprecated Signature
--------------------------------------------------------------------------------
-
-:Example: Using the deprecated signature
-
-.. literalinclude:: doc-astar.queries
- :start-after: --q3
- :end-before: --q4
-
-
-The queries use the :ref:`sampledata` network.
-
See Also
-------------------------------------------------------------------------------
+* :ref:`astar`
+* :ref:`sampledata`
* http://www.boost.org/libs/graph/doc/astar_search.html
* http://en.wikipedia.org/wiki/A*_search_algorithm
+
+.. rubric:: Indices and tables
+
+* :ref:`genindex`
+* :ref:`search`
+
diff --git a/src/astar/doc/pgr_aStarCost.rst b/src/astar/doc/pgr_aStarCost.rst
new file mode 100644
index 0000000..28c08cd
--- /dev/null
+++ b/src/astar/doc/pgr_aStarCost.rst
@@ -0,0 +1,239 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _pgr_aStarCost:
+
+pgr_aStarCost -- proposed
+===============================================================================
+
+Name
+-------------------------------------------------------------------------------
+
+``pgr_aStarCost`` — Returns the aggregate cost shortest path using :ref:`astar` algorithm.
+
+.. figure:: images/boost-inside.jpeg
+ :target: http://www.boost.org//libs/graph/doc/astar_search.html
+
+ Boost Graph Inside
+
+.. rubric:: Availability: 2.4.0
+
+Signature Summary
+-----------------
+
+.. include:: proposed.rst
+ :start-after: begin-warning
+ :end-before: end-warning
+
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, start_vid, end_vid) -- Proposed
+ pgr_aStarCost(edges_sql, start_vid, end_vid, directed, heuristic, factor, epsilon) -- Proposed
+ pgr_aStarCost(edges_sql, start_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+ pgr_aStarCost(edges_sql, starts_vid, end_vid, directed, heuristic, factor, epsilon) -- Proposed
+ pgr_aStarCost(edges_sql, starts_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+
+Signatures
+-----------------
+
+
+.. index::
+ single: aStarCost(Minimal Signature) -- Proposed
+
+Minimal Signature
+...............................................................................
+
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, start_vid, end_vid)
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+:Example: Using the defaults
+
+.. literalinclude:: doc-aStarCost.queries
+ :start-after: --q1
+ :end-before: --q2
+
+
+
+.. index::
+ single: aStarCost(One to One) -- Proposed
+
+One to One
+...............................................................................
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, start_vid, end_vid, directed, heuristic, factor, epsilon)
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+:Example: Setting a Heuristic
+
+.. literalinclude:: doc-aStarCost.queries
+ :start-after: --q2
+ :end-before: --q3
+
+
+
+.. index::
+ single: aStarCost(One to Many) -- Proposed
+
+One to many
+.......................................
+
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, start_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+This signature finds a path from one ``start_vid`` to each ``end_vid`` in ``end_vids``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform a one to one `pgr_astar`
+where the starting vertex is fixed, and stop when all ``end_vids`` are reached.
+
+ - The result is equivalent to the union of the results of the one to one `pgr_astar`.
+ - The extra ``end_vid`` column in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-aStarCost.queries
+ :start-after: --q3
+ :end-before: --q4
+
+.. index::
+ single: aStarCost(Many to One) -- Proposed
+
+Many to One
+.......................................
+
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, starts_vid, end_vid, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+This signature finds the shortest path from each ``start_vid`` in ``start_vids`` to one ``end_vid``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform several one to one `pgr_aStar`
+where the ending vertex is fixed.
+
+ - The result is the union of the results of the one to one `pgr_aStar`.
+ - The extra ``start_vid`` column in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-aStarCost.queries
+ :start-after: --q4
+ :end-before: --q5
+
+
+
+.. index::
+ single: aStarCost(Many to Many) -- Proposed
+
+Many to Many
+.......................................
+
+.. code-block:: none
+
+ pgr_aStarCost(edges_sql, starts_vid, end_vids, directed, heuristic, factor, epsilon) -- Proposed
+ RETURNS SET OF (start_vid, end_vid, agg_cost) OR EMPTY SET
+
+This signature finds the shortest path from each ``start_vid`` in ``start_vids`` to each ``end_vid`` in ``end_vids``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+Using this signature, will load once the graph and perform several one to Many `pgr_dijkstra`
+for all ``start_vids``.
+
+ - The result is the union of the results of the one to one `pgr_dijkstra`.
+ - The extra ``start_vid`` in the result is used to distinguish to which path it belongs.
+
+The extra ``start_vid`` and ``end_vid`` in the result is used to distinguish to which path it belongs.
+
+:Example:
+
+.. literalinclude:: doc-aStarCost.queries
+ :start-after: --q5
+ :end-before: --q6
+
+
+
+
+
+
+Description of the Signatures
+--------------------------------
+
+..
+ description of the edges_sql queries
+
+.. include:: pgRouting-concepts.rst
+ :start-after: xy_edges_sql_start
+ :end-before: xy_edges_sql_end
+
+
+Description of the parameters of the signatures
+.................................................
+
+================ ====================== =================================================
+Parameter Type Description
+================ ====================== =================================================
+**edges_sql** ``TEXT`` Edges SQL query as described above.
+**start_vid** ``ANY-INTEGER`` Starting vertex identifier.
+**end_vid** ``ANY-INTEGER`` Ending vertex identifier.
+**directed** ``BOOLEAN`` - Optional.
+
+ - When ``false`` the graph is considered as Undirected.
+ - Default is ``true`` which considers the graph as Directed.
+
+**heuristic** ``INTEGER`` (optional). Heuristic number. Current valid values 0~5. Default ``5``
+
+ - 0: h(v) = 0 (Use this value to compare with pgr_dijkstra)
+ - 1: h(v) abs(max(dx, dy))
+ - 2: h(v) abs(min(dx, dy))
+ - 3: h(v) = dx * dx + dy * dy
+ - 4: h(v) = sqrt(dx * dx + dy * dy)
+ - 5: h(v) = abs(dx) + abs(dy)
+
+**factor** ``FLOAT`` (optional). For units manipulation. :math:`factor > 0`. Default ``1``. See :ref:`astar_factor`
+**epsilon** ``FLOAT`` (optional). For less restricted results. :math:`epsilon >= 1`. Default ``1``.
+================ ====================== =================================================
+
+
+
+
+Description of the return values
+.................................................
+
+Returns set of ``(start_vid, end_vid, agg_cost)``
+
+============= ============= =================================================
+Column Type Description
+============= ============= =================================================
+**start_vid** ``BIGINT`` Identifier of the starting vertex.
+**end_vid** ``BIGINT`` Identifier of the ending vertex.
+**agg_cost** ``FLOAT`` Aggregate cost of the shortest path from ``start_vid`` to ``end_vid``.
+============= ============= =================================================
+
+
+
+
+See Also
+-------------------------------------------------------------------------------
+
+* :ref:`astar`.
+* :ref:`sampledata` network.
+* http://www.boost.org/libs/graph/doc/astar_search.html
+* http://en.wikipedia.org/wiki/A*_search_algorithm
diff --git a/src/astar/doc/pgr_astar-v2.rst b/src/astar/doc/pgr_astar-v2.rst
deleted file mode 100644
index 390184e..0000000
--- a/src/astar/doc/pgr_astar-v2.rst
+++ /dev/null
@@ -1,101 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_astar-V2.0:
-
-pgr_astar - Deprecated Signature
-===============================================================================
-
-.. warning:: This function signature is deprecated!!!
-
- * That means it has been replaced by new signature(s)
- * This signature is no longer supported, and may be removed from future versions.
- * All code that use this function signature should be converted to use its replacement :ref:`pgr_astar`.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_astar`` — Returns the shortest path using A* algorithm.
-
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-The A* (pronounced "A Star") algorithm is based on Dijkstra's algorithm with a heuristic that allow it to solve most shortest path problems by evaluation only a sub-set of the overall graph. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows, that make up a path.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_astar(sql text, source integer, target integer,
- directed boolean, has_rcost boolean);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost, x1, y1, x2, y2 [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :x1: ``x`` coordinate of the start point of the edge
- :y1: ``y`` coordinate of the start point of the edge
- :x2: ``x`` coordinate of the end point of the edge
- :y2: ``y`` coordinate of the end point of the edge
- :reverse_cost: (optional) the cost for the reverse traversal of the edge. This is only used when the ``directed`` and ``has_rcost`` parameters are ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:target: ``int4`` id of the end point
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: node ID
-:id2: edge ID (``-1`` for the last row)
-:cost: cost to traverse from ``id1`` using ``id2``
-
-
-.. rubric:: History
-
-* Renamed in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-
-.. literalinclude:: doc-astar-v2.queries
- :start-after: -- q1
- :end-before: -- q2
-
-* With ``reverse_cost``
-
-.. literalinclude:: doc-astar-v2.queries
- :start-after: -- q2
- :end-before: -- q3
-
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_astar`
-* :ref:`type_cost_result`
-* http://en.wikipedia.org/wiki/A*_search_algorithm
diff --git a/src/astar/sql/CMakeLists.txt b/src/astar/sql/CMakeLists.txt
index a7aba9a..ba8b329 100644
--- a/src/astar/sql/CMakeLists.txt
+++ b/src/astar/sql/CMakeLists.txt
@@ -1,12 +1,11 @@
# Append in local scope
LIST(APPEND PACKAGE_SQL_FILES
${CMAKE_CURRENT_SOURCE_DIR}/astarV2.0.sql
- ${CMAKE_CURRENT_SOURCE_DIR}/astarOneToOne.sql
+ #${CMAKE_CURRENT_SOURCE_DIR}/astarOneToOne.sql
- #for version 3.0
- #${CMAKE_CURRENT_SOURCE_DIR}/_astar.sql
- #${CMAKE_CURRENT_SOURCE_DIR}/astar.sql
- #${CMAKE_CURRENT_SOURCE_DIR}/astarCost.sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/_astar.sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/astar.sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/astarCost.sql
)
# set in parent scope
diff --git a/src/astar/sql/astarCost.sql b/src/astar/sql/astarCost.sql
index b3e57c0..719dfd1 100644
--- a/src/astar/sql/astarCost.sql
+++ b/src/astar/sql/astarCost.sql
@@ -26,6 +26,13 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+
+--
+-- pgr_astarCost subfamily of functions
+--
+
+-- one to one
CREATE OR REPLACE FUNCTION pgr_astarCost(
edges_sql TEXT, -- XY edges sql
BIGINT, -- start_id
@@ -49,6 +56,7 @@ LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
+-- one to many
CREATE OR REPLACE FUNCTION pgr_astarCost(
edges_sql TEXT, -- XY edges sql
BIGINT,
@@ -72,6 +80,7 @@ LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
+-- many to one
CREATE OR REPLACE FUNCTION pgr_astarCost(
edges_sql TEXT, -- XY edges sql
start_vids ANYARRAY,
@@ -95,6 +104,7 @@ LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
+-- many to many
CREATE OR REPLACE FUNCTION pgr_astarCost(
edges_sql TEXT, -- XY edges sql
start_vids ANYARRAY,
diff --git a/src/astar/sql/astarV2.0.sql b/src/astar/sql/astarV2.0.sql
index b83075d..3bdc6ae 100644
--- a/src/astar/sql/astarV2.0.sql
+++ b/src/astar/sql/astarV2.0.sql
@@ -30,7 +30,7 @@ DECLARE
has_reverse BOOLEAN;
sql TEXT;
BEGIN
- RAISE NOTICE 'Deprecated signature of function pgr_astar';
+ RAISE NOTICE 'Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)';
has_reverse =_pgr_parameter_check('astar', edges_sql, false);
sql = edges_sql;
IF (has_reverse != has_rcost) THEN
diff --git a/src/astar/src/CMakeLists.txt b/src/astar/src/CMakeLists.txt
index 0c576a9..61e9dc7 100644
--- a/src/astar/src/CMakeLists.txt
+++ b/src/astar/src/CMakeLists.txt
@@ -1,12 +1,8 @@
ADD_LIBRARY(astar OBJECT
- astarOneToOne.c
- astarOneToOne_driver.cpp
+ many_to_many_astar.c
+ many_to_one_astar.c
+ one_to_many_astar.c
+ one_to_one_astar.c
- #for version 3.0
- #astarOneToMany.c
- #astarOneToMany_driver.cpp
-
- #astarManyToOne.c
- #astarManyToMany.c
- #astarManyToMany_driver.cpp
+ astar_many_to_many_driver.cpp
)
diff --git a/src/astar/src/astarOneToMany_driver.cpp b/src/astar/src/astarOneToMany_driver.cpp
deleted file mode 100644
index af341c8..0000000
--- a/src/astar/src/astarOneToMany_driver.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: astarOneToOne_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <deque>
-#include <algorithm>
-#include <vector>
-#include "./astarOneToMany_driver.h"
-
-
-#include "./../../common/src/pgr_types.h"
-#include "./pgr_astar.hpp"
-#include "./../../common/src/pgr_assert.h"
-#include "./../../common/src/pgr_alloc.hpp"
-
-template < class G >
-void
-pgr_astar(
- G &graph,
- std::deque< Path > &paths,
- int64_t source,
- std::vector < int64_t > targets,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost = false) {
- Pgr_astar< G > fn_astar;
- fn_astar.astar(graph, paths, source, targets,
- heuristic, factor, epsilon, only_cost);
-}
-
-
-/************************************************************
- edges_sql TEXT,
- vertex_table TEXT,
- start_vid BIGINT,
- end_vid BIGINT directed BOOLEAN DEFAULT true,
- ***********************************************************/
-void do_pgr_astarOneToMany(
- Pgr_edge_xy_t *edges,
- size_t total_edges,
- int64_t start_vid,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
- bool directed,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg,
- bool normal) {
- std::ostringstream err;
- std::ostringstream log;
- try {
- pgassert(!(*log_msg));
- pgassert(!(*err_msg));
- pgassert(!(*return_tuples));
- pgassert(*return_count == 0);
- pgassert(total_edges != 0);
-
-
- if (total_edges <= 1) {
- err << "Required: more than one edge\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- std::deque< Path >paths;
- log << "Inserting target vertices into a c++ vector structure\n";
- std::vector< int64_t > end_vids(
- end_vidsArr,
- end_vidsArr + size_end_vidsArr);
-
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::xyDirectedGraph digraph(
- pgrouting::extract_vertices(edges, total_edges),
- gType);
- digraph.graph_insert_data(edges, total_edges);
- pgr_astar(digraph, paths, start_vid, end_vids,
- heuristic, factor, epsilon, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- pgrouting::xyUndirectedGraph undigraph(
- pgrouting::extract_vertices(edges, total_edges),
- gType);
- undigraph.graph_insert_data(edges, total_edges);
- pgr_astar(undigraph, paths, start_vid, end_vids,
- heuristic, factor, epsilon, only_cost);
- }
- if (!normal) {
- for (auto &path : paths) {
- log << "reversing path\n";
- log << path;
- path.reverse();
- log << "reversed path\n";
- log << path;
- }
- }
- log << "checking reversed paths\n";
- for (auto path : paths) {
- log << "reversed path\n";
- log << path;
- }
-
- size_t count(0);
- count = count_tuples(paths);
-
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
- *err_msg = NULL;
- *log_msg = strdup(log.str().c_str());
- } catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- } catch(...) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- }
-}
diff --git a/src/astar/src/astarOneToMany_driver.h b/src/astar/src/astarOneToMany_driver.h
deleted file mode 100644
index 17e8694..0000000
--- a/src/astar/src/astarOneToMany_driver.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: astarOneToMany_driver.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_ASTAR_SRC_ASTARONETOMANY_DRIVER_H_
-#define SRC_ASTAR_SRC_ASTARONETOMANY_DRIVER_H_
-
-#pragma once
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /*********************************************************
- edges_sql TEXT,
- vertex_table TEXT,
- start_vid BIGINT,
- end_vid BIGINT directed BOOLEAN DEFAULT true,
- ********************************************************/
- void do_pgr_astarOneToMany(
- Pgr_edge_xy_t *data_edges,
- size_t total_edges,
- int64_t start_vid,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
- bool directed,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg,
- bool normal);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_ASTAR_SRC_ASTARONETOMANY_DRIVER_H_
diff --git a/src/astar/src/astarOneToOne_driver.h b/src/astar/src/astarOneToOne_driver.h
deleted file mode 100644
index f0b7f70..0000000
--- a/src/astar/src/astarOneToOne_driver.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: astarOneToOne_driver.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_ASTAR_SRC_ASTARONETOONE_DRIVER_H_
-#define SRC_ASTAR_SRC_ASTARONETOONE_DRIVER_H_
-#pragma once
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- /*********************************************************
- edges_sql TEXT,
- vertex_table TEXT,
- start_vid BIGINT,
- end_vid BIGINT directed BOOLEAN DEFAULT true,
- ********************************************************/
- void do_pgr_astarOneToOne(
- Pgr_edge_xy_t *data_edges,
- size_t total_edges,
- int64_t start_vid,
- int64_t end_vid,
- bool directed,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_ASTAR_SRC_ASTARONETOONE_DRIVER_H_
diff --git a/src/astar/src/astarManyToMany_driver.cpp b/src/astar/src/astar_many_to_many_driver.cpp
similarity index 58%
rename from src/astar/src/astarManyToMany_driver.cpp
rename to src/astar/src/astar_many_to_many_driver.cpp
index 7ebb3c8..5150f72 100644
--- a/src/astar/src/astarManyToMany_driver.cpp
+++ b/src/astar/src/astar_many_to_many_driver.cpp
@@ -27,40 +27,73 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./astar_many_to_many_driver.h"
#include <sstream>
#include <deque>
#include <algorithm>
#include <vector>
-#include "./astarManyToMany_driver.h"
-// #define DEBUG
+#include "./pgr_astar.hpp"
+#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
-#include "./pgr_astar.hpp"
-#include "./../../common/src/pgr_assert.h"
-#include "./../../common/src/pgr_alloc.hpp"
-template < class G >
void
+check_parameters(
+ int heuristic,
+ double factor,
+ double epsilon) {
+ if (heuristic > 5 || heuristic < 0) {
+ ereport(ERROR,
+ (errmsg("Unknown heuristic"),
+ errhint("Valid values: 0~5")));
+ }
+ if (factor <= 0) {
+ ereport(ERROR,
+ (errmsg("Factor value out of range"),
+ errhint("Valid values: positive non zero")));
+ }
+ if (epsilon < 1) {
+ ereport(ERROR,
+ (errmsg("Epsilon value out of range"),
+ errhint("Valid values: 1 or greater than 1")));
+ }
+}
+
+template < class G >
+std::deque<Path>
pgr_astar(
G &graph,
- std::deque< Path > &paths,
- std::vector < int64_t > sources,
- std::vector < int64_t > targets,
+ std::vector<int64_t> sources,
+ std::vector<int64_t> targets,
int heuristic,
double factor,
double epsilon,
- bool only_cost = false) {
- Pgr_astar< G > fn_astar;
- fn_astar.astar(graph, paths, sources, targets,
+ bool only_cost,
+ bool normal) {
+ std::sort(sources.begin(), sources.end());
+ sources.erase(
+ std::unique(sources.begin(), sources.end()),
+ sources.end());
+
+ std::sort(targets.begin(), targets.end());
+ targets.erase(
+ std::unique(targets.begin(), targets.end()),
+ targets.end());
+
+ pgrouting::algorithms::Pgr_astar< G > fn_astar;
+ auto paths = fn_astar.astar(graph, sources, targets,
heuristic, factor, epsilon, only_cost);
+
+ if (!normal) {
+ for (auto &path : paths) {
+ path.reverse();
+ }
+ }
+ return paths;
}
@@ -71,8 +104,7 @@ pgr_astar(
end_vid BIGINT directed BOOLEAN DEFAULT true,
***********************************************************/
void do_pgr_astarManyToMany(
- Pgr_edge_xy_t *edges,
- size_t total_edges,
+ Pgr_edge_xy_t *edges, size_t total_edges,
int64_t *start_vidsArr, size_t size_start_vidsArr,
int64_t *end_vidsArr, size_t size_end_vidsArr,
bool directed,
@@ -80,12 +112,15 @@ void do_pgr_astarManyToMany(
double factor,
double epsilon,
bool only_cost,
+ bool normal,
General_path_element_t **return_tuples,
size_t *return_count,
- char ** log_msg,
- char ** err_msg) {
- std::ostringstream err;
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg) {
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
pgassert(!(*log_msg));
pgassert(!(*err_msg));
@@ -94,15 +129,6 @@ void do_pgr_astarManyToMany(
pgassert(total_edges != 0);
- if (total_edges <= 1) {
- err << "Required: more than one edge\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- std::deque< Path >paths;
log << "Inserting target vertices into a c++ vector structure\n";
std::vector< int64_t > end_vids(
end_vidsArr,
@@ -113,22 +139,23 @@ void do_pgr_astarManyToMany(
graphType gType = directed? DIRECTED: UNDIRECTED;
+ std::deque< Path >paths;
if (directed) {
log << "Working with directed Graph\n";
pgrouting::xyDirectedGraph digraph(
pgrouting::extract_vertices(edges, total_edges),
gType);
- digraph.graph_insert_data(edges, total_edges);
- pgr_astar(digraph, paths, start_vids, end_vids,
- heuristic, factor, epsilon, only_cost);
+ digraph.insert_edges(edges, total_edges);
+ paths = pgr_astar(digraph, start_vids, end_vids,
+ heuristic, factor, epsilon, only_cost, normal);
} else {
log << "Working with Undirected Graph\n";
pgrouting::xyUndirectedGraph undigraph(
pgrouting::extract_vertices(edges, total_edges),
gType);
- undigraph.graph_insert_data(edges, total_edges);
- pgr_astar(undigraph, paths, start_vids, end_vids,
- heuristic, factor, epsilon, only_cost);
+ undigraph.insert_edges(edges, total_edges);
+ paths = pgr_astar(undigraph, start_vids, end_vids,
+ heuristic, factor, epsilon, only_cost, normal);
}
size_t count(0);
@@ -140,7 +167,7 @@ void do_pgr_astarManyToMany(
(*return_count) = 0;
log <<
"No paths found\n";
- *err_msg = strdup(log.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
return;
}
@@ -148,25 +175,30 @@ void do_pgr_astarManyToMany(
log << "Converting a set of paths into the tuples\n";
(*return_count) = (collapse_paths(return_tuples, paths));
- *err_msg = NULL;
- *log_msg = strdup(log.str().c_str());
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
} catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
} catch(...) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
+
diff --git a/src/astar/src/astarManyToMany_driver.h b/src/astar/src/astar_many_to_many_driver.h
similarity index 83%
rename from src/astar/src/astarManyToMany_driver.h
rename to src/astar/src/astar_many_to_many_driver.h
index 7f34268..d028fb1 100644
--- a/src/astar/src/astarManyToMany_driver.h
+++ b/src/astar/src/astar_many_to_many_driver.h
@@ -26,9 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_ASTAR_SRC_ASTARMANYTOMANY_DRIVER_H_
-#define SRC_ASTAR_SRC_ASTARMANYTOMANY_DRIVER_H_
-
+#ifndef SRC_ASTAR_SRC_ASTAR_MANY_TO_MANY_DRIVER_H_
+#define SRC_ASTAR_SRC_ASTAR_MANY_TO_MANY_DRIVER_H_
#pragma once
#include "./../../common/src/pgr_types.h"
@@ -37,6 +36,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
extern "C" {
#endif
+ void check_parameters(
+ int heuristic,
+ double factor,
+ double epsilon);
+
/*********************************************************
edges_sql TEXT,
vertex_table TEXT,
@@ -53,14 +57,16 @@ extern "C" {
double factor,
double epsilon,
bool only_cost,
+ bool normal,
General_path_element_t **return_tuples,
size_t *return_count,
- char ** log_msg,
- char ** err_msg);
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
}
#endif
-#endif // SRC_ASTAR_SRC_ASTARMANYTOMANY_DRIVER_H_
+#endif // SRC_ASTAR_SRC_ASTAR_MANY_TO_MANY_DRIVER_H_
diff --git a/src/astar/src/astarManyToMany.c b/src/astar/src/many_to_many_astar.c
similarity index 57%
rename from src/astar/src/astarManyToMany.c
rename to src/astar/src/many_to_many_astar.c
index c73bc08..2449bd4 100644
--- a/src/astar/src/astarManyToMany.c
+++ b/src/astar/src/many_to_many_astar.c
@@ -27,35 +27,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./astarManyToMany_driver.h"
+#include "./astar_many_to_many_driver.h"
+PGDLLEXPORT Datum astarManyToMany(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(astarManyToMany);
-PGDLLEXPORT Datum
-astarManyToMany(PG_FUNCTION_ARGS);
static
void
process(char* edges_sql,
- int64_t *start_vidsArr, size_t size_start_vidsArr,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
+ ArrayType *starts,
+ ArrayType *ends,
bool directed,
int heuristic,
double factor,
@@ -63,31 +55,20 @@ process(char* edges_sql,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- if (heuristic > 5 || heuristic < 0) {
- free(start_vidsArr);
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Unknown heuristic"),
- errhint("Valid values: 0~5")));
- }
- if (factor <= 0) {
- free(start_vidsArr);
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Factor value out of range"),
- errhint("Valid values: positive non zero")));
- }
- if (epsilon < 1) {
- free(start_vidsArr);
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Epsilon value out of range"),
- errhint("Valid values: 1 or greater than 1")));
- }
+ check_parameters(heuristic, factor, epsilon);
+ pgr_SPI_connect();
+ int64_t* start_vidsArr = NULL;
+ size_t size_start_vidsArr = 0;
+ start_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_start_vidsArr, starts);
+
+ int64_t* end_vidsArr = NULL;
+ size_t size_end_vidsArr = 0;
+ end_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_end_vidsArr, ends);
- pgr_SPI_connect();
Pgr_edge_xy_t *edges = NULL;
size_t total_edges = 0;
@@ -103,12 +84,12 @@ process(char* edges_sql,
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
char *log_msg = NULL;
+ char *notice_msg = NULL;
+ char *err_msg = NULL;
clock_t start_t = clock();
do_pgr_astarManyToMany(
- edges,
- total_edges,
+ edges, total_edges,
start_vidsArr, size_start_vidsArr,
end_vidsArr, size_end_vidsArr,
directed,
@@ -116,34 +97,46 @@ process(char* edges_sql,
factor,
epsilon,
only_cost,
- result_tuples,
- result_count,
+ true,
+ result_tuples, result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing pgr_astar(many to many)", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
-
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+
+ if (only_cost) {
+ time_msg("processing pgr_astarCost(many to many)", start_t, clock());
+ } else {
+ time_msg("processing pgr_astar(many to many)", start_t, clock());
}
- pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_vidsArr) pfree(start_vidsArr);
+ if (end_vidsArr) pfree(end_vidsArr);
+
pgr_SPI_finish();
}
PGDLLEXPORT Datum
astarManyToMany(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- General_path_element_t *result_tuples = 0;
+ /**********************************************************************/
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -163,20 +156,10 @@ astarManyToMany(PG_FUNCTION_ARGS) {
**********************************************************************/
- int64_t* start_vidsArr;
- size_t size_start_vidsArr;
- start_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_vidsArr, PG_GETARG_ARRAYTYPE_P(1));
-
- int64_t* end_vidsArr;
- size_t size_end_vidsArr;
- end_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_vidsArr, PG_GETARG_ARRAYTYPE_P(2));
-
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- start_vidsArr, size_start_vidsArr,
- end_vidsArr, size_end_vidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_BOOL(3),
PG_GETARG_INT32(4),
PG_GETARG_FLOAT8(5),
@@ -185,13 +168,16 @@ astarManyToMany(PG_FUNCTION_ARGS) {
&result_tuples,
&result_count);
- free(end_vidsArr);
- free(start_vidsArr);
-
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->max_calls = (uint32_t) result_count;
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -202,55 +188,51 @@ astarManyToMany(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
/*********************************************************************
- OUT seq INTEGER,
- OUT path_seq INTEGER,
- OUT start_vid BIGINT,
- OUT end_vid BIGINT,
- OUT node BIGINT,
- OUT edge BIGINT,
- OUT cost FLOAT,
- OUT agg_cost FLOAT
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT start_vid BIGINT,
+ OUT end_vid BIGINT,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT
**********************************************************************/
- values = palloc(8 * sizeof(Datum));
- nulls = palloc(8 * sizeof(bool));
+ size_t numb = 8;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 8; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[4] = Int64GetDatum(result_tuples[call_cntr].node);
- values[5] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[7] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[5] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[7] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/astar/src/astarManyToOne.c b/src/astar/src/many_to_one_astar.c
similarity index 58%
rename from src/astar/src/astarManyToOne.c
rename to src/astar/src/many_to_one_astar.c
index 913a4b2..08cfebf 100644
--- a/src/astar/src/astarManyToOne.c
+++ b/src/astar/src/many_to_one_astar.c
@@ -27,34 +27,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./astarOneToMany_driver.h"
+#include "./astar_many_to_many_driver.h"
+PGDLLEXPORT Datum astarManyToOne(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(astarManyToOne);
-PGDLLEXPORT Datum
-astarManyToOne(PG_FUNCTION_ARGS);
static
void
process(char* edges_sql,
- int64_t *start_vidsArr, size_t size_start_vidsArr,
+ ArrayType *starts,
int64_t end_vid,
bool directed,
int heuristic,
@@ -63,29 +55,13 @@ process(char* edges_sql,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- if (heuristic > 5 || heuristic < 0) {
- free(start_vidsArr);
- ereport(ERROR,
- (errmsg("Unknown heuristic"),
- errhint("Valid values: 0~5")));
- }
- if (factor <= 0) {
- free(start_vidsArr);
- ereport(ERROR,
- (errmsg("Factor value out of range"),
- errhint("Valid values: positive non zero")));
- }
- if (epsilon < 1) {
- free(start_vidsArr);
- ereport(ERROR,
- (errmsg("Epsilon value out of range"),
- errhint("Valid values: 1 or greater than 1")));
- }
-
-
+ check_parameters(heuristic, factor, epsilon);
pgr_SPI_connect();
+ size_t size_start_vidsArr = 0;
+ int64_t* start_vidsArr = pgr_get_bigIntArray(&size_start_vidsArr, starts);
+
Pgr_edge_xy_t *edges = NULL;
size_t total_edges = 0;
@@ -100,45 +76,53 @@ process(char* edges_sql,
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
clock_t start_t = clock();
- do_pgr_astarOneToMany(
- edges,
- total_edges,
- end_vid,
+ do_pgr_astarManyToMany(
+ edges, total_edges,
+ &end_vid, 1,
start_vidsArr, size_start_vidsArr,
directed,
heuristic,
factor,
epsilon,
only_cost,
+ false,
result_tuples,
result_count,
&log_msg,
- &err_msg,
- false); // not normal
- time_msg(" processing pgr_astar(many to one)", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
-
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- free(start_vidsArr);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_cost) {
+ time_msg("processing pgr_astarCost(one to many)", start_t, clock());
+ } else {
+ time_msg("processing pgr_astar(one to many)", start_t, clock());
+ }
+
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
}
- pfree(edges);
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_vidsArr) pfree(start_vidsArr);
+
pgr_SPI_finish();
}
PGDLLEXPORT Datum
astarManyToOne(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
General_path_element_t *result_tuples = 0;
@@ -151,24 +135,19 @@ astarManyToOne(PG_FUNCTION_ARGS) {
/**********************************************************************
- edges_sql TEXT,
- start_vid BIGINT,
- end_vids ARRAY[ANY_INTEGER], -- anyarray
- directed BOOLEAN DEFAULT true,
- heuristic INTEGER DEFAULT 0,
- factor FLOAT DEFAULT 1.0,
- epsilon FLOAT DEFAULT 1.0,
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vids ARRAY[ANY_INTEGER], -- anyarray
+ directed BOOLEAN DEFAULT true,
+ heuristic INTEGER DEFAULT 0,
+ factor FLOAT DEFAULT 1.0,
+ epsilon FLOAT DEFAULT 1.0,
**********************************************************************/
- int64_t* start_vidsArr;
- size_t size_start_vidsArr;
- start_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_vidsArr, PG_GETARG_ARRAYTYPE_P(1));
-
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- start_vidsArr, size_start_vidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
PG_GETARG_INT64(2),
PG_GETARG_BOOL(3),
PG_GETARG_INT32(4),
@@ -178,12 +157,16 @@ astarManyToOne(PG_FUNCTION_ARGS) {
&result_tuples,
&result_count);
- free(start_vidsArr);
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -194,25 +177,23 @@ astarManyToOne(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
/*********************************************************************
- OUT seq INTEGER,
- OUT path_seq INTEGER,
- OUT end_vid BIGINT,
- OUT node BIGINT,
- OUT edge BIGINT,
- OUT cost FLOAT,
- OUT agg_cost FLOAT
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT end_vid BIGINT,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT
**********************************************************************/
@@ -225,20 +206,19 @@ astarManyToOne(PG_FUNCTION_ARGS) {
}
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- if (result_tuples) free(result_tuples);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/astar/src/astarOneToMany.c b/src/astar/src/one_to_many_astar.c
similarity index 58%
rename from src/astar/src/astarOneToMany.c
rename to src/astar/src/one_to_many_astar.c
index 88f0c8c..fe298b4 100644
--- a/src/astar/src/astarOneToMany.c
+++ b/src/astar/src/one_to_many_astar.c
@@ -27,35 +27,25 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
+#include "./../../common/src/pgr_types.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
+#include "./astar_many_to_many_driver.h"
-#include "./astarOneToMany_driver.h"
-
+PGDLLEXPORT Datum astarOneToMany(PG_FUNCTION_ARGS);
PG_FUNCTION_INFO_V1(astarOneToMany);
-PGDLLEXPORT Datum
-astarOneToMany(PG_FUNCTION_ARGS);
-
static
void
process(char* edges_sql,
int64_t start_vid,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
+ ArrayType *ends,
bool directed,
int heuristic,
double factor,
@@ -63,26 +53,10 @@ process(char* edges_sql,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- if (heuristic > 5 || heuristic < 0) {
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Unknown heuristic"),
- errhint("Valid values: 0~5")));
- }
- if (factor <= 0) {
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Factor value out of range"),
- errhint("Valid values: positive non zero")));
- }
- if (epsilon < 1) {
- free(end_vidsArr);
- ereport(ERROR,
- (errmsg("Epsilon value out of range"),
- errhint("Valid values: 1 or greater than 1")));
- }
-
+ check_parameters(heuristic, factor, epsilon);
+ size_t size_end_vidsArr = 0;
+ int64_t* end_vidsArr = pgr_get_bigIntArray(&size_end_vidsArr, ends);
pgr_SPI_connect();
@@ -100,44 +74,53 @@ process(char* edges_sql,
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
clock_t start_t = clock();
- do_pgr_astarOneToMany(
- edges,
- total_edges,
- start_vid,
+ do_pgr_astarManyToMany(
+ edges, total_edges,
+ &start_vid, 1,
end_vidsArr, size_end_vidsArr,
directed,
heuristic,
factor,
epsilon,
only_cost,
+ true,
result_tuples,
result_count,
&log_msg,
- &err_msg,
- true);
- time_msg(" processing pgr_astar(one to Many)", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
-
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_cost) {
+ time_msg("processing pgr_astarCost(one to many)", start_t, clock());
+ } else {
+ time_msg("processing pgr_astar(one to many)", start_t, clock());
}
- pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (end_vidsArr) pfree(end_vidsArr);
+
pgr_SPI_finish();
}
PGDLLEXPORT Datum
astarOneToMany(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
General_path_element_t *result_tuples = 0;
@@ -150,25 +133,21 @@ astarOneToMany(PG_FUNCTION_ARGS) {
/*****************************************************************
- edges_sql TEXT,
- start_vid BIGINT,
- end_vids ARRAY[ANY_INTEGER], -- anyarray
- directed BOOLEAN DEFAULT true,
- heuristic INTEGER DEFAULT 0,
- factor FLOAT DEFAULT 1.0,
- epsilon FLOAT DEFAULT 1.0,
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vids ARRAY[ANY_INTEGER], -- anyarray
+ directed BOOLEAN DEFAULT true,
+ heuristic INTEGER DEFAULT 0,
+ factor FLOAT DEFAULT 1.0,
+ epsilon FLOAT DEFAULT 1.0,
****************************************************************/
- int64_t* end_vidsArr;
- size_t size_end_vidsArr;
- end_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_vidsArr, PG_GETARG_ARRAYTYPE_P(2));
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
- end_vidsArr, size_end_vidsArr,
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_BOOL(3),
PG_GETARG_INT32(4),
PG_GETARG_FLOAT8(5),
@@ -177,12 +156,17 @@ astarOneToMany(PG_FUNCTION_ARGS) {
&result_tuples,
&result_count);
- free(end_vidsArr);
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -193,25 +177,23 @@ astarOneToMany(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
/*********************************************************************
- OUT seq INTEGER,
- OUT path_seq INTEGER,
- OUT end_vid BIGINT,
- OUT node BIGINT,
- OUT edge BIGINT,
- OUT cost FLOAT,
- OUT agg_cost FLOAT
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT end_vid BIGINT,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT
*********************************************************************/
@@ -224,20 +206,19 @@ astarOneToMany(PG_FUNCTION_ARGS) {
}
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- if (result_tuples) free(result_tuples);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/astar/src/astarOneToOne.c b/src/astar/src/one_to_one_astar.c
similarity index 64%
rename from src/astar/src/astarOneToOne.c
rename to src/astar/src/one_to_one_astar.c
index a3c66ed..213fb95 100644
--- a/src/astar/src/astarOneToOne.c
+++ b/src/astar/src/one_to_one_astar.c
@@ -27,25 +27,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
-#include "./astarOneToOne_driver.h"
+#include "./astar_many_to_many_driver.h"
PGDLLEXPORT Datum astarOneToOne(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(astarOneToOne);
static
@@ -60,23 +54,7 @@ process(char* edges_sql,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- if (heuristic > 5 || heuristic < 0) {
- ereport(ERROR,
- (errmsg("Unknown heuristic"),
- errhint("Valid values: 0~5")));
- }
- if (factor <= 0) {
- ereport(ERROR,
- (errmsg("Factor value out of range"),
- errhint("Valid values: positive non zero")));
- }
- if (epsilon < 1) {
- ereport(ERROR,
- (errmsg("Epsilon value out of range"),
- errhint("Valid values: 1 or greater than 1")));
- }
-
-
+ check_parameters(heuristic, factor, epsilon);
pgr_SPI_connect();
@@ -96,45 +74,51 @@ process(char* edges_sql,
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
clock_t start_t = clock();
- do_pgr_astarOneToOne(
- edges,
- total_edges,
- start_vid,
- end_vid,
+ do_pgr_astarManyToMany(
+ edges, total_edges,
+ &start_vid, 1,
+ &end_vid, 1,
directed,
heuristic,
factor,
epsilon,
only_cost,
+ true,
result_tuples,
result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing pgr_astar(one to one)", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
+ if (only_cost) {
+ time_msg("processing pgr_astarCost(one to one)", start_t, clock());
+ } else {
+ time_msg("processing pgr_astar(one to one)", start_t, clock());
+ }
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
}
- pfree(edges);
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+
pgr_SPI_finish();
}
-PG_FUNCTION_INFO_V1(astarOneToOne);
PGDLLEXPORT Datum
astarOneToOne(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
General_path_element_t *result_tuples = 0;
@@ -147,19 +131,19 @@ astarOneToOne(PG_FUNCTION_ARGS) {
/**********************************************************************
- edges_sql TEXT,
- start_vid BIGINT,
- end_vid BIGINT,
- directed BOOLEAN DEFAULT true,
- heuristic INTEGER DEFAULT 0,
- factor FLOAT DEFAULT 1.0,
- epsilon FLOAT DEFAULT 1.0,
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN DEFAULT true,
+ heuristic INTEGER DEFAULT 0,
+ factor FLOAT DEFAULT 1.0,
+ epsilon FLOAT DEFAULT 1.0,
**********************************************************************/
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
PG_GETARG_INT64(2),
PG_GETARG_BOOL(3),
@@ -171,9 +155,14 @@ astarOneToOne(PG_FUNCTION_ARGS) {
&result_count);
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -184,24 +173,22 @@ astarOneToOne(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
/**********************************************************************
- OUT seq INTEGER,
- OUT path_seq INTEGER,
- OUT node BIGINT,
- OUT edge BIGINT,
- OUT cost FLOAT,
- OUT agg_cost FLOAT
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT
*********************************************************************/
@@ -213,22 +200,18 @@ astarOneToOne(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
-
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].node);
- values[3] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[4] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[5] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/astar/src/pgr_astar.hpp b/src/astar/src/pgr_astar.hpp
index 92159a4..0f0d5bd 100644
--- a/src/astar/src/pgr_astar.hpp
+++ b/src/astar/src/pgr_astar.hpp
@@ -24,14 +24,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// Include C header first for windows build issue
-
-#if 0
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-#endif
+#ifndef SRC_ASTAR_SRC_PGR_ASTAR_HPP_
+#define SRC_ASTAR_SRC_PGR_ASTAR_HPP_
+#pragma once
#include <boost/config.hpp>
#include <boost/graph/graph_traits.hpp>
@@ -50,9 +45,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./../../common/src/basePath_SSEC.hpp"
#include "./../../common/src/pgr_base_graph.hpp"
-
-
-
+namespace pgrouting {
+namespace algorithms {
template < class G >
class Pgr_astar {
@@ -61,93 +55,117 @@ class Pgr_astar {
typedef typename G::B_G B_G;
+ void clear() {
+ predecessors.clear();
+ distances.clear();
+ }
+
//! @name Astar
//@{
//! one to one
- void astar(
+ //! astar 1 to 1
+ Path astar(
G &graph,
- Path &path,
int64_t start_vertex,
int64_t end_vertex,
int heuristic,
double factor,
double epsilon,
- bool only_cost = false);
+ bool only_cost) {
+ clear();
+
+ predecessors.resize(graph.num_vertices());
+ distances.resize(graph.num_vertices());
+
+ if (!graph.has_vertex(start_vertex)
+ || !graph.has_vertex(end_vertex)) {
+ return Path(start_vertex, end_vertex);
+ }
- //! one to Many
- void astar(
+ auto v_source(graph.get_V(start_vertex));
+ auto v_target(graph.get_V(end_vertex));
+
+ // perform the algorithm
+ astar_1_to_1(graph, v_source, v_target, heuristic, factor, epsilon);
+
+ return Path(graph,
+ v_source, v_target,
+ predecessors, distances,
+ only_cost);
+ }
+
+ //! astar 1 to many
+ std::deque<Path> astar(
G &graph,
- std::deque< Path > &paths,
int64_t start_vertex,
- const std::vector< int64_t > &end_vertex,
+ std::vector<int64_t> end_vertex,
int heuristic,
double factor,
double epsilon,
- bool only_cost = false);
+ bool only_cost) {
+ clear();
- //! Many to Many
- void astar(
- G &graph,
- std::deque< Path > &paths,
- std::vector< int64_t > start_vertex,
- const std::vector< int64_t > &end_vertex,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost = false);
+ predecessors.resize(graph.num_vertices());
+ distances.resize(graph.num_vertices());
- //@}
+ if (!graph.has_vertex(start_vertex)) return std::deque<Path>();
+ auto v_source(graph.get_V(start_vertex));
- private:
- //! Call to Astar 1 source to 1 target
- bool astar_1_to_1(
- G &graph,
- V source,
- V target,
- int heuristic,
- double factor,
- double epsilon);
+ std::vector<V> v_targets;
+ for (const auto &vertex : end_vertex) {
+ if (graph.has_vertex(vertex)) {
+ v_targets.push_back(graph.get_V(vertex));
+ }
+ }
- //! Call to astar 1 source to many targets
- bool astar_1_to_many(
- G &graph,
- V source,
- const std::vector< V > &targets,
- int heuristic,
- double factor,
- double epsilon);
+ astar_1_to_many(graph,
+ v_source,
+ v_targets,
+ heuristic,
+ factor,
+ epsilon);
+ auto paths = get_paths(graph, v_source, v_targets, only_cost);
+ std::stable_sort(paths.begin(), paths.end(),
+ [](const Path &e1, const Path &e2)->bool {
+ return e1.end_id() < e2.end_id();
+ });
- void clear() {
- predecessors.clear();
- distances.clear();
+ return paths;
}
- void get_path(
- const G &graph,
- V source,
- V target,
- Path &path) const;
- void get_cost(
- const G &graph,
- V source,
- V target,
- Path &path) const;
+ // preparation for many to many
+ std::deque<Path> astar(
+ G &graph,
+ std::vector<int64_t> start_vertex,
+ std::vector<int64_t> end_vertex,
+ int heuristic,
+ double factor,
+ double epsilon,
+ bool only_cost) {
+ std::deque<Path> paths;
+ for (const auto &start : start_vertex) {
+ auto r_paths = astar(graph, start, end_vertex,
+ heuristic, factor, epsilon, only_cost);
+ paths.insert(paths.begin(), r_paths.begin(), r_paths.end());
+ }
+
+ std::sort(paths.begin(), paths.end(),
+ [](const Path &e1, const Path &e2)->bool {
+ return e1.end_id() < e2.end_id();
+ });
+ std::stable_sort(paths.begin(), paths.end(),
+ [](const Path &e1, const Path &e2)->bool {
+ return e1.start_id() < e2.start_id();
+ });
+ return paths;
+ }
+ //@}
- // used when multiple goals
- void get_path(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const;
- void get_cost(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const;
+ private:
//! @name members;
//@{
struct found_goals{}; //!< exception for termination
@@ -178,18 +196,18 @@ class Pgr_astar {
double operator()(V u) {
if (m_heuristic == 0) return 0;
if (m_goals.empty()) return 0;
- double best_h(std::numeric_limits<double>::max());
+ double best_h((std::numeric_limits<double>::max)());
for (auto goal : m_goals) {
- double current(std::numeric_limits<double>::max());
+ double current((std::numeric_limits<double>::max)());
double dx = m_g[goal].x() - m_g[u].x();
double dy = m_g[goal].y() - m_g[u].y();
switch (m_heuristic) {
case 0:
current = 0;
case 1:
- current = std::fabs(std::max(dx, dy)) * m_factor;
+ current = std::fabs((std::max)(dx, dy)) * m_factor;
case 2:
- current = std::fabs(std::min(dx, dy)) * m_factor;
+ current = std::fabs((std::min)(dx, dy)) * m_factor;
case 3:
current = (dx * dx + dy * dy) * m_factor * m_factor;
case 4:
@@ -253,315 +271,89 @@ class Pgr_astar {
private:
std::set< V > m_goals;
};
-}; // pgr_astar
-/******************** IMPLEMENTTION ******************/
+ /******************** IMPLEMENTTION ******************/
-//! astar 1 to 1
-template < class G >
-void
-Pgr_astar< G >::astar(
- G &graph,
- Path &path,
- int64_t start_vertex,
- int64_t end_vertex,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost) {
- clear();
-
- // adjust predecessors and distances vectors
- predecessors.resize(graph.num_vertices());
- distances.resize(graph.num_vertices());
-
-
- if (!graph.has_vertex(start_vertex)
- || !graph.has_vertex(end_vertex)) {
- path.clear();
- return;
- }
-
- // get the graphs source and target
- auto v_source(graph.get_V(start_vertex));
- auto v_target(graph.get_V(end_vertex));
-
- // perform the algorithm
- astar_1_to_1(graph, v_source, v_target, heuristic, factor, epsilon);
-
- // get the results
- if (only_cost) {
- get_cost(graph, v_source, v_target, path);
- } else {
- get_path(graph, v_source, v_target, path);
- }
- return;
-}
-
-//! astar 1 to many
-template < class G >
-void
-Pgr_astar< G >::astar(
- G &graph,
- std::deque< Path > &paths,
- int64_t start_vertex,
- const std::vector< int64_t > &end_vertex,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost) {
- clear();
-
- // adjust predecessors and distances vectors
- predecessors.resize(graph.num_vertices());
- distances.resize(graph.num_vertices());
-
- // get the graphs source and targets
- if (!graph.has_vertex(start_vertex)) return;
- auto v_source(graph.get_V(start_vertex));
-
- std::set< V > s_v_targets;
- for (const auto &vertex : end_vertex) {
- if (graph.has_vertex(vertex)) {
- s_v_targets.insert(graph.get_V(vertex));
- }
- }
-
- std::vector< V > v_targets(s_v_targets.begin(), s_v_targets.end());
- // perform the algorithm
- astar_1_to_many(graph, v_source, v_targets, heuristic, factor, epsilon);
-
- // get the results // route id are the targets
- if (only_cost) {
- get_cost(graph, paths, v_source, v_targets);
- } else {
- get_path(graph, paths, v_source, v_targets);
- }
-
- std::stable_sort(paths.begin(), paths.end(),
- [](const Path &e1, const Path &e2)->bool {
- return e1.end_id() < e2.end_id();
- });
-
- return;
-}
-
-// preparation for many to many
-template < class G >
-void
-Pgr_astar< G >::astar(
- G &graph, std::deque< Path > &paths,
- std::vector< int64_t > start_vertex,
- const std::vector< int64_t > &end_vertex,
- int heuristic,
- double factor,
- double epsilon,
- bool only_cost) {
- std::stable_sort(start_vertex.begin(), start_vertex.end());
- start_vertex.erase(
- std::unique(start_vertex.begin(), start_vertex.end()),
- start_vertex.end());
-
- for (const auto &start : start_vertex) {
- astar(graph, paths, start, end_vertex,
- heuristic, factor, epsilon, only_cost);
- }
-
- std::sort(paths.begin(), paths.end(),
- [](const Path &e1, const Path &e2)->bool {
- return e1.end_id() < e2.end_id();
- });
- std::stable_sort(paths.begin(), paths.end(),
- [](const Path &e1, const Path &e2)->bool {
- return e1.start_id() < e2.start_id();
- });
- return;
-}
-
-
-
-
-//! Call to Astar 1 source to 1 target
-template < class G >
-bool
-Pgr_astar< G >::astar_1_to_1(
- G &graph,
- V source,
- V target,
- int heuristic,
- double factor,
- double epsilon) {
- bool found = false;
- try {
- // Call A* named parameter interface
- boost::astar_search(
- graph.graph, source,
- distance_heuristic(graph.graph, target,
- heuristic, factor * epsilon),
- boost::predecessor_map(&predecessors[0])
- .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
- .distance_map(&distances[0])
- .visitor(astar_one_goal_visitor(target)));
- }
- catch(found_goals &) {
- found = true; // Target vertex found
- }
- return found;
-}
-
-
-//! Call to astar 1 source to many targets
-template <class G>
-bool
-Pgr_astar< G >::astar_1_to_many(
- G &graph,
- V source,
- const std::vector< V > &targets,
- int heuristic,
- double factor,
- double epsilon) {
- bool found = false;
- try {
- boost::astar_search(
- graph.graph, source,
- distance_heuristic(
- graph.graph, targets,
- heuristic, factor * epsilon),
- boost::predecessor_map(&predecessors[0])
- .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
- .distance_map(&distances[0])
- .visitor(astar_many_goals_visitor(targets)));
- }
- catch(found_goals &fg) {
- found = true; // Target vertex found
- }
- return found;
-}
-
-
-/*
- * GET_COST
- */
+ //! Call to Astar 1 source to 1 target
+ bool astar_1_to_1(
+ G &graph,
+ V source,
+ V target,
+ int heuristic,
+ double factor,
+ double epsilon) {
+ bool found = false;
+ try {
+ // Call A* named parameter interface
+ boost::astar_search(
+ graph.graph, source,
+ distance_heuristic(graph.graph, target,
+ heuristic, factor * epsilon),
+ boost::predecessor_map(&predecessors[0])
+ .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
+ .distance_map(&distances[0])
+ .visitor(astar_one_goal_visitor(target)));
+ }
+ catch(found_goals &) {
+ found = true; // Target vertex found
+ }
+ return found;
+ }
+
+
+ //! Call to astar 1 source to many targets
+ bool astar_1_to_many(
+ G &graph,
+ V source,
+ const std::vector< V > &targets,
+ int heuristic,
+ double factor,
+ double epsilon) {
+ bool found = false;
+ try {
+ boost::astar_search(
+ graph.graph, source,
+ distance_heuristic(
+ graph.graph, targets,
+ heuristic, factor * epsilon),
+ boost::predecessor_map(&predecessors[0])
+ .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
+ .distance_map(&distances[0])
+ .visitor(astar_many_goals_visitor(targets)));
+ }
+ catch(found_goals &) {
+ found = true; // Target vertex found
+ }
+ return found;
+ }
-template < class G >
-void
-Pgr_astar< G >::get_cost(
- const G &graph,
- V source,
- V target,
- Path &r_path) const {
- // backup of the target
- int64_t from(graph.graph[source].id);
- int64_t to(graph.graph[target].id);
-
- // no path was found
- if (target == predecessors[target]) {
- r_path.clear();
- } else {
- Path path(from, to);
- path.push_front(
- {to, -1, distances[target], distances[target]});
- r_path = path;
- }
-}
-template < class G >
-void
-Pgr_astar< G >::get_cost(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const {
- Path path;
- for (auto s_it = targets.begin(); s_it != targets.end(); ++s_it) {
- path.clear();
- get_cost(graph, source, *s_it, path);
- paths.push_back(path);
- }
-}
-
-
-/*
- * GET_PATH
- */
+ /*
+ * GET_PATHS
+ */
-template < class G >
-void
-Pgr_astar< G >::get_path(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const {
- Path path;
- typename std::vector< V >::iterator s_it;
- for (s_it = targets.begin(); s_it != targets.end(); ++s_it) {
- path.clear();
- get_path(graph, source, *s_it, path);
- paths.push_back(path);
- }
-}
+ std::deque<Path> get_paths(
+ const G &graph,
+ V source,
+ const std::vector<V> &targets,
+ bool only_cost) const {
+ std::deque<Path> paths;
+ for (const auto &target : targets) {
+ paths.push_back(
+ Path(graph,
+ source, target,
+ predecessors, distances,
+ only_cost));
+ }
+ return paths;
+ }
+};
-template < class G >
-void
-Pgr_astar< G >::get_path(
- const G &graph,
- V source,
- V target,
- Path &r_path) const {
- // backup of the target
- V target_back = target;
- uint64_t from(graph.graph[source].id);
- uint64_t to(graph.graph[target].id);
-
- // no path was found
- if (target == predecessors[target]) {
- r_path.clear();
- return;
- }
-
- // find out how large is the path
- int64_t result_size = 1;
- while (target != source) {
- if (target == predecessors[target]) break;
- result_size++;
- target = predecessors[target];
- }
-
- // recover the target
- target = target_back;
-
- // variables that are going to be stored
- int64_t vertex_id;
- int64_t edge_id;
- double cost;
-
- // working from the last to the beginning
-
- // initialize the sequence
- auto seq = result_size;
- // the last stop is the target
- Path path(from, to);
- path.push_front(
- {graph.graph[target].id, -1,
- 0, distances[target]});
-
- while (target != source) {
- // we are done when the predecesor of the target is the target
- if (target == predecessors[target]) break;
- // values to be inserted in the path
- --seq;
- cost = distances[target] - distances[predecessors[target]];
- vertex_id = graph.graph[predecessors[target]].id;
- edge_id = graph.get_edge_id(predecessors[target], target, cost);
-
- path.push_front({vertex_id, edge_id,
- cost, (distances[target] - cost)});
- target = predecessors[target];
- }
- r_path = path;
- return;
-}
+} // namespace algorithms
+} // namespace pgrouting
+
+#endif // SRC_ASTAR_SRC_PGR_ASTAR_HPP_
diff --git a/src/astar/test/doc-aStarCost.result b/src/astar/test/doc-aStarCost.result
new file mode 100644
index 0000000..5010704
--- /dev/null
+++ b/src/astar/test/doc-aStarCost.result
@@ -0,0 +1,16 @@
+--q1
+2|12|4
+--q2
+2|12|4
+--q3
+2|3|5
+2|12|4
+--q4
+2|12|4
+7|12|5
+--q5
+2|3|5
+2|12|4
+7|3|6
+7|12|5
+--q6
diff --git a/src/astar/test/doc-aStarCost.test.sql b/src/astar/test/doc-aStarCost.test.sql
new file mode 100644
index 0000000..8837a17
--- /dev/null
+++ b/src/astar/test/doc-aStarCost.test.sql
@@ -0,0 +1,22 @@
+\echo --q1
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, 12);
+\echo --q2
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, 12,
+ directed := false, heuristic := 2);
+\echo --q3
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ 2, ARRAY[3, 12], heuristic := 2);
+\echo --q4
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], 12, heuristic := 0);
+\echo --q5
+SELECT * FROM pgr_aStarCost(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], ARRAY[3, 12], heuristic := 2);
+\echo --q6
diff --git a/src/astar/test/doc-astar-v2.result b/src/astar/test/doc-astar-v2.result
index e996171..62ec16c 100644
--- a/src/astar/test/doc-astar-v2.result
+++ b/src/astar/test/doc-astar-v2.result
@@ -1,5 +1,5 @@
-- q1
-NOTICE: Deprecated signature of function pgr_astar
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
0|4|16|1
1|9|9|1
2|6|8|1
@@ -7,7 +7,7 @@ NOTICE: Deprecated signature of function pgr_astar
4|2|1|1
5|1|-1|0
-- q2
-NOTICE: Deprecated signature of function pgr_astar
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
0|4|3|1
1|3|2|1
2|2|1|1
diff --git a/src/astar/test/doc-astar-v2.test.sql b/src/astar/test/doc-astar-v2.test.sql
index 6cf0060..ad44338 100644
--- a/src/astar/test/doc-astar-v2.test.sql
+++ b/src/astar/test/doc-astar-v2.test.sql
@@ -1,12 +1,10 @@
-SET client_min_messages TO NOTICE;
-
\echo -- q1
-SELECT * FROM pgr_AStar(
+SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2
FROM edge_table',
4, 1, false, false);
\echo -- q2
-SELECT * FROM pgr_AStar(
+SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2, reverse_cost
FROM edge_table ',
4, 1, true, true);
diff --git a/src/astar/test/doc-astar.result b/src/astar/test/doc-astar.result
index 50be369..bdc2c79 100644
--- a/src/astar/test/doc-astar.result
+++ b/src/astar/test/doc-astar.result
@@ -6,20 +6,64 @@
5|5|12|-1|0|4
--q2
1|1|2|4|1|0
-2|2|5|8|1|1
-3|3|6|9|1|2
-4|4|9|15|1|3
-5|5|12|-1|0|4
-1|1|2|4|1|0
-2|2|5|8|1|1
-3|3|6|9|1|2
-4|4|9|15|1|3
+2|2|5|10|1|1
+3|3|10|12|1|2
+4|4|11|13|1|3
5|5|12|-1|0|4
--q3
-NOTICE: Deprecated signature of function pgr_astar
+1|1|3|2|4|1|0
+2|2|3|5|8|1|1
+3|3|3|6|9|1|2
+4|4|3|9|16|1|3
+5|5|3|4|3|1|4
+6|6|3|3|-1|0|5
+7|1|12|2|4|1|0
+8|2|12|5|8|1|1
+9|3|12|6|9|1|2
+10|4|12|9|15|1|3
+11|5|12|12|-1|0|4
+--q4
+1|1|2|2|4|1|0
+2|2|2|5|10|1|1
+3|3|2|10|12|1|2
+4|4|2|11|13|1|3
+5|5|2|12|-1|0|4
+6|1|7|7|6|1|0
+7|2|7|8|7|1|1
+8|3|7|5|10|1|2
+9|4|7|10|12|1|3
+10|5|7|11|13|1|4
+11|6|7|12|-1|0|5
+--q5
+1|1|2|3|2|4|1|0
+2|2|2|3|5|8|1|1
+3|3|2|3|6|9|1|2
+4|4|2|3|9|16|1|3
+5|5|2|3|4|3|1|4
+6|6|2|3|3|-1|0|5
+7|1|2|12|2|4|1|0
+8|2|2|12|5|8|1|1
+9|3|2|12|6|9|1|2
+10|4|2|12|9|15|1|3
+11|5|2|12|12|-1|0|4
+12|1|7|3|7|6|1|0
+13|2|7|3|8|7|1|1
+14|3|7|3|5|8|1|2
+15|4|7|3|6|9|1|3
+16|5|7|3|9|16|1|4
+17|6|7|3|4|3|1|5
+18|7|7|3|3|-1|0|6
+19|1|7|12|7|6|1|0
+20|2|7|12|8|7|1|1
+21|3|7|12|5|8|1|2
+22|4|7|12|6|9|1|3
+23|5|7|12|9|15|1|4
+24|6|7|12|12|-1|0|5
+--q6
+NOTICE: Deprecated signature pgr_astar(text, integer, integer, boolean, boolean)
0|2|4|1
1|5|8|1
2|6|9|1
3|9|15|1
4|12|-1|0
---q4
+--q7
diff --git a/src/astar/test/doc-astar.test.sql b/src/astar/test/doc-astar.test.sql
index b2cac85..464a6c5 100644
--- a/src/astar/test/doc-astar.test.sql
+++ b/src/astar/test/doc-astar.test.sql
@@ -1,5 +1,3 @@
-SET client_min_messages TO NOTICE;
-
\echo --q1
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
@@ -7,12 +5,22 @@ SELECT * FROM pgr_astar(
\echo --q2
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
- 2, 12, heuristic := 1);
+ 2, 12,
+ directed := false, heuristic := 2);
+\echo --q3
SELECT * FROM pgr_astar(
'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
- 2, 12, heuristic := 2);
-\echo --q3
+ 2, ARRAY[3, 12], heuristic := 2);
+\echo --q4
+SELECT * FROM pgr_astar(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], 12, heuristic := 0);
+\echo --q5
+SELECT * FROM pgr_astar(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ ARRAY[7, 2], ARRAY[3, 12], heuristic := 2);
+\echo --q6
SELECT * FROM pgr_astar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
2, 12, true, true);
-\echo --q4
+\echo --q7
diff --git a/src/astar/test/pgtap/astar_ManyToMany-compare-dijkstra.test.sql b/src/astar/test/pgtap/astar_ManyToMany-compare-dijkstra.test.sql
new file mode 100644
index 0000000..8b3e10c
--- /dev/null
+++ b/src/astar/test/pgtap/astar_ManyToMany-compare-dijkstra.test.sql
@@ -0,0 +1,97 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2015 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+\i setup.sql
+
+SELECT plan(4);
+
+SET client_min_messages TO ERROR;
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION astarCompareDijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+astar_sql TEXT;
+vids TEXT;
+data TEXT;
+BEGIN
+ data := ' seq, start_vid, cost::text, agg_cost::text ';
+ vids := ' ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] ';
+
+
+ -----------------------
+ -- with reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ', ' || vids || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -----------------------
+ -- NO reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || vids || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ', ' || vids || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+SELECT * from astarCompareDijkstra();
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/src/astar/test/pgtap/astar_ManyToOne-compare-dijkstra.test.sql b/src/astar/test/pgtap/astar_ManyToOne-compare-dijkstra.test.sql
new file mode 100644
index 0000000..94cb3b4
--- /dev/null
+++ b/src/astar/test/pgtap/astar_ManyToOne-compare-dijkstra.test.sql
@@ -0,0 +1,99 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2015 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+\i setup.sql
+
+SELECT plan(68);
+
+SET client_min_messages TO ERROR;
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION astarCompareDijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+astar_sql TEXT;
+vids TEXT;
+data TEXT;
+BEGIN
+ data := ' seq, start_vid, cost::text, agg_cost::text ';
+ vids := ' ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] ';
+
+ FOR i IN 1.. cant LOOP
+
+ -----------------------
+ -- with reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ', ' || i || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -----------------------
+ -- NO reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || vids
+ || ',' || i || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || vids
+ || ', ' || i || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ END LOOP;
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+SELECT * from astarCompareDijkstra();
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/src/astar/test/pgtap/astar_oneToMany-compare-dijkstra.test.sql b/src/astar/test/pgtap/astar_oneToMany-compare-dijkstra.test.sql
new file mode 100644
index 0000000..01b3473
--- /dev/null
+++ b/src/astar/test/pgtap/astar_oneToMany-compare-dijkstra.test.sql
@@ -0,0 +1,99 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2015 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+\i setup.sql
+
+SELECT plan(68);
+
+SET client_min_messages TO ERROR;
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION astarCompareDijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+astar_sql TEXT;
+vids TEXT;
+data TEXT;
+BEGIN
+ data = ' seq, end_vid, cost::text, agg_cost::text ';
+ vids = ' ARRAY[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18] ';
+
+ FOR i IN 1.. cant LOOP
+
+ -----------------------
+ -- with reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -----------------------
+ -- NO reverse cost
+ -----------------------
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, x1, y1, x2, y2 FROM edge_table';
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', true)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', true, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ -- UNDIRECTED
+ dijkstra_sql := 'SELECT ' || data || ' FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', false)';
+
+ astar_sql := 'SELECT ' || data || ' FROM pgr_astar($$' || inner_sql || '$$, ' || i || ', ' || vids
+ || ', false, heuristic := 0)';
+ RETURN query SELECT set_eq(astar_sql, dijkstra_sql, astar_sql);
+
+ END LOOP;
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+SELECT * from astarCompareDijkstra();
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/src/astar/test/pgtap/astar_oneToOne-types-check.sql b/src/astar/test/pgtap/astar_oneToOne-types-check.sql
index af2b0da..04329b5 100644
--- a/src/astar/test/pgtap/astar_oneToOne-types-check.sql
+++ b/src/astar/test/pgtap/astar_oneToOne-types-check.sql
@@ -23,11 +23,35 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
\i setup.sql
-SELECT plan(93);
+SELECT plan(99);
SET client_min_messages TO ERROR;
SELECT has_function('pgr_astar',
+ ARRAY['text', 'anyarray', 'bigint', 'boolean',
+ 'integer', 'double precision', 'double precision']);
+SELECT function_returns('pgr_astar',
+ ARRAY['text', 'anyarray', 'bigint', 'boolean',
+ 'integer', 'double precision', 'double precision'],
+ 'setof record');
+
+SELECT has_function('pgr_astar',
+ ARRAY['text', 'bigint', 'anyarray', 'boolean',
+ 'integer', 'double precision', 'double precision']);
+SELECT function_returns('pgr_astar',
+ ARRAY['text', 'bigint', 'anyarray', 'boolean',
+ 'integer', 'double precision', 'double precision'],
+ 'setof record');
+
+SELECT has_function('pgr_astar',
+ ARRAY['text', 'anyarray', 'anyarray', 'boolean',
+ 'integer', 'double precision', 'double precision']);
+SELECT function_returns('pgr_astar',
+ ARRAY['text', 'anyarray', 'anyarray', 'boolean',
+ 'integer', 'double precision', 'double precision'],
+ 'setof record');
+
+SELECT has_function('pgr_astar',
ARRAY['text', 'bigint', 'bigint', 'boolean',
'integer', 'double precision', 'double precision']);
SELECT function_returns('pgr_astar',
diff --git a/src/astar/test/test.conf b/src/astar/test/test.conf
index a4129d5..5756152 100644
--- a/src/astar/test/test.conf
+++ b/src/astar/test/test.conf
@@ -7,10 +7,12 @@
'tests' => [qw(
doc-astar-v2
doc-astar
+ doc-aStarCost
)],
'documentation' => [qw(
doc-astar-v2
doc-astar
+ doc-aStarCost
)]
},
# 'vpg-vpgis' => {}, # for version specific tests
diff --git a/src/bdDijkstra/doc/doc-pgr_bdDijkstra.queries b/src/bdDijkstra/doc/doc-pgr_bdDijkstra.queries
new file mode 100644
index 0000000..e25a292
--- /dev/null
+++ b/src/bdDijkstra/doc/doc-pgr_bdDijkstra.queries
@@ -0,0 +1,52 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
+-- q1
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3
+);
+ seq | path_seq | node | edge | cost | agg_cost
+-----+----------+------+------+------+----------
+ 1 | 1 | 2 | 4 | 1 | 0
+ 2 | 2 | 5 | 8 | 1 | 1
+ 3 | 3 | 6 | 9 | 1 | 2
+ 4 | 4 | 9 | 16 | 1 | 3
+ 5 | 5 | 4 | 3 | 1 | 4
+ 6 | 6 | 3 | -1 | 0 | 5
+(6 rows)
+
+-- q2
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3,
+ false
+);
+ seq | path_seq | node | edge | cost | agg_cost
+-----+----------+------+------+------+----------
+ 1 | 1 | 2 | 2 | 1 | 0
+ 2 | 2 | 3 | -1 | 0 | 1
+(2 rows)
+
+-- q3
+SET client_min_messages TO notice;
+SET
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT FROM edge_table',
+ 2, 3,
+ false,
+ false
+);
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+ seq | id1 | id2 | cost
+-----+-----+-----+------
+ 0 | 2 | 4 | 1
+ 1 | 5 | 8 | 1
+ 2 | 6 | 5 | 1
+ 3 | 3 | -1 | 0
+(4 rows)
+
+-- q4
+ROLLBACK;
+ROLLBACK
diff --git a/src/bdDijkstra/doc/pgr_bdDijkstra.rst b/src/bdDijkstra/doc/pgr_bdDijkstra.rst
new file mode 100644
index 0000000..f924208
--- /dev/null
+++ b/src/bdDijkstra/doc/pgr_bdDijkstra.rst
@@ -0,0 +1,113 @@
+..
+ ****************************************************************************
+ pgRouting Manual
+ Copyright(c) pgRouting Contributors
+
+ This documentation is licensed under a Creative Commons Attribution-Share
+ Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
+ ****************************************************************************
+
+.. _pgr_bdDijkstra:
+
+pgr_bdDijkstra
+===============================================================================
+
+``pgr_bdDijkstra`` — Returns the shortest path(s) using Bidirectional Dijkstra algorithm.
+
+.. figure:: images/boost-inside.jpeg
+ :target: http://www.boost.org/libs/graph/doc
+
+ Boost Graph Inside
+
+.. rubric:: Availability:
+
+* pgr_bdDijkstra(one to one) 2.0.0, Signature changed 2.4.0
+
+Signature Summary
+-----------------
+
+.. code-block:: none
+
+ pgr_dijkstra(edges_sql, start_vid, end_vid)
+ pgr_bdDijkstra(edges_sql, start_vid, end_vid, directed)
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
+ OR EMPTY SET
+
+
+
+Signatures
+-------------------------------------------------------------------------------
+
+.. index::
+ single: bdDijkstra(Minimal Use)
+
+Minimal signature
+.......................................
+
+.. code-block:: none
+
+ pgr_bdDijkstra(edges_sql, start_vid, end_vid)
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost) or EMPTY SET
+
+The minimal signature is for a **directed** graph from one ``start_vid`` to one ``end_vid``:
+
+:Example:
+
+.. literalinclude:: doc-pgr_bdDijkstra.queries
+ :start-after: -- q1
+ :end-before: -- q2
+
+
+.. index::
+ single: bdDijkstra(One to One)
+
+pgr_bdDijkstra One to One
+.......................................
+
+.. code-block:: none
+
+ pgr_bdDijkstra(edges_sql, start_vid, end_vid, directed)
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost) or EMPTY SET
+
+This signature finds the shortest path from one ``start_vid`` to one ``end_vid``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
+
+:Example:
+
+.. literalinclude:: doc-pgr_bdDijkstra.queries
+ :start-after: -- q2
+ :end-before: -- q3
+
+
+
+Description of the Signatures
+-------------------------------------------------------------------------------
+
+.. include:: pgRouting-concepts.rst
+ :start-after: basic_edges_sql_start
+ :end-before: basic_edges_sql_end
+
+.. include:: pgr_dijkstra.rst
+ :start-after: pgr_dijkstra_parameters_start
+ :end-before: pgr_dijkstra_parameters_end
+
+.. include:: pgRouting-concepts.rst
+ :start-after: return_path_start
+ :end-before: return_path_end
+
+
+
+
+See Also
+-------------------------------------------------------------------------------
+
+* The queries use the :ref:`sampledata` network.
+* http://www.cs.princeton.edu/courses/archive/spr06/cos423/Handouts/EPP%20shortest%20path%20algorithms.pdf
+* https://en.wikipedia.org/wiki/Bidirectional_search
+
+.. rubric:: Indices and tables
+
+* :ref:`genindex`
+* :ref:`search`
+
diff --git a/src/bdDijkstra/sql/CMakeLists.txt b/src/bdDijkstra/sql/CMakeLists.txt
new file mode 100644
index 0000000..45b9942
--- /dev/null
+++ b/src/bdDijkstra/sql/CMakeLists.txt
@@ -0,0 +1,7 @@
+# Append in local scope
+LIST(APPEND PACKAGE_SQL_FILES
+ ${CMAKE_CURRENT_SOURCE_DIR}/bdDijkstra.sql
+)
+
+# set in parent scope
+SET(PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}" PARENT_SCOPE)
diff --git a/src/bdDijkstra/sql/bdDijkstra.sql b/src/bdDijkstra/sql/bdDijkstra.sql
new file mode 100644
index 0000000..55d666c
--- /dev/null
+++ b/src/bdDijkstra/sql/bdDijkstra.sql
@@ -0,0 +1,93 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+
+CREATE OR REPLACE FUNCTION _pgr_bdDijkstra(
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN,
+ only_cost BOOLEAN DEFAULT false,
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT)
+RETURNS SETOF RECORD AS
+'$libdir/${PGROUTING_LIBRARY_NAME}', 'bdDijkstra'
+LANGUAGE c IMMUTABLE STRICT;
+
+
+-- V3 signature
+CREATE OR REPLACE FUNCTION pgr_bdDijkstra(
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT)
+RETURNS SETOF RECORD AS
+$BODY$
+DECLARE
+statement_txt record;
+sql TEXT;
+BEGIN
+ RETURN query
+ SELECT * FROM _pgr_bdDijkstra(_pgr_get_statement($1), start_vid, end_vid, true, false);
+ END
+$BODY$
+LANGUAGE plpgsql VOLATILE
+COST 100
+ROWS 1000;
+
+
+-- V3
+CREATE OR REPLACE FUNCTION pgr_bdDijkstra(
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN,
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT)
+RETURNS SETOF RECORD AS
+$BODY$
+DECLARE
+BEGIN
+ RETURN query SELECT *
+ FROM _pgr_bdDijkstra(_pgr_get_statement($1), start_vid, end_vid, directed, false);
+ END
+$BODY$
+LANGUAGE plpgsql VOLATILE
+COST 100
+ROWS 1000;
diff --git a/src/bdDijkstra/src/CMakeLists.txt b/src/bdDijkstra/src/CMakeLists.txt
new file mode 100644
index 0000000..134546b
--- /dev/null
+++ b/src/bdDijkstra/src/CMakeLists.txt
@@ -0,0 +1,4 @@
+ADD_LIBRARY(bdDijkstra OBJECT
+ bdDijkstra.c
+ bdDijkstra_driver.cpp
+ )
diff --git a/src/dijkstra/src/one_to_one_dijkstra.c b/src/bdDijkstra/src/bdDijkstra.c
similarity index 69%
copy from src/dijkstra/src/one_to_one_dijkstra.c
copy to src/bdDijkstra/src/bdDijkstra.c
index da20582..d0f1234 100644
--- a/src/dijkstra/src/one_to_one_dijkstra.c
+++ b/src/bdDijkstra/src/bdDijkstra.c
@@ -1,14 +1,15 @@
/*PGR-GNU*****************************************************************
-File: one_to_one_dijkstra.c
+File: bdDijkstra.c
Generated with Template by:
-Copyright (c) 2015 pgRouting developers
+Copyright (c) 2016 pgRouting developers
Mail: project at pgrouting.org
Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
+Copyright (c) 2016 Celia Virginia Vergara Castillo
Mail: vicky_vergara at hotmail.com
+
------
This program is free software; you can redistribute it and/or modify
@@ -27,27 +28,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
+#include "./../../common/src/postgres_connection.h"
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
-#include "./one_to_one_dijkstra_driver.h"
-PG_MODULE_MAGIC;
+#include "./bdDijkstra_driver.h"
+
+PGDLLEXPORT Datum bdDijkstra(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(bdDijkstra);
-PGDLLEXPORT Datum one_to_one_dijkstra(PG_FUNCTION_ARGS);
/******************************************************************************/
/* MODIFY AS NEEDED */
@@ -65,63 +58,62 @@ process(
PGR_DBG("Load data");
pgr_edge_t *edges = NULL;
+ size_t total_edges = 0;
if (start_vid == end_vid) {
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- size_t total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ pgr_get_edges(edges_sql, &edges, &total_edges);
+ PGR_DBG("Total %ld edges in query:", total_edges);
- if (total_tuples == 0) {
+ if (total_edges == 0) {
PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
PGR_DBG("Starting processing");
clock_t start_t = clock();
+ char *log_msg = NULL;
+ char *notice_msg = NULL;
char *err_msg = NULL;
- do_pgr_one_to_one_dijkstra(
+ do_pgr_bdDijkstra(
edges,
- total_tuples,
+ total_edges,
start_vid,
end_vid,
directed,
only_cost,
result_tuples,
result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra one to one", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ time_msg(" processing pgr_bdDijkstra", start_t, clock());
+ PGR_DBG("Returning %ld tuples", *result_count);
+
+ if (err_msg) {
+ if (*result_tuples) free(*result_tuples);
+ }
+ pgr_global_report(log_msg, notice_msg, err_msg);
- free(err_msg);
pfree(edges);
pgr_SPI_finish();
}
/* */
/******************************************************************************/
-PG_FUNCTION_INFO_V1(one_to_one_dijkstra);
-PGDLLEXPORT Datum
-one_to_one_dijkstra(PG_FUNCTION_ARGS) {
+PGDLLEXPORT Datum bdDijkstra(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
- TupleDesc tuple_desc;
+ TupleDesc tuple_desc;
/**************************************************************************/
/* MODIFY AS NEEDED */
/* */
- General_path_element_t *result_tuples = 0;
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -134,14 +126,17 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
/**********************************************************************/
/* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text, start_vids BIGINT,
- // end_vid BIGINT,
- // directed BOOLEAN default true,
+ /*
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN DEFAULT true,
+ only_cost BOOLEAN DEFAULT false,
+ **********************************************************************/
+
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
PG_GETARG_INT64(2),
PG_GETARG_BOOL(3),
@@ -152,7 +147,11 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
/* */
/**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -167,12 +166,11 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
+
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -180,12 +178,14 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
/**********************************************************************/
/* MODIFY AS NEEDED */
- // OUT seq INTEGER,
- // OUT path_seq INTEGER,
- // OUT node BIGINT,
- // OUT edge BIGINT,
- // OUT cost FLOAT,
- // OUT agg_cost FLOAT
+ /*
+ OUT seq INTEGER,
+ OUT path_seq INTEGER,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT
+ ***********************************************************************/
values = palloc(6 * sizeof(Datum));
nulls = palloc(6 * sizeof(bool));
@@ -197,22 +197,18 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
}
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].node);
- values[3] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[4] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[5] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/astar/src/astarOneToOne_driver.cpp b/src/bdDijkstra/src/bdDijkstra_driver.cpp
similarity index 57%
rename from src/astar/src/astarOneToOne_driver.cpp
rename to src/bdDijkstra/src/bdDijkstra_driver.cpp
index 3bed03f..4e263b7 100644
--- a/src/astar/src/astarOneToOne_driver.cpp
+++ b/src/bdDijkstra/src/bdDijkstra_driver.cpp
@@ -1,13 +1,13 @@
/*PGR-GNU*****************************************************************
-File: astarOneToOne_driver.cpp
+File: bdDijkstra_driver.cpp
Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+Mail: vicky_vergara at hotmail.com
------
@@ -28,103 +28,99 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
#include <sstream>
#include <deque>
-#include <algorithm>
#include <vector>
-#include "./astarOneToOne_driver.h"
-#include "./../../common/src/pgr_types.h"
+#include "./pgr_bdDijkstra.hpp"
+#include "./bdDijkstra_driver.h"
+
-#include "./pgr_astar.hpp"
-#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
+
+#include "./../../common/src/pgr_base_graph.hpp"
+
+
+
+
+/************************************************************
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN DEFAULT true,
+ only_cost BOOLEAN DEFAULT false,
+ ***********************************************************/
template < class G >
-void
-pgr_astar(
+static
+Path
+pgr_bdDijkstra(
G &graph,
- Path &path,
int64_t source,
int64_t target,
- int heuristic,
- double factor,
- double epsilon,
+ std::ostream &log,
bool only_cost = false) {
- Pgr_astar< G > fn_astar;
- fn_astar.astar(graph, path, source, target,
- heuristic, factor, epsilon, only_cost);
+ log << "entering static function\n";
+ Pgr_bdDijkstra<G> fn_bdDijkstra(graph);
+
+ auto path = fn_bdDijkstra.pgr_bdDijkstra(
+ graph.get_V(source), graph.get_V(target), only_cost);
+ log << fn_bdDijkstra.log();
+
+ return path;
}
-/************************************************************
- edges_sql TEXT,
- vertex_table TEXT,
- start_vid BIGINT,
- end_vid BIGINT directed BOOLEAN DEFAULT true,
- ***********************************************************/
-void do_pgr_astarOneToOne(
- Pgr_edge_xy_t *data_edges,
+void
+do_pgr_bdDijkstra(
+ pgr_edge_t *data_edges,
size_t total_edges,
int64_t start_vid,
int64_t end_vid,
bool directed,
- int heuristic,
- double factor,
- double epsilon,
bool only_cost,
General_path_element_t **return_tuples,
size_t *return_count,
char ** log_msg,
+ char ** notice_msg,
char ** err_msg) {
- std::ostringstream err;
std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
try {
pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
pgassert(!(*err_msg));
pgassert(!(*return_tuples));
pgassert(*return_count == 0);
pgassert(total_edges != 0);
- if (total_edges <= 1) {
- log << "Required: more than one edge\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
-
graphType gType = directed? DIRECTED: UNDIRECTED;
Path path;
+ log << "starting process\n";
if (directed) {
log << "Working with directed Graph\n";
- pgrouting::xyDirectedGraph digraph(gType);
- log << "Working with directed Graph 1 \n";
- digraph.graph_insert_data(data_edges, total_edges);
-#ifdef DEBUG
- log << digraph;
-#endif
- log << "Working with directed Graph 2\n";
- pgr_astar(digraph, path, start_vid, end_vid,
- heuristic, factor, epsilon, only_cost);
- log << "Working with directed Graph 3\n";
+ pgrouting::DirectedGraph digraph(gType);
+ digraph.insert_edges(data_edges, total_edges);
+ path = pgr_bdDijkstra(digraph,
+ start_vid,
+ end_vid,
+ log,
+ only_cost);
} else {
log << "Working with Undirected Graph\n";
- pgrouting::xyUndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_edges);
-#ifdef DEBUG
- log << undigraph;
-#endif
- pgr_astar(undigraph, path, start_vid, end_vid,
- heuristic, factor, epsilon, only_cost);
+ pgrouting::UndirectedGraph undigraph(gType);
+ undigraph.insert_edges(data_edges, total_edges);
+ path = pgr_bdDijkstra(
+ undigraph,
+ start_vid,
+ end_vid,
+ log,
+ only_cost);
}
auto count = path.size();
@@ -132,35 +128,38 @@ void do_pgr_astarOneToOne(
if (count == 0) {
(*return_tuples) = NULL;
(*return_count) = 0;
- log <<
- "No paths found\n";
- *log_msg = strdup(log.str().c_str());
- return;
+ notice <<
+ "No paths found between start_vid and end_vid vertices";
+ } else {
+ (*return_tuples) = pgr_alloc(count, (*return_tuples));
+ size_t sequence = 0;
+ path.generate_postgres_data(return_tuples, sequence);
+ (*return_count) = sequence;
}
- size_t sequence = 0;
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- path.generate_postgres_data(return_tuples, sequence);
- (*return_count) = sequence;
-
- *err_msg = NULL;
- *log_msg = strdup(log.str().c_str());
+ pgassert(*err_msg == NULL);
+ *log_msg = log.str().empty()?
+ nullptr :
+ strdup(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ nullptr :
+ strdup(notice.str().c_str());
} catch (AssertFailedException &except) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
+ err << except.what();
*err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
} catch (std::exception& except) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
+ err << except.what();
*err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
} catch(...) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << "Caught unknown exception!\n";
+ err << "Caught unknown exception!";
*err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
}
diff --git a/src/dijkstra/src/one_to_one_dijkstra_driver.h b/src/bdDijkstra/src/bdDijkstra_driver.h
similarity index 71%
rename from src/dijkstra/src/one_to_one_dijkstra_driver.h
rename to src/bdDijkstra/src/bdDijkstra_driver.h
index a5c052c..adca119 100644
--- a/src/dijkstra/src/one_to_one_dijkstra_driver.h
+++ b/src/bdDijkstra/src/bdDijkstra_driver.h
@@ -1,5 +1,5 @@
/*PGR-GNU*****************************************************************
-File: one_to_one_dijkstra_driver.h
+File: bdDijkstra_driver.h
Generated with Template by:
Copyright (c) 2015 pgRouting developers
@@ -27,8 +27,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_DIJKSTRA_SRC_ONE_TO_ONE_DIJKSTRA_DRIVER_H_
-#define SRC_DIJKSTRA_SRC_ONE_TO_ONE_DIJKSTRA_DRIVER_H_
+#ifndef SRC_BDDIJKSTRA_SRC_BDDIJKSTRA_DRIVER_H_
+#define SRC_BDDIJKSTRA_SRC_BDDIJKSTRA_DRIVER_H_
+#pragma once
#include "./../../common/src/pgr_types.h"
@@ -36,22 +37,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
extern "C" {
#endif
-// CREATE OR REPLACE FUNCTION pgr_dijkstra(
-// sql text,
-// start_vid BIGINT,
-// end_vid BIGINT,
-// directed BOOLEAN default true,
+ /*********************************************************
+ edges_sql TEXT,
+ start_vid BIGINT,
+ end_vid BIGINT,
+ directed BOOLEAN DEFAULT true,
+ only_cost BOOLEAN DEFAULT false,
+ ********************************************************/
+
void
- do_pgr_one_to_one_dijkstra(
+ do_pgr_bdDijkstra(
pgr_edge_t *data_edges,
- size_t total_tuples,
+ size_t total_edges,
int64_t start_vid,
int64_t end_vid,
bool directed,
bool only_cost,
General_path_element_t **return_tuples,
size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg);
@@ -59,4 +65,4 @@ extern "C" {
}
#endif
-#endif // SRC_DIJKSTRA_SRC_ONE_TO_ONE_DIJKSTRA_DRIVER_H_
+#endif // SRC_BDDIJKSTRA_SRC_BDDIJKSTRA_DRIVER_H_
diff --git a/src/bdDijkstra/src/pgr_bdDijkstra.hpp b/src/bdDijkstra/src/pgr_bdDijkstra.hpp
new file mode 100644
index 0000000..56bd888
--- /dev/null
+++ b/src/bdDijkstra/src/pgr_bdDijkstra.hpp
@@ -0,0 +1,281 @@
+/*PGR-GNU*****************************************************************
+
+File: pgr_bdDijkstra.hpp
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ ********************************************************************PGR-GNU*/
+
+#ifndef SRC_BDDIJKSTRA_SRC_PGR_BDDIJKSTRA_HPP_
+#define SRC_BDDIJKSTRA_SRC_PGR_BDDIJKSTRA_HPP_
+#pragma once
+
+
+#include <boost/config.hpp>
+#include <boost/graph/adjacency_list.hpp>
+#include <boost/graph/dijkstra_shortest_paths.hpp>
+
+#include <string>
+#include <queue>
+#include <utility>
+#include <vector>
+#include <limits>
+#include <functional>
+
+
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/basePath_SSEC.hpp"
+#include "./../../common/src/pgr_base_graph.hpp"
+
+
+
+
+template < typename G >
+class Pgr_bdDijkstra {
+ typedef typename G::V V;
+ typedef typename G::E E;
+
+ typedef std::pair<double, V> Cost_Vertex_pair;
+ typedef typename std::priority_queue<
+ Cost_Vertex_pair,
+ std::vector<Cost_Vertex_pair>,
+ std::greater<Cost_Vertex_pair> > Priority_queue;
+
+
+ public:
+ explicit Pgr_bdDijkstra(G &pgraph):
+ graph(pgraph),
+ INF((std::numeric_limits<double>::max)()) {
+ m_log << "constructor\n";
+ };
+
+ ~Pgr_bdDijkstra() = default;
+
+
+ Path pgr_bdDijkstra(V start_vertex, V end_vertex, bool only_cost) {
+ m_log << "pgr_bdDijkstra\n";
+ v_source = start_vertex;
+ v_target = end_vertex;
+
+ if (v_source == v_target) {
+ return Path(v_source, v_target);
+ }
+ return bidir_dijkstra(only_cost);
+ }
+
+ std::string log() const {return m_log.str();}
+ void clean_log() {log.clear();}
+ void clear() {
+ while (!forward_queue.empty()) forward_queue.pop();
+ while (!backward_queue.empty()) backward_queue.pop();
+
+ backward_finished.clear();
+ backward_edge.clear();
+ backward_predecessor.clear();
+ backward_cost.clear();
+
+ forward_finished.clear();
+ forward_edge.clear();
+ forward_predecessor.clear();
+ forward_cost.clear();
+ }
+
+
+ private:
+ void initialize() {
+ m_log << "initializing\n";
+ clear();
+ forward_predecessor.resize(graph.num_vertices());
+ forward_finished.resize(graph.num_vertices(), false);
+ forward_edge.resize(graph.num_vertices(), -1);
+ forward_cost.resize(graph.num_vertices(), INF);
+ std::iota(forward_predecessor.begin(), forward_predecessor.end(), 0);
+
+ backward_predecessor.resize(graph.num_vertices());
+ backward_finished.resize(graph.num_vertices(), false);
+ backward_edge.resize(graph.num_vertices(), -1);
+ backward_cost.resize(graph.num_vertices(), INF);
+ std::iota(backward_predecessor.begin(), backward_predecessor.end(), 0);
+
+ v_min_node = -1;
+ best_cost = INF;
+ }
+
+ Path bidir_dijkstra(bool only_cost) {
+ m_log << "bidir_dijkstra\n";
+
+ Pgr_bdDijkstra< G >::initialize();
+
+ forward_cost[v_source] = 0;
+ forward_queue.push(std::make_pair(0.0, v_source));
+
+ backward_cost[v_target] = 0;
+ backward_queue.push(std::make_pair(0.0, v_target));
+
+ while (!forward_queue.empty() && !backward_queue.empty()) {
+ auto forward_node = forward_queue.top();
+ auto backward_node = backward_queue.top();
+ /*
+ * done: there is no path with lower cost
+ */
+ if (forward_node.first == INF || backward_node.first == INF) {
+ break;
+ }
+
+ /*
+ * Explore from the cheapest side
+ */
+ if (backward_node.first < forward_node.first) {
+ backward_queue.pop();
+ if (!backward_finished[backward_node.second]) {
+ explore_backward(backward_node);
+ }
+ if (found(backward_node.second)) {
+ break;
+ }
+ } else {
+ forward_queue.pop();
+ if (!forward_finished[forward_node.second]) {
+ explore_forward(forward_node);
+ }
+ if (found(forward_node.second)) {
+ break;
+ }
+ }
+ }
+
+ if (best_cost == INF) return Path();
+
+ Path forward_path(
+ graph,
+ v_source,
+ v_min_node,
+ forward_predecessor,
+ forward_cost,
+ only_cost,
+ true);
+ Path backward_path(
+ graph,
+ v_target,
+ v_min_node,
+ backward_predecessor,
+ backward_cost,
+ only_cost,
+ false);
+ m_log << forward_path;
+ backward_path.reverse();
+ m_log << backward_path;
+ forward_path.append(backward_path);
+ m_log << forward_path;
+ return forward_path;
+ }
+
+
+
+ bool found(const V &node) {
+ /*
+ * Update common node
+ */
+ if (forward_finished[node] && backward_finished[node]) {
+ if (best_cost >= forward_cost[node] + backward_cost[node]) {
+ v_min_node = node;
+ best_cost = forward_cost[node] + backward_cost[node];
+ return false;
+ } else {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ void explore_forward(const Cost_Vertex_pair &node) {
+ typename G::EO_i out, out_end;
+
+ auto current_cost = node.first;
+ auto current_node = node.second;
+
+ for (boost::tie(out, out_end) = out_edges(current_node, graph.graph);
+ out != out_end; ++out) {
+ auto edge_cost = graph[*out].cost;
+ auto next_node = graph.adjacent(current_node, *out);
+
+ if (forward_finished[next_node]) continue;
+
+ if (edge_cost + current_cost < forward_cost[next_node]) {
+ forward_cost[next_node] = edge_cost + current_cost;
+ forward_predecessor[next_node] = current_node;
+ forward_edge[next_node] = graph[*out].id;
+ forward_queue.push({forward_cost[next_node], next_node});
+ }
+ }
+ forward_finished[current_node] = true;
+ }
+
+ void explore_backward(const Cost_Vertex_pair &node) {
+ typename G::EI_i in, in_end;
+
+ auto current_cost = node.first;
+ auto current_node = node.second;
+
+ for (boost::tie(in, in_end) = in_edges(current_node, graph.graph);
+ in != in_end; ++in) {
+ auto edge_cost = graph[*in].cost;
+ auto next_node = graph.adjacent(current_node, *in);
+
+ if (backward_finished[next_node]) continue;
+
+ if (edge_cost + current_cost < backward_cost[next_node]) {
+ backward_cost[next_node] = edge_cost + current_cost;
+ backward_predecessor[next_node] = current_node;
+ backward_edge[next_node] = graph[*in].id;
+ backward_queue.push({backward_cost[next_node], next_node});
+ }
+ }
+ backward_finished[current_node] = true;
+ }
+
+
+ private:
+ G &graph;
+ V v_source; //!< source descriptor
+ V v_target; //!< target descriptor
+ V v_min_node; //!< target descriptor
+
+ double INF; //!< infinity
+
+ mutable std::ostringstream m_log;
+ Priority_queue forward_queue;
+ Priority_queue backward_queue;
+
+ double best_cost;
+ bool cost_only;
+
+ std::vector<bool> backward_finished;
+ std::vector<int64_t> backward_edge;
+ std::vector<V> backward_predecessor;
+ std::vector<double> backward_cost;
+
+ std::vector<bool> forward_finished;
+ std::vector<int64_t> forward_edge;
+ std::vector<V> forward_predecessor;
+ std::vector<double> forward_cost;
+};
+
+#endif // SRC_BDDIJKSTRA_SRC_PGR_BDDIJKSTRA_HPP_
diff --git a/src/bdDijkstra/test/bdDijkstra-large.result b/src/bdDijkstra/test/bdDijkstra-large.result
new file mode 100644
index 0000000..73fd1f1
--- /dev/null
+++ b/src/bdDijkstra/test/bdDijkstra-large.result
@@ -0,0 +1,332 @@
+--q1
+1|5700|20787|0.006774
+2|10932|20756|0.040876
+3|10931|20797|0.002564
+4|7661|20796|0.002581
+5|10943|20776|0.040800
+6|10941|20772|0.005720
+7|3415|20771|0.007463
+8|10940|20841|0.187594
+9|10952|20812|0.005045
+10|7034|20811|0.004532
+11|10951|20833|0.177477
+12|10944|20779|0.008539
+13|8910|20778|0.006447
+14|10929|20835|0.071114
+15|10948|20794|0.013276
+16|8908|12990|0.013157
+17|8325|13831|0.009169
+18|3753|13830|0.196045
+19|6774|13829|0.032840
+20|8304|13828|0.117213
+21|9205|13827|0.010639
+22|8994|13165|0.012931
+23|8977|13164|0.008029
+24|8976|13163|0.069895
+25|8993|13162|0.009638
+26|8351|13161|0.099016
+27|8992|13160|0.187353
+28|8991|13159|0.018649
+29|2962|13158|0.071931
+30|1285|13157|0.118340
+31|8989|13156|0.006317
+32|8988|13155|0.079185
+33|21|13154|0.057101
+34|6436|13153|0.083288
+35|637|13152|0.099744
+36|8987|13151|0.057786
+37|398|13150|0.120005
+38|8496|13149|0.069498
+39|8986|13148|0.014323
+40|8985|13167|0.070884
+41|8451|11869|0.006925
+42|476|11868|0.196533
+43|529|11867|0.005677
+44|8450|11871|0.118857
+45|8452|11878|0.083250
+46|8455|11880|0.048821
+47|8456|11883|0.064572
+48|1807|11882|0.101185
+49|8457|11894|0.046805
+50|8465|15481|0.180992
+51|8522|15480|0.016198
+52|9621|15479|0.209882
+53|2808|15478|0.019312
+54|8311|15477|0.113487
+55|8583|16981|0.045667
+56|10046|16982|0.022635
+57|8467|16983|0.022924
+58|9624|15487|0.034042
+59|8468|11899|0.018103
+60|3170|19357|0.047698
+61|9949|19358|0.059093
+62|10479|19359|0.051651
+63|9948|19360|0.051709
+64|8509|19374|0.106794
+65|9595|19375|0.102428
+66|8634|19376|0.107643
+67|10174|19377|0.096140
+68|10482|19378|0.009782
+69|9194|19379|0.102702
+70|4397|19380|0.108243
+71|3002|19381|0.098919
+72|10484|19382|0.006171
+73|5962|19383|0.005429
+74|10485|19384|0.047276
+75|10459|19385|0.052864
+76|7579|19386|0.052378
+77|10455|19387|0.052414
+78|5805|19388|0.081956
+79|10462|19389|0.016974
+80|8768|12598|0.059630
+81|8767|19290|0.117748
+82|10470|19289|0.065769
+83|10469|19288|0.066230
+84|10468|19287|0.111281
+85|9967|16642|0.029056
+86|9956|16621|0.014614
+87|9938|16626|0.007036
+88|9960|16649|0.081206
+89|9968|16650|0.012230
+90|9969|16647|0.012368
+91|5457|6266|0.055134
+92|5458|6267|0.053860
+93|5459|6268|0.109859
+94|5460|6269|0.104952
+95|5461|6270|0.053766
+96|5462|6271|0.046800
+97|5463|12897|0.170300
+98|8880|15060|0.049014
+99|7101|15059|0.047811
+100|9313|15058|0.044674
+101|6733|-1|0.000000
+--q2
+1|6585|17975|0.200230
+2|5367|17976|0.155428
+3|7125|17977|0.178581
+4|613|17978|0.175712
+5|10025|17979|0.173776
+6|5802|6758|0.013489
+7|5803|6759|0.065176
+8|5804|6760|0.008679
+9|5805|6761|0.145097
+10|5806|6762|0.146807
+11|5807|6763|0.097186
+12|5808|6764|0.050569
+13|5809|20663|0.169650
+14|4620|20662|0.023243
+15|5774|20661|0.120390
+16|6482|20660|0.002769
+17|5957|20659|0.087952
+18|8289|20658|0.048701
+19|10884|20657|0.009212
+20|10883|20656|0.080500
+21|9954|20655|0.075280
+22|4390|16876|0.147691
+23|9203|17805|0.063931
+24|7892|17804|0.015429
+25|8417|17803|0.069119
+26|10171|17802|0.075825
+27|9953|17801|0.045079
+28|8859|17800|0.029389
+29|8536|17799|0.072658
+30|10180|17798|0.076558
+31|9592|17797|0.027637
+32|9318|17796|0.114755
+33|10179|17795|0.007150
+34|10178|17794|0.087467
+35|8402|17793|0.062258
+36|6179|17792|0.109483
+37|8508|17791|0.036248
+38|3305|17790|0.069816
+39|8512|17789|0.064158
+40|998|17807|0.471312
+41|2698|2743|0.102019
+42|2563|9039|0.341756
+43|2043|9040|0.587619
+44|4280|9041|0.145996
+45|2317|9042|0.268754
+46|7135|9043|0.121251
+47|4276|9044|0.145396
+48|6167|9045|0.583394
+49|7136|9046|0.043099
+50|7137|19345|0.053510
+51|10475|19344|0.015153
+52|10142|19343|0.064475
+53|10140|17566|0.135370
+54|8539|17565|0.057338
+55|10138|17558|0.064893
+56|6943|17559|0.201703
+57|8140|17560|0.469613
+58|10139|20189|0.060217
+59|10705|20185|0.055053
+60|8247|-1|0.000000
+--q3
+1|9426|14822|0.060319
+2|3606|-1|0.000000
+--q4
+1|3606|14822|0.060319
+2|9426|-1|0.000000
+--q5
+1|6733|15058|0.044674
+2|9313|15059|0.047811
+3|7101|15060|0.049014
+4|8880|12897|0.170300
+5|5463|6271|0.046800
+6|5462|6270|0.053766
+7|5461|6269|0.104952
+8|5460|6268|0.109859
+9|5459|6267|0.053860
+10|5458|6266|0.055134
+11|5457|16647|0.012368
+12|9969|16650|0.012230
+13|9968|16649|0.081206
+14|9960|16626|0.007036
+15|9938|16621|0.014614
+16|9956|16642|0.029056
+17|9967|19287|0.111281
+18|10468|19288|0.066230
+19|10469|19289|0.065769
+20|10470|19290|0.117748
+21|8767|12598|0.059630
+22|8768|19389|0.016974
+23|10462|19388|0.081956
+24|5805|19387|0.052414
+25|10455|19386|0.052378
+26|7579|19385|0.052864
+27|10459|19384|0.047276
+28|10485|19383|0.005429
+29|5962|19382|0.006171
+30|10484|19381|0.098919
+31|3002|19380|0.108243
+32|4397|19379|0.102702
+33|9194|19378|0.009782
+34|10482|19377|0.096140
+35|10174|19376|0.107643
+36|8634|19375|0.102428
+37|9595|19374|0.106794
+38|8509|19360|0.051709
+39|9948|19359|0.051651
+40|10479|19358|0.059093
+41|9949|19357|0.047698
+42|3170|11899|0.018103
+43|8468|15487|0.034042
+44|9624|16983|0.022924
+45|8467|16982|0.022635
+46|10046|16981|0.045667
+47|8583|15477|0.113487
+48|8311|15478|0.019312
+49|2808|15479|0.209882
+50|9621|15480|0.016198
+51|8522|15481|0.180992
+52|8465|11894|0.046805
+53|8457|11882|0.101185
+54|1807|11883|0.064572
+55|8456|11880|0.048821
+56|8455|11878|0.083250
+57|8452|11871|0.118857
+58|8450|11867|0.005677
+59|529|11868|0.196533
+60|476|11869|0.006925
+61|8451|13167|0.070884
+62|8985|13148|0.014323
+63|8986|13149|0.069498
+64|8496|13150|0.120005
+65|398|13151|0.057786
+66|8987|13152|0.099744
+67|637|13153|0.083288
+68|6436|13154|0.057101
+69|21|13155|0.079185
+70|8988|13156|0.006317
+71|8989|13157|0.118340
+72|1285|13158|0.071931
+73|2962|13159|0.018649
+74|8991|13160|0.187353
+75|8992|13161|0.099016
+76|8351|13162|0.009638
+77|8993|13163|0.069895
+78|8976|13164|0.008029
+79|8977|13165|0.012931
+80|8994|13827|0.010639
+81|9205|13828|0.117213
+82|8304|13829|0.032840
+83|6774|13830|0.196045
+84|3753|13831|0.009169
+85|8325|12990|0.013157
+86|8908|20794|0.013276
+87|10948|20835|0.071114
+88|10929|20778|0.006447
+89|8910|20779|0.008539
+90|10944|20833|0.177477
+91|10951|20811|0.004532
+92|7034|20812|0.005045
+93|10952|20841|0.187594
+94|10940|20771|0.007463
+95|3415|20772|0.005720
+96|10941|20776|0.040800
+97|10943|20796|0.002581
+98|7661|20797|0.002564
+99|10931|20756|0.040876
+100|10932|20787|0.006774
+101|5700|-1|0.000000
+--q6
+1|8247|20185|0.055053
+2|10705|20189|0.060217
+3|10139|17560|0.469613
+4|8140|17559|0.201703
+5|6943|17558|0.064893
+6|10138|17565|0.057338
+7|8539|17566|0.135370
+8|10140|19343|0.064475
+9|10142|19344|0.015153
+10|10475|19345|0.053510
+11|7137|9046|0.043099
+12|7136|9045|0.583394
+13|6167|9044|0.145396
+14|4276|9043|0.121251
+15|7135|9042|0.268754
+16|2317|9041|0.145996
+17|4280|9040|0.587619
+18|2043|9039|0.341756
+19|2563|2743|0.102019
+20|2698|17807|0.471312
+21|998|17789|0.064158
+22|8512|17790|0.069816
+23|3305|17791|0.036248
+24|8508|17792|0.109483
+25|6179|17793|0.062258
+26|8402|17794|0.087467
+27|10178|17795|0.007150
+28|10179|17796|0.114755
+29|9318|17797|0.027637
+30|9592|17798|0.076558
+31|10180|17799|0.072658
+32|8536|17800|0.029389
+33|8859|17801|0.045079
+34|9953|17802|0.075825
+35|10171|17803|0.069119
+36|8417|17804|0.015429
+37|7892|17805|0.063931
+38|9203|16876|0.147691
+39|4390|20655|0.075280
+40|9954|20656|0.080500
+41|10883|20657|0.009212
+42|10884|20658|0.048701
+43|8289|20659|0.087952
+44|5957|20660|0.002769
+45|6482|20661|0.120390
+46|5774|20662|0.023243
+47|4620|20663|0.169650
+48|5809|6764|0.050569
+49|5808|6763|0.097186
+50|5807|6762|0.146807
+51|5806|6761|0.145097
+52|5805|6760|0.008679
+53|5804|6759|0.065176
+54|5803|6758|0.013489
+55|5802|17979|0.173776
+56|10025|17978|0.175712
+57|613|17977|0.178581
+58|7125|17976|0.155428
+59|5367|17975|0.200230
+60|6585|-1|0.000000
diff --git a/src/max_flow/src/max_flow_one_to_one_driver.h b/src/bdDijkstra/test/bdDijkstra-large.test.sql
similarity index 52%
rename from src/max_flow/src/max_flow_one_to_one_driver.h
rename to src/bdDijkstra/test/bdDijkstra-large.test.sql
index b19e023..7e6cc5f 100644
--- a/src/max_flow/src/max_flow_one_to_one_driver.h
+++ b/src/bdDijkstra/test/bdDijkstra-large.test.sql
@@ -1,14 +1,8 @@
/*PGR-GNU*****************************************************************
-File: max_flow_one_to_one_driver.h
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
+Copyright (c) 2016 pgRouting developers
Mail: project at pgrouting.org
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
------
This program is free software; you can redistribute it and/or modify
@@ -27,30 +21,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_ONE_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_ONE_DRIVER_H_
-
+\echo --q1
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 5700, 6733, true);
-#include "./../../common/src/pgr_types.h"
+\echo --q2
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 6585, 8247, true);
-#ifdef __cplusplus
-extern "C" {
-#endif
+\echo --q3
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 9426, 3606, true);
- void
- do_pgr_max_flow_one_to_one(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t sink_vertex,
- char* algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg);
+\echo --q4
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 3606, 9426, true);
+\echo --q5
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 6733, 5700, true);
-#ifdef __cplusplus
-}
-#endif
+\echo --q6
+SELECT seq, node, edge, round(cost::numeric, 6) FROM
+ pgr_bdDijkstra('SELECT * FROM bdd_ways', 8247, 6585, true);
-#endif // SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_ONE_DRIVER_H_
diff --git a/src/bdDijkstra/test/doc-pgr_bdDijkstra.result b/src/bdDijkstra/test/doc-pgr_bdDijkstra.result
new file mode 100644
index 0000000..cfe9136
--- /dev/null
+++ b/src/bdDijkstra/test/doc-pgr_bdDijkstra.result
@@ -0,0 +1,17 @@
+-- q1
+1|1|2|4|1|0
+2|2|5|8|1|1
+3|3|6|9|1|2
+4|4|9|16|1|3
+5|5|4|3|1|4
+6|6|3|-1|0|5
+-- q2
+1|1|2|2|1|0
+2|2|3|-1|0|1
+-- q3
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|2|4|1
+1|5|8|1
+2|6|5|1
+3|3|-1|0
+-- q4
diff --git a/src/bdDijkstra/test/doc-pgr_bdDijkstra.test.sql b/src/bdDijkstra/test/doc-pgr_bdDijkstra.test.sql
new file mode 100644
index 0000000..ef2e1af
--- /dev/null
+++ b/src/bdDijkstra/test/doc-pgr_bdDijkstra.test.sql
@@ -0,0 +1,23 @@
+
+\echo -- q1
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3
+);
+
+\echo -- q2
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3,
+ false
+);
+\echo -- q3
+SET client_min_messages TO notice;
+SELECT * FROM pgr_bdDijkstra(
+ 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT FROM edge_table',
+ 2, 3,
+ false, -- undirected
+ false -- no reverse_cost
+);
+\echo -- q4
+
diff --git a/src/bdDijkstra/test/large.data b/src/bdDijkstra/test/large.data
new file mode 100644
index 0000000..2f320cd
--- /dev/null
+++ b/src/bdDijkstra/test/large.data
@@ -0,0 +1,17280 @@
+
+drop table if exists bdd_ways cascade;
+create table bdd_ways (
+ id integer not null primary key,
+ source integer,
+ target integer,
+ cost float8,
+ reverse_cost float8
+);
+
+copy bdd_ways (id, source, target, cost, reverse_cost) from stdin;
+18129 10271 10265 0.407629542119694 0.407629542119694
+14822 9426 3606 0.0603186413824967 0.0603186413824967
+16176 5812 7719 0.198519002375015 0.198519002375015
+16177 7719 9841 1.21182332618964 1.21182332618964
+16178 137 1482 0.199034161669709 0.199034161669709
+16179 1482 3758 0.20606858724026 0.20606858724026
+16217 7903 7844 0.0651768093591436 0.0651768093591436
+16218 7844 6725 0.105799860394335 0.105799860394335
+15793 2298 2322 0.00529554982932783 0.00529554982932783
+14854 9432 9433 0.00987428384236239 0.00987428384236239
+19732 4490 10638 0.0159213769578026 0.0159213769578026
+19734 10639 10640 0.115517684408379 0.115517684408379
+19736 10643 5491 0.200611432022914 0.200611432022914
+19737 5491 9472 0.173586542348893 0.173586542348893
+16211 7730 9848 1.41098736584228 1.41098736584228
+19766 8868 3770 0.15451665559366 0.15451665559366
+19767 3770 10249 0.199225315153312 0.199225315153312
+19769 9471 4895 0.183643472400882 0.183643472400882
+19770 4895 9419 0.162738965694015 0.162738965694015
+16694 9991 9992 0.00824975577533471 0.00824975577533471
+16253 9862 7741 0.405750287416545 0.405750287416545
+16254 7741 5836 0.199719306282583 0.199719306282583
+16255 5836 9863 0.20307644815808 0.20307644815808
+445 449 450 0.199450473576153 0.199450473576153
+20724 9339 9399 0.00989025456720925 0.00989025456720925
+20725 9399 10912 0.0075300269970097 0.0075300269970097
+20727 10911 9342 0.00831469236711343 0.00831469236711343
+18403 7778 10286 0.0505898966958872 0.0505898966958872
+273 283 284 0.0964719650645454 0.0964719650645454
+275 285 286 0.0574345831683482 0.0574345831683482
+276 286 287 0.00381671595135443 0.00381671595135443
+277 288 286 0.0749798421316384 0.0749798421316384
+267 277 278 0.026080790494895 0.026080790494895
+19535 10550 10547 0.0727126892007364 0.0727126892007364
+240 247 248 0.0772679392991742 0.0772679392991742
+242 249 250 0.0969982430766615 0.0969982430766615
+19500 10527 10528 0.0180139213913488 0.0180139213913488
+16008 9778 9779 0.0944640625920965 0.0944640625920965
+15463 8882 1361 0.00984596954833585 0.00984596954833585
+11520 658 713 0.150268576052698 0.150268576052698
+270 280 281 0.0978981798906238 0.0978981798906238
+16247 7743 5838 0.199906773104335 0.199906773104335
+505 499 500 0.0224810261782308 0.0224810261782308
+19508 10448 10534 0.00643702567875165 0.00643702567875165
+16434 9896 3281 0.0340559329983669 0.0340559329983669
+19458 10492 10506 0.00750267115612711 0.00750267115612711
+16700 9995 9996 0.0459960991438913 0.0459960991438913
+17222 5174 8210 0.200775724104805 0.200775724104805
+17224 4240 7299 0.0119914556826953 0.0119914556826953
+345 346 347 0.130802492327731 0.130802492327731
+347 348 349 0.135557185972568 0.135557185972568
+348 349 350 0.136845365159024 0.136845365159024
+355 357 358 0.388256388951567 0.388256388951567
+356 358 359 0.410677079496879 0.410677079496879
+18458 10297 6395 0.0910083144293941 0.0910083144293941
+18424 8333 10290 0.150248967925867 0.150248967925867
+18426 8331 7848 0.20002866768649 0.20002866768649
+16185 9843 7721 1.49406009526399 1.49406009526399
+18230 2552 10281 0.408042509102773 0.408042509102773
+568 561 562 0.0238735645312088 0.0238735645312088
+509 503 504 0.0378269387886271 0.0378269387886271
+510 504 505 0.131422581642966 0.131422581642966
+511 505 506 0.13298824931129 0.13298824931129
+512 506 507 0.0469418788297666 0.0469418788297666
+513 507 508 0.00800396830514923 0.00800396830514923
+514 508 509 0.189986229051577 0.189986229051577
+521 516 517 0.0463139600038384 0.0463139600038384
+12956 1507 1599 0.174395269936236 0.174395269936236
+19854 9521 10661 0.207011877470032 0.207011877470032
+11687 773 774 0.0194846935551434 0.0194846935551434
+20577 10865 10866 0.00985918265048112 0.00985918265048112
+15197 3400 9212 0.0496967641825266 0.0496967641825266
+3594 3445 1174 0.142771364790872 0.142771364790872
+3595 1174 897 0.139794356108886 0.139794356108886
+19561 10564 10565 0.0196154846965349 0.0196154846965349
+16270 6159 9867 0.121531820960243 0.121531820960243
+11805 8417 8418 0.134805848745127 0.134805848745127
+18434 8357 10291 0.154597709113849 0.154597709113849
+15269 8698 8458 0.108561000163296 0.108561000163296
+16600 3169 9952 0.143650464740249 0.143650464740249
+971 982 983 0.153004941982632 0.153004941982632
+19467 10511 10512 0.0226507231527583 0.0226507231527583
+19468 10512 10513 0.0195038602641882 0.0195038602641882
+16605 9954 9955 0.0548421550272179 0.0548421550272179
+16733 5003 10004 0.0399314883998924 0.0399314883998924
+16677 9979 9980 0.023537846703909 0.023537846703909
+15811 9714 9715 0.0297752747528411 0.0297752747528411
+12949 1304 1330 0.0581647037716416 0.0581647037716416
+11964 5499 7073 0.148280923478534 0.148280923478534
+18453 9427 4296 0.104102993198957 0.104102993198957
+20603 10836 10820 0.0118777812250081 0.0118777812250081
+20604 10820 10827 0.0109415807816948 0.0109415807816948
+318 326 327 0.287313248528131 0.287313248528131
+919 933 934 0.0476774715690845 0.0476774715690845
+920 934 935 0.0499176342652801 0.0499176342652801
+921 935 936 0.0512339711733563 0.0512339711733563
+12002 6577 5507 0.29282736629382 0.29282736629382
+2397 2072 2388 0.0939943538292093 0.0939943538292093
+17363 7241 3255 0.194151227318962 0.194151227318962
+3612 954 3458 0.174654702147255 0.174654702147255
+3613 3458 3459 0.161855899930502 0.161855899930502
+3614 3459 3460 0.184505780617563 0.184505780617563
+3615 3460 3461 0.174076203888655 0.174076203888655
+12954 1477 1478 0.162422090556836 0.162422090556836
+16746 6830 10008 0.0662012224002346 0.0662012224002346
+19537 10551 4704 0.0179029738053875 0.0179029738053875
+16747 10008 3664 0.0562861796352498 0.0562861796352498
+12008 8513 4459 0.0575373844976813 0.0575373844976813
+12009 4459 5508 0.146438493557302 0.146438493557302
+11575 1594 1595 0.149695612752929 0.149695612752929
+18383 8920 8960 0.0494721849144557 0.0494721849144557
+19652 10605 10528 0.00763160148090486 0.00763160148090486
+1706 1727 204 0.0785826238386085 0.0785826238386085
+11578 1595 1767 0.0524448615311058 0.0524448615311058
+351 353 354 0.0783794642996216 0.0783794642996216
+16749 53 10005 0.150239248303575 0.150239248303575
+20036 7837 816 0.140917505829302 0.140917505829302
+20637 10876 10878 0.031770930566573 0.031770930566573
+16183 1702 133 0.201630131124766 0.201630131124766
+16753 6829 10009 0.0465845830870589 0.0465845830870589
+18737 2600 1858 0.180581857071932 0.180581857071932
+14686 1987 2318 0.198940266900504 0.198940266900504
+1928 1941 1942 0.123855031305308 0.123855031305308
+18741 8070 7651 0.262731372814963 0.262731372814963
+14685 1546 1987 0.20778014181537 0.20778014181537
+12334 8656 8657 0.0212762444700433 0.0212762444700433
+18873 7825 7987 0.015602795644656 0.015602795644656
+12352 8668 8669 0.00723037090372959 0.00723037090372959
+18669 9460 1818 0.156714358591483 0.156714358591483
+18185 5799 6059 0.199739960113703 0.199739960113703
+18862 9131 9178 0.0368320416365925 0.0368320416365925
+16606 9955 7890 0.148662937956551 0.148662937956551
+12197 424 2296 0.092590985158808 0.092590985158808
+328 329 330 0.0301965908229701 0.0301965908229701
+329 330 331 0.00308879550687601 0.00308879550687601
+15797 2324 2349 0.0197202421063636 0.0197202421063636
+16293 2377 2409 0.0804076908745063 0.0804076908745063
+17370 3254 7297 0.216186214827155 0.216186214827155
+18195 8107 9376 0.183361036437535 0.183361036437535
+17371 7297 40 0.193403542976089 0.193403542976089
+389 391 392 0.10291889633356 0.10291889633356
+18880 1927 7249 0.20098536077548 0.20098536077548
+12842 2658 461 0.235239531220745 0.235239531220745
+18457 7020 10297 0.095413640203737 0.095413640203737
+14684 1545 1546 0.195783826439231 0.195783826439231
+16302 2721 2722 0.0283898956128369 0.0283898956128369
+18674 1569 1570 0.17732367890712 0.17732367890712
+19651 10604 10605 0.00569731320684084 0.00569731320684084
+12365 8674 8675 0.00395306971093599 0.00395306971093599
+18885 80 7308 0.203338584644882 0.203338584644882
+18462 9528 9293 0.135413968590027 0.135413968590027
+17073 8133 10070 0.277242310734424 0.277242310734424
+18887 3267 7247 0.200784680682105 0.200784680682105
+16306 2851 2852 0.0109060813984903 0.0109060813984903
+18803 8953 10352 0.0713096059986916 0.0713096059986916
+12360 8670 8671 0.0527368404826503 0.0527368404826503
+19915 8054 8774 0.178101620538173 0.178101620538173
+19027 10418 8995 0.822032321709027 0.822032321709027
+16313 2929 2636 0.0522503580010493 0.0522503580010493
+18123 10266 7936 0.0422734852594549 0.0422734852594549
+11696 1005 1006 0.0249036708868205 0.0249036708868205
+19031 9820 9825 0.141867922710985 0.141867922710985
+17076 828 3568 0.137092229325187 0.137092229325187
+20641 10879 4802 0.0562973461233787 0.0562973461233787
+19035 9497 9495 0.0285635113459611 0.0285635113459611
+2071 2074 2075 0.135495947312548 0.135495947312548
+15936 9757 6254 0.229061306545615 0.229061306545615
+3229 3143 3144 0.198651066611581 0.198651066611581
+3231 3145 1186 0.167106782855451 0.167106782855451
+20275 10725 6473 0.00777253007071417 0.00777253007071417
+20276 6473 10726 0.00774087009692378 0.00774087009692378
+20277 10710 5573 0.00807679050419555 0.00807679050419555
+16287 1363 2160 0.150908240771596 0.150908240771596
+18901 10379 10378 0.00446883067059111 0.00446883067059111
+18181 6056 4071 0.17853957848987 0.17853957848987
+16288 2160 2273 0.031688963076218 0.031688963076218
+15792 2131 2298 0.0834787229201596 0.0834787229201596
+17362 1905 7241 0.196305657515643 0.196305657515643
+20796 10943 7661 0.00258138052005919 0.00258138052005919
+20797 7661 10931 0.00256438171506516 0.00256438171506516
+17367 3197 6112 0.203543642625323 0.203543642625323
+19564 10566 10567 0.0877791462313442 0.0877791462313442
+17839 9059 10189 0.106477983280495 0.106477983280495
+17124 42 4240 0.19030237977338 0.19030237977338
+15941 9758 9759 0.0631588158295344 0.0631588158295344
+17151 4781 4823 0.202239291799058 0.202239291799058
+14110 421 3623 0.253988429085779 0.253988429085779
+20309 10730 10731 0.0277808040232953 0.0277808040232953
+19606 10584 10500 0.00674103787689334 0.00674103787689334
+18677 2800 2801 0.105225983369234 0.105225983369234
+17096 3720 3721 0.196415457175175 0.196415457175175
+19914 6599 8054 0.176409123849899 0.176409123849899
+14113 3767 3768 0.109524379066099 0.109524379066099
+19575 10571 10572 0.0878577106463745 0.0878577106463745
+19578 7458 10573 0.00838425457343401 0.00838425457343401
+13363 6192 9050 0.200728781748151 0.200728781748151
+18684 3608 1316 0.176123680044276 0.176123680044276
+16406 9888 9885 0.103994018141439 0.103994018141439
+20348 10747 10734 0.124798183375822 0.124798183375822
+13367 487 9053 0.0916792010447841 0.0916792010447841
+17112 3776 3932 0.0318567386044335 0.0318567386044335
+18472 7703 9005 0.191779872148763 0.191779872148763
+13566 4 3088 0.053682748576131 0.053682748576131
+14690 2868 3129 0.152693011202245 0.152693011202245
+19632 10519 10594 0.0691883113691504 0.0691883113691504
+16442 9898 9900 0.0593229160576478 0.0593229160576478
+19557 10561 10562 0.0114115661676901 0.0114115661676901
+17140 3200 3089 0.200962427212495 0.200962427212495
+19588 10578 7459 0.00830641959761081 0.00830641959761081
+19590 10509 10579 0.0688000441577074 0.0688000441577074
+4371 4093 4094 0.0474398468296831 0.0474398468296831
+14821 4531 9426 0.131844452515128 0.131844452515128
+20313 10734 10735 0.135778003167023 0.135778003167023
+16512 8896 9922 0.103245634213484 0.103245634213484
+19627 10592 10501 0.0068017037739497 0.0068017037739497
+3432 3319 3320 0.201627360859163 0.201627360859163
+3631 1572 3475 0.135693159195378 0.135693159195378
+3632 3475 3476 0.119283891700122 0.119283891700122
+3634 3211 3477 0.201273972346718 0.201273972346718
+3635 3477 1922 0.201175175309244 0.201175175309244
+17122 4176 3542 0.20232729922556 0.20232729922556
+16444 9901 9902 0.179094898504736 0.179094898504736
+20287 9383 6472 0.201518688053588 0.201518688053588
+20014 8858 10180 0.0735203760297937 0.0735203760297937
+19233 10457 10420 0.0372086096742178 0.0372086096742178
+4657 4299 3840 0.0473685540434106 0.0473685540434106
+14125 3659 3925 0.129261803351535 0.129261803351535
+3623 3469 3470 0.140706278566204 0.140706278566204
+18908 10386 10387 0.0302347602157808 0.0302347602157808
+15943 9760 8085 0.0293664602336856 0.0293664602336856
+18142 10269 6300 0.0570177692907992 0.0570177692907992
+17020 10057 10058 0.15155359133236 0.15155359133236
+17158 5010 5011 0.0757362739800239 0.0757362739800239
+16649 9960 9968 0.0812055546813917 0.0812055546813917
+17022 10055 10058 0.0158274438461504 0.0158274438461504
+20617 10793 10829 0.0486626332146345 0.0486626332146345
+17292 7745 7192 0.403926945097788 0.403926945097788
+17953 8781 10225 0.0170107340919314 0.0170107340919314
+17142 4509 4616 0.202021015829292 0.202021015829292
+14706 5161 5162 0.0515278311632085 0.0515278311632085
+17293 7192 8754 0.202354446551741 0.202354446551741
+16653 9971 9972 0.0159150831985239 0.0159150831985239
+17955 10229 10228 0.0205875980561605 0.0205875980561605
+16775 9905 10011 0.0628512846047373 0.0628512846047373
+20430 10790 10791 0.0319464035455711 0.0319464035455711
+17144 4683 4684 0.183413882011105 0.183413882011105
+17482 367 368 0.0073956069596753 0.0073956069596753
+17483 368 4274 0.0740383655738795 0.0740383655738795
+18131 6045 4102 0.143663826029319 0.143663826029319
+17166 3547 48 0.197940166378652 0.197940166378652
+17957 10231 10232 0.0468160398694911 0.0468160398694911
+19584 10563 10576 0.0699872416467849 0.0699872416467849
+19587 10577 10578 0.0879343964012276 0.0879343964012276
+16540 7834 812 0.139228180638449 0.139228180638449
+20323 10742 10732 0.00891011779971553 0.00891011779971553
+14118 3946 4047 0.0370997345222532 0.0370997345222532
+20325 10743 10744 0.00292597509729593 0.00292597509729593
+17681 9050 9814 0.396292789359983 0.396292789359983
+17683 10165 9814 0.392184725428778 0.392184725428778
+17303 3516 4258 0.201418622589808 0.201418622589808
+17690 6173 6191 0.0979652724466413 0.0979652724466413
+17305 8744 8715 0.198903931890441 0.198903931890441
+19815 6602 8057 0.177734109816075 0.177734109816075
+20432 10754 10792 0.00161805170064806 0.00161805170064806
+5752 4838 5081 0.0155515271366432 0.0155515271366432
+14703 5104 5105 0.188886837572701 0.188886837572701
+19833 10653 10654 0.205572346227123 0.205572346227123
+4807 4413 4414 0.0998668735468864 0.0998668735468864
+3650 3488 3106 0.174737901377497 0.174737901377497
+3651 3106 3491 0.194747174928978 0.194747174928978
+17379 5746 5747 0.00818765310677506 0.00818765310677506
+20468 10818 10755 0.173765546097308 0.173765546097308
+17164 1802 4242 0.207580745712203 0.207580745712203
+6015 5267 5268 0.103281094663511 0.103281094663511
+18137 10263 10272 0.406284221439373 0.406284221439373
+17291 10085 7745 0.543012306463268 0.543012306463268
+14709 5330 4870 0.190973371939833 0.190973371939833
+18138 4093 6038 0.184675507720467 0.184675507720467
+16651 9969 9970 0.100708681464822 0.100708681464822
+14710 4870 2220 0.162414391352976 0.162414391352976
+18505 6386 17 0.132879414135856 0.132879414135856
+14727 6220 6303 0.0511187399227223 0.0511187399227223
+17176 5390 5408 0.208329703574267 0.208329703574267
+20791 8358 10898 0.00761490800516594 0.00761490800516594
+17146 1801 4241 0.206257539278646 0.206257539278646
+14731 6303 5467 0.125799145673022 0.125799145673022
+18536 5557 10309 0.366989977501724 0.366989977501724
+14723 6016 5469 0.171433952660857 0.171433952660857
+18516 2412 10295 0.0120882825664803 0.0120882825664803
+17153 1911 4839 0.199025256937054 0.199025256937054
+17154 4839 3202 0.202009935716231 0.202009935716231
+18288 6762 6873 0.146634632629247 0.146634632629247
+20338 10735 10738 0.035049164748108 0.035049164748108
+18690 5770 5771 0.102556159708994 0.102556159708994
+20424 10785 10786 0.0731561229415083 0.0731561229415083
+5740 1710 5071 0.202613094112382 0.202613094112382
+14744 2216 4866 0.159742631617364 0.159742631617364
+18148 6033 4087 0.198416361234407 0.198416361234407
+17476 4654 473 0.0704097319033273 0.0704097319033273
+18150 4100 6044 0.175955927487578 0.175955927487578
+6851 5860 5861 0.109631940187014 0.109631940187014
+14841 7164 7777 0.0983349446501409 0.0983349446501409
+18242 6768 3993 0.201258062688176 0.201258062688176
+18273 6645 6666 0.202152498738845 0.202152498738845
+20386 10770 10771 0.0535943445752728 0.0535943445752728
+6983 5958 5959 0.149650557500517 0.149650557500517
+18306 3982 7041 0.200503190670894 0.200503190670894
+20438 10796 10797 0.0670860233753639 0.0670860233753639
+20500 10838 10824 0.0121125751150814 0.0121125751150814
+14725 977 5162 0.0458445478179373 0.0458445478179373
+6627 5707 1851 0.181903999460801 0.181903999460801
+3671 3508 3509 0.00436333612190551 0.00436333612190551
+3672 3509 3510 0.046781667512879 0.046781667512879
+7657 3346 6356 0.257422789129267 0.257422789129267
+14872 3240 5733 0.139141273161543 0.139141273161543
+18469 9138 10300 0.19595637710121 0.19595637710121
+18266 1691 6545 0.203809181046432 0.203809181046432
+18272 6629 6645 0.186774688365716 0.186774688365716
+8163 6669 2301 0.106319016804013 0.106319016804013
+14130 9280 9279 0.186364690747119 0.186364690747119
+14771 2209 923 0.186974313150198 0.186974313150198
+18247 9377 8108 0.184107753412847 0.184107753412847
+18704 7871 4059 0.176577842625336 0.176577842625336
+15923 9752 9072 0.0836347230210634 0.0836347230210634
+18541 7538 8363 0.0639425794382817 0.0639425794382817
+14134 509 9280 0.0291273215905741 0.0291273215905741
+15926 498 9102 0.0623752088587868 0.0623752088587868
+11651 8350 4542 0.134464503460642 0.134464503460642
+18291 6752 3975 0.201306126180051 0.201306126180051
+14752 5933 6903 0.0776419963986988 0.0776419963986988
+15930 9755 8063 0.0157417186886108 0.0157417186886108
+8622 3936 5625 0.097083190357132 0.097083190357132
+14891 9021 8103 0.0999072642817978 0.0999072642817978
+11386 8241 8242 0.105664996309114 0.105664996309114
+11647 7709 8347 0.0834163322393992 0.0834163322393992
+12254 8618 8619 0.0216515691565663 0.0216515691565663
+20225 8757 10713 0.181625832679021 0.181625832679021
+11373 437 8225 0.0125774855889878 0.0125774855889878
+20018 6572 4453 0.146908325275574 0.146908325275574
+20512 10063 10060 0.007549583111055 0.007549583111055
+12048 8527 8528 0.0740401240439702 0.0740401240439702
+14785 7957 5458 0.175576789379919 0.175576789379919
+12271 8518 8628 0.0787132719056346 0.0787132719056346
+11383 8239 8240 0.0842941433278933 0.0842941433278933
+11370 7971 7972 0.0117965527041302 0.0117965527041302
+11414 7984 7985 0.287379755335746 0.287379755335746
+11432 415 8254 0.452015989776023 0.452015989776023
+20350 10730 2968 0.0120941619304981 0.0120941619304981
+8748 5336 6979 0.175571360985687 0.175571360985687
+3691 3527 3528 0.0472108481996503 0.0472108481996503
+3692 3528 2737 0.0483230367668469 0.0483230367668469
+3697 3532 3533 0.0559788343200402 0.0559788343200402
+15221 3833 8055 0.052921136155694 0.052921136155694
+12311 8645 8476 0.144977480276504 0.144977480276504
+12312 8476 8646 0.198472144343311 0.198472144343311
+12314 8643 8559 0.0228329493898265 0.0228329493898265
+20367 10748 10749 0.0037547184046713 0.0037547184046713
+9843 7548 7549 0.124919366653633 0.124919366653633
+12301 4845 8524 0.0473127526043962 0.0473127526043962
+18331 7594 6751 0.14027973854483 0.14027973854483
+11791 8037 2687 0.147733787935878 0.147733787935878
+15865 8762 8763 0.0396940145175954 0.0396940145175954
+20529 10029 10846 0.0100359682174695 0.0100359682174695
+17959 6241 5194 0.169083036600962 0.169083036600962
+18370 6889 5250 0.0518724586298984 0.0518724586298984
+15225 8180 5297 0.041720314716376 0.041720314716376
+9071 2781 7147 0.103689348353689 0.103689348353689
+3710 3546 1524 0.0515313284334221 0.0515313284334221
+20305 10728 8110 0.168482747904973 0.168482747904973
+3711 1524 3547 0.0494425170647519 0.0494425170647519
+14739 6538 6607 0.183986331427456 0.183986331427456
+11372 290 437 0.0112130207438012 0.0112130207438012
+18381 8535 8919 0.0499954488007408 0.0499954488007408
+12246 8615 4817 0.146110905108578 0.146110905108578
+11425 8251 8078 0.7456254172446 0.7456254172446
+12247 4817 5788 0.143910603528138 0.143910603528138
+12818 299 8256 0.476082599329394 0.476082599329394
+20410 8976 9207 0.0123297683183119 0.0123297683183119
+12263 8621 8622 0.00671006625102598 0.00671006625102598
+11559 8319 7714 0.15000222129108 0.15000222129108
+15229 8334 8335 0.02937581800825 0.02937581800825
+18377 6069 2549 0.201785565265125 0.201785565265125
+11447 387 8258 0.356209179582772 0.356209179582772
+11812 1881 8316 0.0255940628377938 0.0255940628377938
+14781 921 2207 0.190721648601815 0.190721648601815
+20233 10711 10715 0.00692211182471866 0.00692211182471866
+20363 9209 8991 0.0223079019168015 0.0223079019168015
+18388 8990 9001 0.0110856339057274 0.0110856339057274
+20651 10033 10881 0.0461798387778834 0.0461798387778834
+13366 9052 487 0.0981014313599177 0.0981014313599177
+12303 8639 8640 0.0320591977276875 0.0320591977276875
+20243 10716 10713 0.0141769281388351 0.0141769281388351
+14749 4864 2214 0.160302668775638 0.160302668775638
+13468 309 9094 0.0506545738820493 0.0506545738820493
+18336 1689 7624 0.203108569942922 0.203108569942922
+12937 1303 1970 0.0130832107015757 0.0130832107015757
+20525 10839 1286 0.00844906120646156 0.00844906120646156
+10918 8035 5970 0.0219813767800627 0.0219813767800627
+14913 7600 2016 0.104505986927597 0.104505986927597
+20351 2968 10750 0.0147633294839236 0.0147633294839236
+15880 8763 8762 0.0396940145175954 0.0396940145175954
+20353 9401 9336 0.00949287140929792 0.00949287140929792
+12244 8613 8614 0.00356038865266788 0.00356038865266788
+11216 8164 8165 0.0796169077304663 0.0796169077304663
+14132 9279 507 0.0225847659450503 0.0225847659450503
+15875 8940 8978 0.0300860996423522 0.0300860996423522
+11429 8253 319 0.299890155674121 0.299890155674121
+20371 2707 10756 0.00655605333712087 0.00655605333712087
+14677 3794 9330 0.199283554137764 0.199283554137764
+18476 4295 2411 0.100910451832155 0.100910451832155
+18478 5542 9039 0.101169435731023 0.101169435731023
+11770 3014 8406 0.0500338703103734 0.0500338703103734
+11823 8421 8424 0.377719915283211 0.377719915283211
+10669 7915 6847 0.0947158385157811 0.0947158385157811
+3731 3565 3566 0.0486546976993217 0.0486546976993217
+3732 3566 3567 0.109486664803565 0.109486664803565
+3733 3567 1037 0.105564006595596 0.105564006595596
+11897 8466 8467 0.103343928827087 0.103343928827087
+11947 397 8496 0.0965081758273934 0.0965081758273934
+18380 8494 8535 0.0492964457876769 0.0492964457876769
+20364 8991 10755 0.00786332111355482 0.00786332111355482
+12162 8315 8569 0.02262255215678 0.02262255215678
+12218 8594 2290 0.0213925904868369 0.0213925904868369
+14931 3354 2767 0.0942765011393086 0.0942765011393086
+18498 9212 9220 0.133514882064815 0.133514882064815
+20706 9190 10885 0.00984120017613085 0.00984120017613085
+12373 8677 8678 0.0486250060422128 0.0486250060422128
+14967 7610 7264 0.0940136459475559 0.0940136459475559
+15895 9441 5377 0.102059140746775 0.102059140746775
+13974 9251 9129 0.169864606266652 0.169864606266652
+20368 10749 10733 0.00357512667889407 0.00357512667889407
+14674 2227 943 0.182649781226047 0.182649781226047
+14178 3784 8864 0.153337805989006 0.153337805989006
+19290 10470 8767 0.117748080941626 0.117748080941626
+12575 8759 8760 0.0168627139608601 0.0168627139608601
+14983 8789 8796 0.105952161931752 0.105952161931752
+14984 8796 8878 0.106413855851218 0.106413855851218
+20419 10774 3587 0.00984290685312232 0.00984290685312232
+15867 8770 8771 0.0147638851882813 0.0147638851882813
+11263 8195 8196 0.0967030898556648 0.0967030898556648
+16192 5817 7723 0.19660431304726 0.19660431304726
+20360 8992 10754 0.00404589397436802 0.00404589397436802
+19297 10471 1942 0.0559273520312209 0.0559273520312209
+15868 8833 5588 0.0188635032964949 0.0188635032964949
+19299 9959 564 0.00433589917958362 0.00433589917958362
+20814 10936 7168 0.0050166121287054 0.0050166121287054
+20823 10780 9337 0.0124085195369407 0.0124085195369407
+19301 1942 10467 0.0736734316331574 0.0736734316331574
+12854 4133 6696 0.093947304456844 0.093947304456844
+15004 6269 9466 0.0522837092305697 0.0522837092305697
+19305 10464 10461 0.0144782338635936 0.0144782338635936
+19307 10467 611 0.103622552493386 0.103622552493386
+11685 8366 1032 0.0209886592874132 0.0209886592874132
+20820 10919 8330 0.00776069150921458 0.00776069150921458
+11643 8347 4658 0.0580128250256257 0.0580128250256257
+12924 8890 8891 0.0884309215437497 0.0884309215437497
+15230 8360 8248 0.0379210675749848 0.0379210675749848
+13013 8916 2892 0.160989403082392 0.160989403082392
+12051 8531 8529 0.0116601753914343 0.0116601753914343
+20828 9205 8443 0.0104227726118747 0.0104227726118747
+18615 7410 5865 0.176922387553379 0.176922387553379
+14852 8621 9432 0.00675320800603643 0.00675320800603643
+18616 5865 9447 0.157075160700523 0.157075160700523
+18618 1314 9447 0.0196279343381406 0.0196279343381406
+11994 8505 8048 0.149802391835517 0.149802391835517
+18621 2586 5181 0.176412393215512 0.176412393215512
+18622 5181 5649 0.1069372720504 0.1069372720504
+19473 7476 10517 0.0101658403815209 0.0101658403815209
+19474 10517 10518 0.00993077177126307 0.00993077177126307
+18480 9040 9120 0.135103567036488 0.135103567036488
+20833 10944 10951 0.17747662532422 0.17747662532422
+19475 10518 10519 0.0191608413173093 0.0191608413173093
+19512 10537 10447 0.00647615513057594 0.00647615513057594
+2 2 3 0.283463280100036 0.283463280100036
+3 3 4 0.0333775918694363 0.0333775918694363
+18628 1310 9484 0.175555113641419 0.175555113641419
+12242 8611 8612 0.0998376585619669 0.0998376585619669
+5 5 6 0.348594358341424 0.348594358341424
+15909 9104 9105 0.0387441124726526 0.0387441124726526
+15903 6134 8603 0.0260893170771595 0.0260893170771595
+15878 8833 8770 0.0398025148628561 0.0398025148628561
+13625 7013 2274 0.0942922296438968 0.0942922296438968
+15024 4136 2663 0.0946854927112821 0.0946854927112821
+13651 9159 1177 0.0568269678125187 0.0568269678125187
+6 6 7 0.250747670173169 0.250747670173169
+20837 10949 10945 0.0947762411619158 0.0947762411619158
+15887 8842 9619 0.0119243513569086 0.0119243513569086
+19481 10511 10486 0.0687637700371023 0.0687637700371023
+13777 9191 292 0.0113408171424215 0.0113408171424215
+19493 10463 10523 0.0181472136448415 0.0181472136448415
+13799 9195 5081 0.0314508853846434 0.0314508853846434
+19487 10426 10427 0.0081618196829418 0.0081618196829418
+18570 10325 10322 0.0277653060168724 0.0277653060168724
+15042 6787 4718 0.0916704601824836 0.0916704601824836
+15043 4718 9414 0.0490846601218478 0.0490846601218478
+19494 10523 7469 0.0159566577035026 0.0159566577035026
+13814 4934 9200 0.0155640797101011 0.0155640797101011
+13008 8914 2891 0.0117402105605065 0.0117402105605065
+17570 10143 10144 0.0307556488479174 0.0307556488479174
+20841 10952 10940 0.18759449218266 0.18759449218266
+15726 7317 9449 0.0375532628709029 0.0375532628709029
+15904 8603 9697 0.00690416936559141 0.00690416936559141
+13877 4478 2804 0.135897648680331 0.135897648680331
+18633 4044 4045 0.00275409212275412 0.00275409212275412
+15057 9477 6733 0.054468335249091 0.054468335249091
+15058 6733 9313 0.0446744870999848 0.0446744870999848
+13910 9228 3317 0.0850892170141282 0.0850892170141282
+12689 2057 8805 0.133235184271089 0.133235184271089
+18656 6223 7657 0.27620827404325 0.27620827404325
+15858 9732 9739 0.0147062242308904 0.0147062242308904
+20843 10954 10751 0.181296524715589 0.181296524715589
+16082 366 255 0.573997033805984 0.573997033805984
+16084 9817 9818 0.0154245817929875 0.0154245817929875
+16127 4555 9122 0.0381695434595099 0.0381695434595099
+14675 943 5941 0.178224321703034 0.178224321703034
+15285 8799 3187 0.00972670306222712 0.00972670306222712
+15873 8879 8889 0.108518344615814 0.108518344615814
+15405 9585 9582 0.0323190665796029 0.0323190665796029
+16246 9859 7743 0.402195232762633 0.402195232762633
+13026 1537 4265 0.200987668621859 0.200987668621859
+3749 3578 3579 0.097584814173116 0.097584814173116
+3750 3579 848 0.0994883860112991 0.0994883860112991
+3752 3580 3581 0.0190511917089631 0.0190511917089631
+19488 10427 4703 0.0206936304458077 0.0206936304458077
+20829 8443 10954 0.0118059106132393 0.0118059106132393
+16351 7009 2285 0.0978474396198024 0.0978474396198024
+16382 9879 9771 0.00992783408407401 0.00992783408407401
+16432 9894 9895 0.0235353492080929 0.0235353492080929
+14329 9328 602 0.0664699646577648 0.0664699646577648
+20848 10950 10953 0.0184888911494772 0.0184888911494772
+13445 9078 9079 0.200451693111106 0.200451693111106
+16391 3033 9847 0.0236566168850551 0.0236566168850551
+15437 9602 9603 0.109740104543279 0.109740104543279
+18475 9005 4295 0.117455212214086 0.117455212214086
+19609 10585 10503 0.00693839845805758 0.00693839845805758
+16644 564 565 0.0167681949380125 0.0167681949380125
+18641 5875 7416 0.178910174745805 0.178910174745805
+16758 7565 10010 0.0537198584701325 0.0537198584701325
+13557 9032 9033 0.185435393968361 0.185435393968361
+19028 8995 7690 0.0430021373921601 0.0430021373921601
+17062 10068 2247 0.0643618782275657 0.0643618782275657
+16833 593 9915 0.00807834974542274 0.00807834974542274
+18614 4049 7410 0.176200842798068 0.176200842798068
+16902 74 7306 0.205595181095446 0.205595181095446
+17068 10069 675 0.181147813198563 0.181147813198563
+17009 4847 10051 0.0109841519151342 0.0109841519151342
+13581 9133 9134 0.0795179133195768 0.0795179133195768
+17207 9891 234 0.00951110757861507 0.00951110757861507
+19644 10601 10602 0.00459389199037625 0.00459389199037625
+14887 7456 5693 0.103533596199028 0.103533596199028
+15073 9480 8706 0.0156808972883418 0.0156808972883418
+18617 9447 1314 0.0196279343381406 0.0196279343381406
+19477 10520 10521 0.0112440070511006 0.0112440070511006
+19479 1872 10522 0.0183337010143588 0.0183337010143588
+18629 9484 5862 0.00360275623818702 0.00360275623818702
+17406 3210 6122 0.199774981063921 0.199774981063921
+15450 9609 9610 0.118608570416781 0.118608570416781
+14988 9309 9464 0.101172548296122 0.101172548296122
+15965 1443 7623 0.202446963416806 0.202446963416806
+13793 4819 8514 0.148483674564771 0.148483674564771
+3766 2339 3595 0.17591583054365 0.17591583054365
+3767 3595 3596 0.243702533330372 0.243702533330372
+15851 5596 9735 0.0497175089074512 0.0497175089074512
+15124 6515 226 0.0653425651240956 0.0653425651240956
+15449 9608 9609 0.0645563810419252 0.0645563810419252
+13914 4840 9230 0.275162192340763 0.275162192340763
+13922 9137 9233 0.0899935621999505 0.0899935621999505
+3788 1148 1821 0.103455086525091 0.103455086525091
+18632 7408 4044 0.178025429971464 0.178025429971464
+15247 9542 8177 0.0166658349694615 0.0166658349694615
+15460 9613 9614 0.039786363249444 0.039786363249444
+15461 8882 9615 0.0277165465497567 0.0277165465497567
+15546 9646 9647 0.0122997635777285 0.0122997635777285
+15889 8978 1101 0.0278428503732722 0.0278428503732722
+236 30 31 0.0623462807475453 0.0623462807475453
+239 246 247 0.10870569104286 0.10870569104286
+19602 10483 10583 0.0688347644552014 0.0688347644552014
+19497 7457 10525 0.0182919034833847 0.0182919034833847
+15292 9561 9562 0.0285639174620334 0.0285639174620334
+16011 9781 9782 0.0666625832869129 0.0666625832869129
+204 216 217 0.0495486567174314 0.0495486567174314
+16105 9825 9826 0.769429574289864 0.769429574289864
+19504 10531 10532 0.00490376342058079 0.00490376342058079
+19505 10532 10533 0.0113536336982688 0.0113536336982688
+15983 4420 7372 0.10794760335784 0.10794760335784
+16336 6683 8026 0.0934572989494279 0.0934572989494279
+15146 8245 9501 0.259647287125597 0.259647287125597
+16378 2678 4127 0.105747053096561 0.105747053096561
+15168 9509 3381 0.0515085102071127 0.0515085102071127
+14670 9413 5473 0.178785252044424 0.178785252044424
+15438 9603 2287 0.0101078833454114 0.0101078833454114
+16618 7974 3673 0.0581937370992888 0.0581937370992888
+16393 9876 3281 0.0515999951055545 0.0515999951055545
+11613 742 743 0.188831137780044 0.188831137780044
+16792 6964 10013 0.15953431348719 0.15953431348719
+16830 9911 10017 0.00322492509560211 0.00322492509560211
+17016 10055 10056 0.150978646033743 0.150978646033743
+17201 10074 6392 0.100421160552702 0.100421160552702
+19702 10621 10622 0.0560876276790842 0.0560876276790842
+17391 10095 8785 0.114852910416621 0.114852910416621
+18648 4053 10111 0.195636353938149 0.195636353938149
+17545 8264 8929 0.192238762103777 0.192238762103777
+19596 10507 10581 0.0688892384795374 0.0688892384795374
+18652 8072 7653 0.262512305989993 0.262512305989993
+18119 4085 6030 0.181292795599691 0.181292795599691
+17647 8242 223 0.0953499590487046 0.0953499590487046
+17960 5194 10233 0.0515871143302905 0.0515871143302905
+17964 10236 10232 0.0350820368831285 0.0350820368831285
+17785 8986 8497 0.0646311177616063 0.0646311177616063
+17753 10173 8485 0.0489434224402369 0.0489434224402369
+11535 1543 1544 0.137939265537406 0.137939265537406
+17819 8676 10186 0.0370735665978641 0.0370735665978641
+17777 6508 6993 0.160336610713707 0.160336610713707
+3801 3083 3195 0.200442064419022 0.200442064419022
+3802 3195 3622 0.204398520601987 0.204398520601987
+3803 3622 1902 0.199020966616341 0.199020966616341
+3804 1902 3624 0.19721596773449 0.19721596773449
+17851 10193 10194 0.0260169590696429 0.0260169590696429
+12958 1630 1631 0.127437048321071 0.127437048321071
+18661 10206 7647 0.17872352996795 0.17872352996795
+19942 10671 4953 0.0511372085610231 0.0511372085610231
+12964 1770 1771 0.0893785434926153 0.0893785434926153
+18602 7656 6222 0.275287629645573 0.275287629645573
+18232 2550 6070 0.201831098039417 0.201831098039417
+18761 10339 10340 0.0412859123428405 0.0412859123428405
+4425 950 4134 0.165887036500793 0.165887036500793
+4426 4134 4135 0.171020798065652 0.171020798065652
+4427 4135 4136 0.184950521487565 0.184950521487565
+18817 10355 8431 0.088262856016995 0.088262856016995
+4447 4149 4150 0.111495530172709 0.111495530172709
+4448 4150 4151 0.101644653962629 0.101644653962629
+19603 10583 10496 0.00675773327585877 0.00675773327585877
+19855 10661 10662 0.203042057763788 0.203042057763788
+20643 10879 10877 0.0314570447479651 0.0314570447479651
+19158 8423 8388 0.0601966609853944 0.0601966609853944
+19615 10587 10502 0.00686995556939521 0.00686995556939521
+12339 8656 2501 0.0156699758852849 0.0156699758852849
+19328 9895 10473 0.0277673159561869 0.0277673159561869
+19490 10441 10447 0.0184697170100914 0.0184697170100914
+19492 10448 10463 0.00504831489789659 0.00504831489789659
+19428 10489 7287 0.156514421452779 0.156514421452779
+19286 563 9967 0.0537140867907163 0.0537140867907163
+19621 10589 10590 0.0274773310120508 0.0274773310120508
+19441 10492 10493 0.0201930874558464 0.0201930874558464
+19789 9476 4873 0.191586478139089 0.191586478139089
+19805 2619 10411 0.177645225629424 0.177645225629424
+18409 10287 10288 0.0734556316276251 0.0734556316276251
+20191 462 10707 0.132640175005266 0.132640175005266
+14823 3606 9335 0.071748078170483 0.071748078170483
+14824 9335 9402 0.00997675672475066 0.00997675672475066
+14825 9402 8301 0.0653806855821323 0.0653806855821323
+14830 4022 8322 0.0483334251113916 0.0483334251113916
+14832 5668 7026 0.0386007852757077 0.0386007852757077
+4468 4163 4164 0.0480674059146442 0.0480674059146442
+4469 4164 991 0.0502312521862823 0.0502312521862823
+14857 8907 9435 0.0508107102861791 0.0508107102861791
+14859 9436 9437 0.0520105887104481 0.0520105887104481
+15729 9448 9449 0.154385795199696 0.154385795199696
+18619 9447 9452 0.260663192513491 0.260663192513491
+14936 5495 8700 0.014007087915999 0.014007087915999
+20590 2705 10795 0.0154885940353102 0.0154885940353102
+14972 2754 7005 0.0961416158900631 0.0961416158900631
+15045 5118 4946 0.0490898990370342 0.0490898990370342
+15046 4946 7151 0.0490351349560296 0.0490351349560296
+15963 6397 4362 0.0791794536243071 0.0791794536243071
+15989 9452 4506 0.0512507321563124 0.0512507321563124
+16056 308 4648 0.208884022844132 0.208884022844132
+15158 9504 7749 0.203686953618576 0.203686953618576
+16076 8934 9417 0.0908088237702457 0.0908088237702457
+16106 9826 214 0.019707054216564 0.019707054216564
+19536 10547 10551 0.00289118198627037 0.00289118198627037
+16257 8751 9267 0.200818549492747 0.200818549492747
+16332 5124 7146 0.105923351259383 0.105923351259383
+3817 3633 3634 0.395318196729382 0.395318196729382
+16359 2326 5997 0.152345269926906 0.152345269926906
+5101 4522 4624 0.135948680255943 0.135948680255943
+18688 2602 1859 0.181461056809498 0.181461056809498
+16455 9910 8957 0.00642990572974513 0.00642990572974513
+16456 8957 9911 0.00773671564019088 0.00773671564019088
+16715 132 1701 0.201952446468105 0.201952446468105
+17236 31 134 0.108163538194537 0.108163538194537
+17237 134 246 0.0735610173824186 0.0735610173824186
+17521 3940 6651 0.0163911525787958 0.0163911525787958
+18097 10256 2169 0.0491222602233141 0.0491222602233141
+18207 8329 7847 0.200166859157176 0.200166859157176
+18394 5586 2554 0.157693803770027 0.157693803770027
+18972 7756 3621 0.0947044796448553 0.0947044796448553
+19237 10458 10457 0.00406582159548868 0.00406582159548868
+19229 10453 10454 0.0676096530689986 0.0676096530689986
+3858 3667 3668 0.0415319443079903 0.0415319443079903
+3859 3668 3669 0.0482985746708946 0.0482985746708946
+19322 2203 916 0.200210598103272 0.200210598103272
+15203 7160 9528 0.0514241954874698 0.0514241954874698
+19690 10616 10397 0.0495068144600769 0.0495068144600769
+19692 10617 10398 0.0503641661598134 0.0503641661598134
+19879 5198 10672 0.124230342536198 0.124230342536198
+19967 10686 9720 0.110372440140764 0.110372440140764
+19969 9505 1931 0.205435822074821 0.205435822074821
+19971 9711 1933 0.17400772229687 0.17400772229687
+19972 1933 10306 0.208946577187585 0.208946577187585
+3875 3685 3686 0.109844105363612 0.109844105363612
+17510 10120 10119 0.158859506306984 0.158859506306984
+676 669 670 0.102292085856109 0.102292085856109
+3893 3696 3697 0.200080946502272 0.200080946502272
+3894 3697 3698 0.204567969900071 0.204567969900071
+3896 3699 3700 0.197370997762066 0.197370997762066
+20255 5749 10704 0.00800649085379587 0.00800649085379587
+20320 10739 10740 0.00883881362478868 0.00883881362478868
+15207 1113 9529 0.0508930389416975 0.0508930389416975
+15251 9544 9536 0.0327374869648338 0.0327374869648338
+15379 8806 2642 0.105298522418053 0.105298522418053
+18635 7865 1846 0.175356787311383 0.175356787311383
+15485 9612 9616 0.0684703360070514 0.0684703360070514
+15516 9635 3736 0.0550573183727317 0.0550573183727317
+19480 10522 10511 0.00442285695753415 0.00442285695753415
+15574 9660 9464 0.175338544663329 0.175338544663329
+15598 7585 2003 0.0946559616738872 0.0946559616738872
+15618 9679 9680 0.101799223111765 0.101799223111765
+15640 9666 9667 0.00676039634627663 0.00676039634627663
+15683 8023 7680 0.104281288426574 0.104281288426574
+15704 7666 2329 0.100028756753634 0.100028756753634
+15755 3356 2760 0.0982705119459115 0.0982705119459115
+1110 1126 1127 0.154576986104079 0.154576986104079
+2347 2338 2265 0.095819812257735 0.095819812257735
+12348 8664 8665 0.0099818469883938 0.0099818469883938
+20799 10928 6772 0.00617692305613739 0.00617692305613739
+1176 1191 1192 0.0992884317332444 0.0992884317332444
+20800 6772 10949 0.00765667567444528 0.00765667567444528
+441 439 440 0.131394781189403 0.131394781189403
+2798 2750 2752 0.210544806502819 0.210544806502819
+20666 10888 10889 0.0790962373353106 0.0790962373353106
+19518 6854 10540 0.00704975834948009 0.00704975834948009
+17074 10070 7842 0.137917824166884 0.137917824166884
+320 63 64 0.0374489603047296 0.0374489603047296
+62 68 69 0.0422209546479027 0.0422209546479027
+12003 5507 7080 0.146738996592278 0.146738996592278
+109 116 117 0.143188450690636 0.143188450690636
+18456 10296 7020 0.00773615182989558 0.00773615182989558
+134 142 143 0.102085903671524 0.102085903671524
+18414 7445 8376 0.0994737732965907 0.0994737732965907
+153 162 163 0.0752431334530451 0.0752431334530451
+18417 10289 8332 0.15046170994065 0.15046170994065
+323 206 207 0.0117249781899754 0.0117249781899754
+222 233 234 0.0133914034588106 0.0133914034588106
+269 279 280 0.111130387977042 0.111130387977042
+304 312 313 0.0760674046765663 0.0760674046765663
+378 380 381 0.042583144928967 0.042583144928967
+334 335 336 0.0838277836552233 0.0838277836552233
+18422 6881 8361 0.201914074104345 0.201914074104345
+367 368 369 0.0822344709508681 0.0822344709508681
+541 535 536 0.186883681615866 0.186883681615866
+11516 528 591 0.200155681159152 0.200155681159152
+15254 9538 9539 0.0173547475022314 0.0173547475022314
+659 649 650 0.011039314445329 0.011039314445329
+11464 701 5 0.465980985000995 0.465980985000995
+16702 9996 9629 0.03889405892702 0.03889405892702
+12966 1824 1825 0.0102076592436785 0.0102076592436785
+18427 7848 2983 0.204332357907837 0.204332357907837
+16420 3283 3331 0.0144926793767328 0.0144926793767328
+794 799 800 0.10010177351148 0.10010177351148
+11695 896 1005 0.0164907467236235 0.0164907467236235
+18433 6878 8357 0.204690873329425 0.204690873329425
+863 876 877 0.10476487069157 0.10476487069157
+883 898 899 0.104753841122432 0.104753841122432
+884 899 864 0.0807039229442354 0.0807039229442354
+927 941 942 0.0494985310502231 0.0494985310502231
+16705 9999 9629 0.0289087737479417 0.0289087737479417
+17026 3489 3490 0.0719959563000755 0.0719959563000755
+18682 3408 3539 0.176214327588196 0.176214327588196
+18442 8299 10294 0.012207810422513 0.012207810422513
+1076 1092 1093 0.17117547982738 0.17117547982738
+15790 2105 2106 0.167962867985551 0.167962867985551
+1100 1116 1117 0.101443140583253 0.101443140583253
+1122 1138 1139 0.131688298285365 0.131688298285365
+2171 2170 2171 0.00661609813602913 0.00661609813602913
+19434 10489 10109 0.051734430819511 0.051734430819511
+16849 9890 3358 0.0252874452199061 0.0252874452199061
+16171 7732 6631 0.170999473020786 0.170999473020786
+1145 1163 1164 0.10638131618854 0.10638131618854
+2233 2234 2235 0.107325767093377 0.107325767093377
+16734 10004 5726 0.044310348629928 0.044310348629928
+19574 7473 10571 0.0063271995041771 0.0063271995041771
+1286 1311 1312 0.0523154141859772 0.0523154141859772
+18191 5793 6053 0.200818759010255 0.200818759010255
+12198 2296 2417 0.0275462737865406 0.0275462737865406
+1335 1360 142 0.202746839209369 0.202746839209369
+1357 1386 1387 0.204107383179499 0.204107383179499
+1384 1411 1412 0.132938489820146 0.132938489820146
+1385 1412 1413 0.131234196689436 0.131234196689436
+16835 10018 10019 0.00449297276091322 0.00449297276091322
+1459 1481 1482 0.0508965659313026 0.0508965659313026
+533 397 398 0.176353791704941 0.176353791704941
+1483 1503 1504 0.10868886965133 0.10868886965133
+17373 3540 4236 0.201662628453229 0.201662628453229
+1505 47 1524 0.198761508803526 0.198761508803526
+16510 9930 8899 0.028599893322584 0.028599893322584
+19459 10506 10507 0.0718336837694179 0.0718336837694179
+16953 10037 10038 0.0209544596641532 0.0209544596641532
+1573 1601 1602 0.162785877407261 0.162785877407261
+1622 1650 1651 0.0538894092860146 0.0538894092860146
+1645 1672 1673 0.130835848827306 0.130835848827306
+1667 1692 1693 0.050088176287895 0.050088176287895
+1694 1718 1719 0.0873988319892153 0.0873988319892153
+1719 1738 1456 0.0837159374419676 0.0837159374419676
+1750 1769 1772 0.200154711336709 0.200154711336709
+1772 1790 1791 0.0243124544354895 0.0243124544354895
+12976 2866 2867 0.0166252705046511 0.0166252705046511
+1804 1817 1818 0.0911976784518576 0.0911976784518576
+11690 836 837 0.0102634119335747 0.0102634119335747
+1854 1868 1869 0.0969507802969199 0.0969507802969199
+18890 6123 3212 0.200920158955186 0.200920158955186
+13010 2892 2956 0.114118910643116 0.114118910643116
+1900 1913 1087 0.0825040978126541 0.0825040978126541
+11531 1232 1233 0.136649469135664 0.136649469135664
+3101 3032 3035 0.0672642720958143 0.0672642720958143
+16771 7290 7418 0.177711115784665 0.177711115784665
+2076 2079 2080 0.00320241388686281 0.00320241388686281
+20267 7552 10721 0.0076233085405271 0.0076233085405271
+2099 2101 2102 0.0617614998037007 0.0617614998037007
+2178 2178 2179 0.133414657501795 0.133414657501795
+20703 10902 10893 0.0137674602252582 0.0137674602252582
+18186 6059 4074 0.199239203137735 0.199239203137735
+2271 2271 2274 0.132133232701666 0.132133232701666
+2297 2295 2044 0.383761223862801 0.383761223862801
+2323 2315 2316 0.330214470935474 0.330214470935474
+12347 8663 8664 0.0257805479932851 0.0257805479932851
+2391 2374 2380 0.0606466728888714 0.0606466728888714
+17368 6112 1906 0.199361824625973 0.199361824625973
+2461 2451 2452 0.13645541326163 0.13645541326163
+2505 2485 2486 0.101289554682704 0.101289554682704
+2559 1939 371 0.224011572183979 0.224011572183979
+19236 5960 10458 0.00935537130778975 0.00935537130778975
+20487 10833 10834 0.0146368261080025 0.0146368261080025
+17152 4823 1911 0.202007841348173 0.202007841348173
+15939 9756 1179 0.0444859500137061 0.0444859500137061
+3746 3576 3577 0.10159835449875 0.10159835449875
+3791 2772 3612 0.203936793927218 0.203936793927218
+3792 3612 3613 0.107839344756473 0.107839344756473
+2787 2741 2742 0.198829139661659 0.198829139661659
+15945 9761 9759 0.0391671909462338 0.0391671909462338
+2831 2780 2781 0.0528298940705434 0.0528298940705434
+19569 10568 10569 0.0878244193957737 0.0878244193957737
+2880 2824 2825 0.0974259616864288 0.0974259616864288
+2902 2845 2846 0.808353421265405 0.808353421265405
+17512 10121 10120 0.0252089130538733 0.0252089130538733
+18124 7936 10267 0.178836603986638 0.178836603986638
+17213 3773 3774 0.00322537908461904 0.00322537908461904
+4010 3797 3798 0.0496772635509661 0.0496772635509661
+20618 10829 10811 0.00710063413803192 0.00710063413803192
+4056 3836 542 0.0542189434563804 0.0542189434563804
+16431 9893 9894 0.0272038809490012 0.0272038809490012
+4079 3854 3855 0.107248137237127 0.107248137237127
+4105 3874 1534 0.0983074346464974 0.0983074346464974
+4130 3892 3893 0.176077888960898 0.176077888960898
+3140 2139 3065 0.10712340392365 0.10712340392365
+14117 3945 3946 0.0482205385893945 0.0482205385893945
+19586 7471 10577 0.00638268050836497 0.00638268050836497
+18680 1852 3185 0.180570803347185 0.180570803347185
+4350 4077 4078 0.0772510249569655 0.0772510249569655
+4372 4094 4095 0.0479505811649138 0.0479505811649138
+19591 10579 10498 0.00651919101450697 0.00651919101450697
+3306 3214 3215 0.0471079000187924 0.0471079000187924
+3328 3230 3231 0.132391302135547 0.132391302135547
+19626 10513 10592 0.0688709903222838 0.0688709903222838
+3398 3295 3296 0.0155356242142858 0.0155356242142858
+19230 10454 10455 0.0118389292817843 0.0118389292817843
+20315 10736 10737 0.159656650881409 0.159656650881409
+18079 6355 10255 0.0661057533214939 0.0661057533214939
+3483 3361 3362 0.201966263198038 0.201966263198038
+4636 4280 4281 0.102934268159845 0.102934268159845
+16647 9969 5457 0.0123677166569097 0.0123677166569097
+16903 7306 3263 0.199172661453728 0.199172661453728
+19484 6853 10408 0.00698312522129821 0.00698312522129821
+19234 10420 10457 0.0372086096742178 0.0372086096742178
+19820 10648 3951 0.0619393226511354 0.0619393226511354
+20630 10847 10760 0.0141138073557462 0.0141138073557462
+4772 4383 4384 0.143358020264065 0.143358020264065
+4773 4384 2688 0.1475761156103 0.1475761156103
+19822 10648 9252 0.121899654224586 0.121899654224586
+17019 10054 10057 0.00913318334502991 0.00913318334502991
+19885 7405 10416 0.200852838610439 0.200852838610439
+18259 7775 9395 0.0553851197391209 0.0553851197391209
+4859 3019 4445 0.0478223869342914 0.0478223869342914
+20466 10753 10817 0.0682187434932547 0.0682187434932547
+19877 10671 6237 0.122419389056498 0.122419389056498
+19878 6237 5198 0.175009695046305 0.175009695046305
+18518 10303 10304 0.0239997630410034 0.0239997630410034
+4902 3446 4478 0.091694374773876 0.091694374773876
+19966 9509 10686 0.206010969949978 0.206010969949978
+19567 10565 7474 0.0766585847384353 0.0766585847384353
+14126 3925 419 0.00806156942685905 0.00806156942685905
+3723 3558 2895 0.0536764980359733 0.0536764980359733
+3795 3615 3616 0.170284963942666 0.170284963942666
+20220 9234 6625 0.292333005384616 0.292333005384616
+14111 3623 3659 0.11789221451213 0.11789221451213
+3861 3670 3671 0.0217628748782358 0.0217628748782358
+17030 3607 3490 0.0408681491476405 0.0408681491476405
+15948 9763 9764 0.10655007034609 0.10655007034609
+17086 504 3946 0.0996587778769702 0.0996587778769702
+20151 8263 8850 0.190160460059289 0.190160460059289
+17097 3721 2249 0.175979650666522 0.175979650666522
+3955 2834 3751 0.211238280484951 0.211238280484951
+4024 3809 3810 0.0544429181408591 0.0544429181408591
+20310 10731 10732 0.0936889543382987 0.0936889543382987
+4047 2945 3827 0.152861408667566 0.152861408667566
+20433 10792 10793 0.0378257433013547 0.0378257433013547
+4179 3929 3930 0.138165941069034 0.138165941069034
+18286 6824 3986 0.13302202745972 0.13302202745972
+20336 10747 10740 0.0348319951594156 0.0348319951594156
+5524 4925 4926 0.124694107926995 0.124694107926995
+4269 4013 4014 0.135510024687662 0.135510024687662
+20344 10743 10749 0.0091415179335324 0.0091415179335324
+17114 3959 582 0.020964645373322 0.020964645373322
+14696 4947 5018 0.17692836025714 0.17692836025714
+4361 4085 4086 0.0439979039927832 0.0439979039927832
+20443 10800 10797 0.0184411605361648 0.0184411605361648
+4436 1838 4143 0.106284873443858 0.106284873443858
+4437 4143 4144 0.0526768909687255 0.0526768909687255
+4456 4154 4155 0.103915690256788 0.103915690256788
+4457 4155 4156 0.103695542240372 0.103695542240372
+4476 4169 727 0.0512571810638195 0.0512571810638195
+4477 727 4170 0.0478531500173987 0.0478531500173987
+5818 5133 5134 0.102145042918239 0.102145042918239
+5912 5193 5194 0.024083404138801 0.024083404138801
+20491 10835 10836 0.00603667118796414 0.00603667118796414
+15862 9742 9737 0.126226895338302 0.126226895338302
+5931 5209 5210 0.693210396806986 0.693210396806986
+16531 9230 9133 0.0319382574203035 0.0319382574203035
+4627 1616 4276 0.105592921129571 0.105592921129571
+20628 10756 10873 0.0143552752086545 0.0143552752086545
+20696 10910 4524 0.00942218117840877 0.00942218117840877
+18136 6043 10263 0.201163508503498 0.201163508503498
+4695 4331 808 0.139418137507802 0.139418137507802
+4698 4332 4333 0.161361651356291 0.161361651356291
+6050 4013 5293 0.134925136075026 0.134925136075026
+18073 6354 6355 0.0448917156923931 0.0448917156923931
+4744 4362 4363 0.107836470275357 0.107836470275357
+4765 4378 4379 0.183602249353544 0.183602249353544
+20634 10876 10877 0.0283642470117633 0.0283642470117633
+18170 5801 6061 0.198751914750946 0.198751914750946
+4835 4430 4431 0.145138896688942 0.145138896688942
+4862 4446 4447 0.0474277072247471 0.0474277072247471
+18509 9355 10301 0.00184585558113331 0.00184585558113331
+6260 174 1704 0.202197382513594 0.202197382513594
+4958 4516 4517 0.0491656169358357 0.0491656169358357
+4983 4534 4535 0.0998419246339525 0.0998419246339525
+19921 10413 7869 0.176021720356684 0.176021720356684
+5064 4589 4590 0.0154062452430768 0.0154062452430768
+5086 4607 4608 0.119245405144689 0.119245405144689
+5111 4630 4631 0.139104857432868 0.139104857432868
+20788 5700 10925 0.00572872738726038 0.00572872738726038
+3915 2811 3713 0.0582509515897595 0.0582509515897595
+3917 3714 3715 0.0974014881112134 0.0974014881112134
+20790 10947 8358 0.00657767070033128 0.00657767070033128
+5221 4709 4710 0.122314419308335 0.122314419308335
+5243 875 4463 0.138237545752752 0.138237545752752
+18318 7366 7442 0.0771284931905011 0.0771284931905011
+5315 4770 4771 0.0488277782804066 0.0488277782804066
+5336 2332 4786 0.0940516760159238 0.0940516760159238
+5388 4825 97 0.199068637854245 0.199068637854245
+17092 4597 9466 0.17373336205738 0.17373336205738
+5437 4857 4858 0.0515825872815672 0.0515825872815672
+5483 4893 4894 0.046048954675788 0.046048954675788
+5531 4931 4932 0.018084718359645 0.018084718359645
+6850 4421 5860 0.102045619820979 0.102045619820979
+6892 5894 5697 0.0947186956045014 0.0947186956045014
+5585 1550 4269 0.196429076934968 0.196429076934968
+3934 3732 3733 0.121703755972038 0.121703755972038
+3936 3734 3735 0.176733819603511 0.176733819603511
+5609 4988 4989 0.201206746854351 0.201206746854351
+6912 5908 1999 0.0940717232862836 0.0940717232862836
+5705 932 2217 0.184097423724296 0.184097423724296
+5753 5081 5082 0.054538974474369 0.054538974474369
+5760 5088 1840 0.180073513278395 0.180073513278395
+5785 2782 5108 0.132016677253578 0.132016677253578
+18555 7706 2990 0.19846083928125 0.19846083928125
+18352 3981 7040 0.199881951179414 0.199881951179414
+5885 5176 130 0.21663995111842 0.21663995111842
+14774 5924 3807 0.151382817559166 0.151382817559166
+17792 8508 6179 0.109482524773714 0.109482524773714
+5955 5228 5229 0.0697529045378229 0.0697529045378229
+5977 1247 4556 0.132973381558885 0.132973381558885
+20546 10755 2961 0.0206004250178228 0.0206004250178228
+6055 3817 5296 0.100909929183789 0.100909929183789
+6076 172 1729 0.256606586411632 0.256606586411632
+6122 5349 4219 0.225702767955147 0.225702767955147
+6172 5388 1958 0.131227861001577 0.131227861001577
+20555 10853 10028 0.0104514157116194 0.0104514157116194
+6194 3028 5401 0.132618210317087 0.132618210317087
+18508 10301 9355 0.00184585558113331 0.00184585558113331
+6264 1941 5456 0.107892445399082 0.107892445399082
+6308 2067 5487 0.0160838439354733 0.0160838439354733
+6329 5502 5503 0.0544715490547718 0.0544715490547718
+20506 10834 10840 0.00711722931583218 0.00711722931583218
+7656 5012 3346 0.092992178848436 0.092992178848436
+20397 10758 10759 0.00383951895664098 0.00383951895664098
+19830 10649 10650 0.203375176962632 0.203375176962632
+18258 6760 7775 0.140758515508444 0.140758515508444
+6495 3928 5619 0.089155871041537 0.089155871041537
+6517 963 5279 0.100667730658223 0.100667730658223
+7856 6469 6470 0.161667024351427 0.161667024351427
+14751 929 5933 0.176747364710656 0.176747364710656
+6673 3933 5622 0.0990284128542063 0.0990284128542063
+14716 5687 933 0.176256990051995 0.176256990051995
+20475 10824 10825 0.0252031422821514 0.0252031422821514
+6694 5571 5749 0.0485856779635153 0.0485856779635153
+6695 5749 5750 0.0408085368300434 0.0408085368300434
+3964 1865 3758 0.048211663801055 0.048211663801055
+3965 3758 3759 0.0426076537269238 0.0426076537269238
+11217 443 444 0.0957304857475106 0.0957304857475106
+6741 5790 5791 0.0533877005590012 0.0533877005590012
+6764 5808 5809 0.0505689128275476 0.0505689128275476
+6788 5828 5829 0.0547714293876055 0.0547714293876055
+18151 6044 10264 0.200762745716695 0.200762745716695
+6809 365 4683 0.0475091694046952 0.0475091694046952
+6832 5852 1635 0.119748990570207 0.119748990570207
+18333 7291 3229 0.082496713136994 0.082496713136994
+6884 4667 1334 0.0975135676636165 0.0975135676636165
+6901 5900 2304 0.084800082911027 0.084800082911027
+6971 5951 5952 0.0992113626066069 0.0992113626066069
+14748 6733 4864 0.192735673325504 0.192735673325504
+18279 6738 6739 0.202843884763896 0.202843884763896
+7077 898 4479 0.137748361044457 0.137748361044457
+18284 6793 6794 0.0655358337845971 0.0655358337845971
+7099 5645 4359 0.0906469204279695 0.0906469204279695
+7124 6037 6038 0.0494419955897028 0.0494419955897028
+7168 6071 6072 0.0522594599242274 0.0522594599242274
+11649 8349 7711 0.138715670988872 0.138715670988872
+11989 8046 6574 0.143315424684023 0.143315424684023
+11652 4542 1283 0.131430485325992 0.131430485325992
+17217 1908 6114 0.200603968094547 0.200603968094547
+20549 10805 10854 0.0404087571222208 0.0404087571222208
+11385 8240 8241 0.317652248043028 0.317652248043028
+15924 9072 9753 0.0703936306326387 0.0703936306326387
+18551 9428 7705 0.2040983825575 0.2040983825575
+20556 10028 10805 0.0117396717425925 0.0117396717425925
+20452 10807 10808 0.0757678652544946 0.0757678652544946
+7529 6285 2831 0.200979085137746 0.200979085137746
+15928 9754 5382 0.011733427647939 0.011733427647939
+7553 4092 6302 0.0803403744103832 0.0803403744103832
+7580 6315 3820 0.130703255177956 0.130703255177956
+7677 1716 6365 0.197561364927668 0.197561364927668
+7751 5773 6410 0.160605281527339 0.160605281527339
+18359 7774 7775 0.0541753575171131 0.0541753575171131
+7777 6426 2486 0.134234515445665 0.134234515445665
+12252 122 8617 0.0393889261650165 0.0393889261650165
+7883 6494 6495 0.00940457999056201 0.00940457999056201
+7884 6495 5423 0.0969372989858353 0.0969372989858353
+3980 3771 3772 0.0481390459121498 0.0481390459121498
+3981 3772 3777 0.0470016129182315 0.0470016129182315
+7927 1795 6524 0.13760350708633 0.13760350708633
+8001 6561 6562 0.0546858550544455 0.0546858550544455
+11445 8257 385 0.474417191747682 0.474417191747682
+8048 6593 6594 0.0289242599655845 0.0289242599655845
+18526 9154 9352 0.0531084744773735 0.0531084744773735
+8069 6605 6606 1.2681000346061 1.2681000346061
+8092 4244 6622 0.082630423756929 0.082630423756929
+8093 6622 6623 0.0749027437652235 0.0749027437652235
+3996 3787 3788 0.0979026300528609 0.0979026300528609
+3997 3788 3789 0.0995935295086316 0.0995935295086316
+9386 7325 7326 0.0119980817003928 0.0119980817003928
+20477 10789 10826 0.0103983863250137 0.0103983863250137
+20507 10840 10823 0.00612377712997262 0.00612377712997262
+8262 841 6717 0.175943907281508 0.175943907281508
+9533 7395 7396 0.139422525474238 0.139422525474238
+20405 10779 8354 0.0261167106000956 0.0261167106000956
+8335 6764 6765 0.0503863905918892 0.0503863905918892
+8336 6765 6766 0.0491492877930629 0.0491492877930629
+4013 983 3800 0.100500044528257 0.100500044528257
+4014 3800 3801 0.0985249152645202 0.0985249152645202
+15231 8248 8334 0.0146425177596963 0.0146425177596963
+8409 3830 6807 0.0888447463890759 0.0888447463890759
+18321 6063 2543 0.201974991797574 0.201974991797574
+8457 6832 1495 0.201208565152389 0.201208565152389
+19836 2624 5204 0.178927982846839 0.178927982846839
+18379 8493 8494 0.0504160144523199 0.0504160144523199
+8503 6860 6861 0.0162922756173271 0.0162922756173271
+8527 3425 6874 0.0494311548712974 0.0494311548712974
+8599 1237 4811 0.0968243021950299 0.0968243021950299
+8699 1327 6954 0.11293333226081 0.11293333226081
+8743 6978 6843 0.0844431261667327 0.0844431261667327
+8770 6990 6991 0.0486520030390688 0.0486520030390688
+8791 7006 4358 0.202474203830337 0.202474203830337
+8792 4358 7007 0.00688683462760985 0.00688683462760985
+8840 7032 6092 0.0997655880788332 0.0997655880788332
+12243 8612 8613 0.138493887289201 0.138493887289201
+8862 2493 2840 0.128352303826166 0.128352303826166
+8889 7059 4436 0.0844445583973766 0.0844445583973766
+15879 8770 8763 0.0140298928163018 0.0140298928163018
+12248 5788 8274 0.146502988080446 0.146502988080446
+20224 10712 8757 0.0605456526720602 0.0605456526720602
+15789 9625 2105 0.0133775626084498 0.0133775626084498
+9093 4150 2344 0.174578433496429 0.174578433496429
+12934 8900 8688 0.0533584685274483 0.0533584685274483
+18558 10316 10317 0.318647498327865 0.318647498327865
+9165 7197 7198 0.272798906116362 0.272798906116362
+9189 7209 3616 0.0495666126691076 0.0495666126691076
+10453 3743 5856 0.10095556193443 0.10095556193443
+20231 10714 10715 0.0286157939247338 0.0286157939247338
+20392 10774 10770 0.00608971066273246 0.00608971066273246
+9337 4780 1523 0.0520500965787765 0.0520500965787765
+20017 8044 6572 0.144143863155146 0.144143863155146
+20561 10856 10798 0.00573758430075899 0.00573758430075899
+10672 7485 7454 0.0961864249467466 0.0961864249467466
+15863 9737 9743 0.0881669372882309 0.0881669372882309
+9436 7346 4173 0.192934476657366 0.192934476657366
+10721 7452 5690 0.129238470693044 0.129238470693044
+20510 638 10782 0.00926383363589588 0.00926383363589588
+18479 9039 9040 0.136726032574097 0.136726032574097
+9591 7412 5066 0.050234753132255 0.050234753132255
+9612 2128 5998 0.154063403679123 0.154063403679123
+16186 7721 5815 0.197248711738883 0.197248711738883
+9637 1423 7186 0.128478917444104 0.128478917444104
+11449 8259 8260 0.319737139262779 0.319737139262779
+9690 1895 7457 0.0666302144465139 0.0666302144465139
+9691 7457 7458 0.0198488245240688 0.0198488245240688
+19476 10519 10520 0.0516997558936505 0.0516997558936505
+9736 7494 5544 0.102560827713484 0.102560827713484
+16038 9802 9796 0.0179822727083053 0.0179822727083053
+11790 6564 8037 0.143771757250665 0.143771757250665
+9810 7528 7529 0.208257062216787 0.208257062216787
+9836 7542 7543 0.0265476903097887 0.0265476903097887
+18631 9484 7408 0.179068927816078 0.179068927816078
+15241 9537 9539 0.0227628365288052 0.0227628365288052
+20526 1286 10810 0.0112823826001832 0.0112823826001832
+9968 7619 7620 0.0778364486506147 0.0778364486506147
+9969 7620 7621 0.111522724623373 0.111522724623373
+9988 7625 1491 0.204666735578584 0.204666735578584
+10072 7660 2775 0.203041970554709 0.203041970554709
+10073 2775 6897 0.203220599619524 0.203220599619524
+10091 7671 690 0.200329217944331 0.200329217944331
+10115 2354 4156 0.173430880829093 0.173430880829093
+10138 3577 5644 0.141664156461633 0.141664156461633
+10164 7702 7703 0.0486413772868685 0.0486413772868685
+10187 7030 7715 0.0498024158316235 0.0498024158316235
+12249 8274 8295 0.153451254229228 0.153451254229228
+11642 1281 8347 0.0589263897659084 0.0589263897659084
+10281 7757 2638 0.20261361621015 0.20261361621015
+12251 8616 122 0.0306511482720316 0.0306511482720316
+10351 5524 6462 0.155650660428743 0.155650660428743
+11777 5360 8407 0.147060404896327 0.147060404896327
+20362 10734 9209 0.0303997458302742 0.0303997458302742
+10404 4224 7568 0.0462000499013743 0.0462000499013743
+10427 5696 6320 0.173275054190131 0.173275054190131
+16041 9802 9797 0.0106947269448384 0.0106947269448384
+10504 1036 7842 0.0544400914304572 0.0544400914304572
+12047 8526 8527 0.0840721683590618 0.0840721683590618
+10550 4923 5368 0.0856922507743825 0.0856922507743825
+16085 9818 9819 0.0412898984205639 0.0412898984205639
+10600 7873 7874 0.202540822887829 0.202540822887829
+10623 7886 1192 0.167316235534945 0.167316235534945
+20558 10845 2957 0.00878460299692283 0.00878460299692283
+10644 7563 7901 0.105394463133352 0.105394463133352
+12237 1599 8609 0.00546433627657245 0.00546433627657245
+20564 10825 1287 0.00477901915260098 0.00477901915260098
+10749 6942 7958 0.162394709841225 0.162394709841225
+10796 7983 947 0.174677658409185 0.174677658409185
+10817 6492 4607 0.147058520431446 0.147058520431446
+12476 5450 5427 0.050269770055972 0.050269770055972
+10839 6220 8004 0.052907543789053 0.052907543789053
+15731 7157 8801 0.0199400844261404 0.0199400844261404
+16956 10040 9425 0.0116537581995054 0.0116537581995054
+10942 4686 4956 0.099446723287275 0.099446723287275
+16188 7203 1784 0.197361998677517 0.197361998677517
+10964 6721 4791 0.136892276030183 0.136892276030183
+10986 5402 3133 0.105232928623448 0.105232928623448
+20369 10733 10746 0.00402873670536954 0.00402873670536954
+12735 8822 7751 0.202267643963295 0.202267643963295
+16205 7728 5823 0.195806305910918 0.195806305910918
+15885 9619 8879 0.0100154912435563 0.0100154912435563
+16189 1784 4247 0.203808666270494 0.203808666270494
+11109 8035 807 0.0159273560245565 0.0159273560245565
+11132 8133 6270 0.051417429454822 0.051417429454822
+11156 2087 2654 0.0953557861022671 0.0953557861022671
+11157 2654 4115 0.0506170186006763 0.0506170186006763
+11208 8161 8162 0.355822290917686 0.355822290917686
+11220 8169 106 0.241259609778708 0.241259609778708
+11240 8178 8182 0.0195790567337129 0.0195790567337129
+20821 8330 10923 0.00839528658401215 0.00839528658401215
+17791 3305 8508 0.0362477709828647 0.0362477709828647
+11322 8214 5950 0.203024250253409 0.203024250253409
+13061 8944 8945 0.0479106655937031 0.0479106655937031
+11349 1754 4801 0.0245317247967943 0.0245317247967943
+11390 8244 8245 0.0389791405679458 0.0389791405679458
+17817 9286 10185 0.00969626713044654 0.00969626713044654
+11462 8270 701 0.039999373678842 0.039999373678842
+11492 8281 8282 0.00503511807894305 0.00503511807894305
+11538 8302 8303 0.0107298944611382 0.0107298944611382
+11571 7713 8322 0.206137749537799 0.206137749537799
+11573 1766 7715 0.157141019260281 0.157141019260281
+13237 9010 4325 0.222509982407309 0.222509982407309
+11632 1278 4529 0.134276517370514 0.134276517370514
+11724 8374 8375 0.133513247237079 0.133513247237079
+11797 8414 4446 0.0913151320718964 0.0913151320718964
+11798 4446 6565 0.148651456771305 0.148651456771305
+11799 6565 8038 0.145022863674794 0.145022863674794
+13411 4426 9064 0.0342337858603608 0.0342337858603608
+11882 8457 1807 0.101184879886606 0.101184879886606
+13518 7635 7602 0.0983630321096794 0.0983630321096794
+11995 8048 6576 0.143165005086162 0.143165005086162
+12062 8532 3932 0.283100338690813 0.283100338690813
+12064 8532 3745 0.0315839509500456 0.0315839509500456
+12065 3745 8533 0.0402006397458181 0.0402006397458181
+16198 1788 6622 0.140253824514813 0.140253824514813
+12143 2334 7677 0.0942814693046897 0.0942814693046897
+13771 2561 9189 0.0689861433647756 0.0689861433647756
+18571 10322 10326 0.0103554459054315 0.0103554459054315
+15556 9654 9655 0.107168580692288 0.107168580692288
+12220 8596 8597 0.100597506592905 0.100597506592905
+12284 8235 7279 0.114584410389232 0.114584410389232
+12290 8634 8488 0.146216431524827 0.146216431524827
+15445 9605 9606 0.0107985098434616 0.0107985098434616
+12402 8686 2352 0.174110261708509 0.174110261708509
+12403 2352 4154 0.17319721774215 0.17319721774215
+12445 8705 902 0.277961591263562 0.277961591263562
+16201 7209 5822 0.204832695484964 0.204832695484964
+14071 3116 6673 0.099476803467174 0.099476803467174
+12563 729 7060 0.0981255480039199 0.0981255480039199
+12670 8793 5460 0.173942223750684 0.173942223750684
+12698 8808 8810 0.00713796130621387 0.00713796130621387
+12701 2643 8805 0.104981962462916 0.104981962462916
+12721 3633 3295 0.250204598549556 0.250204598549556
+16683 9985 9930 0.0816514509832002 0.0816514509832002
+12762 3506 8170 0.201022944642928 0.201022944642928
+15870 8842 8843 0.0221571458561984 0.0221571458561984
+15950 9765 9766 0.0194093177763062 0.0194093177763062
+12930 3167 8897 0.107237063498964 0.107237063498964
+14520 3985 7053 0.133213475028965 0.133213475028965
+15337 9564 9565 0.0333323202761363 0.0333323202761363
+15952 9765 9758 0.0491105082028732 0.0491105082028732
+13016 8918 8921 0.143291466888449 0.143291466888449
+13097 8917 8959 0.032086215385934 0.032086215385934
+13121 640 8968 0.045462010282231 0.045462010282231
+13175 4472 2794 0.133415072213096 0.133415072213096
+13447 9080 4647 0.227691913723815 0.227691913723815
+19029 7690 8144 0.0861073402797158 0.0861073402797158
+13280 4312 7812 0.197562058294396 0.197562058294396
+20373 10757 10758 0.0390214492856105 0.0390214492856105
+13466 9093 9091 0.0528525628364664 0.0528525628364664
+15458 1970 8766 0.0532545399938913 0.0532545399938913
+13600 2311 6580 0.108271978342533 0.108271978342533
+13622 3355 9148 0.0901126087179192 0.0901126087179192
+15127 8268 225 0.129419996314042 0.129419996314042
+15855 9737 9738 0.0422997339419691 0.0422997339419691
+15953 9758 9764 0.0382745737843307 0.0382745737843307
+13641 9152 327 0.371274069669657 0.371274069669657
+13690 6833 6976 0.085342873664165 0.085342873664165
+15860 9707 9741 0.0544957036472965 0.0544957036472965
+13709 6929 3818 0.116035215256342 0.116035215256342
+15411 7964 9590 0.052042549974644 0.052042549974644
+18495 15 6384 0.132622389900901 0.132622389900901
+18578 10319 10327 0.0490398009212077 0.0490398009212077
+13818 8483 6705 0.147706661087796 0.147706661087796
+13972 9250 9251 0.0609360549506678 0.0609360549506678
+20378 10761 10762 0.0703070927126279 0.0703070927126279
+14062 6351 2574 0.0264285559063396 0.0264285559063396
+4057 542 3837 0.0481841661951123 0.0481841661951123
+20619 10811 10850 0.0311826470096292 0.0311826470096292
+14143 9286 9287 0.00349243594701226 0.00349243594701226
+15782 2533 9708 0.0671466764878958 0.0671466764878958
+18700 1376 9773 0.0602159412724284 0.0602159412724284
+19501 10528 10529 0.0145223093781074 0.0145223093781074
+16094 9821 9496 0.0522797219291825 0.0522797219291825
+16682 9984 9985 0.111071610148866 0.111071610148866
+16220 9022 9008 0.10706671130041 0.10706671130041
+16222 9850 7740 0.404338691233817 0.404338691233817
+16223 7740 5835 0.200008410058821 0.200008410058821
+14438 6143 4017 0.133566629484228 0.133566629484228
+14458 9168 3834 0.0502958887489777 0.0502958887489777
+16499 8709 8890 0.00781309402153006 0.00781309402153006
+14504 9364 2172 0.0261972288759813 0.0261972288759813
+16631 9312 9964 0.536418418139307 0.536418418139307
+16632 9964 9965 0.081644512591407 0.081644512591407
+15472 8892 1971 0.0354218020701201 0.0354218020701201
+14617 9402 9350 0.13375643872535 0.13375643872535
+14954 7265 7584 0.0944614970989242 0.0944614970989242
+4076 3852 3853 0.00162344592902021 0.00162344592902021
+15099 7228 2370 0.054925658104601 0.054925658104601
+16381 9878 9879 0.0338421848775343 0.0338421848775343
+16508 9928 9929 0.0170279633676167 0.0170279633676167
+16525 5158 7669 0.0405110122092171 0.0405110122092171
+16594 9950 9951 0.140650325269802 0.140650325269802
+17419 10101 10102 0.0281887857345848 0.0281887857345848
+16852 9866 6519 0.0479747206312546 0.0479747206312546
+16968 10038 10045 0.00348952632939911 0.00348952632939911
+17638 10159 9498 0.0561256700305383 0.0561256700305383
+17642 8238 524 0.198799957504709 0.198799957504709
+17105 331 10064 0.12693044123038 0.12693044123038
+17422 10082 10083 0.0318734478115971 0.0318734478115971
+17268 4260 3518 0.200851927356296 0.200851927356296
+17398 7305 3261 0.198983160217956 0.198983160217956
+17400 3509 4251 0.199228485757107 0.199228485757107
+17911 4835 9197 0.134589353492833 0.134589353492833
+17544 8941 8264 0.168906883412351 0.168906883412351
+18155 10135 10136 0.408197365852498 0.408197365852498
+17572 10145 10146 0.0800519816931861 0.0800519816931861
+17628 2882 8136 0.162489310093733 0.162489310093733
+18601 10335 7656 0.178628836370645 0.178628836370645
+17816 9287 10184 0.0350560568035198 0.0350560568035198
+17966 6242 10236 0.0113656789072773 0.0113656789072773
+17886 9955 4390 0.0561034767074801 0.0561034767074801
+17918 5173 6867 0.199959252458115 0.199959252458115
+17919 6867 5276 0.0971272913038605 0.0971272913038605
+19066 5495 9469 0.177422724680083 0.177422724680083
+19037 9496 9494 0.0281063525870562 0.0281063525870562
+18774 9642 7121 0.176777734913143 0.176777734913143
+19101 10429 10049 0.0400790686743565 0.0400790686743565
+19617 10477 10588 0.0688805182452796 0.0688805182452796
+19314 6700 5030 0.15289416238876 0.15289416238876
+19425 36 3535 0.208182345564595 0.208182345564595
+19426 3535 4231 0.197905943796208 0.197905943796208
+19462 10478 10483 0.0205384885375563 0.0205384885375563
+19725 4489 10627 0.00886289645656064 0.00886289645656064
+19764 5140 5153 0.0242552277861381 0.0242552277861381
+20136 2752 6988 0.0528412012093399 0.0528412012093399
+19927 4579 8367 0.130318576605927 0.130318576605927
+20000 10690 8645 0.0319530891427096 0.0319530891427096
+4106 1534 3875 0.0874992877759652 0.0874992877759652
+20047 9078 9193 0.27590001979893 0.27590001979893
+397 400 401 0.186988741368815 0.186988741368815
+398 401 402 0.0834459188949902 0.0834459188949902
+400 403 313 0.0512719310633618 0.0512719310633618
+402 404 405 0.135745743044228 0.135745743044228
+404 406 407 0.304825723005793 0.304825723005793
+406 408 409 0.43926972528011 0.43926972528011
+408 410 411 0.386425449179561 0.386425449179561
+410 412 413 0.296429557961552 0.296429557961552
+411 413 414 0.0146716283322865 0.0146716283322865
+412 414 415 0.325808855480319 0.325808855480319
+414 416 328 0.121195048255912 0.121195048255912
+416 329 416 0.287289513548727 0.287289513548727
+417 416 417 0.245312696429149 0.245312696429149
+20053 1955 8185 0.122183214039011 0.122183214039011
+20198 8571 5783 0.145694845246542 0.145694845246542
+14833 7026 8320 0.0139341057083995 0.0139341057083995
+14834 8320 7029 0.0476978989477955 0.0476978989477955
+15442 9600 8606 0.035907314389173 0.035907314389173
+19656 10607 10531 0.00409092160847847 0.00409092160847847
+20737 10917 10886 0.0142612706482701 0.0142612706482701
+14870 9363 2450 0.140513945011527 0.140513945011527
+11514 269 270 0.151462432210479 0.151462432210479
+12364 8672 8674 0.0109017354569362 0.0109017354569362
+12 12 13 0.134681710739383 0.134681710739383
+14892 8103 9009 0.099173697837006 0.099173697837006
+14893 9009 8146 0.0976735888216106 0.0976735888216106
+33 36 37 0.0487053100188426 0.0487053100188426
+14912 7271 7600 0.0956539249415721 0.0956539249415721
+18874 7987 218 0.124810113553517 0.124810113553517
+18876 3520 84 0.204554290109371 0.204554290109371
+15454 8884 9611 0.0785818613777641 0.0785818613777641
+322 154 206 0.0287029588335131 0.0287029588335131
+18627 9483 1310 0.220178764490314 0.220178764490314
+18894 10375 10376 0.00936614397970835 0.00936614397970835
+15122 8269 9491 0.0542877044701678 0.0542877044701678
+18715 7650 8069 0.263314494448216 0.263314494448216
+15971 8998 4214 0.0961806119218467 0.0961806119218467
+551 544 545 0.0205710614294522 0.0205710614294522
+15166 7386 9508 0.0293624650986513 0.0293624650986513
+18679 2589 1852 0.179197761430995 0.179197761430995
+602 593 594 0.0187536593392831 0.0187536593392831
+16091 9818 526 0.0930965533879819 0.0930965533879819
+13959 448 9111 0.0841767201213853 0.0841767201213853
+16119 427 4010 0.113680084788302 0.113680084788302
+17947 10226 10227 0.0385043082181171 0.0385043082181171
+16175 7201 5812 0.201274753121947 0.201274753121947
+699 693 694 0.0993204992661042 0.0993204992661042
+16265 9865 7738 0.345896015945794 0.345896015945794
+16341 9873 8704 0.014474001055321 0.014474001055321
+11688 774 775 0.0224766779818413 0.0224766779818413
+16464 1081 9912 0.0130855777393443 0.0130855777393443
+18428 2983 10286 0.340223280394145 0.340223280394145
+16719 485 10003 0.0666623735199971 0.0666623735199971
+18212 2988 7850 0.201655156198778 0.201655156198778
+18213 7850 6382 0.201197176818258 0.201197176818258
+17132 1799 4238 0.205173852791716 0.205173852791716
+268 278 279 0.0669047721045728 0.0669047721045728
+18436 10287 10292 0.102997198003519 0.102997198003519
+17134 3543 44 0.198313047920784 0.198313047920784
+15194 7392 9524 0.0521516926212219 0.0521516926212219
+19559 10563 10553 0.0196751082256841 0.0196751082256841
+19864 10666 10667 0.12344950946071 0.12344950946071
+1022 827 1037 0.134288205933024 0.134288205933024
+19991 10682 10649 0.0504069045792634 0.0504069045792634
+327 328 329 0.206425005842362 0.206425005842362
+15245 9540 9541 0.00803794786000152 0.00803794786000152
+14681 446 727 0.207769052846247 0.207769052846247
+18636 1846 2580 0.177268272488638 0.177268272488638
+15883 9594 8842 0.0247081602797847 0.0247081602797847
+18445 1124 10289 0.0496295455281554 0.0496295455281554
+15483 9622 9623 0.0434553081653394 0.0434553081653394
+15784 9596 2105 0.0159980383240888 0.0159980383240888
+18450 7849 2986 0.202541671618508 0.202541671618508
+15540 1221 8429 0.105180771417586 0.105180771417586
+17095 3719 3720 0.174398206796096 0.174398206796096
+12950 1330 1331 0.0133918888831226 0.0133918888831226
+19570 10569 7462 0.00803939319633032 0.00803939319633032
+1312 1338 1339 0.0991205046552405 0.0991205046552405
+15958 9768 9769 0.0623405517746533 0.0623405517746533
+325 268 153 0.064083026712354 0.064083026712354
+386 388 389 0.0751873239589982 0.0751873239589982
+1392 1419 1420 0.399589215327938 0.399589215327938
+16282 9096 9098 0.0807475840805468 0.0807475840805468
+391 393 394 0.185819928048464 0.185819928048464
+15753 6671 2023 0.100119371100459 0.100119371100459
+18126 6042 10262 0.201564202628959 0.201564202628959
+17137 4425 1909 0.200241543203617 0.200241543203617
+16013 9783 9784 0.0337977814282775 0.0337977814282775
+12006 8049 6578 0.147083508160087 0.147083508160087
+2343 2334 2335 0.271393460830069 0.271393460830069
+19952 4670 7857 0.100774147000306 0.100774147000306
+20659 8289 5957 0.0879515292456205 0.0879515292456205
+12349 8665 8666 0.0489645255680358 0.0489645255680358
+1536 1559 1560 0.0937807122385258 0.0937807122385258
+2410 2115 2401 0.446933916798798 0.446933916798798
+19581 7470 10575 0.00667183269883622 0.00667183269883622
+1557 1582 1583 0.0811305260417956 0.0811305260417956
+469 472 473 0.100239678379349 0.100239678379349
+569 562 563 0.0844940522055572 0.0844940522055572
+12010 5508 7081 0.146350144860015 0.146350144860015
+2663 2621 2622 0.0420400210402162 0.0420400210402162
+16696 9597 7094 0.00600769898364912 0.00600769898364912
+18883 7310 84 0.202570183098447 0.202570183098447
+16736 7419 10004 0.204798388413466 0.204798388413466
+1623 1651 1652 0.0452674748546477 0.0452674748546477
+12948 1303 1304 0.066448544071591 0.066448544071591
+20711 10885 10914 0.126940460926274 0.126940460926274
+20712 10914 5881 0.00554916008288024 0.00554916008288024
+16509 9929 9930 0.0673766892433469 0.0673766892433469
+1643 1670 1671 0.136647738333876 0.136647738333876
+19534 6856 10550 0.00719456093421717 0.00719456093421717
+19538 4704 10552 0.0168576392161317 0.0168576392161317
+19539 10552 10553 0.00416995013524246 0.00416995013524246
+11689 775 836 0.0388095868373909 0.0388095868373909
+20 21 22 0.0174708821601448 0.0174708821601448
+16449 9906 9907 0.130469688472308 0.130469688472308
+41 44 45 0.0507831501846365 0.0507831501846365
+17298 7736 5829 0.204153885319898 0.204153885319898
+64 70 71 0.046163806906163 0.046163806906163
+18467 10299 10298 0.126605139952982 0.126605139952982
+18685 1316 1372 0.177012768030012 0.177012768030012
+1826 1842 1843 0.155652098486701 0.155652098486701
+19783 3732 10633 0.0548138207459151 0.0548138207459151
+1846 1861 1862 0.0495211888216282 0.0495211888216282
+177 186 187 0.102075274690852 0.102075274690852
+202 214 215 0.233063347854791 0.233063347854791
+271 281 282 0.0968799942510371 0.0968799942510371
+335 336 337 0.26926308578439 0.26926308578439
+14122 3945 503 0.0521094341958735 0.0521094341958735
+1949 1964 1965 0.100541047482359 0.100541047482359
+503 497 498 0.332501427216364 0.332501427216364
+508 502 503 0.0804669922754196 0.0804669922754196
+19271 10424 10425 0.0133101789702176 0.0133101789702176
+19460 10507 10477 0.0195042673008727 0.0195042673008727
+12962 1631 1599 0.105987129966341 0.105987129966341
+11814 2150 2151 0.12777055976042 0.12777055976042
+18730 7649 8066 0.263509830967107 0.263509830967107
+18671 2605 1538 0.176823430683456 0.176823430683456
+20037 816 3558 0.154160936652516 0.154160936652516
+20700 10894 10895 0.0022719801727208 0.0022719801727208
+17029 3606 3607 0.0180484124991241 0.0180484124991241
+850 863 864 0.0616242283467915 0.0616242283467915
+18683 3539 3608 0.177667253998454 0.177667253998454
+20825 9400 10954 0.0122123114573311 0.0122123114573311
+872 885 886 0.105399149486358 0.105399149486358
+19920 2621 10413 0.177079309456246 0.177079309456246
+892 906 907 0.104783494637697 0.104783494637697
+12344 8660 8661 0.0179171962919351 0.0179171962919351
+17141 3089 4509 0.200737491088575 0.200737491088575
+16291 2376 2377 0.00482087191216397 0.00482087191216397
+963 974 975 0.202802632214452 0.202802632214452
+17135 44 4412 0.404761668333185 0.404761668333185
+17088 10071 9940 0.138093381903903 0.138093381903903
+16845 10022 10018 0.0055152683612349 0.0055152683612349
+17952 10226 10230 0.0192923880160408 0.0192923880160408
+20322 10741 10742 0.00907488670500163 0.00907488670500163
+1113 1129 1130 0.204124873969403 0.204124873969403
+16607 7890 9325 0.145145340110648 0.145145340110648
+15260 9550 9551 0.0630135708366092 0.0630135708366092
+19433 10110 10489 0.0489242953920304 0.0489242953920304
+16954 10038 10039 0.0207511303582817 0.0207511303582817
+12357 8669 8668 0.00723037090372959 0.00723037090372959
+1183 1198 1199 0.0305943034250603 0.0305943034250603
+19442 10493 10494 0.0196148764551294 0.0196148764551294
+19443 10494 10495 0.0228284210093234 0.0228284210093234
+2633 2594 2595 0.0115937480855902 0.0115937480855902
+1205 1220 1221 0.0900481853791487 0.0900481853791487
+18180 5796 6056 0.200195877654712 0.200195877654712
+11707 1245 1246 0.0231530055304531 0.0231530055304531
+19444 10495 10496 0.0213401735101805 0.0213401735101805
+19445 10496 10497 0.0182367704590367 0.0182367704590367
+2703 2659 2660 0.155649282617483 0.155649282617483
+19446 10497 10498 0.0203055071588043 0.0203055071588043
+2724 107 2679 0.0450807290855188 0.0450807290855188
+1266 1286 1287 0.0202842890457172 0.0202842890457172
+18451 2986 7704 0.199650644692106 0.199650644692106
+16289 1363 2376 0.00344312944616261 0.00344312944616261
+19447 10498 10499 0.0196160459333464 0.0196160459333464
+14693 2225 4875 0.162113763012991 0.162113763012991
+1308 1334 1335 0.129255645714035 0.129255645714035
+14695 4946 4947 0.168905093573288 0.168905093573288
+1332 1357 1358 0.136424467862451 0.136424467862451
+19448 10499 10487 0.023296750596408 0.023296750596408
+2841 2789 2790 0.0523852002781698 0.0523852002781698
+15843 7795 9723 0.020416694003674 0.020416694003674
+18886 7308 3267 0.201549354300641 0.201549354300641
+19449 10487 10500 0.022940948763835 0.022940948763835
+17307 5827 7735 0.20365816745981 0.20365816745981
+2499 2480 2481 0.265342544498994 0.265342544498994
+19450 10500 10501 0.0189264900266028 0.0189264900266028
+18889 1923 6123 0.200475462008098 0.200475462008098
+1428 1451 1452 0.107578729884622 0.107578729884622
+18647 7412 4053 0.176566575042864 0.176566575042864
+1452 1471 1472 0.147622384612895 0.147622384612895
+19451 10501 10502 0.0200830353316625 0.0200830353316625
+2953 2897 2898 0.0472912053919854 0.0472912053919854
+16310 2439 2721 0.0812562615874829 0.0812562615874829
+12320 1302 1603 0.00893905362813633 0.00893905362813633
+19452 10502 10503 0.0197272337869401 0.0197272337869401
+19453 10503 7482 0.0181814350817939 0.0181814350817939
+19038 9494 229 0.0588468541295868 0.0588468541295868
+1498 1517 1518 0.199413272863754 0.199413272863754
+15846 9732 1098 0.0848710138660927 0.0848710138660927
+19454 7482 10504 0.0196839111368948 0.0196839111368948
+19455 10504 10505 0.017559948119168 0.017559948119168
+13365 9051 9052 0.103390283727961 0.103390283727961
+2998 1652 2935 0.112349122861115 0.112349122861115
+17375 1796 4235 0.206436210016501 0.206436210016501
+13963 9247 9102 0.0619095710643366 0.0619095710643366
+1534 1557 1558 0.0743776380849984 0.0743776380849984
+19916 8774 7640 0.176934657107496 0.176934657107496
+19917 7640 6233 0.179269287981755 0.179269287981755
+1556 1581 1582 0.0903340712116846 0.0903340712116846
+18461 9354 9528 0.135770728089025 0.135770728089025
+19456 10505 7464 0.0643341844968674 0.0643341844968674
+19919 5202 2621 0.177194532329155 0.177194532329155
+1603 1634 1635 0.0667169559865797 0.0667169559865797
+15911 9239 9240 0.00759910247117962 0.00759910247117962
+3133 2004 3061 0.0946875314878615 0.0946875314878615
+1648 1675 1676 0.0232219414191173 0.0232219414191173
+1649 1676 1677 0.104810655650978 0.104810655650978
+18412 7776 7163 0.0985154391997448 0.0985154391997448
+3153 3077 3078 0.0921654003892753 0.0921654003892753
+1666 1129 1692 0.0515669276869657 0.0515669276869657
+256 264 265 0.00881331069899833 0.00881331069899833
+19580 10574 7470 0.0064160385090956 0.0064160385090956
+1690 1714 1715 0.111918529606987 0.111918529606987
+12366 8674 8671 0.0118216471510326 0.0118216471510326
+18801 10352 9812 0.039652100920871 0.039652100920871
+379 381 382 0.0684082960066799 0.0684082960066799
+16308 2827 2851 0.00473328951361683 0.00473328951361683
+20640 10878 10879 0.0287629224507079 0.0287629224507079
+20278 5573 10727 0.00799925463089475 0.00799925463089475
+18122 2538 10266 0.180269607102109 0.180269607102109
+1907 1919 1920 0.101419584890654 0.101419584890654
+16419 3282 3283 0.0297579469637327 0.0297579469637327
+11533 1234 1235 0.136499599599558 0.136499599599558
+18135 4099 6043 0.191045620861521 0.191045620861521
+16763 4439 9868 0.0469300202486105 0.0469300202486105
+257 265 257 0.0618021904449226 0.0618021904449226
+3413 3306 3307 0.147259003832799 0.147259003832799
+1997 2009 2010 0.0436503011483876 0.0436503011483876
+381 383 384 0.174765079599045 0.174765079599045
+3437 3324 3325 0.13969071524798 0.13969071524798
+2020 2029 2030 0.0536884532048604 0.0536884532048604
+14708 5223 5330 0.173633760067415 0.173633760067415
+17179 5410 5449 0.194891408787823 0.194891408787823
+2041 2049 2050 0.203224924896292 0.203224924896292
+15894 9255 9441 0.0812248966226341 0.0812248966226341
+2068 2071 2072 0.108635365611271 0.108635365611271
+383 385 386 0.313694212518365 0.313694212518365
+15938 9757 9756 0.156652526688463 0.156652526688463
+2092 1220 2094 0.120498651922126 0.120498651922126
+16738 725 51 0.242028173240196 0.242028173240196
+19560 10553 10564 0.0204794292027182 0.0204794292027182
+2166 2165 2166 0.0846335919696035 0.0846335919696035
+19638 10597 10526 0.00694709641094844 0.00694709641094844
+3597 3446 2803 0.137873345883867 0.137873345883867
+16317 2510 3005 0.00592207877923616 0.00592207877923616
+17174 5326 5327 0.109586213492937 0.109586213492937
+16740 4437 10005 0.047793833799427 0.047793833799427
+3644 3483 3484 0.202897902969007 0.202897902969007
+2231 2232 2233 0.0942717670146639 0.0942717670146639
+2232 2233 2234 0.0947564865992517 0.0947564865992517
+16741 10005 4510 0.0465117651564764 0.0465117651564764
+2248 2251 2252 0.0515208780131149 0.0515208780131149
+16742 4510 10006 0.0392105126712721 0.0392105126712721
+3687 3523 3524 0.057537938641533 0.057537938641533
+2276 2276 2277 0.201064010739015 0.201064010739015
+18183 6051 5769 0.201340675613812 0.201340675613812
+18863 9178 2185 0.000908525082812035 0.000908525082812035
+14108 502 3544 0.223192299132 0.223192299132
+16417 3130 3281 0.0400386431725339 0.0400386431725339
+16286 1362 1363 0.0694355006798695 0.0694355006798695
+3729 3563 3564 0.1023601599905 0.1023601599905
+13961 9112 9247 0.133632751867418 0.133632751867418
+2325 1348 1614 0.104366499106977 0.104366499106977
+18909 10388 10381 0.014813120492833 0.014813120492833
+18903 10381 10380 0.00882005349877488 0.00882005349877488
+18454 4296 10295 0.0897566766881454 0.0897566766881454
+14692 941 2225 0.184174515609916 0.184174515609916
+19558 10562 10563 0.0196153093677919 0.0196153093677919
+16743 10006 7566 0.0419162617939555 0.0419162617939555
+19568 7474 10568 0.0062936328481519 0.0062936328481519
+18905 10382 10383 0.00831887899673018 0.00831887899673018
+17147 4241 3546 0.202185735299221 0.202185735299221
+14720 937 2221 0.184339220920538 0.184339220920538
+18637 2580 7383 0.244324669292135 0.244324669292135
+2484 2467 2468 0.0154146632189528 0.0154146632189528
+17183 5608 5658 0.149882473899379 0.149882473899379
+3908 3707 3708 0.138080579549583 0.138080579549583
+2555 2532 2533 0.191131540477931 0.191131540477931
+2556 2533 254 0.098486007419044 0.098486007419044
+19573 10570 7473 0.00674972719310255 0.00674972719310255
+2577 1090 2550 0.0509764502640852 0.0509764502640852
+17311 5685 5705 0.205154639659543 0.205154639659543
+20594 10852 10864 0.00559477666444464 0.00559477666444464
+2602 2568 2565 0.0838899757725962 0.0838899757725962
+13584 9079 9135 0.0736016285399027 0.0736016285399027
+3952 3748 3749 0.123087650580437 0.123087650580437
+2626 2587 2588 0.00484286584971978 0.00484286584971978
+2627 2588 2589 0.0472712028951763 0.0472712028951763
+18404 10286 7165 0.0480937532986949 0.0480937532986949
+18406 9349 8340 0.136218529796162 0.136218529796162
+13586 9135 9136 0.116423294527986 0.116423294527986
+14719 5893 937 0.0748599535472642 0.0748599535472642
+2721 2676 2677 0.00391406141859358 0.00391406141859358
+18735 4002 7603 0.202077020511888 0.202077020511888
+17677 6029 10165 0.522362145407342 0.522362145407342
+17480 344 5940 0.0510780896194201 0.0510780896194201
+2823 2771 2261 0.100546651913918 0.100546651913918
+18144 10275 10261 0.405650212701817 0.405650212701817
+12350 8663 8667 0.00958750951684791 0.00958750951684791
+4125 3888 3889 0.19728512260693 0.19728512260693
+2839 2788 1047 0.105687024742303 0.105687024742303
+2840 1047 2789 0.0528381886609336 0.0528381886609336
+12351 8667 8668 0.0176529909929813 0.0176529909929813
+19572 10564 10570 0.0698992084212194 0.0698992084212194
+16413 9458 9887 0.0468003057153474 0.0468003057153474
+2910 785 2854 0.0936375066158938 0.0936375066158938
+12361 8671 8672 0.0146217858658369 0.0146217858658369
+2955 2899 2900 0.139071498957734 0.139071498957734
+20621 10800 10799 0.0197706815366264 0.0197706815366264
+16441 5747 9898 0.0366397439833697 0.0366397439833697
+3003 2938 2939 0.343360355018568 0.343360355018568
+20697 4524 10911 0.0102002426471616 0.0102002426471616
+20441 10798 10799 0.0151893809033584 0.0151893809033584
+3052 2983 2984 0.049669116788992 0.049669116788992
+17130 4371 4372 0.0862019013563638 0.0862019013563638
+3072 3004 3006 0.148595619798792 0.148595619798792
+20009 9620 10046 0.0380951574175552 0.0380951574175552
+4390 4106 695 0.201687631399372 0.201687631399372
+18702 2606 1861 0.182749323037212 0.182749323037212
+3122 2901 3051 0.104668558602022 0.104668558602022
+20265 5574 10723 0.0117861788911356 0.0117861788911356
+20266 10724 7552 0.00870010659628447 0.00870010659628447
+19624 10591 10497 0.00644185269782912 0.00644185269782912
+19579 10573 10574 0.0879788736402366 0.0879788736402366
+18895 10376 10377 0.0641298068195797 0.0641298068195797
+20011 10694 10695 0.0242395353024572 0.0242395353024572
+17687 6171 6172 0.0391351463481426 0.0391351463481426
+3160 3084 3085 0.0490903700114876 0.0490903700114876
+19594 10580 10495 0.00720293691626167 0.00720293691626167
+3180 3100 3101 0.129889039932712 0.129889039932712
+17168 5241 5262 0.201125324676422 0.201125324676422
+17121 1798 4176 0.205688375484509 0.205688375484509
+3202 3118 3119 0.112364882779035 0.112364882779035
+14726 5162 6220 0.0504817306174529 0.0504817306174529
+3225 3140 3141 0.161478257380345 0.161478257380345
+13781 438 3176 0.297045355127737 0.297045355127737
+19813 5371 10633 0.121358837066421 0.121358837066421
+3298 3207 2047 0.106039987596014 0.106039987596014
+17169 5262 1912 0.201876443466571 0.201876443466571
+4605 3695 4261 0.0511463408235916 0.0511463408235916
+3320 3225 3226 0.12416264535459 0.12416264535459
+19269 10421 10423 0.00254934916501421 0.00254934916501421
+18686 1372 4116 0.0631464225691973 0.0631464225691973
+20456 10811 10791 0.0266421174352104 0.0266421174352104
+20624 10873 10804 0.10579809531994 0.10579809531994
+18140 10260 10273 0.404128367861769 0.404128367861769
+4673 4035 4316 0.0606123696093501 0.0606123696093501
+3387 3285 3286 0.00355897702027561 0.00355897702027561
+3388 3286 3287 0.0772193168955733 0.0772193168955733
+18146 10276 10258 0.404206655907194 0.404206655907194
+4696 808 3552 0.152717552993661 0.152717552993661
+3410 3303 3304 0.147141483236073 0.147141483236073
+20283 10722 10688 0.0815558763222832 0.0815558763222832
+20448 10804 10757 0.0136201124223367 0.0136201124223367
+20785 10292 10946 0.00447271282341959 0.00447271282341959
+19630 10593 10504 0.00657829834277663 0.00657829834277663
+3431 3318 3319 0.157091916454475 0.157091916454475
+20450 10805 10806 0.0327940652155406 0.0327940652155406
+4743 1385 4362 0.103327121803573 0.103327121803573
+18254 6754 8093 0.140439193425512 0.140439193425512
+18250 9369 6873 0.0520299718080319 0.0520299718080319
+20787 10932 5700 0.00677435562999442 0.00677435562999442
+3475 3354 3355 0.201619360833214 0.201619360833214
+14728 6303 5053 0.0505955795491821 0.0505955795491821
+3501 59 3374 0.0977645612190622 0.0977645612190622
+4808 4414 4415 0.102078381821333 0.102078381821333
+3525 3393 3394 0.0602077843108352 0.0602077843108352
+18251 6873 8493 0.0500003986375519 0.0500003986375519
+3545 656 1887 0.0518725917476049 0.0518725917476049
+14732 5467 6342 0.17284299485541 0.17284299485541
+3566 1664 1683 0.0314909646044893 0.0314909646044893
+17138 1909 4488 0.199449310001805 0.199449310001805
+18256 7043 3984 0.199449230757582 0.199449230757582
+4925 3762 2559 0.0885452473584724 0.0885452473584724
+18261 6496 2547 0.410253746717568 0.410253746717568
+3637 3478 3266 0.200452444377038 0.200452444377038
+3638 3266 3479 0.201663130575812 0.201663130575812
+20636 4518 10876 0.0502632727704227 0.0502632727704227
+3656 1794 3493 0.171297280470528 0.171297280470528
+18171 6061 4076 0.198476287736927 0.198476287736927
+20376 10759 10760 0.116931333825994 0.116931333825994
+3702 3537 3538 0.048566556365416 0.048566556365416
+20385 10293 10769 0.0538892457987372 0.0538892457987372
+18174 6420 6455 0.4094647827628 0.4094647827628
+5048 4577 4578 0.133343896044873 0.133343896044873
+3745 3575 3576 0.0911473636959273 0.0911473636959273
+3747 3577 3469 0.101252045857741 0.101252045857741
+20384 10767 10768 0.0160296914364663 0.0160296914364663
+17309 4261 5684 0.20074031502923 0.20074031502923
+18311 7054 7244 0.0289643230302344 0.0289643230302344
+20470 10819 10820 0.0323669425461701 0.0323669425461701
+14736 4161 4770 0.262098569801346 0.262098569801346
+5118 4637 4638 0.0862888373921514 0.0862888373921514
+18265 6532 1691 0.20439620202731 0.20439620202731
+20472 10821 10822 0.0473810496096361 0.0473810496096361
+5168 2615 4670 0.0537518017226415 0.0537518017226415
+18530 9153 9524 0.0561612407510351 0.0561612407510351
+17081 882 4467 0.138148999917071 0.138148999917071
+20012 10207 7896 0.145636470907972 0.145636470907972
+20423 10784 10785 0.00445123207828982 0.00445123207828982
+19137 10436 10430 0.0315234230528839 0.0315234230528839
+17145 4684 1801 0.196612355705575 0.196612355705575
+3889 3694 83 0.201794860941248 0.201794860941248
+18574 10316 10323 0.0808271649311999 0.0808271649311999
+17148 3546 46 0.198774198414449 0.198774198414449
+3912 3710 3711 0.148294717491307 0.148294717491307
+20615 10786 10857 0.0479734082124594 0.0479734082124594
+18267 6545 2438 0.164157220604829 0.164157220604829
+17099 332 3745 0.0956275481171213 0.0956275481171213
+14740 6607 3802 0.199799384709315 0.199799384709315
+18269 5736 5525 0.155855016610815 0.155855016610815
+5281 4748 4749 0.0137701294893219 0.0137701294893219
+3961 3755 3756 0.201785607236284 0.201785607236284
+3963 3757 1865 0.238183107088451 0.238183107088451
+18538 10309 10310 0.222695826046938 0.222695826046938
+4053 3833 3834 0.0227974048946719 0.0227974048946719
+18576 10324 10320 0.158325840757882 0.158325840757882
+5401 3070 4833 0.174791291148441 0.174791291148441
+20827 9001 9205 0.0113889892669974 0.0113889892669974
+16010 9780 9781 0.00910284197008254 0.00910284197008254
+18606 8065 6592 0.262343816062173 0.262343816062173
+18608 2631 5208 0.201029440504885 0.201029440504885
+20328 10745 10742 0.0339039031846942 0.0339039031846942
+4098 1552 3870 0.130787042699874 0.130787042699874
+16079 9815 9284 0.0214365694827313 0.0214365694827313
+18703 1861 7871 0.177358977412927 0.177358977412927
+5445 4865 4866 0.0483753395839426 0.0483753395839426
+4124 2246 3888 0.176179418850458 0.176179418850458
+18692 1856 5978 0.157563244482301 0.157563244482301
+5513 4918 1222 0.0334183748575429 0.0334183748575429
+4193 3941 3942 0.10150841538758 0.10150841538758
+18280 6739 6757 0.185196443942793 0.185196443942793
+18287 3986 6762 0.199195011240905 0.199195011240905
+4211 3961 3962 0.203354581445588 0.203354581445588
+18282 6460 6792 0.289344591592559 0.289344591592559
+18709 7654 7506 0.191266971634704 0.191266971634704
+4258 4004 4005 0.0557864946968893 0.0557864946968893
+18293 6900 6901 0.125065642459057 0.125065642459057
+4279 4022 4023 0.136471513645059 0.136471513645059
+18285 6794 6824 0.0676234540262284 0.0676234540262284
+20412 10780 10737 0.00327519593576582 0.00327519593576582
+5639 1165 885 0.138504687840451 0.138504687840451
+18705 4059 9745 0.17218742858343 0.17218742858343
+5680 5036 5037 0.13925145495263 0.13925145495263
+4340 4070 4006 0.0527657969561626 0.0527657969561626
+4341 4006 4071 0.045563339939639 0.045563339939639
+18706 9745 3863 0.0360430655172132 0.0360430655172132
+4363 4087 1214 0.050228703045046 0.050228703045046
+18708 6218 7654 0.273874816557472 0.273874816557472
+14701 5065 986 0.133961657579708 0.133961657579708
+4385 4078 4080 0.499220390775423 0.499220390775423
+17161 5086 5087 0.0305453434226413 0.0305453434226413
+4410 4124 3048 0.142041157035339 0.142041157035339
+18547 10315 7542 0.326789019301198 0.326789019301198
+5780 4917 5106 0.0912724900005868 0.0912724900005868
+4431 4139 2389 0.109327413388579 0.109327413388579
+5754 5082 5083 0.0244848814587712 0.0244848814587712
+18548 7542 5567 0.0788647232749776 0.0788647232749776
+5829 5144 5145 0.0718528722690416 0.0718528722690416
+4478 4170 4171 0.114300734663783 0.114300734663783
+14104 421 3767 0.239382300921688 0.239382300921688
+5849 1966 5160 0.213373795201997 0.213373795201997
+4498 1369 4184 0.105991036166523 0.105991036166523
+17123 3542 42 0.197838013671145 0.197838013671145
+18295 1428 6901 0.00619376962359973 0.00619376962359973
+18296 6901 6968 0.214788257098635 0.214788257098635
+5920 5198 5199 0.0509206897939403 0.0509206897939403
+4576 4176 1777 0.0501165848501884 0.0501165848501884
+20629 10873 10847 0.0359844691550279 0.0359844691550279
+18356 7764 7765 0.203486837058476 0.203486837058476
+18353 7040 3427 0.201724758100166 0.201724758100166
+6017 3447 5269 0.0916999906376171 0.0916999906376171
+4669 4312 4313 0.0844811623232087 0.0844811623232087
+18355 7763 7764 0.18255985476615 0.18255985476615
+20388 10772 10773 0.00806462172146812 0.00806462172146812
+4690 1574 4327 0.172428634063548 0.172428634063548
+14761 7128 660 0.183084210873309 0.183084210873309
+18307 7041 3428 0.200871545358079 0.200871545358079
+4768 2038 4380 0.146902820961905 0.146902820961905
+18357 7765 7253 0.0959812077322034 0.0959812077322034
+17178 5409 5410 0.041431272963648 0.041431272963648
+4841 4434 4435 0.0243817622036277 0.0243817622036277
+19636 10595 10596 0.0236895488952709 0.0236895488952709
+20494 10814 10837 0.00453902687683386 0.00453902687683386
+12316 8640 8559 0.0170391288088959 0.0170391288088959
+4864 4448 4449 0.051463626660104 0.051463626660104
+14105 3767 490 0.17231974049998 0.17231974049998
+18310 7244 7054 0.0289643230302344 0.0289643230302344
+4906 3886 865 0.080856531304005 0.080856531304005
+14762 660 7162 0.177556995744578 0.177556995744578
+14106 490 492 0.200841500024827 0.200841500024827
+6278 5468 5223 0.0507325637005759 0.0507325637005759
+20498 2955 10783 0.00926966063781334 0.00926966063781334
+18511 9529 10302 0.134870017545438 0.134870017545438
+18559 10317 10318 0.0818849597364774 0.0818849597364774
+5006 4551 4552 0.0605833275140723 0.0605833275140723
+20497 10805 2955 0.011923850145444 0.011923850145444
+6365 1258 377 0.0777271141684953 0.0777271141684953
+5032 3218 4567 0.203476554448063 0.203476554448063
+18309 3989 7244 0.103816807067418 0.103816807067418
+6389 5536 5537 0.0941709460297732 0.0941709460297732
+5052 4580 4581 0.0994044886957745 0.0994044886957745
+19827 9253 7642 0.176656738058614 0.176656738058614
+18315 7190 1430 0.126827993445383 0.126827993445383
+18691 2597 1856 0.178902858758576 0.178902858758576
+6529 1038 5638 0.106710156184621 0.106710156184621
+5211 4703 4704 0.0593965930317325 0.0593965930317325
+18320 7455 6063 0.193748278871749 0.193748278871749
+5307 4763 4764 0.0623737801227747 0.0623737801227747
+20402 10771 10761 0.045832556045337 0.045832556045337
+6659 5732 716 0.0227471694550216 0.0227471694550216
+5331 3596 4783 0.0944705655668644 0.0944705655668644
+14107 492 502 0.277229511676695 0.277229511676695
+6732 5783 5784 0.103949862025848 0.103949862025848
+14767 7420 4860 0.190666070334235 0.190666070334235
+20406 8354 10772 0.00730920335045724 0.00730920335045724
+6754 5799 5800 0.0473962648551068 0.0473962648551068
+14769 7430 4858 0.18998910813567 0.18998910813567
+5443 4863 4864 0.0452091651037792 0.0452091651037792
+19834 10654 9725 0.196434640947063 0.196434640947063
+6799 2741 5836 0.0500630331544159 0.0500630331544159
+20523 2708 10752 0.00659207654644855 0.00659207654644855
+18323 7479 7480 0.203575671880267 0.203575671880267
+18329 6073 7593 0.194237102947714 0.194237102947714
+5506 4912 2121 0.0993922299820147 0.0993922299820147
+19837 5204 5602 0.169326060361496 0.169326060361496
+6868 3299 5873 0.0385426751655708 0.0385426751655708
+5529 4929 4930 0.0186787878300106 0.0186787878300106
+5530 4930 4931 0.150638241291928 0.150638241291928
+20519 10815 10845 0.0426977620157165 0.0426977620157165
+6909 5905 5906 0.0925705753401188 0.0925705753401188
+5581 4968 4969 0.19364655602673 0.19364655602673
+20802 10942 606 0.00932539286509621 0.00932539286509621
+20522 10808 2708 0.0062556157491122 0.0062556157491122
+5631 3571 5004 0.140817256140417 0.140817256140417
+18338 2435 7632 0.201752260263955 0.201752260263955
+20016 2696 8044 0.148197142125826 0.148197142125826
+5653 2345 4151 0.175358365382788 0.175358365382788
+18327 1432 7191 0.123062885737589 0.123062885737589
+6998 2684 5970 0.144359466732262 0.144359466732262
+5670 679 5028 0.00422540721209624 0.00422540721209624
+5671 5028 5029 0.199984733552555 0.199984733552555
+20382 10765 10766 0.0345648031474255 0.0345648031474255
+18350 7716 6756 0.141149359906032 0.141149359906032
+5748 5078 5079 0.20268033504505 0.20268033504505
+18163 10259 6036 0.2014076606309 0.2014076606309
+14704 5105 3799 0.199599075644316 0.199599075644316
+18162 2170 10259 0.118558518008842 0.118558518008842
+20019 4453 5501 0.145746885757253 0.145746885757253
+5830 5145 2118 0.0459910302398271 0.0459910302398271
+20020 5501 7075 0.147873409818305 0.147873409818305
+14776 5927 3806 0.151596310173331 0.151596310173331
+5853 4622 5163 0.10255879316328 0.10255879316328
+18343 7662 5247 0.110734380038432 0.110734380038432
+20022 8291 7898 0.145585163841291 0.145585163841291
+7192 6084 6085 0.188916282974339 0.188916282974339
+18345 6874 1684 0.205522453761373 0.205522453761373
+20542 2953 10853 0.0105529318413212 0.0105529318413212
+18348 2429 7700 0.202520445331427 0.202520445331427
+20024 8856 9319 0.148299248554164 0.148299248554164
+7238 4839 1519 0.0519761467059316 0.0519761467059316
+14772 923 5925 0.177924520685585 0.177924520685585
+20544 10831 10809 0.07258379165013 0.07258379165013
+5934 4646 3645 0.198637387669602 0.198637387669602
+20537 10850 10851 0.00393462806086889 0.00393462806086889
+7284 6141 11 0.135513694564746 0.135513694564746
+5958 5230 5231 0.202816769336327 0.202816769336327
+20538 10764 10852 0.00745697116010785 0.00745697116010785
+7311 5071 6157 0.164940273242935 0.164940273242935
+5976 4624 1247 0.13286062727511 0.13286062727511
+5978 4556 2725 0.132159028738313 0.132159028738313
+20539 10852 10833 0.00647861100893927 0.00647861100893927
+7339 6169 6170 0.0619567458929491 0.0619567458929491
+5998 5256 5257 0.103904946256075 0.103904946256075
+19289 10469 10470 0.0657689911002152 0.0657689911002152
+20550 10854 10842 0.00418096419493106 0.00418096419493106
+6016 5268 3447 0.109289564409357 0.109289564409357
+20541 10846 2953 0.0102415664506872 0.0102415664506872
+6042 2870 5284 0.0497761483323909 0.0497761483323909
+20446 10802 10794 0.010877497210246 0.010877497210246
+6066 1342 5306 0.205811743638723 0.205811743638723
+20547 2961 10838 0.0117661269256179 0.0117661269256179
+7483 6261 1188 0.16816674729097 0.16816674729097
+6138 3644 4554 0.0976185559336041 0.0976185559336041
+18364 7802 1660 0.0598129332818693 0.0598129332818693
+7554 6302 1356 0.0804502555219789 0.0804502555219789
+6209 5412 1185 0.167137462035015 0.167137462035015
+6210 1185 5413 0.0233182677092941 0.0233182677092941
+14730 6318 6303 0.0522173167652759 0.0522173167652759
+20234 10715 10714 0.0286157939247338 0.0286157939247338
+20565 1287 10855 0.00858462136960439 0.00858462136960439
+6251 5443 779 0.0160681132894306 0.0160681132894306
+14783 4856 7862 0.182896538603858 0.182896538603858
+6272 5463 5464 0.0498340640254978 0.0498340640254978
+20235 10714 8820 0.0168131405425372 0.0168131405425372
+6293 5477 3890 0.10549800375505 0.10549800375505
+16545 7835 9934 0.137971408959184 0.137971408959184
+6362 351 5522 0.0335008525021526 0.0335008525021526
+16018 9787 9788 0.0995758326234823 0.0995758326234823
+6387 5535 2028 0.107888528337289 0.107888528337289
+20242 10717 10716 0.029516495512001 0.029516495512001
+7774 5212 6424 0.109568567873903 0.109568567873903
+16546 9934 9935 0.139302196645357 0.139302196645357
+20562 10798 10807 0.0058401189840652 0.0058401189840652
+15113 3050 7229 0.0133472139691031 0.0133472139691031
+20245 8372 6959 0.0489264341729089 0.0489264341729089
+11422 8078 8079 0.0484137060021889 0.0484137060021889
+6473 5599 5600 0.108658521887425 0.108658521887425
+15115 7996 7997 0.209391166364433 0.209391166364433
+18367 7754 8093 0.0507390772270922 0.0507390772270922
+20352 10751 9401 0.00837355044160468 0.00837355044160468
+6492 5616 5617 0.0720767157725574 0.0720767157725574
+14721 2221 4871 0.160443069505019 0.160443069505019
+18368 8093 6894 0.0518148786998363 0.0518148786998363
+16020 9789 9788 0.073636854952175 0.073636854952175
+7896 6503 6504 0.201046575537805 0.201046575537805
+16547 9935 3668 0.222625726498778 0.222625726498778
+11416 8000 8034 0.303468507056762 0.303468507056762
+6579 5669 5670 0.150406237761818 0.150406237761818
+20845 10954 10937 0.131662909083966 0.131662909083966
+6604 5693 4324 0.222481680681729 0.222481680681729
+18371 5250 7594 0.0499247461563453 0.0499247461563453
+15222 8101 8102 0.077833708774634 0.077833708774634
+18372 7594 5883 0.083286408265142 0.083286408265142
+6714 5766 2843 0.181402526618843 0.181402526618843
+14742 5935 931 0.176525948040391 0.176525948040391
+20409 8971 8976 0.00824136098890487 0.00824136098890487
+17573 10146 4643 0.00925827675066928 0.00925827675066928
+8175 6672 3101 0.17546713620256 0.17546713620256
+11210 300 106 0.00724031766776508 0.00724031766776508
+8223 6696 951 0.177624298281023 0.177624298281023
+6856 4317 5865 0.0513037576080921 0.0513037576080921
+18335 7611 1689 0.102723820359578 0.102723820359578
+20356 10752 10753 0.178510491347886 0.178510491347886
+6873 5878 5879 0.686284794666677 0.686284794666677
+11609 3416 7035 0.200128365503357 0.200128365503357
+11610 7035 8338 0.189938999172283 0.189938999172283
+6895 5896 4960 0.0956843495121368 0.0956843495121368
+11335 8218 251 0.176906123725318 0.176906123725318
+17668 10162 10161 0.0392525789715303 0.0392525789715303
+8321 6751 5251 0.0499574491010493 0.0499574491010493
+17670 8260 9051 0.230562637224967 0.230562637224967
+8340 6769 5533 0.120999789974565 0.120999789974565
+11366 7971 1892 0.0488719799669425 0.0488719799669425
+6977 4442 5511 0.147695461409276 0.147695461409276
+14750 2214 929 0.185352492811126 0.185352492811126
+7030 4913 5988 0.198333075719104 0.198333075719104
+18693 5978 6025 0.00688297127309608 0.00688297127309608
+11612 3418 742 0.19996057055502 0.19996057055502
+20437 10795 10796 0.0230619881865373 0.0230619881865373
+11948 8496 8497 0.0216014239716138 0.0216014239716138
+7132 1290 6044 0.0502638300231986 0.0502638300231986
+11686 1032 773 0.0128283485920152 0.0128283485920152
+8554 4804 6890 0.135875328970406 0.135875328970406
+11767 2687 8406 0.0738017906986337 0.0738017906986337
+8601 2178 596 0.0528183519637533 0.0528183519637533
+7225 6106 6107 0.101643082422806 0.101643082422806
+11821 8422 8423 0.175711465733647 0.175711465733647
+8624 109 720 0.104166949267626 0.104166949267626
+18552 7705 2988 0.199131268231619 0.199131268231619
+14770 4858 2209 0.16101488662795 0.16101488662795
+7328 6165 6166 0.0995968460919669 0.0995968460919669
+12286 8526 8525 0.0214801658544325 0.0214801658544325
+7376 337 6196 0.0756391181616623 0.0756391181616623
+12217 8592 8593 0.114913209514243 0.114913209514243
+12317 8559 2500 0.0435792910401613 0.0435792910401613
+8839 528 7032 0.050727128416239 0.050727128416239
+7478 6259 1180 0.207751884347626 0.207751884347626
+18554 9429 7706 0.20403157089995 0.20403157089995
+15821 8564 8565 0.0641361466923926 0.0641361466923926
+8860 7045 7046 0.134234542647931 0.134234542647931
+7498 4598 3688 0.240872387579393 0.240872387579393
+7499 3688 6270 0.142331405185985 0.142331405185985
+20649 10880 1676 0.0578550543011222 0.0578550543011222
+12236 8586 1599 0.0967599085697604 0.0967599085697604
+7572 5861 1309 0.178473387298321 0.178473387298321
+18324 7480 7524 0.15130858595047 0.15130858595047
+7598 6323 6324 0.205483069278936 0.205483069278936
+17836 9362 1627 0.0523901213643909 0.0523901213643909
+14759 7101 5464 0.170276074046912 0.170276074046912
+14760 5464 7128 0.178804240685068 0.178804240685068
+7640 6024 3875 0.0993805589791004 0.0993805589791004
+16021 9788 9790 0.320911397883896 0.320911397883896
+9035 7131 7132 0.0496921831493493 0.0496921831493493
+18491 9168 9169 0.133423914370859 0.133423914370859
+17837 1627 5679 0.10292857902181 0.10292857902181
+9059 2896 5632 0.0842038197459281 0.0842038197459281
+20806 7427 10935 0.00559704943884798 0.00559704943884798
+12938 1970 8709 0.0935507240006809 0.0935507240006809
+11439 511 8252 0.25940626826434 0.25940626826434
+7695 5168 6377 0.177825109084943 0.177825109084943
+20708 7442 10913 0.0784445493600802 0.0784445493600802
+9099 6388 7159 0.131345505242465 0.131345505242465
+11441 8256 8255 0.0395721958074786 0.0395721958074786
+19809 5615 9635 0.105426130739244 0.105426130739244
+9145 5720 7186 0.100417695742859 0.100417695742859
+11443 8254 8257 0.03964069530807 0.03964069530807
+7788 6432 6433 0.0533345329573706 0.0533345329573706
+12939 8709 8766 0.0775671350558112 0.0775671350558112
+9187 7207 7208 0.0500116374722849 0.0500116374722849
+7811 838 6446 0.0830965282034823 0.0830965282034823
+7816 6449 2813 0.0739587262737054 0.0739587262737054
+12260 8617 8618 0.00726192949201925 0.00726192949201925
+20803 606 10913 0.0113017508087441 0.0113017508087441
+9235 7240 7241 0.0498075431237363 0.0498075431237363
+7861 6474 6475 0.692905896897531 0.692905896897531
+12942 8804 1331 0.0594619846778877 0.0594619846778877
+12264 8622 8616 0.0863852743591186 0.0863852743591186
+7908 6511 6512 0.107336468131195 0.107336468131195
+20811 10951 7034 0.00453220039269765 0.00453220039269765
+13006 8912 8913 0.031616887141609 0.031616887141609
+7929 4175 6525 0.0337195393803404 0.0337195393803404
+20394 10762 10775 0.00651572160316994 0.00651572160316994
+20400 3591 10771 0.0086403574168429 0.0086403574168429
+8000 6560 6561 0.05117078549911 0.05117078549911
+18914 10389 10392 0.00619620469246147 0.00619620469246147
+8024 6580 6581 0.135411748293681 0.135411748293681
+8047 5711 6593 0.0649690182450408 0.0649690182450408
+20509 10841 638 0.00591881170263726 0.00591881170263726
+12270 8627 8518 0.0752716608672627 0.0752716608672627
+15918 9104 9746 0.00764030702792677 0.00764030702792677
+8143 6654 1583 0.150966803397046 0.150966803397046
+18477 2411 5542 0.101313827089111 0.101313827089111
+15876 8978 9002 0.0205305754568531 0.0205305754568531
+8295 6735 6736 0.0734967400485445 0.0734967400485445
+12273 8629 8517 0.0368940227401467 0.0368940227401467
+8322 5251 6752 0.0513511942917184 0.0513511942917184
+17214 3774 8403 0.176505403414048 0.176505403414048
+11789 4445 6564 0.147259159007996 0.147259159007996
+8396 516 6411 0.245438474982929 0.245438474982929
+19810 9635 9643 0.17762409301406 0.17762409301406
+19811 9643 7122 0.176833292049994 0.176833292049994
+9834 7540 7541 0.0505839701248518 0.0505839701248518
+8443 1465 5441 0.103147915206822 0.103147915206822
+13470 9094 9095 0.186249123099868 0.186249123099868
+9909 7585 3060 0.206196737198557 0.206196737198557
+8516 6868 4142 0.0958725861464383 0.0958725861464383
+18481 9120 6391 0.130087180946324 0.130087180946324
+8559 1248 4557 0.13273864991069 0.13273864991069
+18488 9153 9154 0.0316379611455697 0.0316379611455697
+10040 7380 7647 0.073513516250253 0.073513516250253
+8638 6926 6927 0.0519431626477688 0.0519431626477688
+8640 6928 2302 0.107037203280329 0.107037203280329
+18492 9169 9170 0.136492159060533 0.136492159060533
+8683 1000 4222 0.0557449369548998 0.0557449369548998
+15905 8603 8604 0.0748338508215397 0.0748338508215397
+13757 8439 9181 0.0861617636196398 0.0861617636196398
+10162 2158 7701 0.118289099292956 0.118289099292956
+8752 6982 6983 0.20266520881126 0.20266520881126
+12326 8650 8651 0.106050821827968 0.106050821827968
+18298 6995 6996 0.187375849458261 0.187375849458261
+14103 418 421 0.212232135618177 0.212232135618177
+11436 8255 7984 0.498708139076575 0.498708139076575
+18497 9201 9212 0.134547599555241 0.134547599555241
+19881 2617 10410 0.177201589274352 0.177201589274352
+8821 13 7020 0.00925156011318802 0.00925156011318802
+14676 5941 3794 0.153141383772443 0.153141383772443
+8846 6085 742 0.0513498235273795 0.0513498235273795
+19287 9967 10468 0.111280897910296 0.111280897910296
+8898 267 7062 0.0377688740912094 0.0377688740912094
+20847 10946 10950 0.100177888201708 0.100177888201708
+18612 1850 9261 0.181237135841786 0.181237135841786
+18361 7374 7802 0.0447005696877022 0.0447005696877022
+8973 7099 900 0.0469763030340631 0.0469763030340631
+14047 4836 389 0.0490717904305928 0.0490717904305928
+12310 8644 8645 0.447909393812679 0.447909393812679
+8996 7110 7111 0.00729890302499032 0.00729890302499032
+8997 7111 7112 0.0821157489631964 0.0821157489631964
+19296 10470 10471 0.0561834077462884 0.0561834077462884
+9018 7120 3944 0.0625799505809278 0.0625799505809278
+20228 8758 8818 0.0478043651923457 0.0478043651923457
+14140 9284 9285 0.260183964007922 0.260183964007922
+10472 1612 7829 0.00870018444151776 0.00870018444151776
+9067 7146 1144 0.138617590256283 0.138617590256283
+9068 1144 873 0.140306927162159 0.140306927162159
+16081 9816 366 0.168828958006928 0.168828958006928
+19882 10410 7867 0.175655958248639 0.175655958248639
+9135 5185 5653 0.105406920017136 0.105406920017136
+19292 10469 10471 0.0669585268555214 0.0669585268555214
+14789 9417 9415 0.0546470920616291 0.0546470920616291
+14678 9330 9301 0.189092694124095 0.189092694124095
+16087 9493 9819 0.0602377998698223 0.0602377998698223
+9262 5135 5150 0.0243532262877801 0.0243532262877801
+14663 9300 6543 0.20364721866244 0.20364721866244
+9311 4256 7276 0.202152573812647 0.202152573812647
+20396 10777 10758 0.00300729649615889 0.00300729649615889
+16088 9819 9820 0.154328326827327 0.154328326827327
+9435 7345 7346 0.0190810494123846 0.0190810494123846
+18624 6136 9460 0.0524172265643075 0.0524172265643075
+20568 10857 10787 0.0362929048752591 0.0362929048752591
+18625 9460 2258 0.0501132934741927 0.0501132934741927
+15897 9441 9042 0.0240046794304529 0.0240046794304529
+16387 9458 9459 0.0276860712412084 0.0276860712412084
+11214 8163 391 0.128403364715461 0.128403364715461
+9803 6610 7523 0.196894261944695 0.196894261944695
+15456 9612 9605 0.0879146885908635 0.0879146885908635
+18630 5862 9484 0.00360275623818702 0.00360275623818702
+11351 4798 8227 0.0561921807720747 0.0561921807720747
+9936 4537 7602 0.2557209782077 0.2557209782077
+11457 8266 8267 0.4367852597313 0.4367852597313
+11491 6185 8281 0.106123839405449 0.106123839405449
+11244 8185 8162 0.0231522248365289 0.0231522248365289
+18634 4045 7865 0.17751242949901 0.17751242949901
+18698 5868 1320 0.176912291429695 0.176912291429695
+10141 6347 3032 0.0935494731718596 0.0935494731718596
+11771 8406 4385 0.0534654755495647 0.0534654755495647
+19883 7867 3716 0.104069204828323 0.104069204828323
+11834 8430 8431 0.087830432319228 0.087830432319228
+10212 7733 7734 0.0513578872611552 0.0513578872611552
+19884 3716 7405 0.200874185823139 0.200874185823139
+11852 8443 8444 0.0120541689820552 0.0120541689820552
+10235 2742 7741 0.0499109655825577 0.0499109655825577
+19913 10244 6599 0.17675930412674 0.17675930412674
+15270 8458 8459 0.0175633548114394 0.0175633548114394
+10253 1700 7749 0.00587012913148048 0.00587012913148048
+20002 10691 10692 0.0226226455892357 0.0226226455892357
+11911 8472 8473 0.00378078844043477 0.00378078844043477
+10274 3194 6110 0.20159656533977 0.20159656533977
+11953 8041 6568 0.145503350739709 0.145503350739709
+10298 6399 3614 0.133348580117153 0.133348580117153
+11992 5503 7077 0.147510556806948 0.147510556806948
+19496 10524 7457 0.0831219334199701 0.0831219334199701
+10398 7619 7807 0.0285985320629965 0.0285985320629965
+15922 1816 9751 0.110608853519784 0.110608853519784
+11917 8476 1302 0.0550753650708828 0.0550753650708828
+20647 10880 10034 0.0300539000602635 0.0300539000602635
+10474 6225 7658 0.277054905467397 0.277054905467397
+11996 6576 4457 0.148175074796056 0.148175074796056
+12215 8590 8591 0.0896761056675667 0.0896761056675667
+12240 1246 8611 0.0161729384224601 0.0161729384224601
+10602 7875 741 0.0900908109241702 0.0900908109241702
+16451 9903 9904 0.00638068663878895 0.00638068663878895
+12161 8568 8315 0.127606752812743 0.127606752812743
+16022 9791 9792 0.180221045869865 0.180221045869865
+12376 7853 4674 0.113693675785271 0.113693675785271
+12377 4674 8679 0.101029871301971 0.101029871301971
+19472 10516 7476 0.0110661304777454 0.0110661304777454
+16024 363 9793 0.0338194849383131 0.0338194849383131
+12518 5916 3788 0.153505057727295 0.153505057727295
+10815 3667 7993 0.06101955432425 0.06101955432425
+17063 2247 4880 0.17655557289719 0.17655557289719
+18644 1374 1318 0.176938793518256 0.176938793518256
+20668 1127 10890 0.00915451265400173 0.00915451265400173
+15804 1934 9711 0.166526724215667 0.166526724215667
+15805 9711 9506 0.0388070303408929 0.0388070303408929
+15809 9713 7112 0.0121509406944637 0.0121509406944637
+17109 4052 8135 0.162752784015343 0.162752784015343
+12609 7223 8772 0.0487324288024552 0.0487324288024552
+10935 6177 3306 0.106502895543558 0.106502895543558
+10936 3306 8049 0.0536769065211004 0.0536769065211004
+16203 7727 9845 1.20908168114497 1.20908168114497
+10955 8058 8059 0.079137340429329 0.079137340429329
+16612 9327 9942 0.147120185144049 0.147120185144049
+17066 5478 9963 0.164315977100666 0.164315977100666
+17067 9963 10069 0.0117569437064922 0.0117569437064922
+12661 6331 6548 0.107973460603441 0.107973460603441
+12679 3638 8797 0.0132415259966435 0.0132415259966435
+16962 10044 10040 0.011239967337662 0.011239967337662
+12708 6861 5165 0.179825321478717 0.179825321478717
+11020 1485 143 0.200555984903635 0.200555984903635
+11021 143 8087 0.297571119969413 0.297571119969413
+17011 9424 10052 0.0266755832635793 0.0266755832635793
+12731 8820 7196 0.0815503609966838 0.0815503609966838
+17038 10062 9210 0.00792923279445615 0.00792923279445615
+11062 3436 7764 0.0490279707439403 0.0490279707439403
+16025 9793 9792 0.141538634561804 0.141538634561804
+12773 8830 4166 0.0867031847297172 0.0867031847297172
+16209 6627 5825 0.203615270524375 0.203615270524375
+16207 7210 6624 0.114867174949551 0.114867174949551
+16210 5825 7730 0.194825716270604 0.194825716270604
+13015 8917 8918 0.0110325419879542 0.0110325419879542
+13019 8923 8924 0.0459300988872919 0.0459300988872919
+11247 8187 5274 0.160867422208887 0.160867422208887
+19514 10535 10538 0.0037920381346196 0.0037920381346196
+13024 6190 280 0.0860979970314494 0.0860979970314494
+11276 8174 8198 0.367460344283523 0.367460344283523
+18156 4088 6034 0.199039273787356 0.199039273787356
+13094 1749 8958 0.0802223716795591 0.0802223716795591
+11325 5154 2237 0.0295446835402977 0.0295446835402977
+18719 4048 7409 0.17730031135953 0.17730031135953
+13118 8967 1742 0.0145216501585431 0.0145216501585431
+18386 8971 8972 0.00871865668631088 0.00871865668631088
+13072 8913 8952 0.0749880743663527 0.0749880743663527
+17640 230 8241 0.144923812025645 0.144923812025645
+13560 9033 578 0.049912950240993 0.049912950240993
+11377 8237 4850 0.0778446846789704 0.0778446846789704
+18720 7409 5864 0.175843787012913 0.175843787012913
+11410 2864 7808 0.201887571458386 0.201887571458386
+11526 8300 809 0.0681077085457417 0.0681077085457417
+18653 7653 10176 0.157020875630107 0.157020875630107
+13241 7916 4418 0.196768399976565 0.196768399976565
+11566 7031 7379 0.100426092571383 0.100426092571383
+11568 7379 1594 0.158671241159827 0.158671241159827
+17820 10186 10187 0.0184687744290435 0.0184687744290435
+13263 4963 6826 0.0748897830948627 0.0748897830948627
+11599 7782 8332 0.0501574795892601 0.0501574795892601
+11600 8332 1125 0.0495676895406725 0.0495676895406725
+11644 4658 8348 0.011012895464713 0.011012895464713
+18918 10397 10398 0.0105062475981655 0.0105062475981655
+17913 6562 4748 0.176744370871331 0.176744370871331
+11715 8369 8370 0.101679025311835 0.101679025311835
+11747 8387 8388 0.0596706311453888 0.0596706311453888
+11775 8121 2683 0.119321215072029 0.119321215072029
+13389 8267 9048 0.0706232625221708 0.0706232625221708
+11997 4457 5505 0.144543593212435 0.144543593212435
+19642 10599 10600 0.00461558236551731 0.00461558236551731
+12058 153 3776 0.311946607437041 0.311946607437041
+13750 6895 9177 0.1538081352177 0.1538081352177
+12164 4818 7560 0.10615031357403 0.10615031357403
+15934 6257 9756 0.181030993335028 0.181030993335028
+18568 10324 10321 0.144976741381278 0.144976741381278
+20260 6471 10699 0.00720326005355295 0.00720326005355295
+12382 440 8680 0.0360714923590191 0.0360714923590191
+13919 482 483 0.00751372921095178 0.00751372921095178
+20414 3586 10773 0.00983155874827391 0.00983155874827391
+12480 8712 8713 0.0991407463070431 0.0991407463070431
+15455 9611 9612 0.086225314993736 0.086225314993736
+20417 8993 10775 0.0123681069665026 0.0123681069665026
+19623 10508 10591 0.0688242418092362 0.0688242418092362
+14087 6816 2943 0.102402811156445 0.102402811156445
+12571 8755 8756 0.0991408859101036 0.0991408859101036
+18658 9831 7643 0.17655772025733 0.17655772025733
+16026 9792 9793 0.141538634561804 0.141538634561804
+14200 5104 8831 0.0500819471783367 0.0500819471783367
+16028 9794 9795 0.0352990859554557 0.0352990859554557
+12690 8805 8806 0.0205962859747724 0.0205962859747724
+14297 1952 9317 0.0799385706307454 0.0799385706307454
+12747 5350 4220 0.0793424677909429 0.0793424677909429
+16029 9796 9797 0.0144472492683917 0.0144472492683917
+20288 6472 10687 0.0642398609947935 0.0642398609947935
+14311 8859 8501 0.0340924315859818 0.0340924315859818
+14330 602 8973 0.0577848630730138 0.0577848630730138
+16030 9797 9798 0.0484390320890552 0.0484390320890552
+16031 9798 9799 0.00754569346896809 0.00754569346896809
+14334 2420 8925 0.0583291679544673 0.0583291679544673
+12784 8834 5470 0.171286135301765 0.171286135301765
+12785 5470 8835 0.178924287864237 0.178924287864237
+16033 9799 9800 0.00706845342179734 0.00706845342179734
+14357 513 9331 0.0549879463430077 0.0549879463430077
+12804 3763 2560 0.0898130023336766 0.0898130023336766
+12820 8849 8848 0.188203677867594 0.188203677867594
+16035 9800 6871 0.0378217549395311 0.0378217549395311
+20159 6155 10163 0.0614761289722609 0.0614761289722609
+12915 967 5281 0.138474892352542 0.138474892352542
+16687 9988 8314 0.0384286340006129 0.0384286340006129
+12991 8908 306 0.0182421240862306 0.0182421240862306
+13032 8926 8928 0.185901221322606 0.185901221322606
+16689 1824 9989 0.0121513664645164 0.0121513664645164
+13107 8963 8964 0.0484369444463125 0.0484369444463125
+19516 10539 10536 0.00249155177103479 0.00249155177103479
+19470 10514 10515 0.0196261730033966 0.0196261730033966
+13156 8988 8989 0.00631722030409862 0.00631722030409862
+19649 10600 10601 0.0174353644977756 0.0174353644977756
+18928 10405 10396 0.00112670264684339 0.00112670264684339
+18410 10288 8327 0.00700530123739539 0.00700530123739539
+14672 9414 4877 0.190941051800692 0.190941051800692
+14673 4877 2227 0.162460717202061 0.162460717202061
+13231 4409 9009 0.223227137223831 0.223227137223831
+237 31 134 0.108163538194537 0.108163538194537
+14831 8322 5668 0.0494625040984646 0.0494625040984646
+18415 8376 3409 0.101754880454598 0.101754880454598
+15848 9733 9731 0.0169747446876837 0.0169747446876837
+13335 3971 7017 0.0998321056196178 0.0998321056196178
+18626 2258 9475 0.0453120140623152 0.0453120140623152
+13471 9095 9092 0.294331677800491 0.294331677800491
+13512 7797 9114 0.0647363210214912 0.0647363210214912
+15901 9499 9500 0.157325995690783 0.157325995690783
+13697 9167 7423 0.127782150083045 0.127782150083045
+20289 10687 10697 0.00276887237539732 0.00276887237539732
+13718 8097 9171 0.00881240787098174 0.00881240787098174
+13751 9178 9130 0.0262505906254233 0.0262505906254233
+15391 9259 9571 0.107861175514815 0.107861175514815
+15783 2106 9596 0.166115711722291 0.166115711722291
+13852 1774 4412 0.0465225826542141 0.0465225826542141
+20380 10763 10764 0.00723047037301379 0.00723047037301379
+15452 9609 9598 0.128875611115748 0.128875611115748
+14144 9287 4651 0.182099578171645 0.182099578171645
+15807 9712 7111 0.0179279183487844 0.0179279183487844
+14230 8860 4113 0.0915086936553939 0.0915086936553939
+15819 9705 8564 0.0112418070831931 0.0112418070831931
+14250 8157 7606 0.0899264482990573 0.0899264482990573
+19499 10526 10527 0.0418767441965843 0.0418767441965843
+16078 9814 9815 0.177867255933272 0.177867255933272
+14354 5520 6454 0.134959237439496 0.134959237439496
+16224 5835 9851 0.203722282298932 0.203722282298932
+14425 1233 6137 0.0491477874140339 0.0491477874140339
+16468 9914 9902 0.117059110726511 0.117059110726511
+16500 8890 8891 0.0884309215437497 0.0884309215437497
+16591 9948 8492 0.14561270804365 0.14561270804365
+16470 9915 3282 0.193717589764618 0.193717589764618
+14541 6915 9375 0.0102720812466755 0.0102720812466755
+16501 8891 3167 0.0148460110144783 0.0148460110144783
+16593 9949 9950 0.145366288858291 0.145366288858291
+14609 8990 8994 0.00979628795431279 0.00979628795431279
+14794 3335 7882 0.0961603685796077 0.0961603685796077
+17101 332 10014 0.240821045601335 0.240821045601335
+14816 9424 9425 0.0673114946358147 0.0673114946358147
+17065 9474 5478 0.175247470145414 0.175247470145414
+15103 3050 9489 0.102745543982247 0.102745543982247
+16898 8714 8743 0.201991786328297 0.201991786328297
+16402 9880 9878 0.04752967411177 0.04752967411177
+16959 10041 10042 0.0119234352124219 0.0119234352124219
+16556 9939 2889 0.0528287697048915 0.0528287697048915
+18646 5867 7412 0.177003576876814 0.177003576876814
+16623 9957 9958 0.00927766896119108 0.00927766896119108
+17017 10056 10054 0.00431206144532878 0.00431206144532878
+16635 9967 9937 0.0755376260933099 0.0755376260933099
+16636 9937 9968 0.0848568890148885 0.0848568890148885
+17507 8389 10114 0.0670519033214907 0.0670519033214907
+17069 675 9465 0.179146976203574 0.179146976203574
+17040 8988 10063 0.00586346085648923 0.00586346085648923
+18726 6207 7644 0.18227085937915 0.18227085937915
+18724 4060 7415 0.175525264809921 0.175525264809921
+16759 10010 55 0.0502605990705626 0.0502605990705626
+17565 10138 8539 0.0573375717149566 0.0573375717149566
+17283 8717 8746 0.200951019692623 0.200951019692623
+17285 76 3515 0.20373476556842 0.20373476556842
+17286 3515 4257 0.200873634983474 0.200873634983474
+17288 10023 5839 0.200541247802215 0.200541247802215
+18744 6227 5190 0.106449102002429 0.106449102002429
+17655 10140 480 0.0210901662616695 0.0210901662616695
+17657 8540 9827 0.194565529373187 0.194565529373187
+17427 10105 10106 0.0219929458534896 0.0219929458534896
+17857 10200 10197 0.0144828525731025 0.0144828525731025
+18236 7037 3424 0.201298115256081 0.201298115256081
+17786 8497 9214 0.0149001836759509 0.0149001836759509
+18667 5188 2601 0.176856921267491 0.176856921267491
+15257 8538 9547 0.0461864635130014 0.0461864635130014
+15834 9727 4582 0.339362052888466 0.339362052888466
+18239 6764 3988 0.20124356936137 0.20124356936137
+17648 223 227 0.245258634538467 0.245258634538467
+19708 10627 10621 0.090662464616454 0.090662464616454
+17961 10234 10235 0.0087318555012696 0.0087318555012696
+19710 10623 10628 0.0762458230270849 0.0762458230270849
+17727 3328 7879 0.104097845117031 0.104097845117031
+18725 7415 10336 0.0555461867275064 0.0555461867275064
+17748 10172 8285 0.147249823900369 0.147249823900369
+19600 10582 10478 0.00442384590255706 0.00442384590255706
+16294 2409 2439 0.0170153678743566 0.0170153678743566
+18663 2592 5184 0.178895247307371 0.178895247307371
+15835 4582 8370 0.135357878279395 0.135357878279395
+17987 10240 7225 0.133765909115813 0.133765909115813
+18776 10123 3737 0.13151506607382 0.13151506607382
+19243 10420 8480 0.0202782525837911 0.0202782525837911
+18831 10359 10360 0.0341232753962164 0.0341232753962164
+19553 6857 10560 0.00726201622420357 0.00726201622420357
+19940 9641 6649 0.164927985335569 0.164927985335569
+18941 4644 1269 0.146851000824624 0.146851000824624
+19118 10431 8430 0.136066207456442 0.136066207456442
+19278 10421 6707 0.0993066662474356 0.0993066662474356
+15836 8370 5297 0.134414346058358 0.134414346058358
+19047 901 9486 0.27949052314451 0.27949052314451
+19612 10586 10499 0.00658715235564877 0.00658715235564877
+15838 9728 7437 0.0439886907558265 0.0439886907558265
+19065 10422 5495 0.202007910819525 0.202007910819525
+15840 9729 9702 0.0777181684296862 0.0777181684296862
+15841 9702 9730 0.0351380099433058 0.0351380099433058
+19273 10425 10173 0.013664079145809 0.013664079145809
+19160 10429 10050 0.0518274489533285 0.0518274489533285
+20574 10861 10862 0.011368530817607 0.011368530817607
+19554 10560 10548 0.0725121719316359 0.0725121719316359
+19461 10477 10478 0.0230516224965269 0.0230516224965269
+19438 10491 6859 0.0113764020129076 0.0113764020129076
+19277 8487 10421 0.0474605500221532 0.0474605500221532
+19226 8479 10451 0.0120282782230604 0.0120282782230604
+19482 10486 10487 0.00666482250083992 0.00666482250083992
+19412 1903 7239 0.197394669243537 0.197394669243537
+19323 916 5917 0.178370202088171 0.178370202088171
+19329 10473 9894 0.0172442514416892 0.0172442514416892
+19662 10608 10609 0.151226661870126 0.151226661870126
+19357 3170 9949 0.0476976092634506 0.0476976092634506
+19703 10622 10623 0.11468932159706 0.11468932159706
+19379 9194 4397 0.102701543160846 0.102701543160846
+19846 10657 10658 0.207612047714745 0.207612047714745
+19735 10641 10642 0.0869223005082275 0.0869223005082275
+423 422 423 0.0170753331475834 0.0170753331475834
+18892 3649 3275 0.147518961348099 0.147518961348099
+20076 6318 8004 0.0509194903724274 0.0509194903724274
+20104 8546 2065 0.048454988097841 0.048454988097841
+20204 9321 10178 0.0841675532676054 0.0841675532676054
+20205 10178 8401 0.0611444527276629 0.0611444527276629
+259 266 267 0.0502803318432383 0.0502803318432383
+14829 6148 4022 0.133340280271954 0.133340280271954
+20293 10704 10700 0.011586826540776 0.011586826540776
+14835 7029 7396 0.0697085759052968 0.0697085759052968
+20259 10688 6471 0.00765068827927408 0.00765068827927408
+17971 10234 10239 0.0311817416438077 0.0311817416438077
+20294 10700 10709 0.0186270421112036 0.0186270421112036
+14868 8305 8308 0.0233992723150567 0.0233992723150567
+421 420 421 0.0887343803029098 0.0887343803029098
+424 254 424 0.214565868461505 0.214565868461505
+425 424 425 0.179345861037356 0.179345861037356
+18900 10380 10379 0.00404144992313864 0.00404144992313864
+312 320 321 0.234451594909332 0.234451594909332
+14897 6102 8202 0.215105101107824 0.215105101107824
+19648 10603 10600 0.0301818413703728 0.0301818413703728
+176 185 186 0.0998871295042773 0.0998871295042773
+20301 9381 10729 0.0209062182463086 0.0209062182463086
+196 205 208 0.198149371104724 0.198149371104724
+16280 9869 4511 0.0441265369006206 0.0441265369006206
+15850 9734 5596 0.0497405541513423 0.0497405541513423
+19563 7475 10566 0.00626126200522767 0.00626126200522767
+248 255 256 0.148914456277168 0.148914456277168
+14938 8158 7604 0.0947062136756459 0.0947062136756459
+305 313 314 0.0701186694040595 0.0701186694040595
+14691 3129 941 0.177390618833456 0.177390618833456
+371 263 372 0.159425481094297 0.159425481094297
+372 262 373 0.154271040601459 0.154271040601459
+373 374 375 0.0498842542371797 0.0498842542371797
+20302 6466 9378 0.155873782837014 0.155873782837014
+315 323 324 0.151711567725454 0.151711567725454
+554 548 549 0.0392699857827163 0.0392699857827163
+14993 7973 7142 0.0462138706300854 0.0462138706300854
+17218 6114 3199 0.202944002497817 0.202944002497817
+317 325 326 0.0648164274191724 0.0648164274191724
+17027 3490 3584 0.0598495371899439 0.0598495371899439
+652 642 643 0.0146721427737165 0.0146721427737165
+18423 8361 8333 0.20323919891824 0.20323919891824
+15011 9469 459 0.0480419410466021 0.0480419410466021
+15012 459 7107 0.043866666346984 0.043866666346984
+11803 8415 8416 0.145780714117446 0.145780714117446
+18731 8066 10337 0.199884513966678 0.199884513966678
+17082 4467 2789 0.134890565512634 0.134890565512634
+788 793 794 0.093857943582342 0.093857943582342
+15029 7883 3337 0.0968744267307773 0.0968744267307773
+18907 10384 10385 0.0177708173335528 0.0177708173335528
+11693 868 895 0.0109449511220029 0.0109449511220029
+16597 8570 5785 0.145695604703312 0.145695604703312
+17133 4238 3543 0.202299079539728 0.202299079539728
+18439 7914 2971 0.147770970542825 0.147770970542825
+16408 9882 9889 0.0253610023428754 0.0253610023428754
+16601 9952 7558 0.0955122170701592 0.0955122170701592
+15050 6016 979 0.0500664854607423 0.0500664854607423
+16409 9889 9879 0.0208518700779087 0.0208518700779087
+995 753 1009 0.150380388134057 0.150380388134057
+15070 9479 610 0.10571035032404 0.10571035032404
+16411 9459 9889 0.012002862934972 0.012002862934972
+1016 1028 1029 0.0655213058855568 0.0655213058855568
+15964 4362 1443 0.198880292667991 0.198880292667991
+16695 9599 9597 0.0527492023482324 0.0527492023482324
+19585 10576 7471 0.00669407122815783 0.00669407122815783
+1119 1135 1136 0.187278154980764 0.187278154980764
+15144 9498 6689 0.0114561417292809 0.0114561417292809
+15795 2323 2324 0.0158381890637799 0.0158381890637799
+20623 2706 10873 0.00650373799697247 0.00650373799697247
+1164 558 1182 0.0726820398635713 0.0726820398635713
+15984 7372 5328 0.126515384088506 0.126515384088506
+16002 9775 6870 0.0380746194857137 0.0380746194857137
+11807 8419 8395 0.147975384561768 0.147975384561768
+16009 9779 9780 0.0100019925159617 0.0100019925159617
+331 207 332 0.116329690490202 0.116329690490202
+20314 10735 10736 0.00660332250129021 0.00660332250129021
+1412 1265 1438 0.0988256135069692 0.0988256135069692
+15147 9501 1753 0.946728932771196 0.946728932771196
+542 536 537 0.223575651807191 0.223575651807191
+1437 1457 1458 0.00733898986406934 0.00733898986406934
+15845 9731 9732 0.0664836940914448 0.0664836940914448
+15172 9512 9513 0.0495248806719176 0.0495248806719176
+15173 9513 9514 0.0500036838355924 0.0500036838355924
+16841 10021 9876 0.0316463232135525 0.0316463232135525
+12011 7081 2030 0.145136996076302 0.145136996076302
+12961 1633 1631 0.0197483532588124 0.0197483532588124
+16037 9801 9802 0.187730927470077 0.187730927470077
+1680 1705 1706 0.200641448140145 0.200641448140145
+15255 9539 9533 0.0958097111651336 0.0958097111651336
+16278 9869 3639 0.110423900704732 0.110423900704732
+1701 1648 1723 0.062496099688971 0.062496099688971
+16118 8309 427 0.26882010834223 0.26882010834223
+250 257 258 0.156601202821138 0.156601202821138
+1726 1744 1745 1.09817431556355 1.09817431556355
+16141 9831 7016 0.0255913598249866 0.0255913598249866
+16142 7016 7028 0.027160195994677 0.027160195994677
+251 259 260 0.154968238345174 0.154968238345174
+1778 1796 1797 0.0510193327806952 0.0510193327806952
+15256 9533 9546 0.0701631467931239 0.0701631467931239
+4282 4025 4026 0.0836518662560613 0.0836518662560613
+4283 4026 2975 0.0536630317560949 0.0536630317560949
+252 261 262 0.0449524282619667 0.0449524282619667
+17948 10228 8780 0.031808150523084 0.031808150523084
+1803 1816 1817 0.0829077522721667 0.0829077522721667
+4294 2858 4032 0.190837980669502 0.190837980669502
+4296 4033 4034 0.0984313521955559 0.0984313521955559
+4297 4034 4035 0.124316100856361 0.124316100856361
+4299 1488 135 0.200939910778157 0.200939910778157
+4300 135 1703 0.200530915425065 0.200530915425065
+253 262 259 0.0587496721634218 0.0587496721634218
+1830 1846 1847 0.0521892409260155 0.0521892409260155
+4310 4043 1394 0.105949182025439 0.105949182025439
+4311 1394 4044 0.0525758001653233 0.0525758001653233
+4312 4044 4045 0.00275409212275412 0.00275409212275412
+4313 4045 4046 0.048684142933598 0.048684142933598
+4314 4046 4048 0.0522538202962548 0.0522538202962548
+11581 1889 1890 0.200726535096683 0.200726535096683
+254 259 263 0.0633181950748288 0.0633181950748288
+1901 1087 1914 0.0231926567105046 0.0231926567105046
+4323 4055 4056 0.0506868932206778 0.0506868932206778
+4324 4056 4057 0.0525415825536361 0.0525415825536361
+4325 4057 1106 0.049505238452812 0.049505238452812
+4326 1106 4058 0.103487473030962 0.103487473030962
+255 263 264 0.0528764032574804 0.0528764032574804
+1921 1933 1934 0.0492173865000396 0.0492173865000396
+1929 1942 1943 0.119118027307007 0.119118027307007
+4337 4067 4068 0.0478289627129219 0.0478289627129219
+4338 4068 4069 0.0505441496304245 0.0505441496304245
+4339 4069 4070 0.0498130318292156 0.0498130318292156
+4342 4071 4072 0.0561534117303384 0.0561534117303384
+4343 4072 4073 0.0484769480819301 0.0484769480819301
+18384 8960 8961 0.0519015690499355 0.0519015690499355
+544 538 539 0.0154777376492066 0.0154777376492066
+2042 2050 2051 0.199194779708592 0.199194779708592
+12337 8654 8655 0.0104809427005404 0.0104809427005404
+4355 3965 4081 0.411489005127648 0.411489005127648
+4356 4081 4082 0.106344190536588 0.106344190536588
+4358 4083 1074 0.0829286899836406 0.0829286899836406
+4359 1074 2497 0.0840300949352524 0.0840300949352524
+16773 3182 3277 0.192234323904948 0.192234323904948
+2067 2069 2070 0.202510221820354 0.202510221820354
+19432 8707 10110 0.0968673163006813 0.0968673163006813
+4370 4092 4093 0.0521723369054183 0.0521723369054183
+4373 4095 4096 0.0511584997280867 0.0511584997280867
+4374 4096 4097 0.0510055304226098 0.0510055304226098
+14753 6934 5930 0.0358835820845479 0.0358835820845479
+545 539 540 0.260599478311813 0.260599478311813
+2113 2114 2115 0.0866449228578761 0.0866449228578761
+12341 2501 8642 0.0589286767766051 0.0589286767766051
+4383 4104 2729 0.0487767884709024 0.0487767884709024
+4387 748 1566 0.142516569011717 0.142516569011717
+16443 9900 9901 0.201666693845683 0.201666693845683
+546 540 541 0.0326517480806501 0.0326517480806501
+547 541 542 0.0254047336234174 0.0254047336234174
+2158 2156 2157 0.218243127550759 0.218243127550759
+2160 2158 2159 0.0821511858388999 0.0821511858388999
+16173 4250 9840 0.39197341800201 0.39197341800201
+19464 10508 10509 0.0204161788330557 0.0204161788330557
+18178 5791 6050 0.202074681821779 0.202074681821779
+20702 10891 10902 0.0170035110425561 0.0170035110425561
+16216 8620 7903 0.142599898878985 0.142599898878985
+11816 2201 2202 0.15535054028393 0.15535054028393
+17089 9940 8134 0.138649146182337 0.138649146182337
+17090 8134 3689 0.141996254884573 0.141996254884573
+2222 2222 2223 0.0488100805647676 0.0488100805647676
+2223 2223 2224 0.0512642786009998 0.0512642786009998
+14639 2243 2244 0.0354564943031107 0.0354564943031107
+17091 3689 4597 0.241148863142693 0.241148863142693
+2264 2264 2265 0.176035436319457 0.176035436319457
+14641 2244 2272 0.0187003459565438 0.0187003459565438
+16312 2722 2929 0.0126176772334624 0.0126176772334624
+14127 419 417 0.0606641044076811 0.0606641044076811
+2285 2284 2285 0.184338950183701 0.184338950183701
+17024 10059 6431 0.0170040072643452 0.0170040072643452
+20326 10744 10738 0.00650370546328925 0.00650370546328925
+2307 2304 1995 0.0793159537973265 0.0793159537973265
+16363 7010 2769 0.112453696268037 0.112453696268037
+16364 2769 3365 0.103853901930967 0.103853901930967
+20334 2967 10745 0.0137335338280324 0.0137335338280324
+2375 2363 964 0.101155075878388 0.101155075878388
+16463 9886 1081 0.198408324686945 0.198408324686945
+16466 9913 9912 0.00925208668760351 0.00925208668760351
+17365 10091 3085 0.200980490545583 0.200980490545583
+17304 4258 8744 0.201266280518922 0.201266280518922
+2443 2434 2435 0.0498096064689081 0.0498096064689081
+18192 6053 4068 0.142529657997643 0.142529657997643
+16717 5546 10002 2.41636756690016 2.41636756690016
+14694 4875 4946 0.19209064576365 0.19209064576365
+2465 1228 2455 0.0986019921641189 0.0986019921641189
+17232 243 244 0.123936016070967 0.123936016070967
+17233 244 245 0.0423914167747626 0.0423914167747626
+17234 245 30 0.0421885133223055 0.0421885133223055
+17235 30 31 0.0623462807475453 0.0623462807475453
+20321 10740 10741 0.00961494122957245 0.00961494122957245
+20520 10845 10841 0.0515194041185215 0.0515194041185215
+19715 10630 10631 0.0208944523636977 0.0208944523636977
+14699 4164 4773 0.260608636385053 0.260608636385053
+2587 2559 2560 0.109781786773584 0.109781786773584
+18391 7038 3425 0.202488499072253 0.202488499072253
+18395 2554 3861 0.207477450927098 0.207477450927098
+20741 10913 7366 0.0901821833329384 0.0901821833329384
+2613 2576 2373 0.0436228403965834 0.0436228403965834
+19620 10524 10589 0.00570573305761744 0.00570573305761744
+18401 1425 7176 0.174145888646233 0.174145888646233
+20347 10745 10747 0.0185775892434006 0.0185775892434006
+2677 2638 2639 0.294941945704345 0.294941945704345
+19655 10606 10607 0.00514986150833142 0.00514986150833142
+18881 7249 3271 0.203031342103983 0.203031342103983
+20742 7366 10907 0.0328095866921768 0.0328095866921768
+2729 2684 2685 0.0539600310135124 0.0539600310135124
+17508 10114 10116 0.025112430125901 0.025112430125901
+17946 10225 10226 0.00737359034109891 0.00737359034109891
+14688 2393 2798 0.189312144234638 0.189312144234638
+18130 10265 6045 0.200929523136355 0.200929523136355
+2876 2499 2821 0.136005417598284 0.136005417598284
+12974 2797 2822 0.0772628603550689 0.0772628603550689
+19658 9394 8493 0.0491161384071996 0.0491161384071996
+19659 8493 6763 0.145715875084599 0.145715875084599
+14698 5033 4164 0.121872885708228 0.121872885708228
+17172 3092 5304 0.202230215982892 0.202230215982892
+3021 2953 2954 0.00990774005844554 0.00990774005844554
+19694 10618 8145 0.956513774549446 0.956513774549446
+19803 5200 10646 0.12476083696761 0.12476083696761
+14722 4871 6016 0.191389811056615 0.191389811056615
+20794 8908 10948 0.0132755925041989 0.0132755925041989
+19880 10672 2617 0.0529554442967168 0.0529554442967168
+19918 6233 5202 0.175854776488408 0.175854776488408
+18502 9278 9526 0.133752339971597 0.133752339971597
+3064 2995 2996 0.132712872312529 0.132712872312529
+19901 10663 10676 0.0513919786820835 0.0513919786820835
+19973 10306 619 0.00429215823862154 0.00429215823862154
+17075 7842 828 0.141317632530522 0.141317632530522
+17970 10238 10234 0.0188321983270746 0.0188321983270746
+18897 10377 10378 0.0131134839493858 0.0131134839493858
+17180 5449 5450 0.206640976814444 0.206640976814444
+17113 3932 3959 0.0402088808240704 0.0402088808240704
+19990 10684 10682 0.0498254818797545 0.0498254818797545
+18513 9294 10302 0.00151227516682341 0.00151227516682341
+3252 2365 3163 0.175456016528149 0.175456016528149
+19267 10446 8486 0.0130023858176566 0.0130023858176566
+15217 9530 539 0.0270882933911684 0.0270882933911684
+18503 9526 9353 0.135313261796309 0.135313261796309
+18902 10378 10381 0.0118745691698922 0.0118745691698922
+20282 10710 10722 0.0492625817369533 0.0492625817369533
+19437 10490 10491 0.0516785382045006 0.0516785382045006
+16422 3358 3034 0.0480216533576434 0.0480216533576434
+17185 5659 5660 0.024871407903781 0.024871407903781
+18512 10302 9294 0.00151227516682341 0.00151227516682341
+18681 3185 3408 0.173742073092489 0.173742073092489
+15235 9533 9534 0.025845258726166 0.025845258726166
+15243 9534 9535 0.0751513734309232 0.0751513734309232
+14715 5686 5687 0.105315223547906 0.105315223547906
+19826 10647 9253 0.122215184303521 0.122215184303521
+20299 10728 5578 0.0498927645754841 0.0498927645754841
+15281 9557 9556 0.01686832436596 0.01686832436596
+15283 9557 9558 0.0154433036380546 0.0154433036380546
+17312 5705 5706 0.401673875470838 0.401673875470838
+3564 3426 3427 0.0516847701108369 0.0516847701108369
+15400 9579 3315 0.0326402169295471 0.0326402169295471
+15402 9580 9581 0.331383974435327 0.331383974435327
+15403 9582 9583 0.0120173707764648 0.0120173707764648
+18689 1859 5770 0.176521953507317 0.176521953507317
+3659 3496 3497 0.100604510338319 0.100604510338319
+15426 8637 4935 0.0862034738049073 0.0862034738049073
+15429 9597 8608 0.0815311130388188 0.0815311130388188
+14717 933 5818 0.11375652775637 0.11375652775637
+3704 3540 3541 0.0487079158287504 0.0487079158287504
+20304 9382 10728 0.0315682813160642 0.0315682813160642
+15490 9618 8464 0.061043367869745 0.061043367869745
+15492 9627 9626 0.0311123551122936 0.0311123551122936
+17382 5814 2314 0.0781390219671105 0.0781390219671105
+20431 10791 10754 0.00545772790966665 0.00545772790966665
+3935 3733 3734 0.176323868665952 0.176323868665952
+20425 10786 10787 0.0471980291688183 0.0471980291688183
+16275 9868 3657 0.128315234485653 0.128315234485653
+17111 3775 3776 0.0186255054019669 0.0186255054019669
+20436 10794 10795 0.0773551964908624 0.0773551964908624
+4030 3814 3815 0.205898323776278 0.205898323776278
+14114 3768 3623 0.0676593021490157 0.0676593021490157
+20311 10732 10733 0.00871128803713245 0.00871128803713245
+17485 321 4992 0.0357053960194593 0.0357053960194593
+4135 1293 3896 0.0646203690871901 0.0646203690871901
+16181 9842 5547 0.812121023854291 0.812121023854291
+15562 9299 9657 0.183361943567776 0.183361943567776
+15563 9657 3803 0.198879262059456 0.198879262059456
+18244 9371 2433 0.198605382792158 0.198605382792158
+20442 10799 10800 0.0197706815366264 0.0197706815366264
+4153 2788 3908 0.132166336514103 0.132166336514103
+19582 10575 10562 0.0700205995742609 0.0700205995742609
+16266 7738 5831 0.20157737543677 0.20157737543677
+17685 6154 6155 0.459645187119716 0.459645187119716
+4242 3991 3227 0.0177155969329486 0.0177155969329486
+4243 3227 3992 0.0329982706824684 0.0329982706824684
+19465 10509 10510 0.0192818852758557 0.0192818852758557
+20445 10801 10802 0.0205768304881295 0.0205768304881295
+4285 658 1885 0.048605694225596 0.048605694225596
+14724 5469 977 0.135303141818757 0.135303141818757
+4308 4042 3999 0.107188720026654 0.107188720026654
+15626 9687 9688 0.091295408872665 0.091295408872665
+18437 10292 8442 0.00675422790693776 0.00675422790693776
+20447 10794 10803 0.118731077964576 0.118731077964576
+4347 4075 4076 0.0470687599943484 0.0470687599943484
+4349 1002 4077 0.216843974938131 0.216843974938131
+20454 10809 10810 0.100342747602662 0.100342747602662
+4420 4130 4131 0.121697779505431 0.121697779505431
+19593 10478 10580 0.068856662719705 0.068856662719705
+20625 10804 10874 0.0625386897444795 0.0625386897444795
+18253 3979 6754 0.201867515357413 0.201867515357413
+4514 4194 4195 0.10298973821829 0.10298973821829
+15674 9685 9686 0.0593326737516342 0.0593326737516342
+20460 10813 10814 0.0263810628539784 0.0263810628539784
+4540 1339 4214 0.206331927913881 0.206331927913881
+15694 7269 2024 0.188168800569156 0.188168800569156
+19466 10510 10511 0.0234630277187848 0.0234630277187848
+20626 10788 10875 0.12707186988651 0.12707186988651
+14733 6342 4868 0.191023303912105 0.191023303912105
+18638 7383 5180 0.100367385774354 0.100367385774354
+15713 1050 3913 0.111080496528689 0.111080496528689
+18173 6048 6420 0.20192046475531 0.20192046475531
+4662 1707 4301 0.203353286347824 0.203353286347824
+15737 3771 8867 0.1545281811215 0.1545281811215
+18694 6025 5978 0.00688297127309608 0.00688297127309608
+18468 10298 9138 0.0199498887128462 0.0199498887128462
+17131 4372 1799 0.197593407061799 0.197593407061799
+15759 3487 5346 0.100946337054167 0.100946337054167
+20632 8227 6090 0.135158757751447 0.135158757751447
+18263 6067 6514 0.193791754137247 0.193791754137247
+4805 4410 4411 0.102107994490615 0.102107994490615
+19823 9252 7641 0.177252004679102 0.177252004679102
+15778 9119 9707 0.0214606208419429 0.0214606208419429
+15780 9707 9703 0.181325566879256 0.181325566879256
+14737 4770 6526 0.178169149120729 0.178169149120729
+4824 534 475 0.0459278377034575 0.0459278377034575
+15830 7134 9724 0.00382519149625338 0.00382519149625338
+434 433 364 0.11596793090747 0.11596793090747
+17139 4488 3200 0.20282742100359 0.20282742100359
+20710 7365 10885 0.00202939174918317 0.00202939174918317
+20738 10886 10887 0.038658244493302 0.038658244493302
+4921 4492 4493 0.0619945774719425 0.0619945774719425
+18268 2438 5736 0.170878783790289 0.170878783790289
+4947 3640 4511 0.128546240241841 0.128546240241841
+2413 2403 2404 0.136554071110129 0.136554071110129
+11806 8418 8419 0.144478674207108 0.144478674207108
+470 473 474 0.189801845816516 0.189801845816516
+14741 3802 5935 0.15521301123556 0.15521301123556
+4998 4544 4545 0.135440573029242 0.135440573029242
+2670 2628 2629 0.199951181775354 0.199951181775354
+18532 10307 7540 0.709454997862857 0.709454997862857
+5075 4599 1025 0.0544629152641776 0.0544629152641776
+17143 4616 4617 0.200408905820063 0.200408905820063
+20669 10890 10891 0.0251214927041886 0.0251214927041886
+14743 931 2216 0.184594913416957 0.184594913416957
+5094 4615 4618 0.110635552941058 0.110635552941058
+19633 10594 10505 0.00660487490366482 0.00660487490366482
+20709 10913 7365 0.234512277592806 0.234512277592806
+20713 5881 10915 0.0114767201911695 0.0114767201911695
+18275 6667 1427 0.0124761175920816 0.0124761175920816
+18575 10323 10324 0.133190640971179 0.133190640971179
+19540 10553 10554 0.069921649249612 0.069921649249612
+19541 10554 7472 0.00672748885261455 0.00672748885261455
+19542 7472 10555 0.00636055689076091 0.00636055689076091
+20479 10827 10828 0.0321786032396296 0.0321786032396296
+5172 3232 4672 0.135963226577445 0.135963226577445
+17294 8754 10015 0.202671913712405 0.202671913712405
+23 24 25 0.131395177842502 0.131395177842502
+24 25 26 0.132981987743145 0.132981987743145
+18535 5555 10308 0.537923452261619 0.537923452261619
+5196 4693 4694 0.101324047402986 0.101324047402986
+17084 505 4047 0.193244409170512 0.193244409170512
+20013 7896 8858 0.144841565186615 0.144841565186615
+18281 6757 6460 0.11412288805936 0.11412288805936
+5239 4723 4724 0.173697663092072 0.173697663092072
+57 61 62 0.0954500024095661 0.0954500024095661
+18609 5208 6228 0.175202487961463 0.175202487961463
+18543 10313 5554 0.549870500653692 0.549870500653692
+5310 4766 3155 0.0172249530452766 0.0172249530452766
+78 84 85 0.0505639086324271 0.0505639086324271
+19778 10632 5380 0.0979518829901303 0.0979518829901303
+20481 10792 10829 0.0269599370404467 0.0269599370404467
+5457 4876 4877 0.0499120224253174 0.0499120224253174
+96 101 102 0.0321305027576107 0.0321305027576107
+97 102 103 0.0620448910426151 0.0620448910426151
+18782 10348 10344 0.0162360672802701 0.0162360672802701
+5478 4135 4890 0.0934025271750886 0.0934025271750886
+121 128 129 0.177008602394702 0.177008602394702
+244 251 252 0.175978023607631 0.175978023607631
+18294 6901 1428 0.00619376962359973 0.00619376962359973
+5500 4907 4908 0.100175479072509 0.100175479072509
+140 148 149 0.0975727004199176 0.0975727004199176
+393 395 396 0.169106051700542 0.169106051700542
+18784 10348 10349 0.00525970147109288 0.00525970147109288
+5522 4924 4677 0.103650586835971 0.103650586835971
+18546 7539 10314 0.65633531431652 0.65633531431652
+18297 6968 6995 0.202610377838011 0.202610377838011
+5676 3669 5032 0.215322761034264 0.215322761034264
+173 182 183 0.0984047094047537 0.0984047094047537
+174 183 184 0.100655002347226 0.100655002347226
+16515 5454 5455 0.104997960992542 0.104997960992542
+20485 10832 10763 0.0351600114003883 0.0351600114003883
+5779 2576 4917 0.032816005995912 0.032816005995912
+192 202 203 0.199740801936021 0.199740801936021
+193 203 169 0.402428218597258 0.402428218597258
+14755 5931 927 0.177893389603082 0.177893389603082
+5803 5121 5122 0.103540820168727 0.103540820168727
+225 49 236 0.00807621055546913 0.00807621055546913
+18672 1538 1539 0.106836085520251 0.106836085520251
+14756 927 2212 0.186014347432929 0.186014347432929
+5852 1967 4622 0.105142035615429 0.105142035615429
+282 292 293 0.038589084717098 0.038589084717098
+283 293 294 0.0763501630731075 0.0763501630731075
+285 295 296 0.17581051150028 0.17581051150028
+14758 4862 7101 0.190667289560019 0.190667289560019
+5875 4334 5174 0.0464101693595893 0.0464101693595893
+350 351 352 0.0901523030384508 0.0901523030384508
+353 355 356 0.108591561133878 0.108591561133878
+369 370 371 0.00989155289209397 0.00989155289209397
+18304 7116 6758 0.139614208847036 0.139614208847036
+517 511 512 0.231881303387922 0.231881303387922
+518 512 513 0.0504031171767775 0.0504031171767775
+12256 8620 8618 0.1042966231246 0.1042966231246
+6051 5293 5294 0.1322760806231 0.1322760806231
+18305 6758 3982 0.20021257935936 0.20021257935936
+574 248 567 0.654270176053915 0.654270176053915
+575 264 568 0.0404038185731676 0.0404038185731676
+19637 10596 10597 0.0126826750829723 0.0126826750829723
+20403 10761 10778 0.00417068578422797 0.00417068578422797
+6437 2444 5569 0.02055703905507 0.02055703905507
+614 605 606 0.0427456634033912 0.0427456634033912
+11697 1006 1032 0.0356944242966225 0.0356944242966225
+18485 7779 9146 0.0491523501803915 0.0491523501803915
+19922 7869 3723 0.102610678307364 0.102610678307364
+20528 10783 10029 0.0108754318867703 0.0108754318867703
+6839 2922 5305 0.104995892978265 0.104995892978265
+634 544 624 0.0671323040254876 0.0671323040254876
+635 624 625 0.00434381837571047 0.00434381837571047
+20428 10788 10789 0.0563042197472527 0.0563042197472527
+18340 7633 7634 0.201343863199868 0.201343863199868
+20531 2704 10847 0.00595682994262844 0.00595682994262844
+18337 7624 2435 0.20163475178063 0.20163475178063
+655 645 646 0.15124021105117 0.15124021105117
+11518 656 657 0.200075413530476 0.200075413530476
+18341 7634 7661 0.00671626059696149 0.00671626059696149
+18342 7661 7662 0.197150609042501 0.197150609042501
+6951 5687 5936 0.0500693590985736 0.0500693590985736
+6952 5936 5453 0.049749026364738 0.049749026364738
+18121 10257 2538 0.176222237628552 0.176222237628552
+18344 5247 6874 0.0949718672307841 0.0949718672307841
+20408 10778 8971 0.00240570116723256 0.00240570116723256
+7025 5987 5146 0.0839973170950687 0.0839973170950687
+687 680 681 0.00253308666004397 0.00253308666004397
+688 681 682 0.0177686502456197 0.0177686502456197
+20536 10790 10850 0.034182335159618 0.034182335159618
+18351 6756 3981 0.199906908242653 0.199906908242653
+7046 5996 5997 0.0183612294578931 0.0183612294578931
+7047 5997 5998 0.0939822022965603 0.0939822022965603
+16701 9996 9997 0.0529811614609842 0.0529811614609842
+20223 10711 10712 0.0485921897229188 0.0485921897229188
+7066 4209 6007 0.100592936440223 0.100592936440223
+719 715 716 0.14011322934495 0.14011322934495
+18164 6036 4091 0.184872985391224 0.184872985391224
+18360 7775 7374 0.049527285222362 0.049527285222362
+7242 1086 6117 0.0183572728116315 0.0183572728116315
+20444 10797 10801 0.0204844414155983 0.0204844414155983
+14778 5928 925 0.176931188736704 0.176931188736704
+7325 6163 6164 0.404282808510336 0.404282808510336
+757 756 757 0.0403523543057396 0.0403523543057396
+758 758 759 0.10406364243601 0.10406364243601
+20552 10810 10855 0.0274674933149076 0.0274674933149076
+7375 340 337 0.0516827997381363 0.0516827997381363
+778 783 784 0.143355100800641 0.143355100800641
+18365 1660 7716 0.0501099513590678 0.0501099513590678
+7418 5550 6228 0.0493634763375772 0.0493634763375772
+798 803 806 1.01502432527974 1.01502432527974
+20237 10712 8819 0.0494540965066323 0.0494540965066323
+7441 1600 1601 0.0713701116113288 0.0713701116113288
+814 825 826 0.10637782371988 0.10637782371988
+815 826 827 0.107195537700229 0.107195537700229
+20239 10716 10717 0.029516495512001 0.029516495512001
+7466 2930 5311 0.101596891275597 0.101596891275597
+836 849 850 0.0925483728292225 0.0925483728292225
+837 850 851 0.184151560988971 0.184151560988971
+20241 8817 10717 0.0237033604501814 0.0237033604501814
+7541 6292 65 0.186329349943054 0.186329349943054
+857 870 871 0.202831473953724 0.202831473953724
+14121 4084 3945 0.0818484712615532 0.0818484712615532
+18787 10347 10345 0.045081440573134 0.045081440573134
+7826 2505 6454 0.100016861256994 0.100016861256994
+876 889 890 0.105571186658179 0.105571186658179
+877 890 891 0.105688383652669 0.105688383652669
+11418 8067 8068 0.0483239948134963 0.0483239948134963
+7848 6464 6465 0.0519215197465546 0.0519215197465546
+894 908 909 0.110040792413973 0.110040792413973
+896 910 911 0.148938852784508 0.148938852784508
+11420 8068 8077 0.744996900508782 0.744996900508782
+7872 6484 6485 0.109350713693358 0.109350713693358
+914 928 929 0.0454506765778274 0.0454506765778274
+15223 8102 5299 0.0276921695746079 0.0276921695746079
+16761 10006 10010 0.188081556068426 0.188081556068426
+20354 9336 10730 0.00773852906846938 0.00773852906846938
+7965 6543 6544 0.0483732045653669 0.0483732045653669
+954 966 967 0.0990431305437434 0.0990431305437434
+19650 10601 10604 0.0245600833310456 0.0245600833310456
+18271 6463 6629 0.159535181156963 0.159535181156963
+20358 10736 9208 0.00987870578899212 0.00987870578899212
+11333 3953 8218 0.0887906096153549 0.0887906096153549
+976 987 988 0.0367128135573791 0.0367128135573791
+18911 10389 10390 0.0499832893351177 0.0499832893351177
+8132 6646 6647 0.176189320777164 0.176189320777164
+20359 9208 8992 0.00952006614931064 0.00952006614931064
+18533 7540 5565 0.0799101067174197 0.0799101067174197
+15227 8248 1474 0.0211145699437457 0.0211145699437457
+11427 8252 8251 0.0497577863871374 0.0497577863871374
+8228 5488 6699 0.203871251538877 0.203871251538877
+1013 1025 1026 0.240326237485559 0.240326237485559
+1014 1026 1027 0.140197604091005 0.140197604091005
+11524 8299 6771 0.0679188084680006 0.0679188084680006
+8280 6724 1837 0.0673898837011532 0.0673898837011532
+16769 3180 3279 0.131366088579917 0.131366088579917
+11560 7714 8320 0.204692599225755 0.204692599225755
+18785 10349 3941 0.0399279993421446 0.0399279993421446
+1055 1071 1072 0.193562714729093 0.193562714729093
+18374 2425 6794 0.0832162654729584 0.0832162654729584
+8378 6787 5475 0.176557126416642 0.176557126416642
+1079 1095 1096 0.106445830238736 0.106445830238736
+1081 1097 1098 0.0486277340974482 0.0486277340974482
+18378 2549 8381 0.409599255943821 0.409599255943821
+8425 4370 2496 0.102227972652095 0.102227972652095
+1101 1117 1118 0.104134759343337 0.104134759343337
+19670 9361 9367 0.104968988119014 0.104968988119014
+11768 8406 8391 0.072368398733761 0.072368398733761
+11405 6191 577 0.346853696348124 0.346853696348124
+11711 2125 2126 0.0693722119224359 0.0693722119224359
+1121 1137 1138 0.209246619241212 0.209246619241212
+11896 1345 8466 0.0539854948645785 0.0539854948645785
+8519 3823 6870 0.0122276886226055 0.0122276886226055
+1142 1161 1045 0.106182749069371 0.106182749069371
+1143 1045 1162 0.0572035723632033 0.0572035723632033
+11949 8497 8498 0.0157235898061176 0.0157235898061176
+8563 6893 6894 0.0563604312984052 0.0563604312984052
+1161 1180 1181 0.108807320753836 0.108807320753836
+1162 1181 555 0.0264412731929892 0.0264412731929892
+11990 6574 4455 0.147936408791814 0.147936408791814
+8587 6905 6906 0.00825706398143248 0.00825706398143248
+1181 1196 1197 0.0308045840002764 0.0308045840002764
+16676 9978 9979 0.0911222888155273 0.0911222888155273
+12046 8525 8526 0.0214801658544325 0.0214801658544325
+8609 4639 1260 0.0990232299326886 0.0990232299326886
+20366 10746 10748 0.00389959559054649 0.00389959559054649
+8754 6984 6985 0.142274771709776 0.142274771709776
+15273 8632 8698 0.0321488809830426 0.0321488809830426
+12327 8651 8462 0.0863896937468126 0.0863896937468126
+8825 7022 7023 0.132397309217195 0.132397309217195
+15906 8604 1831 0.0312706435771371 0.0312706435771371
+8982 704 420 0.200616718436647 0.200616718436647
+1261 1282 24 0.134590345997008 0.134590345997008
+18452 7704 9427 0.203142152499049 0.203142152499049
+12940 8766 1971 0.0880952038111177 0.0880952038111177
+12050 8529 8530 0.0322062217802774 0.0322062217802774
+1281 1306 1307 0.102064457561207 0.102064457561207
+12052 8529 8412 0.0524928623134227 0.0524928623134227
+20805 10934 7427 0.00626540347624637 0.00626540347624637
+9106 7163 7164 0.0532969377049032 0.0532969377049032
+1301 1326 1327 0.0908036524111016 0.0908036524111016
+1302 1327 1328 0.187321516717609 0.187321516717609
+20389 10773 10765 0.00486729953892219 0.00486729953892219
+20812 7034 10952 0.00504516380305115 0.00504516380305115
+12945 8883 8884 0.0693524767029838 0.0693524767029838
+9177 1813 7200 0.0899820045120437 0.0899820045120437
+12258 8619 8617 0.025123815719297 0.025123815719297
+9178 132 7201 0.0532452299195118 0.0532452299195118
+13064 8946 8947 0.0850173355126965 0.0850173355126965
+9301 7274 6989 0.145898107890786 0.145898107890786
+1340 1368 1369 0.19896343011117 0.19896343011117
+20815 7168 10919 0.00784309361436635 0.00784309361436635
+9323 7286 7287 0.0531798537803958 0.0531798537803958
+18312 7244 7291 0.112193704343122 0.112193704343122
+20817 10953 10288 0.00348743524444471 0.00348743524444471
+20818 10288 10921 0.00283999263123215 0.00283999263123215
+9345 7305 6323 0.0511693918815177 0.0511693918815177
+20831 10939 10947 0.189387199061175 0.189387199061175
+20504 10061 10815 0.00579629159172248 0.00579629159172248
+12268 8625 8626 0.00924470302738606 0.00924470302738606
+18317 7365 7366 0.190091232151663 0.190091232151663
+18915 10393 10394 0.0257178211457629 0.0257178211457629
+9548 5843 7400 0.197969196756037 0.197969196756037
+1402 1428 1429 0.0514192906451236 0.0514192906451236
+19551 10559 10558 0.0350073244923259 0.0350073244923259
+20372 10756 10757 0.119877702556756 0.119877702556756
+18474 9006 9005 0.01365486811001 0.01365486811001
+9618 6255 7423 0.201105238361345 0.201105238361345
+1423 1446 1447 0.102065186535373 0.102065186535373
+12355 8667 8662 0.00824054620763183 0.00824054620763183
+13473 9096 9097 0.0791788196488147 0.0791788196488147
+13558 9033 9033 0.000550802138422688 0.000550802138422688
+9720 5436 7485 0.210597915191446 0.210597915191446
+1445 1465 778 0.201931327083159 0.201931327083159
+16745 10007 6830 0.0463356709963923 0.0463356709963923
+18484 9139 9145 0.0170083591694009 0.0170083591694009
+18486 9146 1121 0.0502889247784144 0.0502889247784144
+13588 9137 9132 0.0916872062208973 0.0916872062208973
+18564 10320 10321 0.148893183386122 0.148893183386122
+1470 1490 1454 0.0984270848036789 0.0984270848036789
+11793 8412 1301 0.0102820603565046 0.0102820603565046
+13649 9157 9158 0.11057157733623 0.11057157733623
+9923 7595 5945 0.197471792675123 0.197471792675123
+1492 1512 1513 0.240760864140441 0.240760864140441
+1493 1513 1514 0.0903356876724302 0.0903356876724302
+18489 9154 9164 0.0526957444463644 0.0526957444463644
+9949 7606 7607 0.0349507847949759 0.0349507847949759
+1512 1531 1532 0.421840818868262 0.421840818868262
+1514 1533 1534 0.0990053945754622 0.0990053945754622
+18920 10391 10399 0.0111591670236662 0.0111591670236662
+10025 6642 3954 0.137704462550789 0.137704462550789
+1533 1556 1557 0.0904418216599082 0.0904418216599082
+1535 1558 1559 0.0987505899129773 0.0987505899129773
+19486 10409 10426 0.0202821728904968 0.0202821728904968
+10050 7651 7652 0.0462326431468639 0.0462326431468639
+1552 1577 1578 0.0904564264247089 0.0904564264247089
+1554 1579 1580 0.0903173650147356 0.0903173650147356
+18611 2585 1850 0.178619647699559 0.178619647699559
+19139 479 10436 0.0608772998887891 0.0608772998887891
+10147 7693 7694 0.00731957097451548 0.00731957097451548
+1571 1598 1600 0.0527554061663716 0.0527554061663716
+18460 6389 9354 0.131365686337894 0.131365686337894
+13942 9095 9242 0.111189675764469 0.111189675764469
+10218 6638 5410 0.0525082825873588 0.0525082825873588
+11529 809 810 0.133518358438394 0.133518358438394
+16258 9267 3529 0.187765741537081 0.187765741537081
+10288 7759 7760 0.0990614933501691 0.0990614933501691
+1610 1640 1641 0.0829769157452624 0.0829769157452624
+1611 1641 1642 0.0110107206173314 0.0110107206173314
+14142 478 9286 0.110440686979957 0.110440686979957
+10359 6835 4056 0.176947127899101 0.176947127899101
+10360 4056 7791 0.153314942388554 0.153314942388554
+16039 9796 9803 0.17034831343451 0.17034831343451
+20229 8818 8827 0.0165504595782256 0.0165504595782256
+15466 9616 9605 0.0511543414269977 0.0511543414269977
+10664 7914 2973 0.0665734173113744 0.0665734173113744
+1646 1673 1674 0.136622102626379 0.136622102626379
+1647 1674 1675 0.135851990536989 0.135851990536989
+15467 9605 7963 0.0172079120084978 0.0172079120084978
+1668 1693 1694 0.101380870701686 0.101380870701686
+11218 3630 8166 0.0456744230751041 0.0456744230751041
+15788 9639 9625 0.0212057259943503 0.0212057259943503
+11369 8219 7971 0.0335395055556045 0.0335395055556045
+16195 7725 5820 0.195527635044049 0.195527635044049
+16196 5820 7207 0.20506620423787 0.20506620423787
+11659 7036 3421 0.201375612760589 0.201375612760589
+11773 2681 5358 0.147201059924865 0.147201059924865
+17216 8420 1908 0.199697066538748 0.199697066538748
+16157 9835 9836 0.024879986991164 0.024879986991164
+18699 1320 1376 0.177502821070015 0.177502821070015
+12115 8553 8554 0.175311002200187 0.175311002200187
+19503 10530 10531 0.0385295444601748 0.0385295444601748
+16538 9932 9933 0.139509514048293 0.139509514048293
+1717 1736 1737 0.0422973816408655 0.0422973816408655
+17220 3087 9830 0.198791677003679 0.198791677003679
+12205 8587 7095 0.0103763001462627 0.0103763001462627
+1748 1765 1768 0.20159496635188 0.20159496635188
+12332 8654 8655 0.0104809427005404 0.0104809427005404
+19506 10533 7232 0.00927443019901883 0.00927443019901883
+12444 8704 8705 0.0186821732215156 0.0186821732215156
+1767 1785 1786 0.049264963521636 0.049264963521636
+16454 9909 9910 0.124306713488191 0.124306713488191
+12491 8717 8718 0.055230353030641 0.055230353030641
+12493 8719 8720 0.118556931073074 0.118556931073074
+16535 4328 8117 0.102336137979151 0.102336137979151
+1810 1826 1827 0.198453556780362 0.198453556780362
+18642 7416 4062 0.177070510498962 0.177070510498962
+12605 384 4685 0.0512286127934627 0.0512286127934627
+1838 1854 1855 0.0513002538457751 0.0513002538457751
+1839 1855 1856 0.0505552484656801 0.0505552484656801
+16789 8649 10013 0.223567773525098 0.223567773525098
+12632 2360 3710 0.110712951608372 0.110712951608372
+1858 1870 1871 0.100377935012122 0.100377935012122
+17014 10053 10054 0.0101091220768254 0.0101091220768254
+12810 8258 8846 0.197578956532281 0.197578956532281
+12812 8846 6028 0.064250785290107 0.064250785290107
+12814 8847 8848 0.169735694825716 0.169735694825716
+12816 8848 297 0.081779930762806 0.081779930762806
+16613 9942 2685 0.29520243699611 0.29520243699611
+12926 8892 8893 0.0723033727126927 0.0723033727126927
+13020 8924 8925 0.0102645296363106 0.0102645296363106
+13048 8934 8935 0.109609070074496 0.109609070074496
+14679 9301 445 0.205255827063182 0.205255827063182
+17965 10232 10237 0.0287772787854116 0.0287772787854116
+18916 10395 10396 0.0665707610088623 0.0665707610088623
+17673 8930 8847 0.0672232407607821 0.0672232407607821
+19611 10510 10586 0.0687878070750461 0.0687878070750461
+1895 1909 1910 0.0533681732492523 0.0533681732492523
+18738 1858 7870 0.177701929540755 0.177701929540755
+18722 1312 9772 0.242272496904356 0.242272496904356
+13294 4282 4326 0.048552671008238 0.048552671008238
+1916 1928 1929 0.105818779358726 0.105818779358726
+18739 7870 4057 0.175799763463846 0.175799763463846
+18654 6221 7655 0.275174189153955 0.275174189153955
+1942 1956 1957 0.0270768788779568 0.0270768788779568
+13392 311 9059 0.0124055357740245 0.0124055357740245
+18659 7643 6205 0.176055293755678 0.176055293755678
+13405 8942 9061 0.112337222040467 0.112337222040467
+19275 10446 10424 0.0353155595120025 0.0353155595120025
+1960 1977 1978 0.0139641936224905 0.0139641936224905
+13485 9102 308 0.0118340647108347 0.0118340647108347
+20374 10758 3588 0.00620515380678302 0.00620515380678302
+18262 2547 6067 0.202075066970098 0.202075066970098
+13520 9073 117 0.110830423506594 0.110830423506594
+13529 5647 9088 0.177768687230353 0.177768687230353
+19599 1871 10582 0.0185256932684462 0.0185256932684462
+13548 447 2999 0.0894668373271695 0.0894668373271695
+13553 9126 579 0.319404247396224 0.319404247396224
+18657 7657 10331 0.158775443026926 0.158775443026926
+13716 6715 4211 0.0895901111539728 0.0895901111539728
+2012 2021 2022 0.202353267688237 0.202353267688237
+18846 10364 10366 0.0360011605118072 0.0360011605118072
+13805 9197 6639 0.199762828560815 0.199762828560815
+18572 10317 10318 0.0818849597364774 0.0818849597364774
+2037 2046 2047 0.202843850092204 0.202843850092204
+2038 2047 2048 0.202089258953368 0.202089258953368
+19239 8480 10459 0.145581432505511 0.145581432505511
+13871 2282 3603 0.0995034643784278 0.0995034643784278
+2058 746 1564 0.142548749521321 0.142548749521321
+12345 8661 8662 0.0184782413605156 0.0184782413605156
+13933 9117 9237 0.0487812750222334 0.0487812750222334
+13946 9243 9109 0.0432001724914345 0.0432001724914345
+20415 10773 10767 0.0164543942872072 0.0164543942872072
+15289 7065 9559 0.00979064512162057 0.00979064512162057
+15406 9582 9586 0.261696459707034 0.261696459707034
+14374 512 3439 0.0820413167433817 0.0820413167433817
+15291 9560 9561 0.0474312472960203 0.0474312472960203
+20033 3666 9939 0.222490979962601 0.222490979962601
+14436 9351 6743 0.133828356760244 0.133828356760244
+2083 2084 2085 0.132628008561016 0.132628008561016
+20269 10721 10704 0.0408769490843711 0.0408769490843711
+20257 7553 10687 0.047722995184739 0.047722995184739
+14596 9395 7373 0.0500503806511319 0.0500503806511319
+2107 1822 2109 0.0984259671843471 0.0984259671843471
+18860 10369 10362 0.0840816587742034 0.0840816587742034
+20253 10719 5572 0.00788824170654016 0.00788824170654016
+16690 9989 9990 0.0859897279747206 0.0859897279747206
+2125 1981 1966 0.0405441466490896 0.0405441466490896
+16692 8314 8651 0.0716207548906764 0.0716207548906764
+16847 3130 9896 0.0388183147420438 0.0388183147420438
+12343 8658 8659 0.0326641917954917 0.0326641917954917
+16277 4438 9869 0.0429816129844846 0.0429816129844846
+2254 2256 2257 0.179026041725141 0.179026041725141
+18714 6214 7650 0.274890248386652 0.274890248386652
+2282 2281 2282 0.208433952181449 0.208433952181449
+18413 7163 7445 0.101226183618457 0.101226183618457
+2309 1585 1646 0.0852956059582778 0.0852956059582778
+17366 3085 3197 0.201028238760753 0.201028238760753
+16424 3406 3407 0.0260120249027955 0.0260120249027955
+487 487 488 0.0915902876023465 0.0915902876023465
+2504 2153 2485 0.135805715389887 0.135805715389887
+15259 9549 9550 0.0733424963845631 0.0733424963845631
+17078 8074 9872 0.138360291064547 0.138360291064547
+604 595 596 0.135530584935403 0.135530584935403
+2561 2534 2535 0.131236307359374 0.131236307359374
+11701 1064 1065 0.0735266946881119 0.0735266946881119
+11702 1065 1066 0.144526540080904 0.144526540080904
+2641 1094 1110 0.0327560682713917 0.0327560682713917
+12965 1823 1824 0.115786401746133 0.115786401746133
+2716 2671 2672 0.137037719250731 0.137037719250731
+16268 9866 8748 0.200740333998757 0.200740333998757
+2739 2694 2695 0.0520216844496084 0.0520216844496084
+18678 2801 2589 0.177457369167133 0.177457369167133
+11691 837 867 0.00774513207370433 0.00774513207370433
+11692 867 868 0.00951825440201693 0.00951825440201693
+2894 2838 2839 0.0194790124967281 0.0194790124967281
+16704 9998 9999 0.0072772776659045 0.0072772776659045
+16598 5785 8280 0.146209128325821 0.146209128325821
+2965 1143 2908 0.0621246078682317 0.0621246078682317
+16603 7894 9953 0.113998968091224 0.113998968091224
+3043 2974 2975 0.149630303255577 0.149630303255577
+18440 2971 10293 0.0852727734364054 0.0852727734364054
+3066 2997 2998 0.0208518874255557 0.0208518874255557
+18441 10293 8299 0.0364176386342536 0.0364176386342536
+3086 3018 3019 0.14545556926134 0.14545556926134
+18443 7498 10290 0.0505394400731725 0.0505394400731725
+3112 3044 3045 0.100624292928738 0.100624292928738
+18471 2985 7703 0.198649870528673 0.198649870528673
+16707 9623 9998 0.0621574034637008 0.0621574034637008
+3136 3062 2284 0.0981125078289405 0.0981125078289405
+19669 10610 9361 0.0491952199145155 0.0491952199145155
+3158 3082 3083 0.0983700193882712 0.0983700193882712
+11703 1066 1158 0.148869854474817 0.148869854474817
+3181 3101 3102 0.0962927982103224 0.0962927982103224
+18133 4095 6040 0.192431028537818 0.192431028537818
+18446 10289 7781 0.0503825451517732 0.0503825451517732
+3230 3144 3145 0.203548069983679 0.203548069983679
+18448 9292 9527 0.134072690600401 0.134072690600401
+11705 1159 1244 0.147081474347396 0.147081474347396
+3281 3193 3194 0.106476946636896 0.106476946636896
+16416 3034 3130 0.0869691229324941 0.0869691229324941
+3302 3210 3211 0.0503243467464606 0.0503243467464606
+18899 10379 10380 0.00404144992313864 0.00404144992313864
+11709 1301 1302 0.0358989065327031 0.0358989065327031
+3325 3227 3228 0.131949141660574 0.131949141660574
+12952 1330 1361 0.0263074187615997 0.0263074187615997
+3400 3297 3298 0.0238019064284447 0.0238019064284447
+3489 1140 907 0.140863651036277 0.140863651036277
+16744 7566 10007 0.0424762897679241 0.0424762897679241
+18732 9833 7646 0.178089933314901 0.178089933314901
+3516 3387 3388 0.0211650011658898 0.0211650011658898
+12955 1478 1507 0.126108135430878 0.126108135430878
+3561 3424 3425 0.0612760168169184 0.0612760168169184
+16837 10019 9847 0.0370069651425935 0.0370069651425935
+3583 3438 1421 0.115878563365398 0.115878563365398
+12960 1632 1633 0.128348569926215 0.128348569926215
+3684 3520 3521 0.0506146313810284 0.0506146313810284
+18464 10298 9139 0.0193791784570559 0.0193791784570559
+3734 1037 3568 0.052776292073227 0.052776292073227
+19333 2826 10473 0.01148052310696 0.01148052310696
+18465 9139 541 0.0794672162259436 0.0794672162259436
+3755 3585 3586 0.0186262558199583 0.0186262558199583
+17071 4599 3687 0.240616539690475 0.240616539690475
+3805 3624 3250 0.195616461429944 0.195616461429944
+11577 1766 1595 0.0489656343684566 0.0489656343684566
+3825 3641 3642 0.0193156490955763 0.0193156490955763
+17299 5829 8716 0.20447937601548 0.20447937601548
+3847 3658 3639 0.0475522464454704 0.0475522464454704
+18869 10144 10372 0.0637708443692985 0.0637708443692985
+16541 812 3553 0.152482276035164 0.152482276035164
+20222 7195 10711 0.0935594253631277 0.0935594253631277
+19431 10003 8707 0.100281643377189 0.100281643377189
+3891 3519 3695 0.200167523328644 0.200167523328644
+16751 6829 10008 0.0961527504424716 0.0961527504424716
+3916 3713 3714 0.1010804805974 0.1010804805974
+15272 8538 8632 0.0716756500086966 0.0716756500086966
+3938 3736 3737 0.112607595972795 0.112607595972795
+18125 4097 6042 0.191481087124581 0.191481087124581
+19576 10572 7461 0.00811745051204977 0.00811745051204977
+12969 1970 1971 0.103498330022734 0.103498330022734
+4039 3819 3820 0.147623529549067 0.147623529549067
+18745 5190 2608 0.176866790100876 0.176866790100876
+4127 3890 3891 0.179468370845182 0.179468370845182
+12335 8652 8653 0.0109021010822668 0.0109021010822668
+4149 3906 1161 0.136761513456038 0.136761513456038
+17950 6559 10229 0.0124761805379247 0.0124761805379247
+4173 1891 706 0.0588353275400914 0.0588353275400914
+14115 3623 3925 0.0987645160792797 0.0987645160792797
+16843 10020 10021 0.00337377443816097 0.00337377443816097
+4194 3942 3943 0.176445012103913 0.176445012103913
+18245 2433 9358 0.201879495148218 0.201879495148218
+18189 6055 5795 0.200795798534704 0.200795798534704
+4450 3345 4152 0.10312101394972 0.10312101394972
+18872 9232 7825 0.160805002055775 0.160805002055775
+4529 4204 4205 0.278098742346476 0.278098742346476
+18399 2541 10285 0.412599954612644 0.412599954612644
+4637 4281 913 0.111497113872301 0.111497113872301
+16900 4255 3513 0.200996147699506 0.200996147699506
+15919 9746 7414 0.0221971015175522 0.0221971015175522
+4682 4322 4323 0.0558862625971893 0.0558862625971893
+16298 2636 2637 0.0033759355903552 0.0033759355903552
+18879 6125 1927 0.199518260048308 0.199518260048308
+4761 1489 145 0.199750566224671 0.199750566224671
+18696 4055 6400 0.176933507030136 0.176933507030136
+16300 2637 2160 0.00247295077408309 0.00247295077408309
+4832 1268 4428 0.206285087175769 0.206285087175769
+18888 7247 1923 0.201674729042946 0.201674729042946
+4997 4543 4544 0.132688906239847 0.132688906239847
+16650 9968 9969 0.0122299544992289 0.0122299544992289
+13009 2891 2892 0.172319187220424 0.172319187220424
+5024 4562 4563 0.200718931282707 0.200718931282707
+16315 3005 1362 0.00318470714397005 0.00318470714397005
+5188 4685 4686 0.177776490265982 0.177776490265982
+17297 10086 7736 0.198049290500642 0.198049290500642
+20272 10721 10703 0.0411977345042915 0.0411977345042915
+5368 3223 4808 0.133968729582188 0.133968729582188
+18898 10378 10379 0.00446883067059111 0.00446883067059111
+5393 4828 4829 0.40282604477454 0.40282604477454
+20273 10703 10725 0.144609051598102 0.144609051598102
+5414 4842 1486 0.202708226253938 0.202708226253938
+5490 458 4898 0.0468723555946229 0.0468723555946229
+19112 8424 10118 0.19768851226159 0.19768851226159
+5515 1212 4920 0.232222389672051 0.232222389672051
+19281 10466 8768 0.124416605605605 0.124416605605605
+5542 2537 4941 0.438197641658083 0.438197641658083
+20340 10739 10748 0.00884971981393432 0.00884971981393432
+19231 10455 10456 0.1184623603546 0.1184623603546
+5626 3284 1058 0.0983991410952824 0.0983991410952824
+18347 7686 2429 0.200029751476084 0.200029751476084
+17080 1162 882 0.139677295386473 0.139677295386473
+6004 5259 5260 0.066486526131314 0.066486526131314
+14136 9281 509 0.032133360210872 0.032133360210872
+17116 4052 3775 0.00847774353709404 0.00847774353709404
+6616 5699 5700 0.00800603928165774 0.00800603928165774
+19812 7122 5371 0.176755455393693 0.176755455393693
+6777 5820 5821 0.0499181980722273 0.0499181980722273
+4400 4114 4115 0.202509931844666 0.202509931844666
+11451 8258 8261 0.200629988067775 0.200629988067775
+19818 10647 5606 0.0519771701713562 0.0519771701713562
+6974 2119 5953 0.0979282440578051 0.0979282440578051
+4402 4117 2874 0.134125988252719 0.134125988252719
+4403 2874 4118 0.140174877049639 0.140174877049639
+17149 46 4780 0.204228808601968 0.204228808601968
+7674 1498 187 0.203419998803368 0.203419998803368
+7719 6393 6394 0.135380647167761 0.135380647167761
+20324 10732 10743 0.016217938211146 0.016217938211146
+7749 6408 6409 0.240033624288878 0.240033624288878
+20330 10744 10736 0.0345659354386547 0.0345659354386547
+7835 4630 1259 0.131787660470127 0.131787660470127
+5519 4922 2815 0.0131824278657025 0.0131824278657025
+7914 3652 89 0.238216692287668 0.238216692287668
+17155 3202 3091 0.199774901839453 0.199774901839453
+7937 6530 6531 0.246221323543984 0.246221323543984
+20342 2965 10747 0.0130500853290149 0.0130500853290149
+7957 3453 6015 0.103911955569673 0.103911955569673
+17306 8715 5827 0.20364289358169 0.20364289358169
+7981 6550 6526 0.0499792827976588 0.0499792827976588
+18128 10269 10270 0.123006178444702 0.123006178444702
+8007 6565 6566 0.0461778743400118 0.0461778743400118
+12262 8500 8621 0.00391508697358849 0.00391508697358849
+20346 10731 10745 0.0882403942542692 0.0882403942542692
+8080 6611 6612 0.10285099566632 0.10285099566632
+20503 10831 10061 0.00544027190297384 0.00544027190297384
+17159 5011 5064 0.204989668883762 0.204989668883762
+14700 4773 5065 0.177184173799166 0.177184173799166
+8102 6628 6630 0.0733305516170216 0.0733305516170216
+14712 935 5453 0.176927806170623 0.176927806170623
+8148 6658 1326 0.126702346827637 0.126702346827637
+14707 5162 5223 0.123984475685155 0.123984475685155
+8332 6761 6762 0.0544299595372282 0.0544299595372282
+17167 48 5241 0.405295346029575 0.405295346029575
+8384 6791 4603 0.174075741649446 0.174075741649446
+20516 6731 10843 0.0163123315737135 0.0163123315737135
+17171 5280 3092 0.401948502237413 0.401948502237413
+8434 6821 1593 0.0969711334947841 0.0969711334947841
+14711 2220 935 0.183060496140458 0.183060496140458
+8536 6880 1128 0.0335501177019022 0.0335501177019022
+19635 10525 10595 0.00694156278564008 0.00694156278564008
+18504 9353 6386 0.133800859600802 0.133800859600802
+8556 6891 6418 0.133199850282798 0.133199850282798
+8557 6418 4625 0.132396793169127 0.132396793169127
+17175 5327 5390 0.196700288812187 0.196700288812187
+18507 8379 10301 0.115242670596916 0.115242670596916
+8578 6280 6899 0.103595480205117 0.103595480205117
+4404 4118 4119 0.131974592337134 0.131974592337134
+18510 10301 9529 0.136169474903607 0.136169474903607
+4406 4120 4121 0.394524879292727 0.394524879292727
+19640 10596 10598 0.0045286617175965 0.0045286617175965
+8728 3385 6959 0.0627894298641218 0.0627894298641218
+18496 6384 9201 0.134997571408585 0.134997571408585
+18514 10302 5543 0.103400383164669 0.103400383164669
+8779 6999 7000 0.178967474513147 0.178967474513147
+18515 5543 2412 0.101763704229338 0.101763704229338
+8803 5141 2236 0.0248346840292332 0.0248346840292332
+19831 10650 10651 0.138361801446117 0.138361801446117
+8887 3285 1059 0.0976623415502941 0.0976623415502941
+17182 5607 5608 0.205054564403698 0.205054564403698
+8909 3021 7068 0.0519035642154067 0.0519035642154067
+4407 3574 4122 0.137780007377075 0.137780007377075
+14713 5453 5664 0.115365301333729 0.115365301333729
+9019 3944 7121 0.0616182757003265 0.0616182757003265
+18655 7655 10305 0.198541985736116 0.198541985736116
+9043 7135 4276 0.121250513345306 0.121250513345306
+18147 10258 6033 0.201162874084808 0.201162874084808
+9226 7232 7233 0.0701236279353194 0.0701236279353194
+18152 10264 10277 0.407566866193853 0.407566866193853
+9304 6121 1920 0.204110733126185 0.204110733126185
+18153 4104 6047 0.112519690969595 0.112519690969595
+11446 385 387 0.611916175000286 0.611916175000286
+17478 5886 323 0.0446797516163588 0.0446797516163588
+9352 6077 7309 0.0481617931874556 0.0481617931874556
+20395 10775 10776 0.00739420688081638 0.00739420688081638
+18154 6047 10135 0.201285870335585 0.201285870335585
+20429 10789 10790 0.0478990795077935 0.0478990795077935
+9375 7320 1193 0.16722266002845 0.16722266002845
+18274 6666 6667 0.19713796716552 0.19713796716552
+9396 4346 6344 0.137277828740194 0.137277828740194
+7038 2477 5911 0.20568880939919 0.20568880939919
+9526 7390 6591 0.199950723674749 0.199950723674749
+9527 6591 7113 0.204992725577621 0.204992725577621
+4408 4122 4123 0.139283771950412 0.139283771950412
+20440 8230 10798 0.00724995456680097 0.00724995456680097
+9657 7441 7443 0.137227628583058 0.137227628583058
+17487 4652 4653 0.0539741907357585 0.0539741907357585
+9708 7472 7473 0.0204539718039878 0.0204539718039878
+18246 9358 9377 0.403042223701425 0.403042223701425
+9812 7530 3064 0.202502418308833 0.202502418308833
+17689 6172 6173 0.109301053367223 0.109301053367223
+9839 7545 7546 0.200378656030458 0.200378656030458
+17691 6191 6192 0.114641917935369 0.114641917935369
+9862 7563 7564 0.144864127295822 0.144864127295822
+18248 8108 10283 0.203688042743378 0.203688042743378
+9912 7587 7588 0.0177693522294632 0.0177693522294632
+12245 8614 8615 0.00283454394049719 0.00283454394049719
+20023 7898 8856 0.145457290364043 0.145457290364043
+20462 10063 10815 0.0787418608501839 0.0787418608501839
+10159 5268 6906 0.123203894056526 0.123203894056526
+20464 10816 10812 0.0195704583026571 0.0195704583026571
+11511 8294 8295 0.0520431495126935 0.0520431495126935
+18214 6382 6383 0.202997553277811 0.202997553277811
+10231 6520 7739 0.0500835268559568 0.0500835268559568
+18257 3984 6760 0.19949668413334 0.19949668413334
+10280 7447 7757 0.470575008371913 0.470575008371913
+11783 8122 8036 0.0779413781888185 0.0779413781888185
+14738 6526 6538 0.170206219459847 0.170206219459847
+10497 4733 6800 0.110360790137427 0.110360790137427
+20473 10823 10777 0.00660874071248581 0.00660874071248581
+10520 7847 7425 0.0489570822105033 0.0489570822105033
+18522 4015 10297 0.0710067813209419 0.0710067813209419
+10541 7855 7856 0.177133627375528 0.177133627375528
+10542 7856 2614 0.178768427477815 0.178768427477815
+18524 1880 9146 0.0581549975210073 0.0581549975210073
+10589 7869 6640 0.0423030177562977 0.0423030177562977
+18270 5525 6463 0.15576453739372 0.15576453739372
+10616 7882 4885 0.155749664880603 0.155749664880603
+18528 9272 9525 0.133068770502091 0.133068770502091
+10639 7897 7898 0.052238135352395 0.052238135352395
+10663 7913 7914 0.0662287183378057 0.0662287183378057
+18276 1427 6667 0.0124761175920816 0.0124761175920816
+14745 4866 6690 0.193273433165028 0.193273433165028
+12385 1624 3930 0.0974730336125312 0.0974730336125312
+18277 6667 6720 0.144754021853131 0.144754021853131
+10816 7993 6492 0.0854037034050773 0.0854037034050773
+14747 6732 6733 0.0789150394398201 0.0789150394398201
+12453 3191 6107 0.202925463206431 0.202925463206431
+16202 5822 7727 0.19552660887524 0.19552660887524
+18539 5559 10311 0.589298128069539 0.589298128069539
+10890 3025 8025 0.123630898552104 0.123630898552104
+15899 9255 7490 0.0311439652684609 0.0311439652684609
+18550 4298 9428 0.104368579037722 0.104368579037722
+11283 8190 8201 0.0778576783996018 0.0778576783996018
+4409 4123 4124 0.135738728632571 0.135738728632571
+13171 7691 8995 0.0242708657605628 0.0242708657605628
+11527 809 8301 0.0665080068102908 0.0665080068102908
+15908 9084 9085 0.0343875506043555 0.0343875506043555
+14757 2212 4862 0.162593070375603 0.162593070375603
+11742 8382 8383 0.00390317600089655 0.00390317600089655
+18302 5737 2440 0.171112285574699 0.171112285574699
+11766 8404 8405 0.0591205771532174 0.0591205771532174
+11998 5505 7079 0.147126356992669 0.147126356992669
+12060 332 268 0.0944572536860071 0.0944572536860071
+4411 3048 4125 0.136438064344983 0.136438064344983
+20391 10766 10774 0.00648510043864555 0.00648510043864555
+4412 4125 4126 0.00355827872013668 0.00355827872013668
+19845 9516 10657 0.207937764412144 0.207937764412144
+16200 1790 7209 0.198939694041251 0.198939694041251
+20399 10763 3591 0.00757376863172981 0.00757376863172981
+12520 8729 1189 0.0214820993457698 0.0214820993457698
+20644 10877 4517 0.0511435578342218 0.0511435578342218
+12620 8775 4920 0.0124622300083447 0.0124622300083447
+20646 10035 10880 0.0235473019855852 0.0235473019855852
+12646 5921 920 0.178961176893159 0.178961176893159
+12691 8806 8807 0.0113998193117656 0.0113998193117656
+12822 8261 493 0.226877195561116 0.226877195561116
+13034 8927 585 0.0555278029535648 0.0555278029535648
+14668 6327 4166 0.169217141640748 0.169217141640748
+14856 9434 8907 0.112945329265115 0.112945329265115
+20835 10948 10929 0.0711141044607233 0.0711141044607233
+13572 2184 9130 0.046228028674551 0.046228028674551
+4413 4126 4127 0.123682116907034 0.123682116907034
+4414 4127 4128 0.0151340374611755 0.0151340374611755
+14780 5922 921 0.178257163080484 0.178257163080484
+13824 9203 7891 0.0449920400202888 0.0449920400202888
+13970 9249 9250 0.0321739674064664 0.0321739674064664
+20559 2957 10784 0.0120134443189883 0.0120134443189883
+14029 9262 6653 0.100609617198747 0.100609617198747
+15915 9746 9747 0.0832769023011374 0.0832769023011374
+11415 7985 8000 0.0154063290418794 0.0154063290418794
+14233 8687 6694 0.0247755996269239 0.0247755996269239
+20569 10787 10858 0.0193290169195346 0.0193290169195346
+14464 6149 3994 0.0989127437299345 0.0989127437299345
+14635 9387 9388 0.0403809617749613 0.0403809617749613
+11212 391 392 0.10291889633356 0.10291889633356
+14604 9397 9398 0.123826706008273 0.123826706008273
+14637 9406 2243 0.00956376056529555 0.00956376056529555
+15410 9588 9589 0.0190893984820006 0.0190893984820006
+15440 9601 1507 0.00768187987530518 0.00768187987530518
+16383 9771 9880 0.0381827012246672 0.0381827012246672
+16620 9937 9938 0.0704692374785171 0.0704692374785171
+11802 8392 8415 0.148179257170155 0.148179257170155
+16809 4996 728 0.102190274976312 0.102190274976312
+11640 8346 4530 0.131615785848543 0.131615785848543
+16853 6519 9854 0.0497714413737895 0.0497714413737895
+4415 4128 1171 0.138086753058786 0.138086753058786
+17269 3518 82 0.205066129886621 0.205066129886621
+11951 8499 8500 0.0607548345173342 0.0607548345173342
+17324 6799 7351 0.103019517606604 0.103019517606604
+11991 4455 5503 0.144667643977852 0.144667643977852
+17388 5920 3810 0.153093198888871 0.153093198888871
+17389 3810 10095 0.199017480070308 0.199017480070308
+17407 6122 1921 0.202694690919031 0.202694690919031
+17408 1921 7246 0.200797963530598 0.200797963530598
+12044 8523 8524 0.0621486337289915 0.0621486337289915
+17448 3247 10109 0.0544983800214201 0.0544983800214201
+4416 1171 891 0.137903948024362 0.137903948024362
+12113 8552 672 0.00266902064060136 0.00266902064060136
+17549 10132 10133 2.25328864155446 2.25328864155446
+17666 8928 10162 0.0972564668123919 0.0972564668123919
+12288 8528 8526 0.152174217990106 0.152174217990106
+17729 7332 2080 0.104548139781884 0.104548139781884
+12329 8641 8652 0.00987690479251785 0.00987690479251785
+12331 8653 8654 0.00928748638267964 0.00928748638267964
+17751 8575 6706 0.145927899456713 0.145927899456713
+12936 8688 8689 0.0364958929125483 0.0364958929125483
+17774 7679 5984 0.100495969018847 0.100495969018847
+17787 9214 536 0.151808926625465 0.151808926625465
+17822 10188 10186 0.041401555151972 0.041401555151972
+17852 10195 5678 0.0176253194989635 0.0176253194989635
+17170 1912 5280 0.200459610115248 0.200459610115248
+4417 891 4129 0.140986849802137 0.140986849802137
+12947 1304 1303 0.066448544071591 0.066448544071591
+18995 3958 5601 0.119729821294068 0.119729821294068
+18382 8919 8920 0.0492932118239397 0.0492932118239397
+19080 4746 4159 0.17797879706873 0.17797879706873
+13065 8947 8948 0.014693528299895 0.014693528299895
+19135 3168 8470 0.0222426676149063 0.0222426676149063
+20824 9337 9400 0.0122401419030242 0.0122401419030242
+19172 6804 7956 0.0915174498096421 0.0915174498096421
+19618 10588 10494 0.00731369728944242 0.00731369728944242
+19331 9893 10473 0.0200896227314349 0.0200896227314349
+15874 8889 8940 0.103516223202584 0.103516223202584
+19358 9949 10479 0.0590930811213136 0.0590930811213136
+19413 7239 3251 0.195270640148282 0.195270640148282
+19962 10674 10685 0.14613727594919 0.14613727594919
+18473 9005 9006 0.01365486811001 0.01365486811001
+20041 9172 140 0.204724385208342 0.204724385208342
+18917 10396 10397 0.0952180129620757 0.0952180129620757
+20063 2998 4930 0.100928455718765 0.100928455718765
+20587 10865 10840 0.00838601883021894 0.00838601883021894
+4418 4129 2776 0.133433939347385 0.133433939347385
+14836 7396 7377 0.030817448743492 0.030817448743492
+14837 7377 3410 0.100816825455254 0.100816825455254
+15447 9607 9608 0.0162401698909022 0.0162401698909022
+309 317 318 0.0119735018205437 0.0119735018205437
+13531 5648 3387 0.0436500601039895 0.0436500601039895
+14946 8215 8212 0.101284367879663 0.101284367879663
+13555 408 9127 0.613912488305853 0.613912488305853
+14981 9463 7091 0.107883940343108 0.107883940343108
+14982 7091 8789 0.108748219147477 0.108748219147477
+13650 9158 9159 0.0150152429008076 0.0150152429008076
+15063 8874 7430 0.0504536590179092 0.0504536590179092
+17072 3687 8133 0.141298637785039 0.141298637785039
+18493 9170 5545 0.102571946583037 0.102571946583037
+15171 9511 9512 0.0502858420296349 0.0502858420296349
+15174 9514 9515 0.0498070291463972 0.0498070291463972
+18566 10322 10323 0.186113882409967 0.186113882409967
+16100 9824 9817 0.0308009946802063 0.0308009946802063
+16101 9817 8245 0.0866075022072335 0.0866075022072335
+15444 8607 9604 0.0180426861021608 0.0180426861021608
+16161 3728 722 0.106535324504203 0.106535324504203
+16174 9840 7201 0.0108095014749508 0.0108095014749508
+16239 9856 7742 0.4032601166124 0.4032601166124
+16240 7742 5837 0.199863858168715 0.199863858168715
+15881 8762 9238 0.022425928034548 0.022425928034548
+16327 3906 3134 0.109247651866168 0.109247651866168
+16328 3134 5403 0.105230091275359 0.105230091275359
+17203 10075 10076 0.206234100938924 0.206234100938924
+17253 5918 917 0.179236073493399 0.179236073493399
+18223 1695 6884 0.201956855870188 0.201956855870188
+15286 3187 9268 0.0103389762120735 0.0103389762120735
+19421 34 3533 0.2073108703911 0.2073108703911
+19436 6852 10490 0.151686039209942 0.151686039209942
+19663 10609 9366 0.0532084205099813 0.0532084205099813
+19847 10658 7133 0.20071321213787 0.20071321213787
+19953 7857 10414 0.0579007631193554 0.0579007631193554
+19293 10471 8765 0.117981892754207 0.117981892754207
+19987 9727 10653 0.0514452608394938 0.0514452608394938
+19988 10653 1103 0.0505009558673589 0.0505009558673589
+15432 9598 7965 0.00918826645895189 0.00918826645895189
+15465 9615 9616 0.0488173542586425 0.0488173542586425
+15505 2286 4494 0.207036482148074 0.207036482148074
+18430 7784 10291 0.0493825781706533 0.0493825781706533
+15468 7963 9610 0.0129310975383002 0.0129310975383002
+15643 9669 8703 0.0154036792176203 0.0154036792176203
+15293 9561 9563 0.0354006218838869 0.0354006218838869
+15662 5995 7675 0.101107003151938 0.101107003151938
+15469 9610 9613 0.00340267268464027 0.00340267268464027
+15685 3450 6014 0.102083800598865 0.102083800598865
+18613 9261 4049 0.17355432372221 0.17355432372221
+15707 8686 8810 0.0279306326987703 0.0279306326987703
+15471 9606 8892 0.117003908235376 0.117003908235376
+15762 2940 6814 0.0992967316903301 0.0992967316903301
+15764 6595 9701 0.0232598991470647 0.0232598991470647
+14656 9410 9411 0.19733052173904 0.19733052173904
+20261 10720 5750 0.00799491979378441 0.00799491979378441
+2336 1153 2328 0.201597448584961 0.201597448584961
+17300 8716 8745 0.199099643459498 0.199099643459498
+19471 10515 10516 0.00520398584376517 0.00520398584376517
+20611 10819 10828 0.0109320789190355 0.0109320789190355
+20612 10828 10821 0.0197366861798755 0.0197366861798755
+20613 10821 10870 0.0252155503065758 0.0252155503065758
+478 480 212 0.0356029775534751 0.0356029775534751
+15859 9740 9707 0.0569780852958723 0.0569780852958723
+515 509 510 0.286655598001641 0.286655598001641
+520 514 515 0.226862534758366 0.226862534758366
+15253 9545 9538 0.0260796874031177 0.0260796874031177
+624 614 615 0.101063162513791 0.101063162513791
+19463 10483 10508 0.019159575222575 0.019159575222575
+17219 3199 3087 0.202098851695834 0.202098851695834
+702 696 697 0.1055651557861 0.1055651557861
+15544 9645 9646 0.00692347068679982 0.00692347068679982
+776 778 779 0.103928492069641 0.103928492069641
+15955 6396 500 0.195346208359328 0.195346208359328
+913 927 928 0.0495542499145439 0.0495542499145439
+915 929 930 0.0493548663548942 0.0493548663548942
+15957 9767 9768 0.0474477023795114 0.0474477023795114
+932 947 948 0.100759864187185 0.100759864187185
+15960 9770 7450 0.0160716244910599 0.0160716244910599
+955 967 968 0.0165679791310418 0.0165679791310418
+957 969 970 0.197449816642368 0.197449816642368
+15913 9240 9745 0.0339191222144473 0.0339191222144473
+980 991 992 0.138684932577873 0.138684932577873
+15891 9002 7513 0.0667178592447727 0.0667178592447727
+1003 1016 1017 0.039629871856248 0.039629871856248
+1004 1017 1018 0.176155002789907 0.176155002789907
+19469 10513 10514 0.0200709923319022 0.0200709923319022
+16388 9459 9771 0.0286077698371324 0.0286077698371324
+1087 1103 1104 0.338644304966299 0.338644304966299
+17156 3091 4971 0.202252452796884 0.202252452796884
+16103 255 8239 0.267325536990832 0.267325536990832
+1170 1186 1187 0.0990780990020656 0.0990780990020656
+16337 8026 3444 0.219522804846043 0.219522804846043
+1298 1323 1324 0.104021267127805 0.104021267127805
+1299 1324 1325 0.0988550932780109 0.0988550932780109
+16392 9847 9876 0.0466572032639634 0.0466572032639634
+1322 1347 1348 0.145300158256776 0.145300158256776
+387 389 390 0.101909828504342 0.101909828504342
+19511 10536 10537 0.0367294544686212 0.0367294544686212
+1469 1489 1490 0.0976691429125615 0.0976691429125615
+12005 8512 8049 0.105397118565585 0.105397118565585
+18733 7646 6209 0.175022021354251 0.175022021354251
+16766 5003 7290 0.0493746723595829 0.0493746723595829
+1495 1515 1473 0.1629816039782 0.1629816039782
+1497 1516 1517 0.202642438735294 0.202642438735294
+16788 10012 8649 0.310114997807766 0.310114997807766
+1549 1574 1575 0.0819858846366358 0.0819858846366358
+1550 1575 1576 0.0787364050378914 0.0787364050378914
+12359 8664 8670 0.00994780391809775 0.00994780391809775
+16806 9858 3171 0.0510524682713306 0.0510524682713306
+1570 1597 1598 0.101896558922667 0.101896558922667
+2686 2646 2647 0.164307180037452 0.164307180037452
+17103 9923 330 0.250512453112542 0.250512453112542
+1650 1677 1678 0.13227170643909 0.13227170643909
+11530 810 811 0.199368445906152 0.199368445906152
+16952 10036 10037 0.00823596195269871 0.00823596195269871
+1704 1725 1726 0.0532102629650272 0.0532102629650272
+17039 9210 8988 0.00924605732532601 0.00924605732532601
+1762 1487 1782 0.108567137541803 0.108567137541803
+14689 2798 2868 0.199650986040528 0.199650986040528
+17136 4412 4425 0.202602949014775 0.202602949014775
+17489 472 4654 0.0574342005254488 0.0574342005254488
+1935 1949 1223 0.041131087786823 0.041131087786823
+1937 1950 1951 0.0773266220673917 0.0773266220673917
+16304 2826 2827 0.0584380832256012 0.0584380832256012
+17962 10235 5193 0.0148018460000789 0.0148018460000789
+2187 2187 2188 0.0698088769426891 0.0698088769426891
+17834 10187 10188 0.0373456729353608 0.0373456729353608
+17023 10058 10059 0.043764797810192 0.043764797810192
+2261 2261 2262 0.20174624930555 0.20174624930555
+20285 10701 10709 0.0172154433985116 0.0172154433985116
+16421 3331 3358 0.0229870189622456 0.0229870189622456
+20297 5579 7524 0.0531120067375217 0.0531120067375217
+12353 8669 8661 0.00857375962495721 0.00857375962495721
+16657 3462 3464 0.173665424327281 0.173665424327281
+19565 10567 7463 0.00795043725476521 0.00795043725476521
+17162 5087 5107 0.202243070877092 0.202243070877092
+19034 10159 9497 0.0427022948506461 0.0427022948506461
+20744 9001 10918 0.332184959452437 0.332184959452437
+20748 10921 10922 0.0509227801768603 0.0509227801768603
+20749 10923 10924 0.18669804780169 0.18669804780169
+20750 10925 10926 0.0392592111051346 0.0392592111051346
+20752 10927 10928 0.00711510327217607 0.00711510327217607
+20754 10929 10930 0.0834966641757845 0.0834966641757845
+20756 10931 10932 0.0408755067283247 0.0408755067283247
+20758 10933 10934 0.0399346912680156 0.0399346912680156
+20760 10935 10936 0.0903151185359097 0.0903151185359097
+20762 10937 8302 0.00392992290489043 0.00392992290489043
+20763 8302 10927 0.00412640673301695 0.00412640673301695
+20765 10918 3754 0.00609979968071289 0.00609979968071289
+20766 3754 10938 0.00661123306657495 0.00661123306657495
+20768 10920 7783 0.00949225948867298 0.00949225948867298
+20769 7783 10939 0.00900064827794335 0.00900064827794335
+20771 10940 3415 0.00746326017722055 0.00746326017722055
+20772 3415 10941 0.00571991053425525 0.00571991053425525
+20774 10938 10942 0.117980886182769 0.117980886182769
+20776 10941 10943 0.040800141538403 0.040800141538403
+20778 10929 8910 0.00644678344686978 0.00644678344686978
+20779 8910 10944 0.00853909895805364 0.00853909895805364
+20781 10926 10280 0.00413065470277064 0.00413065470277064
+20782 10280 10933 0.00507364819278473 0.00507364819278473
+16513 9922 1630 0.0152212141119797 0.0152212141119797
+16537 3671 9932 0.221180884679333 0.221180884679333
+16539 9933 7834 0.139783679739911 0.139783679739911
+16790 10013 7828 0.227723092786938 0.227723092786938
+18645 1318 5867 0.177222990129465 0.177222990129465
+16960 10042 10043 0.0112267703364208 0.0112267703364208
+17266 3520 4261 0.200318193124263 0.200318193124263
+18444 10290 1124 0.0512555936349529 0.0512555936349529
+17645 7 9825 0.783906819132393 0.783906819132393
+18721 5864 1312 0.178403401011926 0.178403401011926
+18408 6096 10287 0.0607868213781131 0.0607868213781131
+17821 10187 10188 0.0373456729353608 0.0373456729353608
+17849 2817 1418 0.198773063708036 0.198773063708036
+17914 4748 4144 0.180736428235498 0.180736428235498
+17915 4144 2362 0.17239723292509 0.17239723292509
+18664 5184 5652 0.105551381348891 0.105551381348891
+18600 10333 10334 0.176228489643034 0.176228489643034
+18763 10341 10340 0.0478284118767837 0.0478284118767837
+18822 10356 10117 0.120644655146847 0.120644655146847
+12967 1825 1881 0.094094502294363 0.094094502294363
+19280 10465 10466 0.126391742395325 0.126391742395325
+19156 8422 10431 0.296704595839795 0.296704595839795
+19440 7907 10492 0.0345487307061229 0.0345487307061229
+20295 10709 10710 0.0460287189373458 0.0460287189373458
+3578 3435 3436 0.0484142710611121 0.0484142710611121
+3579 3436 2495 0.0837858518069818 0.0837858518069818
+3580 2495 3437 0.120116992356444 0.120116992356444
+3581 3437 2842 0.00242442592962248 0.00242442592962248
+14124 506 3659 0.275685944218073 0.275685944218073
+16901 3513 74 0.203700975919817 0.203700975919817
+18139 6038 10260 0.200840451178757 0.200840451178757
+19824 7641 5603 0.172193293465978 0.172193293465978
+19832 10652 10653 0.149094174776889 0.149094174776889
+16543 3555 814 0.153171011691858 0.153171011691858
+20427 10755 10788 0.051994279761698 0.051994279761698
+11503 6094 2973 0.264851184287827 0.264851184287827
+11438 8034 511 0.21998121248842 0.21998121248842
+16767 7290 3183 0.0591297362625136 0.0591297362625136
+20517 10806 10844 0.0093521291785604 0.0093521291785604
+18290 6889 6752 0.139920838374264 0.139920838374264
+11434 8077 8253 0.0508611139110148 0.0508611139110148
+20513 10060 10809 0.00760770059759869 0.00760770059759869
+18366 7716 7754 0.0519727898310098 0.0519727898310098
+11784 8036 2685 0.144743408596787 0.144743408596787
+11570 8321 7713 0.150502362587478 0.150502362587478
+18376 8353 6069 0.193914067776721 0.193914067776721
+12066 8533 8534 0.0445577347958965 0.0445577347958965
+16678 9979 9981 0.0909471727810372 0.0909471727810372
+20808 10948 8326 0.017351380837649 0.017351380837649
+13031 590 8926 0.147745966959296 0.147745966959296
+18483 9138 9139 0.0109683239632665 0.0109683239632665
+16502 3167 9925 0.137835608828632 0.137835608828632
+16961 10043 10044 0.075399787572802 0.075399787572802
+17393 67 3508 0.205321571793414 0.205321571793414
+17395 68 7304 0.202979892499458 0.202979892499458
+17650 303 395 0.11664951410225 0.11664951410225
+18596 10330 1845 0.0286669821878414 0.0286669821878414
+18996 5601 9265 0.00587624613864547 0.00587624613864547
+19117 402 10431 0.249198506812358 0.249198506812358
+19489 4703 10441 0.0209493756701814 0.0209493756701814
+19929 9514 10680 0.206733607617385 0.206733607617385
+20583 10849 9338 0.00790665036605531 0.00790665036605531
+20193 10707 9813 0.31051590829715 0.31051590829715
+19738 9472 4893 0.184563607099297 0.184563607099297
+19739 4893 9418 0.161581410791365 0.161581410791365
+19740 9418 955 0.17512104217346 0.17512104217346
+19741 955 8865 0.17730267158364 0.17730267158364
+19745 4908 6614 0.202025102521769 0.202025102521769
+19746 6614 9456 0.193906231686937 0.193906231686937
+19747 9456 10644 0.207835763228408 0.207835763228408
+19748 10644 647 0.139231068042996 0.139231068042996
+19807 7868 3718 0.103509284327612 0.103509284327612
+19756 9305 1209 0.168197350020426 0.168197350020426
+19906 9507 10678 0.206369047895258 0.206369047895258
+17115 582 4052 0.0200066549889732 0.0200066549889732
+20290 10700 10701 0.0224013855081139 0.0224013855081139
+15856 9738 9733 0.00602831355714784 0.00602831355714784
+16390 9811 3033 0.00758642111179705 0.00758642111179705
+17208 234 10075 0.0065072113132931 0.0065072113132931
+18209 3991 6766 0.202297976338321 0.202297976338321
+314 322 323 0.0362830323344 0.0362830323344
+17944 10224 7938 0.0484797623817722 0.0484797623817722
+11519 657 658 0.200633396770054 0.200633396770054
+18400 7187 1425 0.131517435591527 0.131517435591527
+16448 9905 9906 0.00998689980616885 0.00998689980616885
+1705 1726 1727 0.0778502303245676 0.0778502303245676
+19817 3729 10647 0.0543545423636727 0.0543545423636727
+20793 10938 8908 0.0180004191395181 0.0180004191395181
+19241 8221 10460 0.0833729876311698 0.0833729876311698
+18639 5180 2582 0.17723417320802 0.17723417320802
+20291 10701 10703 0.028889965052559 0.028889965052559
+19963 4945 7404 0.157747728004848 0.157747728004848
+5109 4628 4629 0.132844583260552 0.132844583260552
+13926 8916 8922 0.136369708465648 0.136369708465648
+19964 7404 10415 0.200029723937468 0.200029723937468
+12274 8517 8518 0.0318537260898596 0.0318537260898596
+302 310 311 0.0714603355500818 0.0714603355500818
+307 315 316 0.0430385391585726 0.0430385391585726
+333 333 334 0.130005791781119 0.130005791781119
+501 338 339 0.0809671757461818 0.0809671757461818
+337 340 336 0.244398847800565 0.244398847800565
+339 341 342 0.368758396632831 0.368758396632831
+341 343 344 0.267836247641829 0.267836247641829
+1553 1578 1579 0.0969614959298273 0.0969614959298273
+360 362 363 0.19757055700413 0.19757055700413
+361 363 358 0.235481235248911 0.235481235248911
+365 366 367 0.102920688901431 0.102920688901431
+374 376 377 0.135433574317766 0.135433574317766
+376 378 379 0.134391053348824 0.134391053348824
+485 478 486 0.209563350313202 0.209563350313202
+489 489 490 0.0633762863456435 0.0633762863456435
+491 491 492 0.0663732872105415 0.0663732872105415
+493 493 494 0.169203096380544 0.169203096380544
+495 5 495 0.258130691528307 0.258130691528307
+496 495 496 0.152370734557831 0.152370734557831
+523 518 519 0.337507977198885 0.337507977198885
+525 520 521 0.106662672722042 0.106662672722042
+527 522 523 0.0555974633225448 0.0555974633225448
+529 524 525 0.0282350762510443 0.0282350762510443
+530 525 526 0.0218806529722405 0.0218806529722405
+532 527 397 0.320431501428441 0.320431501428441
+11515 270 528 0.19992365959325 0.19992365959325
+535 529 530 0.455513641378482 0.455513641378482
+537 531 532 0.375956762810707 0.375956762810707
+11371 7972 290 0.0119699038475456 0.0119699038475456
+14734 4868 2218 0.161837248854237 0.161837248854237
+6872 5877 5878 0.0844725820315708 0.0844725820315708
+16249 9860 8753 0.202765718025687 0.202765718025687
+16250 8753 9861 0.201364638358659 0.201364638358659
+16251 9861 3662 0.165177264018871 0.165177264018871
+20720 9398 9340 0.00984702702877527 0.00984702702877527
+16256 9863 8751 0.202603541868936 0.202603541868936
+16260 3650 88 0.266027674120579 0.266027674120579
+16261 88 3524 0.203075294530693 0.203075294530693
+16262 3524 9864 0.20046430405241 0.20046430405241
+16263 9864 6517 0.135079896017257 0.135079896017257
+19523 6855 10544 0.00712022213135496 0.00712022213135496
+19524 10544 10545 0.0729342151704198 0.0729342151704198
+19526 10427 10546 0.0076995400840501 0.0076995400840501
+19527 10546 10545 0.0321755552809886 0.0321755552809886
+19528 10545 10547 0.0194542890583841 0.0194542890583841
+19529 10547 10548 0.0207030648178635 0.0207030648178635
+19530 10548 10543 0.0190435691175833 0.0190435691175833
+19531 10543 10549 0.0747704686946873 0.0747704686946873
+19532 10549 6859 0.00739470505760699 0.00739470505760699
+19543 10555 10556 0.0878912692065361 0.0878912692065361
+19544 10556 7460 0.0082175900444136 0.0082175900444136
+11808 8395 2692 0.146729521611774 0.146729521611774
+19546 6852 10557 0.00689466829919516 0.00689466829919516
+19547 10557 10558 0.00988642805887056 0.00988642805887056
+19548 10558 10559 0.0350073244923259 0.0350073244923259
+19550 10409 10559 0.0205641181514586 0.0205641181514586
+343 345 346 0.0953881878570937 0.0953881878570937
+357 359 360 0.0408490640041322 0.0408490640041322
+359 361 362 0.026041104546106 0.026041104546106
+19800 8772 7638 0.176309543452907 0.176309543452907
+19802 6235 5200 0.174765267300994 0.174765267300994
+14862 8517 9439 0.0489472304938478 0.0489472304938478
+14864 9387 9440 0.0279990514780242 0.0279990514780242
+206 104 218 0.105140809305177 0.105140809305177
+207 218 219 0.425726992195474 0.425726992195474
+208 219 220 0.341194420964085 0.341194420964085
+564 250 558 0.137167107757782 0.137167107757782
+566 559 560 0.116737480647973 0.116737480647973
+570 563 564 0.00248176882120935 0.00248176882120935
+571 564 565 0.0167681949380125 0.0167681949380125
+573 566 248 0.898480310845601 0.898480310845601
+577 569 570 0.20355346310439 0.20355346310439
+578 570 571 0.196730394721169 0.196730394721169
+579 571 572 0.203615183123948 0.203615183123948
+580 572 573 0.198181200751108 0.198181200751108
+14119 4047 3768 0.167133877022618 0.167133877022618
+16964 10030 10041 0.01368783886441 0.01368783886441
+17397 72 7305 0.205159206156883 0.205159206156883
+18238 8494 6764 0.145768349374275 0.145768349374275
+19608 10515 10585 0.0689638415978994 0.0689638415978994
+18764 10340 10339 0.0412859123428405 0.0412859123428405
+18823 10117 10113 0.0135016334010227 0.0135016334010227
+19106 10358 10371 0.165108727109845 0.165108727109845
+19491 10447 10448 0.0188144168916081 0.0188144168916081
+20034 9939 10087 0.139116164222915 0.139116164222915
+20585 10868 10860 0.0191301130167572 0.0191301130167572
+16225 9851 8750 0.201618763717288 0.201618763717288
+16226 8750 9852 0.201631838787549 0.201631838787549
+16227 9852 3528 0.200735525849656 0.200735525849656
+16228 3528 92 0.203732802229698 0.203732802229698
+16230 9853 7739 0.398547510805713 0.398547510805713
+16231 7739 5833 0.201507956367007 0.201507956367007
+16232 5833 9854 0.202599224942483 0.202599224942483
+16233 9854 8749 0.200829688485991 0.200829688485991
+16234 8749 9855 0.20199683583572 0.20199683583572
+16235 9855 3526 0.201154889365918 0.201154889365918
+16236 3526 90 0.202910490655376 0.202910490655376
+16237 90 3653 0.220628466219896 0.220628466219896
+16241 5837 9857 0.2019855844315 0.2019855844315
+16242 9857 8752 0.20368896268505 0.20368896268505
+16243 8752 9858 0.200451227373991 0.200451227373991
+16244 9858 3660 0.230907711206458 0.230907711206458
+16248 5838 9860 0.202297457689378 0.202297457689378
+19645 10602 7824 0.0258612340137364 0.0258612340137364
+363 364 365 0.559719374351914 0.559719374351914
+19907 10678 9721 0.0996291174385701 0.0996291174385701
+506 500 501 0.0135415609654236 0.0135415609654236
+561 555 249 0.135203722470136 0.135203722470136
+11580 1888 1889 0.200666363671928 0.200666363671928
+15798 2349 2131 0.0298025813439396 0.0298025813439396
+539 533 534 0.0326127113197712 0.0326127113197712
+19790 4873 2223 0.160309891999679 0.160309891999679
+19791 2223 939 0.184480311036498 0.184480311036498
+19793 6601 8056 0.176023947078255 0.176023947078255
+18090 1076 4197 0.0860162512015724 0.0860162512015724
+19867 5588 10668 0.0462472353637014 0.0462472353637014
+19868 10668 3867 0.0484404910203503 0.0484404910203503
+16756 10007 10009 0.110124788745591 0.110124788745591
+20270 10704 10719 0.0406376536123098 0.0406376536123098
+20705 10912 9190 0.00712573261129369 0.00712573261129369
+18194 10279 8107 0.203288621260674 0.203288621260674
+20434 10793 8352 0.0594105399024928 0.0594105399024928
+458 461 462 0.198429530791892 0.198429530791892
+460 463 464 0.0462542784573108 0.0462542784573108
+462 465 466 0.144675049024067 0.144675049024067
+17120 4175 1798 0.171169073462998 0.171169073462998
+464 265 467 0.159364568867095 0.159364568867095
+18157 6034 6309 0.201831068920315 0.201831068920315
+4816 4421 3998 0.17545447475176 0.17545447475176
+4922 4493 4494 0.0159365819430951 0.0159365819430951
+5210 4702 4703 0.066548442936564 0.066548442936564
+7813 6447 2400 0.0150551554736642 0.0150551554736642
+16544 814 7835 0.140306546265127 0.140306546265127
+12308 8643 8644 0.0690537561530006 0.0690537561530006
+17649 227 303 0.195568266331611 0.195568266331611
+7918 6517 6518 0.0762261509888863 0.0762261509888863
+17937 10218 10222 0.0404413602972235 0.0404413602972235
+17938 10222 10219 0.0368645715567014 0.0368645715567014
+8128 6642 6643 0.177723704306915 0.177723704306915
+17941 10223 10220 0.00249551892827132 0.00249551892827132
+17943 10222 10224 0.00241172243246435 0.00241172243246435
+8312 6745 6746 0.136482587401898 0.136482587401898
+18754 7413 5870 0.17727401445854 0.17727401445854
+18755 5870 1322 0.17769011554913 0.17769011554913
+19718 10634 10631 0.0223829659698328 0.0223829659698328
+19728 5372 10636 0.0113147577104563 0.0113147577104563
+11655 8352 8354 0.0940321887930874 0.0940321887930874
+12943 1331 8882 0.0183910567310257 0.0183910567310257
+13038 8921 8931 0.0826069320981336 0.0826069320981336
+15877 9002 8833 0.267177283911404 0.267177283911404
+13924 219 9234 0.1533276461132 0.1533276461132
+14664 6543 4752 0.198706695176553 0.198706695176553
+14064 5103 7930 0.0939071679637344 0.0939071679637344
+15409 9587 9588 0.102439715732603 0.102439715732603
+17271 7309 3269 0.20118551117184 0.20118551117184
+19597 10581 10493 0.00740818165509206 0.00740818165509206
+17856 10198 10199 0.0985751913110846 0.0985751913110846
+17916 2362 5630 0.113519118424065 0.113519118424065
+17920 5276 3075 0.102745112375949 0.102745112375949
+19227 10451 10452 0.0446144989444803 0.0446144989444803
+20035 10087 7837 0.13791526067504 0.13791526067504
+418 417 418 0.0816052997413777 0.0816052997413777
+20262 5750 10721 0.00796157509542264 0.00796157509542264
+3789 1821 3611 0.0958389453890581 0.0958389453890581
+3790 3611 2772 0.203476606019223 0.203476606019223
+3793 3613 3614 0.132946325644283 0.132946325644283
+3796 3616 3617 0.204716112848492 0.204716112848492
+3797 3617 3618 0.195623928497501 0.195623928497501
+427 426 427 0.387676950856037 0.387676950856037
+429 428 429 0.0146752084107322 0.0146752084107322
+430 429 430 0.036859949213086 0.036859949213086
+431 430 431 0.0704161362424121 0.0704161362424121
+432 431 432 0.590519007108071 0.590519007108071
+4284 2975 658 0.052473064124837 0.052473064124837
+4286 1885 270 0.0500105419976734 0.0500105419976734
+4287 270 4027 0.0498040073250557 0.0498040073250557
+4288 4027 4028 0.0589001114271481 0.0589001114271481
+4289 4028 4029 0.0431017175700998 0.0431017175700998
+4360 2497 4085 0.0418616206629569 0.0418616206629569
+4362 4086 4087 0.0498519055829618 0.0498519055829618
+4375 4097 4098 0.0489802870312836 0.0489802870312836
+4376 4098 4099 0.0495757400917575 0.0495757400917575
+4377 4099 1289 0.0496665540814756 0.0496665540814756
+4388 1566 4105 0.137573017409453 0.137573017409453
+4391 695 4107 0.201385149795677 0.201385149795677
+4393 4108 4109 0.0199664273987825 0.0199664273987825
+14838 3410 8377 0.101986580237 0.101986580237
+14839 8377 7446 0.0983251649921582 0.0983251649921582
+14840 7446 7164 0.102406305295689 0.102406305295689
+14842 7777 9006 0.0511080596626327 0.0511080596626327
+14843 9006 1118 0.0498086503332092 0.0498086503332092
+14844 1118 9427 0.0503946729534928 0.0503946729534928
+14845 9427 7495 0.0500441160343634 0.0500441160343634
+14846 7495 9428 0.0499148481472719 0.0499148481472719
+16340 8082 9873 0.204288977647072 0.204288977647072
+16284 2160 2852 0.333640243849923 0.333640243849923
+16319 7334 9870 0.105486497466828 0.105486497466828
+16320 9870 3330 0.104529154175209 0.104529154175209
+16321 3330 5008 0.105000246042652 0.105000246042652
+16322 5008 9871 0.101110660676404 0.101110660676404
+16323 9871 6279 0.105691817248501 0.105691817248501
+16324 6279 9872 0.052158145666091 0.052158145666091
+16325 9872 1044 0.0524997416021315 0.0524997416021315
+16326 1044 3906 0.105460879039182 0.105460879039182
+16329 5403 7356 0.10569318364656 0.10569318364656
+16330 7356 6784 0.104889107310835 0.104889107310835
+16331 6784 5124 0.210810768544514 0.210810768544514
+20721 9340 10905 0.00789820611305507 0.00789820611305507
+20723 10753 9339 0.007875732855517 0.007875732855517
+20728 9342 9396 0.0106743790650573 0.0106743790650573
+20729 9396 10915 0.00762676803615786 0.00762676803615786
+20731 10886 10916 0.00379288018005415 0.00379288018005415
+20732 10916 10888 0.0491926355480291 0.0491926355480291
+20733 10888 10897 0.0175392611655491 0.0175392611655491
+20735 5884 5882 0.0407543500383345 0.0407543500383345
+20739 10916 10896 0.0428179717864665 0.0428179717864665
+19515 10538 10539 0.0270370607457707 0.0270370607457707
+19519 10540 10541 0.0721562499053708 0.0721562499053708
+19520 6858 10542 0.00731747119062453 0.00731747119062453
+19521 10542 10543 0.072308027249243 0.072308027249243
+19641 10598 10599 0.0410277962156296 0.0410277962156296
+19647 10527 10603 0.00759964014854772 0.00759964014854772
+8 8 9 0.136291899256532 0.136291899256532
+9 9 10 0.137589063327607 0.137589063327607
+10 10 11 0.132825874246234 0.132825874246234
+18420 9372 1692 0.204432374496239 0.204432374496239
+18421 1692 6881 0.204488584881531 0.204488584881531
+279 289 290 0.0346246156131069 0.0346246156131069
+280 290 291 0.0090342150661118 0.0090342150661118
+287 297 298 0.583705095697001 0.583705095697001
+288 298 299 0.306214311798175 0.306214311798175
+290 300 106 0.00724031766776508 0.00724031766776508
+16839 9888 10020 0.0079899169832474 0.0079899169832474
+292 301 302 0.137922345506014 0.137922345506014
+293 302 303 0.195856797695859 0.195856797695859
+295 304 305 0.071509984134022 0.071509984134022
+296 305 291 0.00958395052624692 0.00958395052624692
+298 306 307 0.132706668323714 0.132706668323714
+300 308 309 0.180558406302622 0.180558406302622
+13564 3088 497 0.0577004807279618 0.0577004807279618
+549 543 426 0.352446625998258 0.352446625998258
+552 546 547 0.162031197296959 0.162031197296959
+555 549 550 0.0907371722674166 0.0907371722674166
+16080 9284 9816 0.896094060874208 0.896094060874208
+922 936 937 0.0492564901299232 0.0492564901299232
+923 937 938 0.0472982580528762 0.0472982580528762
+924 938 939 0.0491354084196454 0.0491354084196454
+925 939 940 0.0508720309451131 0.0508720309451131
+926 940 941 0.0492045261244582 0.0492045261244582
+928 942 943 0.0497647165539241 0.0497647165539241
+929 943 944 0.0490705088651407 0.0490705088651407
+930 944 945 0.0603455693296164 0.0603455693296164
+931 946 947 0.0401316151990327 0.0401316151990327
+933 948 949 0.0998226264147839 0.0998226264147839
+934 949 950 0.0983576522120727 0.0983576522120727
+15935 9756 9757 0.156652526688463 0.156652526688463
+2725 2680 2681 0.0108684198063562 0.0108684198063562
+2726 2681 2682 0.048953084737917 0.048953084737917
+2727 2682 2683 0.0539629704453868 0.0539629704453868
+2728 2683 2684 0.0523967582185389 0.0523967582185389
+2730 2685 2686 0.0561874543205358 0.0561874543205358
+2731 2686 2687 0.0505746825733151 0.0505746825733151
+2732 2687 2688 0.0532702991765301 0.0532702991765301
+2733 2688 2689 0.0520434204860384 0.0520434204860384
+2734 2689 2690 0.0469426670134342 0.0469426670134342
+2735 2690 2691 0.0055983554055492 0.0055983554055492
+2736 2691 2692 0.0527791994653692 0.0527791994653692
+2737 2692 2693 0.0530982869497539 0.0530982869497539
+2738 2693 2694 0.0517656440902012 0.0517656440902012
+2740 2695 2696 0.0564222695417846 0.0564222695417846
+2741 2696 2697 0.0491123681137852 0.0491123681137852
+2743 2698 2563 0.102019026624601 0.102019026624601
+2745 2699 2700 0.132875620799413 0.132875620799413
+2746 2700 2701 0.135383174760531 0.135383174760531
+2747 2701 2702 0.142428760025563 0.142428760025563
+2749 2703 2704 0.0110418183352839 0.0110418183352839
+3232 1186 3146 0.0222724242580952 0.0222724242580952
+3233 3146 3147 0.199414112058729 0.199414112058729
+3235 3148 3149 0.202164772668483 0.202164772668483
+3236 3149 3150 0.200873635711822 0.200873635711822
+3238 1549 3151 0.20099284178908 0.20099284178908
+3239 3151 284 0.102708547785912 0.102708547785912
+3241 3152 3153 0.190699299195112 0.190699299195112
+3242 3153 3154 0.20682256355895 0.20682256355895
+3244 3155 3156 0.180582058742099 0.180582058742099
+3245 3156 3157 0.169576673169674 0.169576673169674
+3246 3157 3158 0.182296097160239 0.182296097160239
+3247 3158 3159 0.198872141197801 0.198872141197801
+3248 3159 3160 0.150969541792736 0.150969541792736
+3250 3161 3162 0.20389937284006 0.20389937284006
+14826 8301 6748 0.0667725814392886 0.0667725814392886
+14827 6748 7911 0.0672145953526644 0.0672145953526644
+14828 7911 6148 0.0663282745787247 0.0663282745787247
+258 257 266 0.0587628088830451 0.0587628088830451
+19749 647 7274 0.134298165118703 0.134298165118703
+19750 7274 1989 0.0916188684792704 0.0916188684792704
+19751 1989 1973 0.0380843237979454 0.0380843237979454
+19752 1973 4593 0.133556226393108 0.133556226393108
+19753 4593 6480 0.132288869732613 0.132288869732613
+19754 6480 2468 0.142585895231316 0.142585895231316
+19758 9421 959 0.172665861332853 0.172665861332853
+19759 959 10645 0.13147788241291 0.13147788241291
+19760 1208 9304 0.168127340065809 0.168127340065809
+20582 10869 10849 0.0156424449925145 0.0156424449925145
+19762 9148 5948 0.203948884455816 0.203948884455816
+19763 5948 5140 0.230511938313211 0.230511938313211
+19771 9419 957 0.173152824232778 0.173152824232778
+19772 957 8866 0.177567389214567 0.177567389214567
+19773 8866 3772 0.153916736097948 0.153916736097948
+19774 3772 10250 0.199306990270457 0.199306990270457
+19776 5481 9962 0.172319939483889 0.172319939483889
+19784 10633 5611 0.0523352586472612 0.0523352586472612
+19785 5611 10632 0.0574818788883128 0.0574818788883128
+19786 10632 3948 0.0628606527024246 0.0628606527024246
+19788 5471 9476 0.170862748175182 0.170862748175182
+19795 10242 7118 0.176747024157438 0.176747024157438
+19797 10241 6597 0.176287163937986 0.176287163937986
+19798 6597 8052 0.177501084527478 0.177501084527478
+19799 8052 8772 0.17769668863416 0.17769668863416
+20115 7697 7687 0.0337511699796145 0.0337511699796145
+19903 5589 10662 0.0571161687994488 0.0571161687994488
+19904 10662 7532 0.0504117571952022 0.0504117571952022
+19905 7532 10677 0.0997820208770486 0.0997820208770486
+19909 2313 6581 0.0799825399923036 0.0799825399923036
+19911 9640 7119 0.178268282456568 0.178268282456568
+19912 7119 10244 0.176467674531692 0.176467674531692
+19924 625 10679 0.208701850480872 0.208701850480872
+3596 897 3446 0.139044776802754 0.139044776802754
+3598 2803 3447 0.126707874592684 0.126707874592684
+3599 3447 3448 0.123301295397385 0.123301295397385
+3601 3449 3450 0.173676950071542 0.173676950071542
+3602 3450 2355 0.178205364659248 0.178205364659248
+3603 2355 3451 0.173197360497638 0.173197360497638
+19562 10565 7475 0.0791516149409225 0.0791516149409225
+3604 3451 3452 0.173541943088937 0.173541943088937
+17079 9872 1162 0.139149030623918 0.139149030623918
+3605 3452 3453 0.1769778659128 0.1769778659128
+3606 3453 3454 0.165627970000561 0.165627970000561
+3607 3454 1205 0.168543363105219 0.168543363105219
+3608 1205 3455 0.0221544930319224 0.0221544930319224
+3609 3455 3456 0.199430319568372 0.199430319568372
+3610 3456 3457 0.153671457388635 0.153671457388635
+3611 3457 954 0.177011997745418 0.177011997745418
+3616 3461 3023 0.066721008314693 0.066721008314693
+3617 3023 609 0.0626815132610695 0.0626815132610695
+3618 609 3465 0.0706324711687883 0.0706324711687883
+3620 3466 3467 0.0872559719077514 0.0872559719077514
+3621 3467 3468 0.0185752884131515 0.0185752884131515
+3624 3470 3471 0.137381540377109 0.137381540377109
+3625 3471 3472 0.139227388345715 0.139227388345715
+3627 3473 2394 0.0888475437763938 0.0888475437763938
+3628 2394 3474 0.138668820339117 0.138668820339117
+3630 752 1572 0.142095074047717 0.142095074047717
+3636 1922 3478 0.201186325897418 0.201186325897418
+3639 3479 78 0.204132972246117 0.204132972246117
+3640 78 3480 0.203867249894849 0.203867249894849
+3641 3480 3481 0.201309535256297 0.201309535256297
+3642 3481 3482 0.20059690465602 0.20059690465602
+3643 3482 3483 0.19983968701354 0.19983968701354
+3645 3484 3485 0.206291326448342 0.206291326448342
+17801 8859 9953 0.0450786858997054 0.0450786858997054
+3647 1956 3486 0.372627158727207 0.372627158727207
+3649 3487 3488 0.176001514646942 0.176001514646942
+3652 3491 3492 0.0183360753269697 0.0183360753269697
+3653 3492 1957 0.294352299971408 0.294352299971408
+3655 1514 1794 0.180158106731211 0.180158106731211
+3657 3493 3494 0.410250831833552 0.410250831833552
+3658 3494 3495 0.80930180387284 0.80930180387284
+3660 3497 3498 0.0969369694749486 0.0969369694749486
+3661 3498 3499 0.0991356893770485 0.0991356893770485
+3662 3499 3500 0.0998795294298673 0.0998795294298673
+3663 3500 3501 0.0512305304785401 0.0512305304785401
+3664 3501 3502 0.04790242821524 0.04790242821524
+3665 3502 3503 0.0976724268185372 0.0976724268185372
+3666 3503 3504 0.099556042023676 0.099556042023676
+3667 3504 3505 0.0928685437479174 0.0928685437479174
+3668 3505 3506 0.0161263903021828 0.0161263903021828
+3670 3507 3508 0.0452502277318962 0.0452502277318962
+3673 3510 3511 0.00276384344441178 0.00276384344441178
+3674 3511 3512 0.10075109326777 0.10075109326777
+3675 3512 3513 0.0463453549611142 0.0463453549611142
+3676 3513 3514 0.0488777906121745 0.0488777906121745
+3677 3514 3515 0.0517011274556552 0.0517011274556552
+3678 3515 3480 0.0495708012211316 0.0495708012211316
+3679 3480 3516 0.0493402083699287 0.0493402083699287
+3680 3516 3517 0.0507690156276584 0.0507690156276584
+3681 3517 3518 0.0480408906902884 0.0480408906902884
+3682 3518 3519 0.0499402493817724 0.0499402493817724
+3683 3519 3520 0.0491944164243011 0.0491944164243011
+3685 3521 3522 0.048707440700188 0.048707440700188
+3686 3522 3523 0.0553123927733894 0.0553123927733894
+3688 3524 3525 0.0491959341758901 0.0491959341758901
+3689 3525 3526 0.0471666433723512 0.0471666433723512
+3690 3526 3527 0.0512305206815533 0.0512305206815533
+3693 2737 3529 0.051933950168584 0.051933950168584
+3694 3529 3530 0.02212553176718 0.02212553176718
+3695 3530 3531 0.0926927616463166 0.0926927616463166
+3698 3533 3534 0.0505032949697016 0.0505032949697016
+3699 3534 3535 0.0486395723695605 0.0486395723695605
+3700 3535 3536 0.0490245580059416 0.0490245580059416
+3701 3536 3537 0.0505772192147856 0.0505772192147856
+3703 3538 3540 0.0504276967004131 0.0504276967004131
+3705 3541 3542 0.0472106572615262 0.0472106572615262
+3706 3542 1776 0.0526607102662498 0.0526607102662498
+3707 1776 3543 0.0501355164587406 0.0501355164587406
+3708 3543 3545 0.0479683302933595 0.0479683302933595
+3709 3545 3546 0.0512089379810606 0.0512089379810606
+3712 3547 3548 0.0501783172118128 0.0501783172118128
+3714 3549 3550 0.0951894457465396 0.0951894457465396
+3716 3374 3551 0.137804864391147 0.137804864391147
+3717 3552 3553 0.0519171995444708 0.0519171995444708
+3718 3553 3554 0.0504125238991067 0.0504125238991067
+3719 3554 3555 0.0509345511135035 0.0509345511135035
+3720 3555 3556 0.0352813695033733 0.0352813695033733
+3721 3556 3557 0.0165592866582096 0.0165592866582096
+3722 3557 3558 0.0492318634139881 0.0492318634139881
+3724 2895 3559 0.10435477566087 0.10435477566087
+3725 3559 3560 0.106943183049813 0.106943183049813
+3726 3560 3561 0.104660660979737 0.104660660979737
+3727 3561 3562 0.110121719044693 0.110121719044693
+3728 3562 3563 0.102966459525542 0.102966459525542
+3730 3564 3565 0.0562722873891167 0.0562722873891167
+3735 3568 3569 0.0531044201649232 0.0531044201649232
+3736 3569 3570 0.106391147104451 0.106391147104451
+3737 3570 3571 0.101252017782574 0.101252017782574
+3738 3571 3323 0.106405710576167 0.106405710576167
+3739 3323 3572 0.102008288172629 0.102008288172629
+3740 3572 3573 0.10165616841443 0.10165616841443
+3741 3573 2074 0.102582871487582 0.102582871487582
+3742 2074 2671 0.108231570849142 0.108231570849142
+3743 2671 3574 0.10456159833902 0.10456159833902
+5002 115 4548 0.0219059413647985 0.0219059413647985
+3744 3574 3575 0.112649473969198 0.112649473969198
+3748 3469 3578 0.102738780677217 0.102738780677217
+3751 848 3580 0.194594151891157 0.194594151891157
+3780 799 3582 0.202016106794537 0.202016106794537
+3753 3581 3583 0.0933177632696428 0.0933177632696428
+3756 3586 3587 0.0427524561216555 0.0427524561216555
+20307 3851 3852 0.0199150113624835 0.0199150113624835
+3757 3587 3588 0.00652614157776479 0.00652614157776479
+3758 3588 3589 0.0165416326790114 0.0165416326790114
+3759 3589 3590 0.0292914453635219 0.0292914453635219
+3760 3590 3591 0.012398142936734 0.012398142936734
+3761 3591 3592 0.00808918004643223 0.00808918004643223
+3762 3592 3593 0.0105968786869326 0.0105968786869326
+3764 3487 3594 0.175200690864457 0.175200690864457
+17310 5684 5685 0.200644913348264 0.200644913348264
+3765 3594 2339 0.174981229925885 0.174981229925885
+3768 3596 3597 0.239259126523314 0.239259126523314
+3770 1985 1969 0.0388238770836811 0.0388238770836811
+3771 1969 3598 0.103685036459381 0.103685036459381
+3772 3598 3599 0.103278210249803 0.103278210249803
+3774 3600 685 0.204822140654993 0.204822140654993
+3775 685 1984 0.157051714392723 0.157051714392723
+3777 2473 3601 0.204732098938096 0.204732098938096
+3778 3601 3602 0.203258463693205 0.203258463693205
+3779 3602 799 0.197950165384785 0.197950165384785
+3781 3582 3603 0.209363914186111 0.209363914186111
+3782 3603 3604 0.202974468009462 0.202974468009462
+3783 3604 3063 0.201030651985273 0.201030651985273
+3784 3063 3605 0.183452467298283 0.183452467298283
+3785 3605 3609 0.0173247613422977 0.0173247613422977
+3786 3609 3610 0.100167424900963 0.100167424900963
+3787 3610 1148 0.0998182719974527 0.0998182719974527
+3798 3618 3619 1.41244277904247 1.41244277904247
+3799 3620 3621 0.200419085699923 0.200419085699923
+3800 3621 3083 0.197049820413636 0.197049820413636
+3806 3250 3625 0.214852973763206 0.214852973763206
+3807 3625 37 0.19341482884534 0.19341482884534
+3808 37 3536 0.207817408343139 0.207817408343139
+3809 3536 3626 0.197537787183869 0.197537787183869
+3810 3626 3627 0.0725803332096263 0.0725803332096263
+3812 3628 3629 0.0377891893344826 0.0377891893344826
+3814 3630 108 0.222508950073657 0.222508950073657
+3815 108 3631 0.48374336677931 0.48374336677931
+3816 3631 3632 1.29923590650812 1.29923590650812
+17118 3959 510 0.232935824119298 0.232935824119298
+4428 4136 4137 0.173313517100692 0.173313517100692
+4429 4137 4138 0.202530185785573 0.202530185785573
+18158 6309 10170 0.40356001102466 0.40356001102466
+4432 2389 4140 0.139183902890425 0.139183902890425
+4434 4141 4142 0.197054107936505 0.197054107936505
+4438 4144 4145 0.0537117632250494 0.0537117632250494
+4439 4145 965 0.101471161400112 0.101471161400112
+4440 965 4146 0.104100628512796 0.104100628512796
+4441 4146 3163 0.0969051144320847 0.0969051144320847
+4442 3163 4147 0.101372524256092 0.101372524256092
+4443 4147 4148 0.0308326213261154 0.0308326213261154
+4445 3914 1051 0.113795014444698 0.113795014444698
+4446 1051 4149 0.10964029932362 0.10964029932362
+4449 4151 3345 0.104243278330047 0.104243278330047
+4451 4152 4153 0.102419695022811 0.102419695022811
+4452 4153 2058 0.103354746635848 0.103354746635848
+4453 2058 2644 0.104156201229462 0.104156201229462
+4454 2644 4110 0.102077109293643 0.102077109293643
+5804 5122 5123 0.00520045876973269 0.00520045876973269
+4455 4110 4154 0.102551400025576 0.102551400025576
+4458 4156 3451 0.102085683319337 0.102085683319337
+4459 3451 4157 0.103915702611829 0.103915702611829
+4460 4157 3881 0.104147627332173 0.104147627332173
+4461 3881 844 0.102547271473588 0.102547271473588
+4462 844 4158 0.103915708789956 0.103915708789956
+4463 4158 4159 0.0473715373473714 0.0473715373473714
+4465 4160 4161 0.0487952389865543 0.0487952389865543
+4466 4161 4162 0.0503092120983125 0.0503092120983125
+4467 4162 4163 0.0998399649224705 0.0998399649224705
+4470 991 4165 0.0616573964011522 0.0616573964011522
+4471 4165 4166 0.0374515064164708 0.0374515064164708
+4472 4166 4167 0.0500586202169859 0.0500586202169859
+4473 4167 4168 0.0490747432154895 0.0490747432154895
+4474 4168 1546 0.0500170304502106 0.0500170304502106
+4475 1546 4169 0.0485801531295538 0.0485801531295538
+5773 5098 5099 0.136491222225544 0.136491222225544
+4479 4171 4172 0.0171013114970861 0.0171013114970861
+4480 4172 4173 0.100095278405447 0.100095278405447
+4481 4173 4174 0.0193707742575379 0.0193707742575379
+4482 4174 3125 0.0983746933912928 0.0983746933912928
+4483 3125 3149 0.017633000291927 0.017633000291927
+4485 3759 1483 0.205504619788951 0.205504619788951
+4486 1483 139 0.199306955290764 0.199306955290764
+3818 3634 3635 0.193271661183235 0.193271661183235
+3844 50 2744 0.0297683374213274 0.0297683374213274
+3819 3635 3636 0.259071020170312 0.259071020170312
+3820 3636 3637 0.220352934884474 0.220352934884474
+3821 3637 3638 0.0146799692899151 0.0146799692899151
+3822 3638 3629 0.546064092681382 0.546064092681382
+3823 3629 3628 0.0377891893344826 0.0377891893344826
+3848 3639 3640 0.0377019004254023 0.0377019004254023
+3824 3628 3641 0.274746435577415 0.274746435577415
+3827 3643 3630 0.145379834812045 0.145379834812045
+3829 3644 3645 0.10937380292523 0.10937380292523
+3831 3646 3647 0.118367900276814 0.118367900276814
+3833 3648 3649 0.0133410304783532 0.0133410304783532
+3834 3649 3650 0.0429585103622675 0.0429585103622675
+3835 3650 3651 0.0204151163658954 0.0204151163658954
+3836 3651 3652 0.035861428044368 0.035861428044368
+3837 3652 3653 0.0519097060940613 0.0519097060940613
+3838 3653 2733 0.0215181506261361 0.0215181506261361
+3839 2733 3184 0.0284884125498342 0.0284884125498342
+3840 3184 3654 0.0523000942930375 0.0523000942930375
+3841 3654 3655 0.0449577371290542 0.0449577371290542
+3842 3655 3656 0.0854917295991763 0.0854917295991763
+3843 3656 50 0.0260531877334927 0.0260531877334927
+3845 2744 3657 0.0566089274642789 0.0566089274642789
+3846 3657 3658 0.0492739020617726 0.0492739020617726
+3849 3640 3660 0.0409815373213546 0.0409815373213546
+3850 3660 3661 0.0430567519340905 0.0430567519340905
+3851 3661 3662 0.0468129367556475 0.0468129367556475
+3852 3662 3663 0.0487340718514498 0.0487340718514498
+3853 3663 3664 0.0766168893066023 0.0766168893066023
+3854 3664 3665 0.0775543535398568 0.0775543535398568
+3856 2887 3666 0.0966953683989245 0.0966953683989245
+3857 3666 3667 0.0610272459393337 0.0610272459393337
+3860 3669 3670 0.0315853053568594 0.0315853053568594
+3862 3671 3672 0.0504610774094253 0.0504610774094253
+3863 3672 3673 0.0499084817958282 0.0499084817958282
+3864 3673 3674 0.0598581313257637 0.0598581313257637
+3865 3674 3675 0.0415918035714469 0.0415918035714469
+3866 3675 3676 0.0971838117715375 0.0971838117715375
+3867 3676 3677 0.0757910145140814 0.0757910145140814
+3868 3677 3678 0.0241351496511796 0.0241351496511796
+3869 3678 3679 0.10921148844503 0.10921148844503
+3870 3679 3680 0.0604791133362521 0.0604791133362521
+3871 3680 3681 0.0497662614550786 0.0497662614550786
+3872 3681 3682 0.0284371260175335 0.0284371260175335
+3873 3682 3683 0.0775136719631998 0.0775136719631998
+3874 3683 3684 0.0986272672973807 0.0986272672973807
+3876 3686 1026 0.103637164673652 0.103637164673652
+5148 4657 4658 0.0518173498658282 0.0518173498658282
+3877 1026 3687 0.0559565437232701 0.0559565437232701
+3878 3687 3688 0.0511859173489266 0.0511859173489266
+3879 3688 3689 0.0520066703615513 0.0520066703615513
+3880 3689 3690 0.049253728288425 0.049253728288425
+3882 2886 3691 0.113429848834015 0.113429848834015
+3884 3215 3692 0.202752541360657 0.202752541360657
+3885 3692 1926 0.199353224720545 0.199353224720545
+3886 1926 3693 0.200351682125873 0.200351682125873
+3887 3693 3270 0.203854022504707 0.203854022504707
+3888 3270 3694 0.200935067748901 0.200935067748901
+3890 83 3519 0.205087956532059 0.205087956532059
+3892 3695 3696 0.201007421421966 0.201007421421966
+3897 3217 3701 0.1352188342505 0.1352188342505
+3898 131 1718 0.251512260994622 0.251512260994622
+15946 9759 9762 0.240661719520644 0.240661719520644
+3900 3702 3703 0.0933150678138448 0.0933150678138448
+3901 3703 3704 0.137025546490973 0.137025546490973
+3902 3704 3705 0.132801372713675 0.132801372713675
+3903 3705 1668 0.132757296812598 0.132757296812598
+3904 1668 3706 0.138337667643286 0.138337667643286
+3905 3706 2449 0.137198901653783 0.137198901653783
+3906 2449 3239 0.137027047572602 0.137027047572602
+3909 3708 3709 0.0594114493059888 0.0594114493059888
+3910 3709 109 0.057220909251565 0.057220909251565
+3913 3711 3712 0.139485170169946 0.139485170169946
+3914 3712 2811 0.114534953425458 0.114534953425458
+3918 3715 3716 0.0528065388297546 0.0528065388297546
+3919 3716 3717 0.0498986148500866 0.0498986148500866
+3920 3717 3718 0.0501983896755627 0.0501983896755627
+3921 3718 3722 0.0513311819624353 0.0513311819624353
+3922 3722 3723 0.0447895916462849 0.0447895916462849
+3923 3723 3724 0.0431436061631746 0.0431436061631746
+3924 3724 3725 0.0306469500311329 0.0306469500311329
+3926 3726 3727 0.194057523355391 0.194057523355391
+3927 3727 723 0.155998303022368 0.155998303022368
+3928 723 3728 0.0204200466887832 0.0204200466887832
+3929 3728 3729 0.122760919468851 0.122760919468851
+3930 3729 3730 0.0554195837686694 0.0554195837686694
+3931 3730 520 0.0841868989778494 0.0841868989778494
+3932 520 3731 0.0926590200371809 0.0926590200371809
+3933 3731 3732 0.0560537701957185 0.0560537701957185
+3937 3735 3736 0.177568883213635 0.177568883213635
+3939 3737 3738 0.0596027628340358 0.0596027628340358
+3940 3738 2286 0.015731383207611 0.015731383207611
+3942 191 3739 0.20409229769904 0.20409229769904
+3943 3739 3740 0.196754914184827 0.196754914184827
+3945 3741 3742 0.0963531048469524 0.0963531048469524
+3947 3743 1867 0.211893481628119 0.211893481628119
+3948 1867 3744 0.190309691295086 0.190309691295086
+3949 3744 3369 0.156379911113779 0.156379911113779
+3951 3746 3747 0.0084501441528746 0.0084501441528746
+3953 3749 3750 0.291896586304336 0.291896586304336
+3957 3752 3753 0.00678737857974005 0.00678737857974005
+3958 3753 3754 0.00811546596932882 0.00811546596932882
+3959 3754 605 0.11345488105994 0.11345488105994
+3966 3759 3760 0.0543424988109601 0.0543424988109601
+3967 3760 3761 0.0124828328696103 0.0124828328696103
+3969 3762 3763 0.109035140401267 0.109035140401267
+3970 3763 3764 0.13451246019454 0.13451246019454
+3971 3764 1077 0.0751290727356026 0.0751290727356026
+3972 1077 2521 0.125841042831383 0.125841042831383
+3974 3765 3766 0.0155018141702848 0.0155018141702848
+3975 3766 3769 0.0925922303926536 0.0925922303926536
+3976 3769 450 0.0446743427321934 0.0446743427321934
+3977 450 855 0.0454696499518695 0.0454696499518695
+3978 855 3770 0.0458292249661059 0.0458292249661059
+5269 4111 4741 0.0999126780220414 0.0999126780220414
+3979 3770 3771 0.0463680305523856 0.0463680305523856
+3982 3777 3778 0.0472655889206378 0.0472655889206378
+3983 3778 3456 0.0457775618734605 0.0457775618734605
+3984 3456 3779 0.0949352444381587 0.0949352444381587
+3985 3779 3780 0.0949175907228116 0.0949175907228116
+3986 3780 3781 0.0934360991992659 0.0934360991992659
+3987 3781 3782 0.0927263272279538 0.0927263272279538
+3988 3782 2659 0.0984051754942233 0.0984051754942233
+3989 2659 2053 0.0987467204032972 0.0987467204032972
+3990 2053 3783 0.0990728400130522 0.0990728400130522
+3991 3783 3784 0.0514218472521816 0.0514218472521816
+3992 3784 3785 0.0779176889813446 0.0779176889813446
+3993 3785 3786 0.0982592928032825 0.0982592928032825
+3994 3786 3344 0.100047583059044 0.100047583059044
+3995 3344 3787 0.0997075658602957 0.0997075658602957
+3998 3789 1013 0.0991145515008367 0.0991145515008367
+3999 1013 3790 0.0988154439008836 0.0988154439008836
+4000 3790 3147 0.100818484811759 0.100818484811759
+4001 3147 3128 0.0882379333310365 0.0882379333310365
+4002 3128 3791 0.10924064572907 0.10924064572907
+4003 3791 3792 0.0990892368110052 0.0990892368110052
+4004 3792 3793 0.0983279071551189 0.0983279071551189
+4005 3793 3794 0.0488397000978433 0.0488397000978433
+4006 3794 3795 0.0500279563406491 0.0500279563406491
+4007 3795 2868 0.0499678370514067 0.0499678370514067
+4008 2868 3796 0.048583428681526 0.048583428681526
+4009 3796 3797 0.0504566053315115 0.0504566053315115
+4011 3798 3799 0.0451531325504455 0.0451531325504455
+4012 3799 983 0.0519296915637561 0.0519296915637561
+4015 3801 3802 0.0483738114958222 0.0483738114958222
+4016 3802 3803 0.0519812355103751 0.0519812355103751
+4017 3803 3804 0.101642680761132 0.101642680761132
+4018 3804 3805 0.100202026962745 0.100202026962745
+4019 3805 3806 0.0490200510242293 0.0490200510242293
+4020 3806 3159 0.0527906095396228 0.0527906095396228
+4021 3159 3807 0.0508058777981011 0.0508058777981011
+4022 3807 3808 0.0547154240766913 0.0547154240766913
+4023 3808 3809 0.105580069148102 0.105580069148102
+4025 3810 3811 0.0543737037127348 0.0543737037127348
+16058 9242 237 0.236847878323095 0.236847878323095
+4026 3811 3812 0.108778018122892 0.108778018122892
+4027 3812 1620 0.10920973774803 0.10920973774803
+4029 3813 3814 0.083969278056869 0.083969278056869
+4031 3815 3816 0.139162136479248 0.139162136479248
+4032 3816 3817 0.128842029582485 0.128842029582485
+4034 3818 2303 0.104861015321702 0.104861015321702
+4035 2303 130 0.0947837852263858 0.0947837852263858
+4036 130 155 0.2039982188818 0.2039982188818
+4037 155 1719 0.251031715971117 0.251031715971117
+4040 3820 3821 0.253858034970465 0.253858034970465
+4041 3821 765 0.158798770965753 0.158798770965753
+4042 765 3822 0.38766252452626 0.38766252452626
+4044 3823 3824 0.6423341602363 0.6423341602363
+4045 3825 3826 0.0763938085811643 0.0763938085811643
+5338 4787 4788 0.201919584850824 0.201919584850824
+4049 3828 3829 0.0709013283805701 0.0709013283805701
+4051 3830 3831 0.161299122027925 0.161299122027925
+4052 3832 3833 0.0520709463921909 0.0520709463921909
+4054 3834 3835 0.133913000116738 0.133913000116738
+4055 3835 3836 0.135958385150602 0.135958385150602
+4059 3838 3839 0.195689058153451 0.195689058153451
+4061 3840 3841 0.104161008191779 0.104161008191779
+4062 3841 3842 0.204332097790775 0.204332097790775
+4063 3842 2989 0.198305038809848 0.198305038809848
+4064 2989 3843 0.202007841321225 0.202007841321225
+4065 3843 3844 0.201085745402869 0.201085745402869
+4066 3844 3845 0.203153756914823 0.203153756914823
+4067 3845 3846 0.201463782012409 0.201463782012409
+4068 3846 1694 0.201944163047273 0.201944163047273
+4069 1694 3847 0.201007884572681 0.201007884572681
+4070 3847 2442 0.173966646957408 0.173966646957408
+4071 2442 3848 0.171462594138623 0.171462594138623
+5362 4804 4805 0.138916058502817 0.138916058502817
+4072 3848 3849 0.15641185610528 0.15641185610528
+4073 3849 3850 0.155873108146064 0.155873108146064
+4074 3850 3851 0.11951230715733 0.11951230715733
+4075 3851 3852 0.0199150113624835 0.0199150113624835
+4078 2606 3854 0.176099789319583 0.176099789319583
+4081 3856 3857 0.204451648584923 0.204451648584923
+4082 3857 3858 0.27633741171005 0.27633741171005
+4084 3859 3860 0.194935828897222 0.194935828897222
+4085 3860 2553 0.201807589121279 0.201807589121279
+4086 2553 3861 0.201183796555208 0.201183796555208
+4087 3861 3862 0.206144933368939 0.206144933368939
+4088 3863 3864 0.174004040356707 0.174004040356707
+4089 3864 3865 0.176177241775495 0.176177241775495
+4090 3865 3866 0.0719661295510201 0.0719661295510201
+4091 3866 1862 0.105391351050826 0.105391351050826
+4092 1862 2607 0.183084733810089 0.183084733810089
+4094 3867 3868 0.135844661693153 0.135844661693153
+4096 1431 3869 0.122681533981215 0.122681533981215
+4099 3870 3871 0.0814181379314414 0.0814181379314414
+4101 3038 3872 0.194090812408951 0.194090812408951
+4103 3579 3873 0.140995166985651 0.140995166985651
+4104 3873 3874 0.0908684940539539 0.0908684940539539
+4108 2397 3876 0.142303739641396 0.142303739641396
+4110 3877 702 0.203534713775632 0.203534713775632
+4111 702 3878 0.201204188260029 0.201204188260029
+4113 3879 3880 0.176189861258557 0.176189861258557
+4114 3880 2357 0.178601291381029 0.178601291381029
+4115 2357 3881 0.172977248757485 0.172977248757485
+4116 3881 3882 0.173963704924205 0.173963704924205
+4117 3882 3883 0.177248873598787 0.177248873598787
+4118 3883 3884 0.165174683174039 0.165174683174039
+4120 3885 899 0.068233075024198 0.068233075024198
+4121 899 3886 0.136382558439915 0.136382558439915
+4123 3887 2246 0.064586200340924 0.064586200340924
+4126 3889 3890 0.173108811078515 0.173108811078515
+4128 3891 673 0.180805922237936 0.180805922237936
+4129 673 3892 0.00347134617206091 0.00347134617206091
+4131 3893 3894 0.173412160606882 0.173412160606882
+4132 3894 3686 0.239804659108201 0.239804659108201
+4133 3686 3895 0.139339505088047 0.139339505088047
+4134 3895 1293 0.0712429362693845 0.0712429362693845
+4136 3896 3897 0.00461464942878269 0.00461464942878269
+4137 3897 3898 0.00296969221564957 0.00296969221564957
+4138 3898 3899 0.135099018741423 0.135099018741423
+4139 3899 3900 0.133736401013675 0.133736401013675
+4140 3900 826 0.1432668721319 0.1432668721319
+4141 826 3567 0.140539270126583 0.140539270126583
+4142 3567 3901 0.141736858580205 0.141736858580205
+4143 3901 3902 0.138513379846183 0.138513379846183
+4144 3902 3903 0.137738276341516 0.137738276341516
+4145 3903 3041 0.133834213982 0.133834213982
+4146 3041 3904 0.143195912483998 0.143195912483998
+4147 3904 3905 0.00371612313723013 0.00371612313723013
+4148 3905 3906 0.138485181869722 0.138485181869722
+4150 1161 880 0.143460648556329 0.143460648556329
+4151 880 3907 0.137181190587279 0.137181190587279
+4152 3907 2788 0.133979203320047 0.133979203320047
+4154 3908 3909 0.11929025073176 0.11929025073176
+4155 3909 3910 0.092551367353814 0.092551367353814
+4157 734 1555 0.128698646905998 0.128698646905998
+4158 1555 3911 0.10223670466325 0.10223670466325
+4159 3911 3912 0.0209102658501846 0.0209102658501846
+4160 3913 3914 0.290781445277807 0.290781445277807
+4161 3914 3915 0.112536676265492 0.112536676265492
+4162 3915 3916 0.199777886092506 0.199777886092506
+4163 3916 3917 0.0912727874005277 0.0912727874005277
+4164 3917 3918 0.112620851967747 0.112620851967747
+4166 3919 1187 0.167283340526576 0.167283340526576
+4167 1187 3920 0.0212753866211399 0.0212753866211399
+4168 3920 3790 0.200229524215252 0.200229524215252
+4169 3790 3921 0.153151160013799 0.153151160013799
+4170 3921 3922 0.0549370836226997 0.0549370836226997
+4171 3923 3924 0.0360721076371334 0.0360721076371334
+4174 706 3926 0.117999308023824 0.117999308023824
+4175 3926 3702 0.0450373928319521 0.0450373928319521
+4176 3702 3927 0.114850773809758 0.114850773809758
+4177 3927 3928 0.0608860897951607 0.0608860897951607
+4178 3928 3929 0.107271550927247 0.107271550927247
+4180 3930 1666 0.1330788885459 0.1330788885459
+4181 1666 3931 0.137468360449037 0.137468360449037
+4182 3931 2447 0.134834989989903 0.134834989989903
+4183 2447 3237 0.140199730422516 0.140199730422516
+4184 3237 3933 0.138639782785987 0.138639782785987
+4185 3933 3934 0.138811739329711 0.138811739329711
+4186 3934 3935 0.134204059449961 0.134204059449961
+4187 3935 3936 0.123276584845079 0.123276584845079
+4189 3937 3938 0.126045478045544 0.126045478045544
+4190 3938 3939 0.0651492893105391 0.0651492893105391
+4191 3939 3940 0.0221401135391512 0.0221401135391512
+4192 3940 3941 0.0717318471783874 0.0717318471783874
+4195 3943 3944 0.176615684469352 0.176615684469352
+4196 3944 3947 0.176604135108539 0.176604135108539
+4197 3947 3948 0.122323573259462 0.122323573259462
+4198 3948 3949 0.0559214984515419 0.0559214984515419
+5481 4892 3459 0.0941890822437752 0.0941890822437752
+4199 3949 3950 0.176269184745743 0.176269184745743
+4200 3950 3951 0.05590117541301 0.05590117541301
+4201 3951 3952 0.122088386939327 0.122088386939327
+4202 3952 3953 0.0603148497739477 0.0603148497739477
+4203 3953 3954 0.117311769773874 0.117311769773874
+4204 3954 3955 0.0719490460324168 0.0719490460324168
+4205 3955 3956 0.106538056002006 0.106538056002006
+4206 3956 3957 0.177243078500478 0.177243078500478
+4207 3957 2623 0.176288453506598 0.176288453506598
+4208 2623 3958 0.177546592271005 0.177546592271005
+4209 3958 3960 0.168966442415293 0.168966442415293
+4210 3960 3961 0.111586533238696 0.111586533238696
+4213 3963 3964 0.265623714493738 0.265623714493738
+4214 3965 3966 0.511616430940774 0.511616430940774
+4216 1726 3967 0.0896760315303362 0.0896760315303362
+4217 3967 3968 0.0558858522230369 0.0558858522230369
+4218 3968 3969 0.109150490871186 0.109150490871186
+4219 3970 3971 0.202576252334461 0.202576252334461
+4220 3971 3972 0.199655908563659 0.199655908563659
+4221 3972 3973 0.201550568367269 0.201550568367269
+4223 3974 3975 0.0432784618651284 0.0432784618651284
+4224 3975 3976 0.0119312921672435 0.0119312921672435
+4225 3976 3977 0.0412856988441699 0.0412856988441699
+4226 3977 3978 0.00523979822286268 0.00523979822286268
+4227 3978 3979 0.0456580481243959 0.0456580481243959
+4228 3979 3980 0.0491163050630244 0.0491163050630244
+4229 3980 3981 0.0519851803283443 0.0519851803283443
+4230 3981 1662 0.0500503143032265 0.0500503143032265
+4231 1662 3982 0.0526516968240738 0.0526516968240738
+4232 3982 3983 0.0511950181994891 0.0511950181994891
+4233 3983 3984 0.0508169123465841 0.0508169123465841
+16267 5831 9866 0.203286686616951 0.203286686616951
+4234 3984 3985 0.0684638947838088 0.0684638947838088
+4235 3985 3986 0.0523508233196537 0.0523508233196537
+4236 3986 3987 0.0497154897229056 0.0497154897229056
+4237 3987 2423 0.0326188031399601 0.0326188031399601
+4238 2423 3988 0.017392306107988 0.017392306107988
+4239 3988 3989 0.0330055324383025 0.0330055324383025
+4240 3989 3990 0.0159023099545875 0.0159023099545875
+4241 3990 3991 0.049454634736183 0.049454634736183
+4244 3992 3993 0.049036974566433 0.049036974566433
+4245 3993 3994 0.0522504960301449 0.0522504960301449
+4246 3994 3995 0.113779671004445 0.113779671004445
+4247 3995 3996 0.292866933952659 0.292866933952659
+4248 3996 3997 0.135719788812757 0.135719788812757
+4249 3997 2492 0.131298969381918 0.131298969381918
+4250 2492 2838 0.134023703042734 0.134023703042734
+4252 3998 3999 0.177673273882055 0.177673273882055
+4253 3999 4000 0.178724202369687 0.178724202369687
+4254 4000 4001 0.0914256352612055 0.0914256352612055
+4255 1820 4002 0.0854127756728086 0.0854127756728086
+4256 4002 4003 0.0734940058422204 0.0734940058422204
+4257 4003 4004 0.122094789640982 0.122094789640982
+4260 4006 4007 0.167588698662527 0.167588698662527
+4261 4007 4008 0.199884724997956 0.199884724997956
+4262 4008 4009 0.0119868161378673 0.0119868161378673
+4263 371 1930 0.0503613323391642 0.0503613323391642
+4264 1930 1940 0.0838300296248713 0.0838300296248713
+4265 1940 4010 0.121947021037263 0.121947021037263
+4266 4010 4011 0.132309346356631 0.132309346356631
+4267 4011 4012 0.135165905730987 0.135165905730987
+4268 4012 4013 0.133333876014397 0.133333876014397
+4270 4014 12 0.13580168948729 0.13580168948729
+4271 12 4015 0.00286884184731271 0.00286884184731271
+4272 4015 4016 0.132033234839576 0.132033234839576
+4273 4016 4017 0.133567851795101 0.133567851795101
+4274 4017 4018 0.134726706981619 0.134726706981619
+4275 4018 4019 0.130892412762661 0.130892412762661
+4276 4019 4020 0.134212591203429 0.134212591203429
+4277 4020 4021 0.133433911973159 0.133433911973159
+4278 4021 4022 0.137281795417315 0.137281795417315
+4280 4023 4024 0.0689781307016059 0.0689781307016059
+4281 4024 4025 0.0667654814327236 0.0667654814327236
+5576 4965 4966 0.209377126181678 0.209377126181678
+4290 4029 1890 0.0489976212541555 0.0489976212541555
+4291 1890 4030 0.050071397214541 0.050071397214541
+4293 4031 2858 0.24990384929118 0.24990384929118
+4301 1703 4036 0.19686036595886 0.19686036595886
+4302 4036 4037 2.41616418836648 2.41616418836648
+4303 4038 4039 0.0356847858191414 0.0356847858191414
+4305 4040 4041 0.105425319125276 0.105425319125276
+4306 4041 2256 0.104244973047941 0.104244973047941
+4307 2256 4042 0.103519804078257 0.103519804078257
+4309 3999 4043 0.105003607246795 0.105003607246795
+17679 10164 8262 0.207810693253635 0.207810693253635
+4315 4048 3390 0.0527412463264476 0.0527412463264476
+4316 3390 4049 0.0507539981345734 0.0507539981345734
+4317 4049 4050 0.0520284075919789 0.0520284075919789
+4318 4050 3408 0.0512087059000605 0.0512087059000605
+4319 3408 4051 0.0486341315555791 0.0486341315555791
+4320 4051 4053 0.052533034496925 0.052533034496925
+4321 4053 4054 0.0524475036704537 0.0524475036704537
+4322 4054 4055 0.0498829272923159 0.0498829272923159
+4327 4058 4059 0.051190260382352 0.051190260382352
+4328 4059 3864 0.0501467689985101 0.0501467689985101
+4329 3864 4060 0.0537746384669306 0.0537746384669306
+4330 4060 4061 0.0463502740457097 0.0463502740457097
+4331 4061 4062 0.0561959746447094 0.0561959746447094
+4357 4082 4083 0.157884781724872 0.157884781724872
+4332 4062 4063 0.69866413721226 0.69866413721226
+4333 1273 4064 0.135036752261437 0.135036752261437
+4334 4064 4065 0.129590074598046 0.129590074598046
+4335 4065 4066 0.132616575444838 0.132616575444838
+4344 4073 1390 0.0502435222683857 0.0502435222683857
+4345 1390 4074 0.0493046140403362 0.0493046140403362
+4346 4074 4075 0.0491422603337744 0.0491422603337744
+4351 4078 4079 0.241190031557862 0.241190031557862
+4352 4079 4080 0.258242852029617 0.258242852029617
+4353 4080 1629 0.215143938153131 0.215143938153131
+4354 1629 3965 0.0839336295727996 0.0839336295727996
+4364 1214 4088 0.0489795542886091 0.0489795542886091
+4365 4088 4089 0.0498843047924572 0.0498843047924572
+4366 4089 4090 0.0487540785114809 0.0487540785114809
+4367 4090 2167 0.0506698655714413 0.0506698655714413
+4368 2167 4091 0.0491950203791528 0.0491950203791528
+4369 4091 4092 0.0488189222411035 0.0488189222411035
+4378 1289 4100 0.0495624053047352 0.0495624053047352
+4379 4100 4101 0.0531970268279652 0.0531970268279652
+4380 4101 4102 0.0527877658733148 0.0527877658733148
+4381 4102 4103 0.0491029186922276 0.0491029186922276
+4382 4103 4104 0.053313065445571 0.053313065445571
+18127 10262 10268 0.40641745688608 0.40641745688608
+4394 4109 2351 0.147790101003017 0.147790101003017
+4395 2351 4110 0.174343137234229 0.174343137234229
+4396 4110 4111 0.175176728788125 0.175176728788125
+4397 4111 4112 0.174887842567366 0.174887842567366
+4398 4112 4113 0.163616410243985 0.163616410243985
+14847 9428 3841 0.049872105512027 0.049872105512027
+14848 3841 9429 0.0507867978829422 0.0507867978829422
+14849 9429 5551 0.0504705023896622 0.0504705023896622
+14850 5551 9430 0.0160626819091423 0.0160626819091423
+324 207 268 0.0408317858918375 0.0408317858918375
+14851 9430 9431 0.771810690268124 0.771810690268124
+14860 2500 9438 0.0367185859571526 0.0367185859571526
+14866 8307 6350 0.0205009601935279 0.0205009601935279
+14871 2450 3240 0.14088111565627 0.14088111565627
+14873 5733 5517 0.138655367104914 0.138655367104914
+14874 5517 9442 0.136397019838813 0.136397019838813
+14875 9442 6920 0.112250527906817 0.112250527906817
+14877 6505 9443 0.246198454475103 0.246198454475103
+14878 9443 9444 0.0254384620147021 0.0254384620147021
+14879 9444 6994 0.4499142851013 0.4499142851013
+14880 6994 9445 0.29050322706034 0.29050322706034
+14881 9445 2104 0.111341186723118 0.111341186723118
+14882 2104 9446 1.81122771510753 1.81122771510753
+14883 5328 6848 0.0996617587695029 0.0996617587695029
+14884 6848 9012 0.0991299503198925 0.0991299503198925
+14886 7486 7456 0.0976540916227753 0.0976540916227753
+14888 5693 9010 0.102057355365657 0.102057355365657
+14889 9010 4967 0.099866873546368 0.099866873546368
+14890 4967 9021 0.10207838306375 0.10207838306375
+14894 8146 9004 0.111615935651551 0.111615935651551
+14896 8691 6102 0.204110733056615 0.204110733056615
+14898 8202 8814 0.0690569326601991 0.0690569326601991
+14900 8175 8161 0.034748414576393 0.034748414576393
+14901 8161 9450 0.0195282497941032 0.0195282497941032
+14902 9450 9315 0.339258874320837 0.339258874320837
+14904 8694 8155 0.0907837492404858 0.0907837492404858
+14905 8155 7617 0.0954335805182596 0.0954335805182596
+14906 7617 7270 0.0932816974435063 0.0932816974435063
+14908 4159 8695 0.0152616593160753 0.0152616593160753
+14909 8695 8156 0.0918092963851245 0.0918092963851245
+14910 8156 7618 0.0923894575376538 0.0923894575376538
+14911 7618 7271 0.0946959525813305 0.0946959525813305
+14914 2016 353 0.0344076794786212 0.0344076794786212
+14915 353 9451 0.0583270070041971 0.0583270070041971
+14916 9451 2762 0.099099248852826 0.099099248852826
+14917 2762 7003 0.098484917717332 0.098484917717332
+14918 7003 2266 0.0978645165955224 0.0978645165955224
+14919 2266 3595 0.100545762919748 0.100545762919748
+14920 3595 7518 0.100532638471033 0.100532638471033
+14921 7518 2095 0.100840428744565 0.100840428744565
+14922 2095 5977 0.100495257348787 0.100495257348787
+14923 5977 7667 0.098120652849283 0.098120652849283
+14924 7667 2331 0.102096265330692 0.102096265330692
+14925 2331 9453 0.0789173504157379 0.0789173504157379
+14926 8149 7608 0.0961605881004872 0.0961605881004872
+14927 7608 7261 0.102411721946463 0.102411721946463
+14928 7261 7598 0.095880146438169 0.095880146438169
+14929 7598 2021 0.09187670783236 0.09187670783236
+14930 2021 3354 0.0948528618506519 0.0948528618506519
+14932 2767 7012 0.0931566808998339 0.0931566808998339
+14934 9454 9455 0.0975625637539845 0.0975625637539845
+14937 8700 8158 0.0941289748217691 0.0941289748217691
+14939 7604 7255 0.0976568291897231 0.0976568291897231
+14940 7255 7591 0.0955299991432501 0.0955299991432501
+14941 7591 9173 0.0963387600574313 0.0963387600574313
+14942 9173 9456 0.0980688321229376 0.0980688321229376
+14943 9456 2750 0.102866303298183 0.102866303298183
+14944 2750 7014 0.0961030844605866 0.0961030844605866
+14945 7014 8215 0.0956816865795296 0.0956816865795296
+14947 8212 7523 0.100548507087909 0.100548507087909
+14948 7523 2123 0.0946806328213609 0.0946806328213609
+14949 2123 5989 0.102767406722396 0.102767406722396
+14950 5989 7670 0.0976490581696009 0.0976490581696009
+15962 9768 6397 0.0094036846623539 0.0094036846623539
+14968 7264 7583 0.0956208531243363 0.0956208531243363
+14969 7583 2000 0.0924757762963627 0.0924757762963627
+14970 2000 3360 0.0937229366395869 0.0937229366395869
+14971 3360 2754 0.0967493265415074 0.0967493265415074
+14973 7005 2280 0.0993735606220099 0.0993735606220099
+14974 2280 3602 0.103462577447113 0.103462577447113
+14975 3602 7527 0.0995273521026476 0.0995273521026476
+14976 7527 2135 0.0983330050282197 0.0983330050282197
+14977 2135 5992 0.103459989161242 0.103459989161242
+14978 5992 7672 0.100271460506145 0.100271460506145
+14979 7672 9462 3.03786386467958 3.03786386467958
+14980 5809 9463 0.110364660453643 0.110364660453643
+14989 9464 5043 0.119299198506528 0.119299198506528
+14990 5043 7994 0.118519999914902 0.118519999914902
+14991 7994 9236 0.117759209590851 0.117759209590851
+14992 9236 7973 0.0614780310106107 0.0614780310106107
+14994 7142 5131 0.10575888699282 0.10575888699282
+14995 5131 4724 0.10504840556341 0.10504840556341
+14996 4724 6791 0.107330054626072 0.107330054626072
+14997 6791 7363 0.103200510788566 0.103200510788566
+14998 7363 5422 0.104113985923971 0.104113985923971
+14999 5422 8554 0.105490524385859 0.105490524385859
+15000 8554 3893 0.111457422157238 0.111457422157238
+15001 3893 1024 0.103888468957379 0.103888468957379
+15002 1024 9465 0.0550364598534795 0.0550364598534795
+15003 9465 6269 0.0513684711391166 0.0513684711391166
+15006 9467 9468 0.0801572222360596 0.0801572222360596
+15007 9468 5030 0.106840142374901 0.106840142374901
+18579 3437 7765 0.0485278339531173 0.0485278339531173
+15009 6619 8699 0.0954507670467869 0.0954507670467869
+15010 8699 9469 0.014222614535116 0.014222614535116
+15013 7107 455 0.0456695914542558 0.0456695914542558
+15015 860 9470 0.0919474974486486 0.0919474974486486
+15016 9470 9471 0.0500014374448159 0.0500014374448159
+15017 9471 6021 0.0453621576916579 0.0453621576916579
+15018 6021 9472 0.0470758089061738 0.0470758089061738
+15019 9472 3460 0.0470036762545936 0.0470036762545936
+15020 3460 7685 0.0954954207572325 0.0954954207572325
+15021 7685 8021 0.0933841388460347 0.0933841388460347
+15022 8021 6698 0.0960778131259482 0.0960778131259482
+15023 6698 4136 0.0911259816816344 0.0911259816816344
+15025 2663 8548 0.0930424439627818 0.0930424439627818
+15026 8548 8547 0.100542623889621 0.100542623889621
+15027 8547 7338 0.099089032401214 0.099089032401214
+15028 7338 7883 0.0990804723784167 0.0990804723784167
+15030 3337 5025 0.101286501750056 0.101286501750056
+15031 5025 9473 0.0504081121726349 0.0504081121726349
+15032 9473 8728 0.0508783896228212 0.0508783896228212
+15033 8728 3720 0.054613750451979 0.054613750451979
+16212 9849 7734 1.41107486941703 1.41107486941703
+15034 3720 6265 0.0510651820396187 0.0510651820396187
+15035 6265 9474 0.0526179865653065 0.0526179865653065
+15036 9474 1019 0.0530796783692756 0.0530796783692756
+15037 1019 3889 0.105690016076173 0.105690016076173
+15038 3889 8550 0.11082035773048 0.11082035773048
+15039 8550 5418 0.102756492849076 0.102756492849076
+15040 5418 7359 0.109377907466232 0.109377907466232
+15041 7359 6787 0.102485488457906 0.102485488457906
+15044 9414 5118 0.0507526262754685 0.0507526262754685
+15047 7151 9476 0.0506273642355044 0.0506273642355044
+15048 9476 8834 0.0494473424354765 0.0494473424354765
+15049 8834 6016 0.046054397015081 0.046054397015081
+15051 979 5330 0.0485530564436786 0.0485530564436786
+15052 5330 8003 0.0503217691422663 0.0503217691422663
+15053 8003 6342 0.0507584862620106 0.0507584862620106
+15054 6342 5051 0.0488177307212986 0.0488177307212986
+15055 5051 6690 0.0488248354973201 0.0488248354973201
+15056 6690 9477 0.0468154058850837 0.0468154058850837
+15059 9313 7101 0.0478106623792446 0.0478106623792446
+15060 7101 8880 0.0490142389962295 0.0490142389962295
+15061 8880 7420 0.0493429457759385 0.0493429457759385
+15062 7420 8874 0.0545354482418663 0.0545354482418663
+15064 7430 8793 0.0542698797022772 0.0542698797022772
+15065 8793 7862 0.0521693260437922 0.0521693260437922
+395 399 5 0.209508946543956 0.209508946543956
+15066 7862 8787 0.05844527692302 0.05844527692302
+15067 8787 7957 0.0531372993824669 0.0531372993824669
+15068 7957 9478 0.0541270300244316 0.0541270300244316
+15069 9478 9479 0.108902531529915 0.108902531529915
+15072 4481 9480 0.0910756678915429 0.0910756678915429
+15074 8706 9481 0.10111000413597 0.10111000413597
+15075 9481 9175 0.105113918003998 0.105113918003998
+15076 9175 7259 0.105567381342615 0.105567381342615
+15077 7259 7589 0.103856965848258 0.103856965848258
+15079 3366 2770 0.104765166628809 0.104765166628809
+15080 2770 9176 0.11373488606323 0.11373488606323
+15081 9176 2260 0.11073804654165 0.11073804654165
+15082 2260 3611 0.0999509846289259 0.0999509846289259
+15083 3611 7516 0.100649754002954 0.100649754002954
+15084 7516 2109 0.103508831759163 0.103508831759163
+15085 2109 5999 0.10202033489304 0.10202033489304
+15086 5999 7660 0.0994984857017093 0.0994984857017093
+15087 7660 2328 0.04986487628669 0.04986487628669
+15118 9482 9225 0.0953635356752473 0.0953635356752473
+15120 9455 301 0.129823177853557 0.129823177853557
+15116 9490 8276 0.218414071885788 0.218414071885788
+15121 301 8269 0.152583336977896 0.152583336977896
+15126 226 8268 0.0760384791094216 0.0760384791094216
+15128 225 9482 0.128957275100235 0.128957275100235
+15130 9491 460 0.0667391949721685 0.0667391949721685
+15132 460 575 0.113707068563865 0.113707068563865
+15133 575 6199 0.0290617477448439 0.0290617477448439
+15135 9492 8244 0.032549465488295 0.032549465488295
+15136 8244 9493 0.0198582826309584 0.0198582826309584
+15138 6689 228 0.0134361080204136 0.0134361080204136
+15139 228 9494 0.0329072670561094 0.0329072670561094
+15140 9494 9495 0.0242107567854742 0.0242107567854742
+15142 9496 9497 0.0238335404645399 0.0238335404645399
+15143 9497 9498 0.0343814713189183 0.0343814713189183
+15966 7623 6935 0.205023089639109 0.205023089639109
+15967 6935 5889 0.201769701232267 0.201769701232267
+15968 5889 7449 0.284161489263658 0.284161489263658
+15969 7449 1636 0.117888722564013 0.117888722564013
+15970 1636 8998 0.102786876242831 0.102786876242831
+15972 4214 8094 0.0961834163674376 0.0961834163674376
+15973 8094 194 0.104992906429488 0.104992906429488
+15974 194 2923 0.0991259111035959 0.0991259111035959
+15975 2923 5306 0.0991964539292107 0.0991964539292107
+15976 5306 1461 0.0983899476582488 0.0983899476582488
+15977 1461 5434 0.104614166406686 0.104614166406686
+15978 5434 5973 0.107640436770916 0.107640436770916
+15979 5973 9014 0.00660364948230504 0.00660364948230504
+15980 9014 7915 0.0975740293794765 0.0975740293794765
+15981 7915 6437 0.105749746230322 0.105749746230322
+16016 9786 9159 0.00790012825467591 0.00790012825467591
+15982 6437 4420 0.102051245715481 0.102051245715481
+15985 5328 7056 0.0812625038007973 0.0812625038007973
+15986 7056 9772 0.0538313043287529 0.0538313043287529
+15987 9772 4318 0.0518980074233638 0.0518980074233638
+15988 4318 9452 0.0516277273460522 0.0516277273460522
+15990 4506 4116 0.0518058126204102 0.0518058126204102
+15991 4116 7809 0.0517374039809394 0.0517374039809394
+15992 7809 5068 0.0991665346425536 0.0991665346425536
+15993 5068 9773 0.0531370753578357 0.0531370753578357
+15994 9773 6836 0.0533167080983746 0.0533167080983746
+15995 6836 6978 0.101324072393449 0.101324072393449
+15996 6978 7941 0.102826343168107 0.102826343168107
+15997 7941 9015 0.0975512129036908 0.0975512129036908
+15998 9015 6780 0.448938989090037 0.448938989090037
+15999 6780 9774 0.408854845876832 0.408854845876832
+16000 9076 9768 0.0663101767153915 0.0663101767153915
+16004 9776 1455 0.0526013194004238 0.0526013194004238
+16006 9777 1736 0.0786842572590025 0.0786842572590025
+16092 526 9805 0.0239836164906123 0.0239836164906123
+16044 9806 9807 0.10708389115039 0.10708389115039
+16046 9808 9779 0.598201231733375 0.598201231733375
+16048 9809 8448 0.00611949423172489 0.00611949423172489
+16050 497 315 0.38487204905166 0.38487204905166
+16051 315 9125 0.309277404563432 0.309277404563432
+16053 9092 238 0.378305028269765 0.378305028269765
+14687 2318 2393 0.204381692629994 0.204381692629994
+16054 238 599 0.20185675523074 0.20185675523074
+16055 599 9810 1.85367980178975 1.85367980178975
+16057 4648 9242 0.316343707887743 0.316343707887743
+16530 9931 9230 0.37930803087461 0.37930803087461
+16060 8979 9416 0.148643981954463 0.148643981954463
+16062 9129 442 0.133338694466943 0.133338694466943
+16063 442 341 0.15400049730887 0.15400049730887
+16064 341 8432 0.0419891636299648 0.0419891636299648
+16066 8912 8951 0.033170976893888 0.033170976893888
+16068 9812 8911 0.0471463735469582 0.0471463735469582
+16070 8259 6154 0.322113932922047 0.322113932922047
+16072 8262 9813 0.347409770060633 0.347409770060633
+16073 9813 8849 0.384076686987265 0.384076686987265
+16075 8850 8934 0.249988221702048 0.249988221702048
+15149 1055 2652 0.0975577285651678 0.0975577285651678
+15178 9518 9519 0.0502534780761684 0.0502534780761684
+15150 2652 6953 0.198623612037648 0.198623612037648
+15152 9492 9502 0.376572648781266 0.376572648781266
+15156 3293 102 0.41551161582069 0.41551161582069
+15160 4010 9505 0.052772682936521 0.052772682936521
+15161 9505 7047 0.0525680538450832 0.0525680538450832
+15162 7047 7019 0.0303888581356532 0.0303888581356532
+15163 7019 9506 0.0673030688563473 0.0673030688563473
+15164 9506 9507 0.0483154741652978 0.0483154741652978
+15165 9507 7386 0.0202051235057141 0.0202051235057141
+16629 9962 9963 0.200783522780218 0.200783522780218
+15167 9508 9509 0.0505081496090435 0.0505081496090435
+15169 3381 9510 0.054679375210741 0.054679375210741
+15170 9510 9511 0.0487967465713328 0.0487967465713328
+15175 9515 9516 0.0511072604930319 0.0511072604930319
+15176 9516 9517 0.199298430530572 0.199298430530572
+15177 9517 9518 0.0506626460359665 0.0506626460359665
+15179 9519 9520 0.0992839733792875 0.0992839733792875
+2659 2617 2618 0.0492730897550554 0.0492730897550554
+15180 9520 5591 0.0515928611698618 0.0515928611698618
+15181 5591 9521 0.0485416940170638 0.0485416940170638
+15182 9521 7534 0.0495967074681937 0.0495967074681937
+15183 7534 9522 0.687013260502188 0.687013260502188
+15184 4010 253 0.115254186613677 0.115254186613677
+15185 253 9523 0.265666797076755 0.265666797076755
+16090 9493 9818 0.0359382002911722 0.0359382002911722
+16093 9805 9821 0.0110994776170347 0.0110994776170347
+16096 9495 9822 0.0517988653877033 0.0517988653877033
+16097 9822 9823 0.0110663007110829 0.0110663007110829
+16098 9823 525 0.0383908840803154 0.0383908840803154
+16099 525 9824 0.0469464980296333 0.0469464980296333
+16107 214 9827 0.778079889437356 0.778079889437356
+16108 9827 8266 0.110384878461573 0.110384878461573
+16109 8266 8259 0.22035773346297 0.22035773346297
+16111 426 5290 0.135279903383581 0.135279903383581
+16112 5290 6969 0.13394711160262 0.13394711160262
+16113 6969 9 0.133723176212026 0.133723176212026
+12362 8672 8673 0.0280927507040958 0.0280927507040958
+16114 9 6393 0.135759876984547 0.135759876984547
+16116 543 2417 0.140823258017981 0.140823258017981
+16117 2417 8309 0.134744289641959 0.134744289641959
+16121 9523 8323 0.0490645159279825 0.0490645159279825
+16122 8323 2296 0.111956296963114 0.111956296963114
+16123 2296 425 0.133707313641353 0.133707313641353
+16125 8580 9121 0.223068039429751 0.223068039429751
+16129 4649 7955 0.0999111170250792 0.0999111170250792
+16130 7955 9828 0.0800171872297717 0.0800171872297717
+16131 9829 8581 0.047687571765354 0.047687571765354
+16133 9073 1815 0.113861635058861 0.113861635058861
+16134 1815 9030 0.0294613091189667 0.0294613091189667
+16135 9030 9035 0.0740720067279475 0.0740720067279475
+16136 9035 2259 0.0101253625653209 0.0101253625653209
+16137 2259 6127 0.0869883467865613 0.0869883467865613
+16138 6127 3970 0.0982525233162176 0.0982525233162176
+16139 3970 4005 0.0213357195383616 0.0213357195383616
+16170 9839 7732 1.81004213705151 1.81004213705151
+16140 4005 9831 0.0527909920856998 0.0527909920856998
+16143 7028 9832 0.0518403992809488 0.0518403992809488
+16144 9832 1405 0.0193610465151665 0.0193610465151665
+16145 1405 9086 0.0330290864914803 0.0330290864914803
+16146 9086 9833 0.0517615954401031 0.0517615954401031
+16147 9833 7389 0.013992344500971 0.013992344500971
+16148 7389 7381 0.039974198258354 0.039974198258354
+16149 7381 5215 0.0612246627137571 0.0612246627137571
+16150 5215 3395 0.05711231452959 0.05711231452959
+16152 7953 9834 0.0172080507351113 0.0172080507351113
+16154 9834 274 0.0658337540289098 0.0658337540289098
+16156 2189 9835 0.248404343096233 0.248404343096233
+16214 8735 9837 1.99433693652165 1.99433693652165
+16215 8737 9838 0.871081020569746 0.871081020569746
+4419 2776 4130 0.131599235651272 0.131599235651272
+16159 9143 9028 0.680206597840058 0.680206597840058
+16163 722 8058 0.174054831255352 0.174054831255352
+16164 8058 521 0.0821177779256467 0.0821177779256467
+16165 521 6603 0.0924366308750619 0.0924366308750619
+16166 6603 5373 0.180047417371753 0.180047417371753
+16168 1948 2528 0.0688038536836977 0.0688038536836977
+16333 7146 2907 0.104983935013538 0.104983935013538
+16334 2907 7925 0.0494998939900097 0.0494998939900097
+16338 3444 3467 0.0304982971000002 0.0304982971000002
+16339 3467 8082 0.246312262462312 0.246312262462312
+16342 8704 8153 0.0931754474511838 0.0931754474511838
+16343 8153 7614 0.0941189496630448 0.0941189496630448
+16344 7614 7267 0.0948021938707784 0.0948021938707784
+16345 7267 7586 0.0921634745405222 0.0921634745405222
+16346 7586 7587 0.0431064926802277 0.0431064926802277
+16347 7587 2005 0.0500940428381568 0.0500940428381568
+16348 2005 3364 0.0956080752868491 0.0956080752868491
+16349 3364 2759 0.0936601356465838 0.0936601356465838
+16350 2759 7009 0.0948690491965415 0.0948690491965415
+16352 2285 3605 0.100419536914451 0.100419536914451
+16353 3605 7531 0.0985834303955712 0.0985834303955712
+16354 7531 2140 0.105692387990087 0.105692387990087
+16355 2140 5996 0.104777507715381 0.104777507715381
+16356 5996 7676 0.0990116406010299 0.0990116406010299
+16357 7676 9874 1.60848579675559 1.60848579675559
+17199 2711 10073 0.10997712384001 0.10997712384001
+16358 9875 2326 1.55889022258017 1.55889022258017
+16360 5997 2127 0.151773007567564 0.151773007567564
+16361 2127 3609 0.151558147644208 0.151558147644208
+16362 3609 7010 0.212760869396779 0.212760869396779
+16365 3365 2006 0.0553745270182344 0.0553745270182344
+16366 2006 7588 0.0502101113635407 0.0502101113635407
+16367 7588 7258 0.104315488387994 0.104315488387994
+16368 7258 7615 0.106145187491952 0.106145187491952
+16369 7615 9877 0.104437372352784 0.104437372352784
+16429 9892 3407 0.0665957848901693 0.0665957848901693
+16430 3407 9893 0.16801404607557 0.16801404607557
+16433 9895 9896 0.440540235104303 0.440540235104303
+16436 9897 9898 0.0704932318773383 0.0704932318773383
+16438 95 3655 0.111235679997702 0.111235679997702
+16440 9899 5747 0.0711149911978779 0.0711149911978779
+16445 9902 9903 0.536321309295718 0.536321309295718
+16453 9908 9909 0.550826257700494 0.550826257700494
+16458 9907 9908 0.00771583659604379 0.00771583659604379
+16460 9909 9912 0.0865311626257968 0.0865311626257968
+16461 9912 9910 0.0378168798460609 0.0378168798460609
+16471 3282 9916 0.18653100874984 0.18653100874984
+16473 9917 8680 0.0249041944601551 0.0249041944601551
+19510 10535 10536 0.0273195782326388 0.0273195782326388
+16475 8507 9918 0.021850852998121 0.021850852998121
+16476 9918 3018 0.0101317448895217 0.0101317448895217
+16478 9919 9920 0.0829003664734834 0.0829003664734834
+16479 9921 3681 0.0300651916457247 0.0300651916457247
+16668 9926 9974 0.105582813458159 0.105582813458159
+16669 9588 1633 0.0730557533632891 0.0730557533632891
+16671 9928 9975 0.0177169257267767 0.0177169257267767
+117 124 125 0.0336263849765442 0.0336263849765442
+16672 9975 9929 0.0234356081852519 0.0234356081852519
+16674 9976 9977 0.0468170562405583 0.0468170562405583
+16710 104 7825 0.0602462277844684 0.0602462277844684
+16712 104 3757 0.402008044434906 0.402008044434906
+16713 3757 1487 0.204145741130723 0.204145741130723
+16714 1487 132 0.199447130341484 0.199447130341484
+16716 1701 5546 0.198096603236586 0.198096603236586
+16777 69 3510 0.205561826495526 0.205561826495526
+4421 1201 4132 0.0220332988005433 0.0220332988005433
+16718 7283 485 0.11761309283436 0.11761309283436
+16720 10003 3244 0.0554692551325786 0.0554692551325786
+16721 3244 7234 0.20486059291662 0.20486059291662
+16722 7234 1896 0.200393401337734 0.200393401337734
+16723 1896 6106 0.199619177779868 0.199619177779868
+16724 6106 3190 0.204209613390108 0.204209613390108
+16725 3190 3074 0.20155062603718 0.20155062603718
+17204 10076 9899 0.140445516840247 0.140445516840247
+17206 10077 9891 0.365702001724341 0.365702001724341
+17210 9916 551 0.0168353379628002 0.0168353379628002
+17211 551 10077 0.029511971826839 0.029511971826839
+17221 9830 5174 0.203086414023487 0.203086414023487
+17225 7299 3774 0.0270450210392685 0.0270450210392685
+17227 10078 240 0.11490035547177 0.11490035547177
+17229 240 241 0.0697724132050665 0.0697724132050665
+17230 241 242 0.0623380559401012 0.0623380559401012
+17231 242 243 0.121807717540091 0.121807717540091
+17238 246 247 0.10870569104286 0.10870569104286
+17239 247 248 0.0772679392991742 0.0772679392991742
+17241 235 3406 0.0743704107751119 0.0743704107751119
+17242 3406 10079 0.167074762801468 0.167074762801468
+17244 331 10014 0.0356018290483491 0.0356018290483491
+17245 10014 8533 0.134990804356131 0.134990804356131
+17247 510 8534 0.190527366373376 0.190527366373376
+17249 9649 6335 0.0185334131201332 0.0185334131201332
+17250 6335 10080 0.0823637888630556 0.0823637888630556
+17251 10080 3812 0.199228355515768 0.199228355515768
+17252 3812 5918 0.151375161417453 0.151375161417453
+17254 917 2204 0.201707005619294 0.201707005619294
+17255 2204 4853 0.158074944552835 0.158074944552835
+17506 10119 8389 0.0881257330115891 0.0881257330115891
+17514 10115 4493 0.0857000040414071 0.0857000040414071
+17515 4493 10122 0.00789608138487867 0.00789608138487867
+17516 10122 10123 0.0829902602540724 0.0829902602540724
+17517 10123 3738 0.117121022748715 0.117121022748715
+16415 3033 3034 0.026586968802262 0.026586968802262
+17518 3738 5617 0.105494461178937 0.105494461178937
+17519 5617 10124 0.0771328841888806 0.0771328841888806
+18717 1848 7866 0.175365518810985 0.175365518810985
+17520 10124 3940 0.0438462962781839 0.0438462962781839
+18649 10111 1854 0.1585792263447 0.1585792263447
+17522 6651 7970 0.100526894140491 0.100526894140491
+17523 7970 10125 0.0156643759566378 0.0156643759566378
+17525 342 10126 0.0436005942347808 0.0436005942347808
+17527 10126 10121 0.0408685827486489 0.0408685827486489
+17529 8016 10127 0.0296331396909763 0.0296331396909763
+17533 9200 10128 0.0316360066553629 0.0316360066553629
+17535 10128 3937 0.0160944313012695 0.0160944313012695
+17537 10125 10129 0.0323384241188202 0.0323384241188202
+17540 8937 10130 0.0382349269331771 0.0382349269331771
+18160 6035 10256 0.201529974874074 0.201529974874074
+18081 3725 3961 0.10669546577579 0.10669546577579
+18082 3961 5599 0.120037242247265 0.120037242247265
+18083 5599 10212 0.0720417181829305 0.0720417181829305
+18085 6582 8060 0.177813026382298 0.177813026382298
+18087 79 3516 0.204359090736991 0.204359090736991
+18089 10257 1076 0.140362637117951 0.140362637117951
+18092 8839 10258 0.0505579939719693 0.0505579939719693
+18093 10258 1216 0.0474392361763922 0.0474392361763922
+18094 1216 6309 0.0509984491369365 0.0509984491369365
+18095 6309 4788 0.0491735679878017 0.0491735679878017
+18418 8332 8359 0.203675131612914 0.203675131612914
+18096 4788 10256 0.0504039235105897 0.0504039235105897
+18098 2169 10259 0.0494310424509836 0.0494310424509836
+18099 10259 6301 0.0486534339401342 0.0486534339401342
+18100 6301 10260 0.0495166429402865 0.0495166429402865
+18101 10260 6428 0.0494555977491468 0.0494555977491468
+18102 6428 10261 0.0500541316962619 0.0500541316962619
+18103 10261 8837 0.049703265213276 0.049703265213276
+18104 8837 10262 0.0487206483354329 0.0487206483354329
+18105 10262 4661 0.0502842889238415 0.0502842889238415
+18210 6766 8919 0.14588598272053 0.14588598272053
+18215 6383 6883 0.201049789723751 0.201049789723751
+18217 9380 6467 0.149037633666744 0.149037633666744
+18218 6467 5528 0.155039270882985 0.155039270882985
+18219 5528 5739 0.157509840329179 0.157509840329179
+18220 5739 2443 0.171457541049395 0.171457541049395
+18221 2443 9373 0.174175733096206 0.174175733096206
+18222 9373 1695 0.20076305206058 0.20076305206058
+18224 6884 8362 0.203398590237467 0.203398590237467
+18225 8362 8336 0.20070690829837 0.20070690829837
+18226 8336 7851 0.201718717149991 0.201718717149991
+18228 9334 6072 0.194542227529238 0.194542227529238
+18229 6072 2552 0.201793795787929 0.201793795787929
+18231 10282 2550 0.408975962052575 0.408975962052575
+18233 6070 9333 0.193859431649891 0.193859431649891
+18235 3976 7037 0.199530180994258 0.199530180994258
+200 212 213 0.0847562945477418 0.0847562945477418
+18390 3978 7038 0.19806787554915 0.19806787554915
+18392 3425 3425 0.000442266584977921 0.000442266584977921
+18397 9331 6062 0.201652000193759 0.201652000193759
+18398 6062 2541 0.201129932352607 0.201129932352607
+18581 5716 10279 0.0494611669239994 0.0494611669239994
+18582 10279 7436 0.0477007849303031 0.0477007849303031
+18583 7436 10283 0.0501702475316452 0.0501702475316452
+17420 10101 10103 0.0112555006692224 0.0112555006692224
+18584 10283 7175 0.0483500943699416 0.0483500943699416
+18585 7175 6738 0.0504392554289189 0.0504392554289189
+18586 6738 7790 0.0494479351051842 0.0494479351051842
+18587 7790 6666 0.0500428725179926 0.0500428725179926
+19485 10408 10409 0.0449233009136641 0.0449233009136641
+18958 4669 4949 0.0991091352300086 0.0991091352300086
+18959 4949 10410 0.051350182738824 0.051350182738824
+18961 7220 10411 0.0512063955237151 0.0512063955237151
+18962 10411 5674 0.0503168586815151 0.0503168586815151
+18964 5851 1441 0.115857091100705 0.115857091100705
+18965 1441 10412 0.122824478936007 0.122824478936007
+18966 10412 7622 0.0791461153811418 0.0791461153811418
+18967 7622 6933 0.202629079077677 0.202629079077677
+18968 6933 5888 0.202049147826104 0.202049147826104
+18969 5888 10407 0.149951393120126 0.149951393120126
+18971 4142 7756 0.106122091000002 0.106122091000002
+18973 3621 1827 0.0998991515255571 0.0998991515255571
+18974 1827 10091 0.0457369036734835 0.0457369036734835
+18975 10091 10090 0.0485102588443954 0.0485102588443954
+18976 10090 5102 0.00428121670773934 0.00428121670773934
+18977 5102 9830 0.0472330884345854 0.0472330884345854
+18978 9830 1764 0.0499536922707767 0.0499536922707767
+19245 5031 10461 0.0349404698955745 0.0349404698955745
+19246 10461 10462 0.146091635323691 0.146091635323691
+19247 10462 5803 0.103032761304249 0.103032761304249
+19249 10129 4929 0.0162234814669486 0.0162234814669486
+19250 4929 2997 0.0775054077358341 0.0775054077358341
+19251 2997 7215 0.0556994645707447 0.0556994645707447
+19252 7215 4943 0.101417024663026 0.101417024663026
+19253 4943 4680 0.100527034724402 0.100527034724402
+19254 4680 7861 0.10148450975115 0.10148450975115
+19255 7861 5802 0.109659923162335 0.109659923162335
+19256 5802 8768 0.114010676979814 0.114010676979814
+19257 8768 10464 0.134804410176221 0.134804410176221
+19258 10464 338 0.0847524339031626 0.0847524339031626
+19259 338 10465 0.0582049460436449 0.0582049460436449
+19261 9467 561 0.02991036647086 0.02991036647086
+15187 8324 9523 0.0327715210342319 0.0327715210342319
+15189 9403 6744 0.131603339182178 0.131603339182178
+15190 6744 6144 0.131367316381262 0.131367316381262
+15191 6144 4018 0.137213550559119 0.137213550559119
+15192 4018 7022 0.137229962505115 0.137229962505115
+15193 7022 7392 0.129151524081427 0.129151524081427
+15195 9524 9525 0.0293502828068984 0.0293502828068984
+15196 9525 3400 0.0502879609443278 0.0502879609443278
+15198 9212 8374 0.0509876682022625 0.0509876682022625
+15199 8374 9526 0.0501407630476736 0.0501407630476736
+15201 7443 9527 0.0485275735168955 0.0485275735168955
+15202 9527 7160 0.0501690368011668 0.0501690368011668
+15204 9528 7772 0.0491757515961192 0.0491757515961192
+19414 3251 7295 0.215557365491205 0.215557365491205
+19415 7295 38 0.193056632398898 0.193056632398898
+19416 38 3537 0.207444876530122 0.207444876530122
+19417 3537 4232 0.199406339345135 0.199406339345135
+19419 3248 7289 0.216790622749105 0.216790622749105
+19420 7289 34 0.19126988034169 0.19126988034169
+19660 6763 3987 0.201101495268523 0.201101495268523
+19664 9366 9360 0.104402218346712 0.104402218346712
+19665 9360 10609 0.0511942469588291 0.0511942469588291
+19666 10609 10608 0.151226661870126 0.151226661870126
+19668 10608 10610 0.149537813443153 0.149537813443153
+19674 1809 10611 0.33816836736717 0.33816836736717
+19676 10376 10403 0.0245741855053009 0.0245741855053009
+19678 10612 1810 0.127204321184034 0.127204321184034
+19681 10613 10400 0.0511661482023126 0.0511661482023126
+16697 7094 9611 0.00886963723885407 0.00886963723885407
+19683 10614 10404 0.0688061700167682 0.0688061700167682
+19873 9513 4580 0.132311871209248 0.132311871209248
+19684 10404 10611 0.093589959625359 0.093589959625359
+17421 10103 10082 0.0236886540751766 0.0236886540751766
+19685 10611 10612 0.0295914472405657 0.0295914472405657
+19686 10612 10614 0.0207133170517971 0.0207133170517971
+19688 10615 10399 0.0680853608411523 0.0680853608411523
+19742 8865 3778 0.153182304960692 0.153182304960692
+19743 3778 10251 0.199472712546792 0.199472712546792
+20418 10775 10774 0.0781617215430941 0.0781617215430941
+19804 10646 2619 0.0523061501297365 0.0523061501297365
+19839 10655 10656 0.208642261382715 0.208642261382715
+19840 10656 9515 0.207256465232075 0.207256465232075
+19841 9515 4581 0.131476935756536 0.131476935756536
+19842 4581 8369 0.136571452698726 0.136571452698726
+19843 8369 5296 0.134437189399661 0.134437189399661
+19849 9510 10659 0.196832023994668 0.196832023994668
+19850 10659 10660 0.00933491084100046 0.00933491084100046
+19857 10663 10664 0.203268481110854 0.203268481110854
+19858 10664 4584 0.340902950197611 0.340902950197611
+19859 4584 6443 0.133958738324445 0.133958738324445
+19860 6443 5300 0.13749324562242 0.13749324562242
+19862 10665 7406 0.149893826243372 0.149893826243372
+19865 10667 9512 0.206545737430627 0.206545737430627
+608 599 600 0.326867712180581 0.326867712180581
+19870 10669 10666 0.0946602410525992 0.0946602410525992
+19871 10666 10670 0.114297265097593 0.114297265097593
+19872 10670 9513 0.206208296842551 0.206208296842551
+20654 6734 10882 0.0587106683934502 0.0587106683934502
+19874 4580 8368 0.136014360939856 0.136014360939856
+19875 8368 3817 0.133956606983629 0.133956606983629
+19887 627 10669 0.00369254651812945 0.00369254651812945
+19888 10669 10673 0.0509541857454109 0.0509541857454109
+19889 10673 7185 0.0463624089792375 0.0463624089792375
+19890 7185 10655 0.00294147338451417 0.00294147338451417
+19891 10655 10658 0.0513792379314705 0.0513792379314705
+19892 10658 9726 0.0479329871824602 0.0479329871824602
+19893 9726 10654 0.050711837363241 0.050711837363241
+19894 10654 1102 0.049608905570541 0.049608905570541
+19895 1102 10674 0.051538155846358 0.051538155846358
+19896 10674 7514 0.0472454257465845 0.0472454257465845
+19897 7514 10675 0.00204366911425749 0.00204366911425749
+19898 10675 10650 0.0481859646371305 0.0481859646371305
+19899 10650 3868 0.0500586048613679 0.0500586048613679
+16182 5547 1702 0.197838014226301 0.197838014226301
+19900 3868 10663 0.00177015306197821 0.00177015306197821
+19902 10676 5589 0.0437900336804139 0.0437900336804139
+19975 9710 10678 0.0499234178433857 0.0499234178433857
+19976 10678 9722 0.0489092169162438 0.0489092169162438
+19977 9722 10686 0.0503973293919778 0.0503973293919778
+19978 10686 3380 0.0518081278246911 0.0518081278246911
+19979 3380 10660 0.0523052391085021 0.0523052391085021
+19980 10660 10679 0.0495088072044065 0.0495088072044065
+19981 10679 10667 0.0507313759263116 0.0507313759263116
+19982 10667 10670 0.0483586645716411 0.0483586645716411
+19983 10670 10680 0.0518679752837857 0.0518679752837857
+19984 10680 10656 0.050123635320888 0.050123635320888
+19985 10656 10657 0.0496280116055878 0.0496280116055878
+19986 10657 9727 0.0488069327339047 0.0488069327339047
+19989 1103 10684 0.0492526075164636 0.0492526075164636
+656 646 647 0.146781335789774 0.146781335789774
+20153 9416 8943 0.363005134814212 0.363005134814212
+20155 9241 426 0.0770893533882784 0.0770893533882784
+20157 461 6171 0.271278721099677 0.271278721099677
+20161 1795 8719 0.00999704268874585 0.00999704268874585
+20163 4233 1795 0.205432809418909 0.205432809418909
+20165 3252 7296 0.216277689734072 0.216277689734072
+20166 7296 39 0.192678596239665 0.192678596239665
+20167 39 3538 0.207091579860447 0.207091579860447
+20168 3538 4234 0.200695550258567 0.200695550258567
+20170 6489 3675 0.150803028705812 0.150803028705812
+20172 9313 4863 0.191918567433925 0.191918567433925
+20173 4863 2213 0.160028953629168 0.160028953629168
+20174 2213 928 0.187511558441934 0.187511558441934
+17423 10083 10104 0.109040593432451 0.109040593432451
+20175 928 5932 0.175834480120689 0.175834480120689
+20176 5932 3804 0.153555987473657 0.153555987473657
+20178 3804 10247 0.200040701273324 0.200040701273324
+20181 6549 4768 0.17858020416066 0.17858020416066
+20185 10705 8247 0.0550533285282311 0.0550533285282311
+15205 7772 9040 0.0507978153373748 0.0507978153373748
+15206 9040 1113 0.0497891730866418 0.0497891730866418
+15208 9529 7493 0.0494909698776819 0.0494909698776819
+15209 7493 9169 0.051731129981418 0.051731129981418
+15210 9169 3835 0.0502567043103765 0.0502567043103765
+15212 5624 3708 0.103423232464888 0.103423232464888
+15213 3708 718 0.104893137935114 0.104893137935114
+15214 718 9442 0.108559355644902 0.108559355644902
+15215 9442 8519 0.0865482797270432 0.0865482797270432
+15218 539 540 0.260599478311813 0.260599478311813
+15220 9430 9531 0.0962600395709663 0.0962600395709663
+15232 8334 8360 0.0525484415568663 0.0525484415568663
+15234 9532 9533 0.00803607126282377 0.00803607126282377
+16285 2852 1362 0.131790180095648 0.131790180095648
+15236 9534 9535 0.0751513734309232 0.0751513734309232
+15237 9535 9536 0.0195917533971332 0.0195917533971332
+15238 9536 9537 0.0515491230280822 0.0515491230280822
+18878 3216 6125 0.202386413121619 0.202386413121619
+15239 9537 9538 0.0217956250277941 0.0217956250277941
+15248 8177 9543 0.0137987617761691 0.0137987617761691
+15249 9541 9542 0.0585754347953461 0.0585754347953461
+15262 9552 9550 0.00461416645458039 0.00461416645458039
+15263 9550 8208 0.00942903742084459 0.00942903742084459
+15264 8208 8203 0.268586250441468 0.268586250441468
+15265 8203 8187 0.252138571661244 0.252138571661244
+15267 8182 9552 0.0592295781497915 0.0592295781497915
+15275 9553 392 0.159342904018314 0.159342904018314
+15276 392 443 0.100075433980265 0.100075433980265
+15277 443 8209 0.110751336507506 0.110751336507506
+15278 3258 9554 0.029060284587417 0.029060284587417
+15279 9555 9556 0.0194857519875014 0.0194857519875014
+15280 9556 9557 0.01686832436596 0.01686832436596
+15284 9558 8799 0.0124547414515574 0.0124547414515574
+15287 9268 8812 0.43752637477907 0.43752637477907
+15372 9568 7345 0.407049578137861 0.407049578137861
+15373 7345 7369 0.0183549065123627 0.0183549065123627
+15374 7369 7156 0.617874851338927 0.617874851338927
+15375 7156 8802 0.0193374199518318 0.0193374199518318
+15376 8802 7317 0.278372348360029 0.278372348360029
+15377 7317 7975 0.104085714382657 0.104085714382657
+15378 7975 8806 0.102424669696849 0.102424669696849
+20689 10900 10890 0.00428101320774671 0.00428101320774671
+15380 2642 4108 0.0801282359532547 0.0801282359532547
+15882 9238 9569 0.375213941828735 0.375213941828735
+4422 4132 3782 0.199943657895071 0.199943657895071
+15381 4108 7064 0.0951259934580263 0.0951259934580263
+15383 993 9570 0.0346111476896159 0.0346111476896159
+15385 9570 2914 0.0185752046128979 0.0185752046128979
+15393 9572 9573 0.0529385333780706 0.0529385333780706
+15394 9574 9575 0.235820407161737 0.235820407161737
+15395 8031 9576 0.0470934184180165 0.0470934184180165
+15396 9577 9578 0.0233972200853265 0.0233972200853265
+15398 8797 9577 0.0680401949692739 0.0680401949692739
+15404 9583 9584 0.0189997554494897 0.0189997554494897
+15413 8399 9591 0.147004287358107 0.147004287358107
+15414 9591 9592 0.0201167087704522 0.0201167087704522
+15415 9592 8857 0.127975925737851 0.127975925737851
+15416 8857 7897 0.144523217943683 0.144523217943683
+15864 9238 9744 0.017876559138977 0.017876559138977
+765 765 766 0.102953430637808 0.102953430637808
+15417 7897 8290 0.14604137147811 0.14604137147811
+15418 8290 8283 0.146330295926468 0.146330295926468
+15419 8283 9593 0.142033870447888 0.142033870447888
+15420 9593 5781 0.00569268198805717 0.00569268198805717
+15421 5781 8573 0.144843439528192 0.144843439528192
+15422 8573 6709 0.145981160506706 0.145981160506706
+15423 6709 8489 0.147059173742998 0.147059173742998
+20690 10890 10906 0.00389182243300479 0.00389182243300479
+15424 8489 9595 0.146421765893647 0.146421765893647
+15425 9595 8637 0.147888642293711 0.147888642293711
+15427 4935 9590 0.0193454164735318 0.0193454164735318
+15430 8608 1478 0.0099286705971119 0.0099286705971119
+15433 7965 9599 0.0149228575371813 0.0149228575371813
+15434 9599 9600 0.0470176213777162 0.0470176213777162
+16271 9867 94 0.0502509464237392 0.0502509464237392
+16273 9867 3654 0.100162413874862 0.100162413874862
+15435 9600 9601 0.0734739685688771 0.0734739685688771
+15436 9601 9602 0.120469898327734 0.120469898327734
+15474 9617 9618 0.0309123358720865 0.0309123358720865
+15475 9618 9620 0.138252717835719 0.138252717835719
+15476 9620 8583 0.0318418680569216 0.0318418680569216
+15477 8583 8311 0.113486958547973 0.113486958547973
+15478 8311 2808 0.019311822890669 0.019311822890669
+15479 2808 9621 0.209882261055166 0.209882261055166
+15480 9621 8522 0.0161981079077479 0.0161981079077479
+15481 8522 8465 0.180991531047255 0.180991531047255
+15487 9624 8468 0.0340418553637742 0.0340418553637742
+15786 9625 9596 0.0115036173464072 0.0115036173464072
+15489 9626 9618 0.0131866115872677 0.0131866115872677
+15494 4937 9617 0.0698272217766147 0.0698272217766147
+15496 9628 9607 0.229575641341845 0.229575641341845
+15497 9607 9629 0.399617180847297 0.399617180847297
+15498 9629 8646 0.256050430773093 0.256050430773093
+15500 9630 7969 0.0158758080194332 0.0158758080194332
+20692 10907 5885 0.00586950671491746 0.00586950671491746
+20693 5885 10908 0.00728749668565428 0.00728749668565428
+15501 7969 6652 0.0898251140375734 0.0898251140375734
+15502 6652 3939 0.0164838165497055 0.0164838165497055
+15504 5618 2286 0.10606737169151 0.10606737169151
+15506 4494 9631 0.0855716406365801 0.0855716406365801
+15508 9632 9630 0.0305358161263308 0.0305358161263308
+15510 9633 4938 0.00998098524134014 0.00998098524134014
+15511 4938 6650 0.146459053749354 0.146459053749354
+15512 6650 3942 0.0669626682021978 0.0669626682021978
+15513 3942 9634 0.0625685122990456 0.0625685122990456
+15514 9634 5614 0.0589940973382129 0.0589940973382129
+15515 5614 9635 0.0521244888471325 0.0521244888471325
+15518 9636 9633 0.0394950652718853 0.0394950652718853
+15520 9637 4687 0.0148908622684888 0.0148908622684888
+15522 5369 9637 0.0293813837370069 0.0293813837370069
+15524 9638 4939 0.016179725599566 0.016179725599566
+15525 4939 7226 0.0545709952111213 0.0545709952111213
+15526 7226 9640 0.0899454990944897 0.0899454990944897
+15527 9640 6648 0.0447546990135401 0.0447546990135401
+15528 6648 9641 0.0618904241631349 0.0618904241631349
+15529 9641 3943 0.062420581454241 0.062420581454241
+15530 3943 9642 0.0627968141202241 0.0627968141202241
+15531 9642 5613 0.0612320254822175 0.0612320254822175
+15532 5613 9643 0.0497740720528068 0.0497740720528068
+15533 9643 3735 0.0551525120669933 0.0551525120669933
+15534 3735 4491 0.207391837271035 0.207391837271035
+15535 4491 129 0.109629298465467 0.109629298465467
+15536 129 7948 0.0410521986313786 0.0410521986313786
+15537 7948 2527 0.287151637527745 0.287151637527745
+15538 2527 9644 0.066959748271427 0.066959748271427
+15539 9644 1221 0.102833533420687 0.102833533420687
+16595 9951 6712 0.00734129639736197 0.00734129639736197
+15542 618 9638 0.0309196803723069 0.0309196803723069
+15548 9647 9648 0.0291957554146951 0.0291957554146951
+15549 7572 9649 0.0425327114545183 0.0425327114545183
+15551 9650 9651 0.00414955523410263 0.00414955523410263
+15553 9651 9652 0.0110054302366685 0.0110054302366685
+15555 9652 9653 0.018743029705938 0.018743029705938
+15558 9656 4160 0.0156451635843959 0.0156451635843959
+15559 4160 4769 0.262100180691146 0.262100180691146
+15560 4769 6550 0.17763389531497 0.17763389531497
+15561 6550 9299 0.171507609467602 0.171507609467602
+15564 3803 5934 0.15587305192408 0.15587305192408
+15565 5934 930 0.176935041153743 0.176935041153743
+15566 930 2215 0.185037322727603 0.185037322727603
+15567 2215 4865 0.15888388268895 0.15888388268895
+15568 4865 9477 0.193757182508649 0.193757182508649
+15569 9477 5466 0.16958064463752 0.16958064463752
+15570 5466 9658 0.179556785798918 0.179556785798918
+15571 9658 9659 0.177338892845698 0.177338892845698
+15572 9659 662 0.00516539932395329 0.00516539932395329
+18431 10291 7169 0.0508784288394603 0.0508784288394603
+15573 662 9660 0.00343592323317494 0.00343592323317494
+15575 9464 4609 0.17585408606 0.17585408606
+15576 4609 6490 0.148161596916065 0.148161596916065
+15577 6490 7974 0.0885778987826885 0.0885778987826885
+15579 4336 9656 0.0458791064556152 0.0458791064556152
+15581 7573 3556 0.0299599314208067 0.0299599314208067
+15583 851 7096 0.0990470064031014 0.0990470064031014
+15584 7096 9661 0.0107677923604542 0.0107677923604542
+15585 9661 9662 0.0081027242638239 0.0081027242638239
+15586 9662 9663 0.00747970901198794 0.00747970901198794
+15587 9663 9664 0.00836437719840195 0.00836437719840195
+15588 9664 9665 0.00928103292942469 0.00928103292942469
+15589 9665 9666 0.00696482735297281 0.00696482735297281
+15590 9666 9667 0.00676039634627663 0.00676039634627663
+15591 9667 9668 0.00737940382126904 0.00737940382126904
+15592 9668 9669 0.0330209265296029 0.0330209265296029
+15593 9669 8703 0.0154036792176203 0.0154036792176203
+15594 8703 8152 0.0935877668611654 0.0935877668611654
+15595 8152 7613 0.0937841622026169 0.0937841622026169
+15596 7613 7266 0.0918493440897444 0.0918493440897444
+15597 7266 7585 0.0967046653962524 0.0967046653962524
+15599 2003 3363 0.0896469251714999 0.0896469251714999
+15600 3363 2757 0.0953909752557553 0.0953909752557553
+15601 2757 9670 0.0852737689905025 0.0852737689905025
+15602 9670 9671 0.00427910266137011 0.00427910266137011
+15603 9671 7008 0.00522846022655691 0.00522846022655691
+15604 7008 9672 0.00318311155269209 0.00318311155269209
+15605 9672 9673 0.00446550904917084 0.00446550904917084
+15606 9673 9674 0.0041674932546887 0.0041674932546887
+15607 9674 2283 0.0902343315694916 0.0902343315694916
+15608 2283 3604 0.0998061678618656 0.0998061678618656
+15609 3604 7530 0.0990712121378624 0.0990712121378624
+15610 7530 2138 0.109343720002506 0.109343720002506
+15611 2138 5995 0.0993207600682094 0.0993207600682094
+15612 5995 7675 0.101107003151938 0.101107003151938
+15613 7675 9675 0.0981911301047578 0.0981911301047578
+15614 9675 9676 0.100210056589884 0.100210056589884
+15615 9676 9677 0.100165741773797 0.100165741773797
+15616 9677 9678 0.100142214318315 0.100142214318315
+15617 9678 9679 0.0993326168253197 0.0993326168253197
+899 913 914 0.147143450226327 0.147143450226327
+20715 10914 9397 0.00810191720556871 0.00810191720556871
+15619 9680 9681 0.102717909771226 0.102717909771226
+15620 9681 9682 0.100023276858498 0.100023276858498
+15621 9682 9683 0.100843312370816 0.100843312370816
+15622 9683 9684 0.101658088937986 0.101658088937986
+15623 9684 9685 0.0375181649725389 0.0375181649725389
+15624 9685 9686 0.0593326737516342 0.0593326737516342
+15625 9686 9687 0.102011015676098 0.102011015676098
+15627 9688 9689 0.110065273053945 0.110065273053945
+15628 9689 9690 0.109733851792721 0.109733851792721
+15629 9690 9691 0.0939207749458389 0.0939207749458389
+15630 9691 9692 0.102876500148466 0.102876500148466
+15631 9692 9693 0.0940860472810003 0.0940860472810003
+15633 851 7096 0.0990470064031014 0.0990470064031014
+15634 7096 9661 0.0107677923604542 0.0107677923604542
+15635 9661 9662 0.0081027242638239 0.0081027242638239
+15636 9662 9663 0.00747970901198794 0.00747970901198794
+15637 9663 9664 0.00836437719840195 0.00836437719840195
+15638 9664 9665 0.00928103292942469 0.00928103292942469
+15639 9665 9666 0.00696482735297281 0.00696482735297281
+15641 9667 9668 0.00737940382126904 0.00737940382126904
+15642 9668 9669 0.0330209265296029 0.0330209265296029
+15644 8703 8152 0.0935877668611654 0.0935877668611654
+20716 9397 9341 0.0111932287865196 0.0111932287865196
+15645 8152 7613 0.0937841622026169 0.0937841622026169
+15646 7613 7266 0.0918493440897444 0.0918493440897444
+15647 7266 7585 0.0967046653962524 0.0967046653962524
+15648 7585 2003 0.0946559616738872 0.0946559616738872
+15649 2003 3363 0.0896469251714999 0.0896469251714999
+15650 3363 2757 0.0953909752557553 0.0953909752557553
+15651 2757 9670 0.0852737689905025 0.0852737689905025
+15652 9670 9671 0.00427910266137011 0.00427910266137011
+15653 9671 7008 0.00522846022655691 0.00522846022655691
+15654 7008 9672 0.00318311155269209 0.00318311155269209
+15655 9672 9673 0.00446550904917084 0.00446550904917084
+15656 9673 9674 0.0041674932546887 0.0041674932546887
+15657 9674 2283 0.0902343315694916 0.0902343315694916
+15658 2283 3604 0.0998061678618656 0.0998061678618656
+15659 3604 7530 0.0990712121378624 0.0990712121378624
+940 955 956 0.0467857248690536 0.0467857248690536
+15660 7530 2138 0.109343720002506 0.109343720002506
+15661 2138 5995 0.0993207600682094 0.0993207600682094
+15663 7675 9675 0.0981911301047578 0.0981911301047578
+15664 9675 9676 0.100210056589884 0.100210056589884
+15665 9676 9677 0.100165741773797 0.100165741773797
+15666 9677 9678 0.100142214318315 0.100142214318315
+20717 9341 10910 0.0086655068036058 0.0086655068036058
+15667 9678 9679 0.0993326168253197 0.0993326168253197
+15668 9679 9680 0.101799223111765 0.101799223111765
+15669 9680 9681 0.102717909771226 0.102717909771226
+15670 9681 9682 0.100023276858498 0.100023276858498
+15671 9682 9683 0.100843312370816 0.100843312370816
+15672 9683 9684 0.101658088937986 0.101658088937986
+15673 9684 9685 0.0375181649725389 0.0375181649725389
+15675 9686 9687 0.102011015676098 0.102011015676098
+15676 9687 9688 0.091295408872665 0.091295408872665
+15677 9688 9689 0.110065273053945 0.110065273053945
+15678 9689 9690 0.109733851792721 0.109733851792721
+15679 9690 9691 0.0939207749458389 0.0939207749458389
+15680 9691 9692 0.102876500148466 0.102876500148466
+15681 9692 9693 0.0940860472810003 0.0940860472810003
+15684 7680 3450 0.103468199661171 0.103468199661171
+15686 6014 3880 0.103612570358144 0.103612570358144
+15687 3880 842 0.103458609408344 0.103458609408344
+15688 842 7097 0.103202015659942 0.103202015659942
+15689 7097 9694 0.047717886337947 0.047717886337947
+15690 9694 8693 0.0153273459011852 0.0153273459011852
+15691 8693 8154 0.0909950973067502 0.0909950973067502
+15692 8154 7616 0.0940844002869557 0.0940844002869557
+20719 10885 9398 0.0070860203578635 0.0070860203578635
+15693 7616 7269 0.0941699315585107 0.0941699315585107
+15695 2024 3357 0.101537173300766 0.101537173300766
+15696 3357 2761 0.09936727049288 0.09936727049288
+15697 2761 7002 0.0992423706702366 0.0992423706702366
+15698 7002 2264 0.0979906184711561 0.0979906184711561
+15699 2264 3594 0.0994063483699449 0.0994063483699449
+15700 3594 7517 0.101662572945496 0.101662572945496
+15701 7517 2099 0.100157096238172 0.100157096238172
+15702 2099 5976 0.101294873446063 0.101294873446063
+15703 5976 7666 0.100715370574341 0.100715370574341
+15705 2329 9695 0.166702045988164 0.166702045988164
+15706 8023 8686 0.102850512121315 0.102850512121315
+15708 8810 7064 0.0240522165973304 0.0240522165973304
+15710 8803 7155 0.0191394427517654 0.0191394427517654
+15711 7155 6281 0.12107437233707 0.12107437233707
+15712 6281 1050 0.111583194341316 0.111583194341316
+15714 3913 3150 0.158539469564201 0.158539469564201
+15715 3150 3124 0.0198304894474349 0.0198304894474349
+15716 3124 7370 0.0954616596060542 0.0954616596060542
+15717 7370 7346 0.018354860843617 0.018354860843617
+15718 7346 6806 0.0981383819816197 0.0981383819816197
+15719 6806 6802 0.0198184437093697 0.0198184437093697
+15720 6802 4711 0.111589534373845 0.111589534373845
+15721 4711 782 0.0471200606837116 0.0471200606837116
+15722 782 5113 0.0527296074626885 0.0527296074626885
+15723 5113 1545 0.0490000601275782 0.0490000601275782
+15724 1545 6325 0.0500984428583215 0.0500984428583215
+15728 9449 9696 0.165726699390797 0.165726699390797
+15732 8801 5164 0.779026857141219 0.779026857141219
+15734 9303 1207 0.168708605950551 0.168708605950551
+15735 1207 9698 0.0215813490172367 0.0215813490172367
+15736 9698 3771 0.199072281764282 0.199072281764282
+15738 8867 958 0.177734005515433 0.177734005515433
+15739 958 9420 0.172099550054797 0.172099550054797
+15740 9420 4896 0.162799282631442 0.162799282631442
+15741 4896 9470 0.183516274472291 0.183516274472291
+15742 9470 5493 0.174731799993968 0.174731799993968
+15743 5493 9699 0.19822011575815 0.19822011575815
+15745 6718 4833 0.101679501011927 0.101679501011927
+15746 4833 6378 0.103648655421083 0.103648655421083
+15747 6378 3188 0.103521991883946 0.103521991883946
+15749 8692 1060 0.0921643567251203 0.0921643567251203
+15750 1060 1697 0.0932426366322247 0.0932426366322247
+15751 1697 7268 0.0954492333486145 0.0954492333486145
+15752 7268 6671 0.0907592732101769 0.0907592732101769
+15754 2023 3356 0.0971424118361729 0.0971424118361729
+15756 2760 7001 0.10039029368168 0.10039029368168
+15757 7001 2263 0.0995790205304853 0.0995790205304853
+15758 2263 3487 0.100064167822274 0.100064167822274
+15760 5346 2098 0.0987082712844417 0.0987082712844417
+15761 2098 2940 0.101254724790906 0.101254724790906
+15763 6814 9700 0.201962621208867 0.201962621208867
+15766 9701 9702 0.01946308379228 0.01946308379228
+15767 9702 7793 0.0917115184551997 0.0917115184551997
+15768 7793 9703 0.0139663687397926 0.0139663687397926
+15769 9703 9044 0.0844498524584079 0.0844498524584079
+15770 9044 1093 0.00878466321187049 0.00878466321187049
+15771 1093 7489 0.0946907062423257 0.0946907062423257
+15772 7489 3839 0.0924847260791552 0.0924847260791552
+15773 3839 9041 0.00820472152594153 0.00820472152594153
+15774 9041 5598 0.0888252595207534 0.0888252595207534
+15775 5598 9038 0.0124773684874939 0.0124773684874939
+15776 9038 7546 0.0939528798953845 0.0939528798953845
+15817 9704 9705 0.0108623818240175 0.0108623818240175
+15777 7546 9706 0.691905770916309 0.691905770916309
+15800 1403 9709 0.0705866891174833 0.0705866891174833
+15801 9709 620 0.0978636674417251 0.0978636674417251
+15802 620 9710 0.210732715068668 0.210732715068668
+15803 9710 1934 0.00294671517895333 0.00294671517895333
+15812 9716 2323 0.0248152326425255 0.0248152326425255
+15814 9717 9718 0.0914794540174667 0.0914794540174667
+15815 9718 9719 0.0447183943765151 0.0447183943765151
+19498 10525 10526 0.0198486557174526 0.0198486557174526
+15816 9719 9704 0.266399501314719 0.266399501314719
+15823 622 9720 0.114642644128587 0.114642644128587
+15824 9720 9721 0.0112307689682394 0.0112307689682394
+15825 9721 9722 0.0869660670624723 0.0869660670624723
+15826 9722 9508 0.205466270114504 0.205466270114504
+15828 9723 8889 0.0324596924967659 0.0324596924967659
+15829 8889 7134 0.00993032916751998 0.00993032916751998
+15831 9724 9725 0.00760667507368999 0.00760667507368999
+15832 9725 9726 0.189210618262835 0.189210618262835
+15833 9726 9727 0.207046790394153 0.207046790394153
+19270 10423 10424 0.0241914475611954 0.0241914475611954
+435 364 434 0.342302602243315 0.342302602243315
+437 435 436 0.251313063977777 0.251313063977777
+438 291 437 0.00683009618704691 0.00683009618704691
+439 437 438 0.127267952892383 0.127267952892383
+18188 4070 6055 0.154839029661679 0.154839029661679
+2329 914 2297 0.0421335193471221 0.0421335193471221
+2331 2320 2321 0.0970544429847538 0.0970544429847538
+2332 2321 2325 0.106348268281835 0.106348268281835
+2334 2326 2327 0.097322097365987 0.097322097365987
+2335 2327 1153 0.100532392748858 0.100532392748858
+2338 2329 2330 0.176644411418714 0.176644411418714
+2339 2330 2331 0.174810883246149 0.174810883246149
+2340 2331 2332 0.246452825481674 0.246452825481674
+12346 8662 8663 0.00747381550039305 0.00747381550039305
+15258 8632 9548 0.0273148076656665 0.0273148076656665
+2341 2332 2333 0.239714451404855 0.239714451404855
+2342 2333 2334 0.0332654390408316 0.0332654390408316
+2344 2335 2336 0.129842641397919 0.129842641397919
+2346 2337 2338 0.0990445311811364 0.0990445311811364
+2348 2265 2339 0.101695232363891 0.101695232363891
+2349 2339 2340 0.100657111492997 0.100657111492997
+2350 2340 2100 0.0993531902440497 0.0993531902440497
+20593 3590 10852 0.00726410078461852 0.00726410078461852
+20595 10864 10861 0.0184079229928756 0.0184079229928756
+20596 10861 10869 0.0187971985012912 0.0187971985012912
+20598 10844 10816 0.176342451403751 0.176342451403751
+20599 10816 10784 0.0180725957817606 0.0180725957817606
+18882 3271 7310 0.200940882978518 0.200940882978518
+20600 10784 10835 0.00593511915863137 0.00593511915863137
+20602 2958 10836 0.0107685222165634 0.0107685222165634
+20605 10827 10870 0.0187474646325031 0.0187474646325031
+20606 10870 10871 0.0569206829492766 0.0569206829492766
+20746 10919 10920 0.0829974075948199 0.0829974075948199
+20607 10872 10858 0.118628394955246 0.118628394955246
+20609 2959 10837 0.0110654933350888 0.0110654933350888
+20610 10837 10819 0.0119664824389379 0.0119664824389379
+11704 1158 1159 0.143826308402294 0.143826308402294
+16709 10000 10001 0.0457062376473756 0.0457062376473756
+20652 9411 7929 0.0718148143148174 0.0718148143148174
+20655 4390 9954 0.0752796609482001 0.0752796609482001
+20656 9954 10883 0.0805000116188462 0.0805000116188462
+20657 10883 10884 0.00921180121982239 0.00921180121982239
+20658 10884 8289 0.0487008508548274 0.0487008508548274
+20660 5957 6482 0.0027689648671592 0.0027689648671592
+20661 6482 5774 0.120389794748458 0.120389794748458
+20662 5774 4620 0.0232425190443662 0.0232425190443662
+20663 4620 5809 0.169650245221728 0.169650245221728
+20664 5809 10472 0.013534248318244 0.013534248318244
+2394 2385 2386 0.330871173224232 0.330871173224232
+2396 2387 2072 0.091718253525282 0.091718253525282
+2398 2388 2389 0.0952556218940292 0.0952556218940292
+2399 2389 2390 0.088517954558777 0.088517954558777
+2400 2390 2391 0.100075566647637 0.100075566647637
+2401 2391 2392 0.0940014926636224 0.0940014926636224
+2402 2392 2394 0.0931645591460492 0.0931645591460492
+2403 2394 2395 0.0490422843236324 0.0490422843236324
+2404 2396 2397 0.101232025457682 0.101232025457682
+2405 2397 835 0.0985806787691326 0.0985806787691326
+2406 835 2398 0.196049611343252 0.196049611343252
+2407 2398 2399 0.0153233199302382 0.0153233199302382
+2408 2399 2400 0.00232458495354821 0.00232458495354821
+2412 2402 2403 0.0775441054784182 0.0775441054784182
+2415 2405 2406 0.101142772155656 0.101142772155656
+498 441 442 0.0937180388509973 0.0937180388509973
+500 443 444 0.0957304857475106 0.0957304857475106
+14680 445 446 0.198543865097556 0.198543865097556
+443 447 448 0.0518475604896436 0.0518475604896436
+446 450 451 0.1546192530483 0.1546192530483
+310 318 319 0.318271935051083 0.318271935051083
+447 451 452 0.176746748854474 0.176746748854474
+448 452 453 0.173946054533759 0.173946054533759
+449 453 454 0.161145911336434 0.161145911336434
+450 454 455 0.183605091547984 0.183605091547984
+452 456 457 0.174314536622101 0.174314536622101
+453 457 458 0.162044543484691 0.162044543484691
+454 458 459 0.182862983981988 0.182862983981988
+456 460 6 0.0823027301557762 0.0823027301557762
+1198 1212 1213 0.0683736094322978 0.0683736094322978
+465 266 468 0.155710664946604 0.155710664946604
+466 469 470 0.0207613766308904 0.0207613766308904
+468 471 472 0.378751941435673 0.378751941435673
+472 475 476 0.0306017516715067 0.0306017516715067
+474 477 478 0.142331986757376 0.142331986757376
+476 401 479 0.0792493107270532 0.0792493107270532
+480 481 482 0.61054856130416 0.61054856130416
+481 482 483 0.00751372921095178 0.00751372921095178
+482 483 484 0.0775332394520986 0.0775332394520986
+483 484 485 0.089248827005011 0.089248827005011
+17372 40 3540 0.206359755216492 0.206359755216492
+19502 10529 10530 0.0177249357864871 0.0177249357864871
+2653 2611 2612 0.141657164390576 0.141657164390576
+2654 2612 2613 0.112637909268372 0.112637909268372
+2655 2613 2614 0.0580743648208686 0.0580743648208686
+17439 9901 10107 0.0190863480039502 0.0190863480039502
+2656 2614 2615 0.100743891980042 0.100743891980042
+2657 2615 2616 0.100475490032633 0.100475490032633
+2658 2616 2617 0.0513770343819779 0.0513770343819779
+2660 2618 2619 0.0511386540650187 0.0511386540650187
+2661 2619 2620 0.0507766966271612 0.0507766966271612
+2662 2620 2621 0.0437935865590098 0.0437935865590098
+2664 2622 2623 0.138741239129278 0.138741239129278
+2665 2623 2624 0.0616812798954739 0.0616812798954739
+2666 2624 2625 0.041735581046466 0.041735581046466
+2668 2626 2627 0.080053274568439 0.080053274568439
+2669 2627 2628 0.0586986059075718 0.0586986059075718
+2672 2630 2631 0.0511347279443915 0.0511347279443915
+2673 2631 2632 0.0473711830288774 0.0473711830288774
+2701 1199 2633 0.0222472727939579 0.0222472727939579
+2800 2469 2753 0.205232670024875 0.205232670024875
+2801 2753 2754 0.200329673691245 0.200329673691245
+2802 2754 796 0.200317660350865 0.200317660350865
+2803 796 2755 0.202508246596186 0.202508246596186
+2804 2755 2756 0.202966691897007 0.202966691897007
+2805 2756 2757 0.203516573136303 0.203516573136303
+2806 2757 2758 0.206901705972361 0.206901705972361
+2807 2758 2759 0.18527317626533 0.18527317626533
+2809 2760 2761 0.172193089993048 0.172193089993048
+2810 2761 2337 0.176949778602699 0.176949778602699
+2811 2337 2762 0.175813497300624 0.175813497300624
+2812 2762 2763 0.241500363205236 0.241500363205236
+2813 2763 2764 0.135070479950714 0.135070479950714
+2814 2764 2765 0.106502558770285 0.106502558770285
+2815 2765 2766 0.0334927078919062 0.0334927078919062
+2816 2766 2767 0.200988096936329 0.200988096936329
+2817 2767 2768 0.200799068465386 0.200799068465386
+2819 2769 1141 0.136317655493671 0.136317655493671
+2820 1141 908 0.140881200888928 0.140881200888928
+1246 190 1268 0.101376125490378 0.101376125490378
+20670 10891 10892 0.0391113232197559 0.0391113232197559
+20671 10892 10893 0.0381065586329798 0.0381065586329798
+20672 10893 10894 0.00879572218910387 0.00879572218910387
+20673 10894 6880 0.00914047873035344 0.00914047873035344
+20675 10895 10896 0.0564298376836357 0.0564298376836357
+20676 10896 10897 0.0882221479591311 0.0882221479591311
+20677 10897 10898 0.0915468728847566 0.0915468728847566
+20678 10898 10889 0.0977975944203811 0.0977975944203811
+12368 8665 8670 0.0146509072378509 0.0146509072378509
+20679 10889 10899 0.0863988642991602 0.0863988642991602
+20680 10899 10900 0.00621581990565306 0.00621581990565306
+20682 10899 10901 0.0272487435286037 0.0272487435286037
+20683 10902 10892 0.0353963477419812 0.0353963477419812
+20685 10903 10904 0.0311951245060147 0.0311951245060147
+20686 10905 8231 0.00978569112678673 0.00978569112678673
+20687 8231 10753 0.00720642488718956 0.00720642488718956
+11 11 12 0.132606225003913 0.132606225003913
+13 13 14 0.261405445974353 0.261405445974353
+14 14 15 0.0524534751729061 0.0524534751729061
+15 15 16 0.0498286567506269 0.0498286567506269
+16 16 17 0.0506321145105979 0.0506321145105979
+17 17 18 0.0480115772672805 0.0480115772672805
+19 19 20 0.586520216245135 0.586520216245135
+21 22 23 0.0471109050306669 0.0471109050306669
+22 23 24 0.117066818844753 0.117066818844753
+25 26 27 0.131659873107185 0.131659873107185
+27 28 29 0.0945023300061256 0.0945023300061256
+28 29 32 0.0547795902237084 0.0547795902237084
+29 32 33 0.0472851468321661 0.0472851468321661
+30 33 34 0.0541728824006047 0.0541728824006047
+1 1 2 0.182682884421833 0.182682884421833
+31 34 35 0.0481653228438301 0.0481653228438301
+32 35 36 0.0518878807765827 0.0518878807765827
+34 37 38 0.0490317013211587 0.0490317013211587
+35 38 39 0.0492286314169291 0.0492286314169291
+36 39 40 0.0502550749626562 0.0502550749626562
+37 40 41 0.0504947813294015 0.0504947813294015
+19671 9367 10610 0.0557753987785757 0.0557753987785757
+38 41 42 0.0486093395250147 0.0486093395250147
+39 42 43 0.0502383575999221 0.0502383575999221
+40 43 44 0.0498102685006676 0.0498102685006676
+42 45 46 0.0520249865615885 0.0520249865615885
+43 46 47 0.0510850489044332 0.0510850489044332
+44 47 48 0.0480642310133195 0.0480642310133195
+45 48 49 0.0520776483582305 0.0520776483582305
+47 50 51 0.0661075861419648 0.0661075861419648
+48 51 52 0.0568810950926816 0.0568810950926816
+49 52 53 0.0608706853363099 0.0608706853363099
+50 53 54 0.0662114802606989 0.0662114802606989
+51 54 55 0.0474185291403829 0.0474185291403829
+52 55 56 0.0539297292184645 0.0539297292184645
+53 56 57 0.108686747732496 0.108686747732496
+54 57 58 0.187258749990905 0.187258749990905
+56 59 60 1.21682866156064 1.21682866156064
+58 62 65 0.111732852527499 0.111732852527499
+60 66 67 0.0462182288009238 0.0462182288009238
+61 67 68 0.0059633062869109 0.0059633062869109
+63 69 70 0.0080040379689871 0.0080040379689871
+65 71 72 0.00371377887510826 0.00371377887510826
+66 72 73 0.0481593874311522 0.0481593874311522
+67 73 74 0.0476872742951146 0.0476872742951146
+68 74 75 0.050981067010882 0.050981067010882
+69 75 76 0.047311096476864 0.047311096476864
+70 76 77 0.00343925081784597 0.00343925081784597
+71 77 78 0.0504851331557092 0.0504851331557092
+72 78 79 0.0447329738384301 0.0447329738384301
+73 79 80 0.00573274424924571 0.00573274424924571
+74 80 81 0.048934333458383 0.048934333458383
+75 81 82 0.0451562090400863 0.0451562090400863
+76 82 83 0.0525053441886158 0.0525053441886158
+77 83 84 0.0468507536792171 0.0468507536792171
+79 85 86 0.0489620579654281 0.0489620579654281
+80 86 87 0.056293962476598 0.056293962476598
+81 87 88 0.0565505675369976 0.0565505675369976
+82 88 89 0.049261447484153 0.049261447484153
+83 89 90 0.0461992376398338 0.0461992376398338
+84 90 91 0.0452410545911285 0.0452410545911285
+85 91 92 0.040125194779582 0.040125194779582
+86 92 93 0.0417705541366205 0.0417705541366205
+87 93 94 0.0307746903425865 0.0307746903425865
+88 94 95 0.0484715360122363 0.0484715360122363
+90 58 96 0.0988139178735054 0.0988139178735054
+91 96 97 0.101340345409915 0.101340345409915
+92 97 98 0.0883916436599661 0.0883916436599661
+93 98 99 0.0102766637725455 0.0102766637725455
+94 99 100 0.0815080239205417 0.0815080239205417
+95 100 101 0.0191432455952872 0.0191432455952872
+99 104 105 0.149790406602899 0.149790406602899
+100 106 107 0.104888043119077 0.104888043119077
+101 107 108 0.276057285299863 0.276057285299863
+103 109 110 0.318041485575751 0.318041485575751
+105 111 112 0.0487653491195207 0.0487653491195207
+106 113 114 0.160343090933149 0.160343090933149
+107 114 115 0.208121584183608 0.208121584183608
+111 118 119 0.137350395143796 0.137350395143796
+113 120 121 0.356240759753107 0.356240759753107
+114 121 122 0.149871853701347 0.149871853701347
+115 122 123 0.148228608040365 0.148228608040365
+116 123 124 0.294126045752515 0.294126045752515
+118 125 126 0.131313615022207 0.131313615022207
+119 126 127 0.263795049720844 0.263795049720844
+123 130 131 0.221071288024568 0.221071288024568
+125 132 133 0.0549684068983719 0.0549684068983719
+126 133 135 0.0478699749630446 0.0478699749630446
+127 135 136 0.130706329520293 0.130706329520293
+128 136 137 0.0495130025200929 0.0495130025200929
+129 137 138 0.0194653537975714 0.0194653537975714
+130 138 139 0.0302495949579548 0.0302495949579548
+131 139 140 0.097138516429268 0.097138516429268
+133 141 142 0.0984160429772276 0.0984160429772276
+1414 1439 1440 0.0969799596597411 0.0969799596597411
+135 143 144 0.094779584184767 0.094779584184767
+136 144 145 0.102947980955417 0.102947980955417
+137 145 146 0.0998791210708115 0.0998791210708115
+138 146 147 0.10354963170018 0.10354963170018
+139 147 148 0.0970503169891706 0.0970503169891706
+141 149 150 0.0462633170535789 0.0462633170535789
+142 150 151 0.0859494466376985 0.0859494466376985
+143 151 152 0.084056042435147 0.084056042435147
+144 152 131 0.0865811985903579 0.0865811985903579
+145 131 155 0.0846809008371401 0.0846809008371401
+146 155 156 0.0860732350550831 0.0860732350550831
+147 156 157 0.0810260254286054 0.0810260254286054
+148 157 158 0.0821650587696609 0.0821650587696609
+149 158 159 0.0810216994355951 0.0810216994355951
+150 159 160 0.0856058417834562 0.0856058417834562
+151 160 161 0.0815928873404902 0.0815928873404902
+152 161 162 0.00737779613210769 0.00737779613210769
+154 163 164 0.00763240627009494 0.00763240627009494
+155 164 165 0.0713522613021865 0.0713522613021865
+156 165 166 0.00987473687183569 0.00987473687183569
+157 166 167 0.0668981585963986 0.0668981585963986
+158 167 168 0.0113627652096004 0.0113627652096004
+159 168 169 0.0796520415458163 0.0796520415458163
+160 169 170 0.0789939822174276 0.0789939822174276
+161 170 171 0.0216393201096419 0.0216393201096419
+162 171 172 0.05739626274334 0.05739626274334
+163 172 173 0.0799414498698892 0.0799414498698892
+164 173 174 0.161327077814812 0.161327077814812
+165 174 175 0.292992058630926 0.292992058630926
+166 175 176 0.108231632340063 0.108231632340063
+167 176 177 0.106370208061557 0.106370208061557
+168 177 178 0.0920329418240447 0.0920329418240447
+169 178 179 0.199657740223053 0.199657740223053
+170 179 180 0.100614906430247 0.100614906430247
+1461 1483 1484 0.0976853528091841 0.0976853528091841
+171 180 181 0.0991515808605787 0.0991515808605787
+172 181 182 0.101348037813126 0.101348037813126
+175 184 185 0.0991513776470571 0.0991513776470571
+178 187 188 0.0984378662868895 0.0984378662868895
+179 188 189 0.709590130188447 0.709590130188447
+180 190 191 0.100578501060841 0.100578501060841
+181 191 192 0.0991218871214513 0.0991218871214513
+182 192 193 0.20342936542853 0.20342936542853
+183 193 194 0.207080695389682 0.207080695389682
+184 194 195 0.202642969626672 0.202642969626672
+185 195 196 0.201913108682536 0.201913108682536
+186 196 197 0.201920207523846 0.201920207523846
+187 197 198 0.201206377797867 0.201206377797867
+188 198 199 0.199728327239083 0.199728327239083
+189 199 200 0.179903776297828 0.179903776297828
+190 200 201 0.00513723410606708 0.00513723410606708
+191 201 202 0.207079558909688 0.207079558909688
+194 169 204 0.256940343045097 0.256940343045097
+195 204 205 0.14761309930181 0.14761309930181
+384 386 387 0.312847187378026 0.312847187378026
+197 208 209 0.0482198776992404 0.0482198776992404
+198 209 210 1.36238336075367 1.36238336075367
+199 211 212 0.0762056360151952 0.0762056360151952
+210 221 222 0.10839564681744 0.10839564681744
+212 223 224 0.197685755221764 0.197685755221764
+213 224 225 0.136500664002185 0.136500664002185
+215 226 227 0.0378358956085511 0.0378358956085511
+217 228 229 0.0700057652168164 0.0700057652168164
+218 229 230 0.156709235598665 0.156709235598665
+220 231 232 0.0710636642555904 0.0710636642555904
+223 234 235 0.0652725377045483 0.0652725377045483
+227 237 238 0.33099974682308 0.33099974682308
+19951 4950 4670 0.10032168356836 0.10032168356836
+229 239 240 0.145321847286165 0.145321847286165
+230 240 241 0.0697724132050665 0.0697724132050665
+231 241 242 0.0623380559401012 0.0623380559401012
+232 242 243 0.121807717540091 0.121807717540091
+233 243 244 0.123936016070967 0.123936016070967
+234 244 245 0.0423914167747626 0.0423914167747626
+235 245 30 0.0421885133223055 0.0421885133223055
+238 134 246 0.0735610173824186 0.0735610173824186
+246 253 254 0.386604280856974 0.386604280856974
+261 271 272 0.0791195509987444 0.0791195509987444
+262 272 273 0.0178978198366689 0.0178978198366689
+263 273 274 0.0364878269996901 0.0364878269996901
+264 274 275 0.130636800507014 0.130636800507014
+265 275 276 0.0381201943550558 0.0381201943550558
+272 282 283 0.097546663905458 0.097546663905458
+556 66 551 0.00841985913797999 0.00841985913797999
+557 551 552 0.04510313602044 0.04510313602044
+559 553 554 0.116858726253731 0.116858726253731
+562 249 556 0.0347143242166075 0.0347143242166075
+563 557 250 0.0320475892789012 0.0320475892789012
+581 573 574 3.62449911588374 3.62449911588374
+582 495 575 0.042579905853808 0.042579905853808
+583 575 576 0.0263063929759334 0.0263063929759334
+585 577 311 0.0472092453507094 0.0472092453507094
+587 578 579 0.310605662522472 0.310605662522472
+589 580 206 0.0784574482758401 0.0784574482758401
+591 581 582 0.323379230044806 0.323379230044806
+593 583 584 0.18304036244052 0.18304036244052
+595 585 586 0.0719402278196197 0.0719402278196197
+597 587 588 0.0168822192889414 0.0168822192889414
+599 589 590 0.0668977161070656 0.0668977161070656
+601 592 593 0.00991684169352972 0.00991684169352972
+606 597 598 0.0427315746706827 0.0427315746706827
+610 601 602 0.0635315500234909 0.0635315500234909
+611 602 603 0.0528935910157463 0.0528935910157463
+16699 9993 9994 0.012991856325609 0.012991856325609
+612 603 604 0.0535739683641864 0.0535739683641864
+615 606 307 0.0053241575287587 0.0053241575287587
+616 307 607 0.210415758379136 0.210415758379136
+618 608 609 0.0943257357645838 0.0943257357645838
+620 610 611 0.12631191015444 0.12631191015444
+621 611 612 0.121362330065702 0.121362330065702
+11699 1033 1034 0.0933842207119007 0.0933842207119007
+622 612 613 0.120087101438352 0.120087101438352
+623 613 614 0.109496386514743 0.109496386514743
+625 615 616 0.099485158811405 0.099485158811405
+626 616 617 0.0380723765849069 0.0380723765849069
+627 617 618 0.0166082915806853 0.0166082915806853
+629 619 620 0.0454138336035488 0.0454138336035488
+630 620 621 0.0942731398582661 0.0942731398582661
+631 621 622 0.00735436876666859 0.00735436876666859
+632 622 623 0.102647301082546 0.102647301082546
+633 623 544 0.0305138174261522 0.0305138174261522
+636 625 626 0.0461061908767262 0.0461061908767262
+637 626 627 0.0495093856599813 0.0495093856599813
+639 628 629 0.00822721040716169 0.00822721040716169
+640 629 630 0.102896638771385 0.102896638771385
+641 630 631 0.106879933016847 0.106879933016847
+642 631 632 0.103715813554019 0.103715813554019
+643 632 633 0.10692744992309 0.10692744992309
+644 633 634 0.103895780437174 0.103895780437174
+645 634 635 0.10514306949893 0.10514306949893
+647 636 637 0.00886536795801057 0.00886536795801057
+648 637 638 0.204097990393348 0.204097990393348
+649 638 639 0.00993994545767469 0.00993994545767469
+651 640 641 0.322116221139114 0.322116221139114
+653 643 644 0.14058289547664 0.14058289547664
+654 644 645 0.143886814663415 0.143886814663415
+657 647 648 0.1449055455771 0.1449055455771
+660 650 651 0.0986374455510098 0.0986374455510098
+661 651 652 0.109870142544629 0.109870142544629
+662 652 653 0.107278100090415 0.107278100090415
+663 653 654 0.105274765421146 0.105274765421146
+664 654 655 0.107321673078917 0.107321673078917
+665 655 659 0.103426909396494 0.103426909396494
+666 659 660 0.0476206970204551 0.0476206970204551
+667 660 661 0.0487580750629072 0.0487580750629072
+668 661 662 0.103115405190933 0.103115405190933
+669 662 663 0.118337011744519 0.118337011744519
+670 663 664 0.118107974454135 0.118107974454135
+671 664 665 0.223948343500364 0.223948343500364
+672 665 666 0.106040631048838 0.106040631048838
+673 666 667 0.0256000736542961 0.0256000736542961
+674 667 668 0.0803036973488277 0.0803036973488277
+675 668 669 0.107519240980512 0.107519240980512
+1662 1688 1689 0.0492594246995293 0.0492594246995293
+677 670 671 0.106757477563009 0.106757477563009
+678 671 672 0.103159385358598 0.103159385358598
+679 672 673 0.111733647900791 0.111733647900791
+680 673 674 0.10480806031483 0.10480806031483
+681 674 675 0.0524357665703955 0.0524357665703955
+682 675 676 0.0522607419390769 0.0522607419390769
+683 676 677 0.0516311575112871 0.0516311575112871
+684 677 678 0.0529566114294976 0.0529566114294976
+685 678 679 0.0524070698016137 0.0524070698016137
+686 679 680 0.187479766906081 0.187479766906081
+690 683 684 0.0954023275162926 0.0954023275162926
+691 684 685 0.100472575096637 0.100472575096637
+692 685 686 0.0954830683114717 0.0954830683114717
+693 686 687 0.0981912656165647 0.0981912656165647
+694 687 688 0.0529127579061837 0.0529127579061837
+695 688 689 0.097652475318391 0.097652475318391
+696 689 690 0.0954475604442949 0.0954475604442949
+697 690 691 1.04422795392214 1.04422795392214
+698 692 693 0.101491505067343 0.101491505067343
+700 694 695 0.0992328230839297 0.0992328230839297
+701 695 696 0.102484361376735 0.102484361376735
+703 697 698 0.0986965284486813 0.0986965284486813
+704 698 699 0.0994466333494717 0.0994466333494717
+705 699 700 0.0997814367951755 0.0997814367951755
+706 700 702 0.0968138925983087 0.0968138925983087
+707 702 703 0.100377700728806 0.100377700728806
+708 703 704 0.0945219805489684 0.0945219805489684
+709 704 705 0.101319162842739 0.101319162842739
+711 706 707 0.0929527445510612 0.0929527445510612
+712 707 708 0.132514897770158 0.132514897770158
+713 708 709 0.136169309583257 0.136169309583257
+714 709 710 0.133600704636896 0.133600704636896
+715 710 711 0.131877184107974 0.131877184107974
+716 711 712 0.137129048962243 0.137129048962243
+717 712 714 0.139625593223683 0.139625593223683
+718 714 715 0.140147388874583 0.140147388874583
+720 716 717 0.139181895573122 0.139181895573122
+721 717 718 0.136478657719685 0.136478657719685
+722 718 719 0.0608836584293049 0.0608836584293049
+723 719 720 0.0543052596791692 0.0543052596791692
+724 720 721 0.402215107963206 0.402215107963206
+726 722 723 0.109800761131151 0.109800761131151
+728 724 725 0.0404933936313706 0.0404933936313706
+729 725 726 0.0429068637575149 0.0429068637575149
+730 726 54 0.117488559492451 0.117488559492451
+732 728 729 0.201386679597364 0.201386679597364
+733 729 730 0.204011830144653 0.204011830144653
+734 730 731 0.199761692314281 0.199761692314281
+17425 10099 10083 0.0366406616748247 0.0366406616748247
+735 731 732 0.201563131430502 0.201563131430502
+736 732 733 0.402282143818784 0.402282143818784
+737 734 735 0.0902645098486118 0.0902645098486118
+738 735 736 0.0928507623233121 0.0928507623233121
+739 736 737 0.0900332912586976 0.0900332912586976
+740 737 738 0.0739532182409675 0.0739532182409675
+741 738 739 0.100409435325613 0.100409435325613
+742 739 740 0.0918337393875257 0.0918337393875257
+743 740 741 0.0605135925040139 0.0605135925040139
+744 741 744 0.09764928319827 0.09764928319827
+745 744 745 0.100176801141236 0.100176801141236
+746 745 746 0.0948931710062943 0.0948931710062943
+747 746 747 0.0932950961705344 0.0932950961705344
+748 747 748 0.0948942633213168 0.0948942633213168
+749 748 749 0.0880271421463829 0.0880271421463829
+750 749 750 0.101773658707536 0.101773658707536
+751 750 751 0.094781491782375 0.094781491782375
+752 751 752 0.0909312964030863 0.0909312964030863
+754 753 754 0.0476837940219257 0.0476837940219257
+755 754 755 0.0476837940207114 0.0476837940207114
+756 755 756 0.100492444483886 0.100492444483886
+760 760 761 0.278292588595779 0.278292588595779
+18241 8960 6768 0.145513824807152 0.145513824807152
+762 762 763 0.102174293003021 0.102174293003021
+763 763 764 0.0992571756698332 0.0992571756698332
+764 764 765 0.100622536912342 0.100622536912342
+766 766 767 0.101850111631528 0.101850111631528
+767 767 768 0.0961954013729948 0.0961954013729948
+768 768 769 0.207085640087389 0.207085640087389
+769 769 770 0.1068825400281 0.1068825400281
+770 770 771 0.105967528573409 0.105967528573409
+771 771 772 0.107278769323728 0.107278769323728
+772 772 199 0.0969401274978018 0.0969401274978018
+773 199 776 0.101328977128045 0.101328977128045
+774 776 777 0.0984004881984158 0.0984004881984158
+775 777 778 0.0991276696889056 0.0991276696889056
+779 784 785 0.101305408476756 0.101305408476756
+780 785 786 0.0976265458519536 0.0976265458519536
+781 786 787 0.0966903245975086 0.0966903245975086
+783 788 789 0.0146697046803596 0.0146697046803596
+784 789 790 0.0984239882007814 0.0984239882007814
+785 790 791 0.0942419953953979 0.0942419953953979
+786 791 792 0.0942417343682122 0.0942417343682122
+787 792 793 0.0942331855902031 0.0942331855902031
+789 794 795 0.0937138545964453 0.0937138545964453
+790 795 796 0.0956046195795482 0.0956046195795482
+791 796 797 0.0946549122760597 0.0946549122760597
+792 797 798 0.100527766007763 0.100527766007763
+793 798 799 0.10316918665 0.10316918665
+795 800 801 0.103459881633314 0.103459881633314
+796 801 802 0.0997925526863961 0.0997925526863961
+797 802 803 0.0998006432146063 0.0998006432146063
+854 804 805 0.1238606801811 0.1238606801811
+799 807 808 0.10163704947704 0.10163704947704
+800 808 812 0.0515064726572222 0.0515064726572222
+801 812 813 0.0494547954602067 0.0494547954602067
+802 813 814 0.051447981297694 0.051447981297694
+803 814 815 0.0525679212147471 0.0525679212147471
+804 815 816 0.0487973630951461 0.0487973630951461
+805 816 817 0.0522598325196538 0.0522598325196538
+806 817 818 0.103406751654374 0.103406751654374
+807 818 819 0.10785615815132 0.10785615815132
+808 819 820 0.10473605712406 0.10473605712406
+809 820 821 0.112264494558786 0.112264494558786
+810 821 822 0.0974128787334051 0.0974128787334051
+811 822 823 0.107993299539667 0.107993299539667
+812 823 824 0.0548178827467902 0.0548178827467902
+17428 10106 10103 0.0082057240713584 0.0082057240713584
+1819 1835 1836 0.0691383900190408 0.0691383900190408
+813 824 825 0.0508588332180354 0.0508588332180354
+816 827 828 0.0512039318870449 0.0512039318870449
+817 828 829 0.0518718595198435 0.0518718595198435
+818 829 830 0.106833526059922 0.106833526059922
+820 831 832 0.385745696022263 0.385745696022263
+821 832 833 0.404856481972801 0.404856481972801
+823 834 835 0.105948732119107 0.105948732119107
+824 835 838 0.0910625591495108 0.0910625591495108
+826 839 840 0.0919963536570051 0.0919963536570051
+828 841 842 0.174755253051921 0.174755253051921
+829 842 843 0.178568082023164 0.178568082023164
+830 843 844 0.17297498203528 0.17297498203528
+831 844 845 0.173265495891133 0.173265495891133
+832 845 846 0.177949551875208 0.177949551875208
+833 846 847 0.164704515205255 0.164704515205255
+835 848 849 0.140807407128784 0.140807407128784
+839 852 853 0.167627273627897 0.167627273627897
+840 853 854 0.0221861617364752 0.0221861617364752
+841 854 855 0.199351380476648 0.199351380476648
+842 855 856 0.154506611729302 0.154506611729302
+843 856 857 0.177121299660486 0.177121299660486
+844 857 858 0.173233506037634 0.173233506037634
+845 858 859 0.161447290254498 0.161447290254498
+846 859 860 0.184417991926907 0.184417991926907
+847 860 861 0.174097913655798 0.174097913655798
+848 861 862 0.200651350067359 0.200651350067359
+851 864 865 0.136205566327931 0.136205566327931
+852 865 866 0.134098020570816 0.134098020570816
+853 866 804 0.130206342500308 0.130206342500308
+855 805 869 0.151636521465058 0.151636521465058
+856 869 870 0.0565102957854785 0.0565102957854785
+859 872 873 0.106081890543097 0.106081890543097
+860 873 874 0.104885275538693 0.104885275538693
+861 874 875 0.105346104071406 0.105346104071406
+862 875 876 0.105115636520032 0.105115636520032
+16596 6712 8570 0.146117658845452 0.146117658845452
+864 877 878 0.106492224339564 0.106492224339564
+865 878 879 0.105226257982301 0.105226257982301
+866 879 880 0.109300044149485 0.109300044149485
+867 880 881 0.105305755069531 0.105305755069531
+868 881 882 0.0524982326673818 0.0524982326673818
+869 882 883 0.0527289587191423 0.0527289587191423
+870 883 884 0.104777165086199 0.104777165086199
+871 884 885 0.101110616467656 0.101110616467656
+873 886 887 0.105175290472485 0.105175290472485
+874 887 888 0.105460060240618 0.105460060240618
+875 888 889 0.104542724277831 0.104542724277831
+878 891 892 0.107871242081588 0.107871242081588
+879 892 893 0.100327397599291 0.100327397599291
+880 893 894 0.10715921423401 0.10715921423401
+11694 895 896 0.0160104862378167 0.0160104862378167
+881 894 897 0.103236099875311 0.103236099875311
+882 897 898 0.106539225146671 0.106539225146671
+16754 10009 7565 0.0493392725986542 0.0493392725986542
+20639 10032 10878 0.0503841615701827 0.0503841615701827
+885 864 900 0.0968355268957622 0.0968355268957622
+886 900 901 0.0921857962021889 0.0921857962021889
+887 901 902 0.0154453872411826 0.0154453872411826
+888 902 903 0.099023611112339 0.099023611112339
+889 903 904 0.106658816969038 0.106658816969038
+890 904 905 0.102850064051981 0.102850064051981
+891 905 906 0.106374102165022 0.106374102165022
+893 907 908 0.107980942566683 0.107980942566683
+897 911 912 0.0137000260099873 0.0137000260099873
+900 914 915 0.266296417735211 0.266296417735211
+902 916 917 0.109365780913081 0.109365780913081
+903 917 918 0.110688879788924 0.110688879788924
+904 918 919 0.0528048087506356 0.0528048087506356
+905 919 920 0.0548227612983216 0.0548227612983216
+1909 1921 1922 0.0521063364540888 0.0521063364540888
+12333 8655 8656 0.00566894958463717 0.00566894958463717
+906 920 921 0.0600921295133805 0.0600921295133805
+907 921 922 0.0524145297386554 0.0524145297386554
+908 922 923 0.0533449751273277 0.0533449751273277
+909 923 924 0.0522830317618348 0.0522830317618348
+910 924 925 0.0531296104749593 0.0531296104749593
+911 925 926 0.0494870453453698 0.0494870453453698
+912 926 927 0.0490530439973252 0.0490530439973252
+916 930 931 0.0484862367563559 0.0484862367563559
+917 931 932 0.0491192175023229 0.0491192175023229
+918 932 933 0.0512499454427793 0.0512499454427793
+935 950 951 0.0925005138771614 0.0925005138771614
+936 951 952 0.09155937925052 0.09155937925052
+937 952 953 0.096647434304121 0.096647434304121
+938 953 954 0.0946813321937467 0.0946813321937467
+939 954 955 0.0465376592907314 0.0465376592907314
+941 956 957 0.0470827842175089 0.0470827842175089
+942 957 958 0.0477097696809632 0.0477097696809632
+943 958 959 0.0469673192776546 0.0469673192776546
+944 959 857 0.0470271779665272 0.0470271779665272
+945 857 452 0.0433482724753884 0.0433482724753884
+946 452 960 0.0461959621064724 0.0461959621064724
+947 960 456 0.0448744265859584 0.0448744265859584
+948 456 961 0.0477309298676521 0.0477309298676521
+950 962 963 0.203057783136815 0.203057783136815
+951 963 964 0.111884367881333 0.111884367881333
+952 964 965 0.176567620505235 0.176567620505235
+953 965 966 0.178378901323504 0.178378901323504
+958 970 971 0.205957142551392 0.205957142551392
+960 972 973 0.204078625402165 0.204078625402165
+961 973 282 0.115147222371539 0.115147222371539
+964 976 977 0.0518319225146996 0.0518319225146996
+965 977 978 0.124228855322375 0.124228855322375
+966 978 979 0.172234101769625 0.172234101769625
+967 979 980 0.191895457064314 0.191895457064314
+968 980 981 0.160844607226305 0.160844607226305
+969 981 936 0.183612712644296 0.183612712644296
+18742 7651 6216 0.274731695307389 0.274731695307389
+970 936 982 0.178134725901618 0.178134725901618
+972 983 984 0.199061323006722 0.199061323006722
+973 984 985 0.188587247900735 0.188587247900735
+974 985 986 0.0433580404548831 0.0433580404548831
+975 986 987 0.125051012370851 0.125051012370851
+977 988 989 0.141681092806979 0.141681092806979
+978 989 990 0.0574887447164737 0.0574887447164737
+979 990 991 0.201644088462744 0.201644088462744
+981 992 993 0.0142751187411164 0.0142751187411164
+983 994 995 0.198087310718341 0.198087310718341
+984 995 996 0.021294324874815 0.021294324874815
+986 997 998 0.477759831198138 0.477759831198138
+988 999 1000 0.107359092710075 0.107359092710075
+989 1000 1001 0.213427542201395 0.213427542201395
+990 1001 1002 0.0204216124756694 0.0204216124756694
+991 1002 1003 0.169295945736254 0.169295945736254
+992 1003 1004 0.202119044170343 0.202119044170343
+993 1004 1007 0.405136142942317 0.405136142942317
+994 1008 753 0.128100004965855 0.128100004965855
+996 1009 277 0.197304277838347 0.197304277838347
+998 1010 1011 0.168461631075683 0.168461631075683
+999 1011 1012 0.0217275963794507 0.0217275963794507
+1000 1012 1013 0.199706135128057 0.199706135128057
+1001 1013 1014 0.154996233446664 0.154996233446664
+1002 1014 1015 0.0484476295387052 0.0484476295387052
+1005 1018 1019 0.198018950245581 0.198018950245581
+1006 1019 1020 0.173297369328456 0.173297369328456
+1007 1020 1021 0.177035115256862 0.177035115256862
+1008 1021 1022 0.17859043694682 0.17859043694682
+1009 1022 674 0.00356025053355106 0.00356025053355106
+1010 674 1023 0.00366943257948706 0.00366943257948706
+1011 1023 1024 0.17484373239475 0.17484373239475
+1012 1024 1025 0.173998681621435 0.173998681621435
+1015 1027 1028 0.0704684258530158 0.0704684258530158
+1017 1029 1030 0.0048505404615695 0.0048505404615695
+1018 1030 1031 0.00340295138148338 0.00340295138148338
+1019 1031 1035 0.134848566335067 0.134848566335067
+1020 1035 1036 0.137493615415566 0.137493615415566
+16764 9868 2745 0.0490633016235184 0.0490633016235184
+1021 1036 827 0.141821861187588 0.141821861187588
+1023 1037 1038 0.144096028267239 0.144096028267239
+1024 1038 1039 0.13873602575008 0.13873602575008
+1025 1039 1040 0.137557829611355 0.137557829611355
+1026 1040 1041 0.134490266221638 0.134490266221638
+1027 1041 1042 0.141541481862683 0.141541481862683
+1028 1042 1043 0.00492593525103261 0.00492593525103261
+1029 1043 1044 0.138593778312369 0.138593778312369
+1030 1044 1045 0.140603553737706 0.140603553737706
+1031 1045 881 0.137936273445967 0.137936273445967
+1032 881 1046 0.138493298016227 0.138493298016227
+1033 1046 1047 0.135001777755027 0.135001777755027
+1034 1047 1048 0.131055322767976 0.131055322767976
+1035 1048 1049 0.124939018757432 0.124939018757432
+1037 1050 1051 0.292899479856136 0.292899479856136
+1038 1051 1052 0.166422260927488 0.166422260927488
+1040 735 1053 0.129020329518136 0.129020329518136
+1042 1054 1055 0.104556386299221 0.104556386299221
+1044 1056 1057 0.0821976961903273 0.0821976961903273
+1046 1058 1059 0.198827335717405 0.198827335717405
+1048 1060 1061 0.168836903384636 0.168836903384636
+1050 1062 1063 0.404705159588638 0.404705159588638
+1051 1067 1068 0.132512985213334 0.132512985213334
+1052 1068 1069 0.13497040303733 0.13497040303733
+1053 1069 1070 0.132768776601327 0.132768776601327
+1056 1072 1073 0.0939030414376985 0.0939030414376985
+1058 1074 1075 0.180616569310233 0.180616569310233
+1059 1075 1076 0.0336398662027363 0.0336398662027363
+1060 1076 1077 0.0410609349522483 0.0410609349522483
+1061 1077 1078 0.0827433862317427 0.0827433862317427
+1062 1078 1079 0.0826887112506465 0.0826887112506465
+1064 1080 464 0.0761353371210495 0.0761353371210495
+1065 464 1081 0.349900041786437 0.349900041786437
+1066 1081 1082 0.00956876487693368 0.00956876487693368
+1068 1083 1084 0.207455473901342 0.207455473901342
+1069 1084 1085 0.20253048003379 0.20253048003379
+1070 1085 1086 0.20117520633799 0.20117520633799
+1071 1086 1087 0.200445374909098 0.200445374909098
+1073 1088 1089 0.193552555847569 0.193552555847569
+1074 1089 1090 0.201907921550129 0.201907921550129
+1075 1090 1091 0.409168814751628 0.409168814751628
+1078 1094 1095 0.176210660233647 0.176210660233647
+1082 1098 1099 0.214073333831546 0.214073333831546
+1083 1099 1100 0.273059176292595 0.273059176292595
+1085 1101 1102 0.177543118890406 0.177543118890406
+1086 1102 1103 0.205192174072119 0.205192174072119
+1089 1105 1106 0.177750162727048 0.177750162727048
+1090 1106 1107 0.0539560094135977 0.0539560094135977
+1091 1107 1108 0.122234944576301 0.122234944576301
+1092 1108 1109 0.177333676437683 0.177333676437683
+1093 1109 1110 0.180925459405873 0.180925459405873
+1095 1111 1112 0.128811671442731 0.128811671442731
+1096 1112 1113 0.134815073580703 0.134815073580703
+1097 1113 1114 0.136688571742098 0.136688571742098
+1098 1114 1115 0.101403665812315 0.101403665812315
+1099 1115 1116 0.102067679100378 0.102067679100378
+1102 1118 1119 0.204345080233058 0.204345080233058
+1103 1119 1120 0.199139333361331 0.199139333361331
+1104 1120 1121 0.0469911073941159 0.0469911073941159
+1105 1121 1122 0.0592169845475301 0.0592169845475301
+1106 1122 1123 0.0953718885827498 0.0953718885827498
+1107 1123 1124 0.0510557799357253 0.0510557799357253
+1108 1124 1125 0.150795725410384 0.150795725410384
+1109 1125 1126 0.203566805558282 0.203566805558282
+1111 1127 1128 0.0472430646130033 0.0472430646130033
+1112 1128 1129 0.205543981836037 0.205543981836037
+1114 1130 1131 0.164841461931526 0.164841461931526
+1115 1131 1132 0.171242319742711 0.171242319742711
+1116 1132 1133 0.15535130673221 0.15535130673221
+1117 1133 1134 0.155906924058663 0.155906924058663
+1118 1134 1135 0.158641971110509 0.158641971110509
+1120 1136 1137 0.202486056810199 0.202486056810199
+1124 1140 1141 0.106376038726262 0.106376038726262
+1125 1141 1142 0.11299023410348 0.11299023410348
+1127 1143 1144 0.105553895231553 0.105553895231553
+1128 1144 1145 0.104117784384988 0.104117784384988
+1129 1145 1146 0.103483298103444 0.103483298103444
+1131 1147 1148 0.20922373460901 0.20922373460901
+1132 1148 1149 0.150393643985841 0.150393643985841
+1133 1149 1150 0.0550246362758013 0.0550246362758013
+1134 1150 1151 0.102697719375893 0.102697719375893
+1135 1151 1152 0.0983530643806034 0.0983530643806034
+1136 1152 1153 0.0500465548413358 0.0500465548413358
+1137 1153 1154 0.957298194837815 0.957298194837815
+1138 1155 1156 0.108691319059022 0.108691319059022
+1139 1156 1157 0.102249102579738 0.102249102579738
+1140 1157 1160 0.108168549451273 0.108168549451273
+1141 1160 1161 0.101829092464478 0.101829092464478
+1144 1162 1163 0.0512778300683452 0.0512778300683452
+1146 1164 1165 0.100040433804019 0.100040433804019
+1147 1165 1166 0.107579273983848 0.107579273983848
+1148 1166 1167 0.103452121653836 0.103452121653836
+1149 1167 1168 0.102717798897395 0.102717798897395
+1150 1168 1169 0.106376023896376 0.106376023896376
+1151 1169 1170 0.105583034841699 0.105583034841699
+1152 1170 1171 0.105884448878202 0.105884448878202
+1153 1171 1172 0.107984392656028 0.107984392656028
+1154 1172 1173 0.100211807661524 0.100211807661524
+1156 1174 1175 0.0651406407561477 0.0651406407561477
+1157 1176 1177 0.0916420940843904 0.0916420940843904
+1158 1177 1178 0.317057086238115 0.317057086238115
+1159 1178 1179 0.0403904373250439 0.0403904373250439
+1160 1179 1180 0.087664479851631 0.087664479851631
+1163 555 558 0.0996109464859662 0.0996109464859662
+1165 1182 1183 0.200712633020301 0.200712633020301
+1166 1183 141 0.201303158931495 0.201303158931495
+1167 141 1184 0.160264959796536 0.160264959796536
+1169 1185 1186 0.0892826433471673 0.0892826433471673
+16608 9325 9944 0.146983175121654 0.146983175121654
+1171 1187 1011 0.0980488049438762 0.0980488049438762
+1172 1011 1188 0.100351187096818 0.100351187096818
+1173 1188 1189 0.0991689160182861 0.0991689160182861
+1174 1189 1190 0.0985624561842153 0.0985624561842153
+1175 1190 1191 0.0992629404802966 0.0992629404802966
+1177 1192 1193 0.0982024972051538 0.0982024972051538
+1178 1193 1194 0.0979660824445765 0.0979660824445765
+1179 1194 1195 0.0324477724054976 0.0324477724054976
+1180 1195 1196 0.0675268282620706 0.0675268282620706
+1182 1197 1198 0.0679368973278076 0.0679368973278076
+1184 1199 1200 0.0686815112230977 0.0686815112230977
+1185 1200 1201 0.0309923494566171 0.0309923494566171
+1186 1201 1202 0.0899174664521967 0.0899174664521967
+1187 1202 1203 0.0945518763756908 0.0945518763756908
+1188 1203 1204 0.0933113340782308 0.0933113340782308
+1189 1204 1205 0.09509225728821 0.09509225728821
+1190 1205 1206 0.0947055520559319 0.0947055520559319
+1191 1206 1207 0.0954663818870976 0.0954663818870976
+1192 1207 1208 0.0457748420522195 0.0457748420522195
+1193 1208 853 0.0452361278424885 0.0452361278424885
+1194 853 1209 0.0465328064656566 0.0465328064656566
+1195 1209 1210 0.0443349306457526 0.0443349306457526
+1196 1210 1211 0.0926255737985973 0.0926255737985973
+1200 1214 1215 0.199187167786165 0.199187167786165
+1201 1215 1216 0.200954541481784 0.200954541481784
+1202 1216 1217 0.405030982441888 0.405030982441888
+1203 1218 1219 0.0492032479248998 0.0492032479248998
+1204 1219 1220 0.0957003230509211 0.0957003230509211
+1206 1221 1222 0.0745042299709739 0.0745042299709739
+1207 1222 1223 0.102728552500243 0.102728552500243
+1208 1223 1224 0.112933078893132 0.112933078893132
+1210 1225 1226 0.132646861758746 0.132646861758746
+1212 1227 1228 0.133737749967366 0.133737749967366
+1213 1228 1229 0.138340301298334 0.138340301298334
+1214 1229 1230 0.133937469551528 0.133937469551528
+1215 1230 1231 0.133215122537399 0.133215122537399
+1216 1231 1236 0.135593895539884 0.135593895539884
+1217 1236 1237 0.134329596288595 0.134329596288595
+1218 1237 1238 0.133838756927755 0.133838756927755
+1220 1239 1240 0.201119608536246 0.201119608536246
+1222 1241 1242 0.0687159203588902 0.0687159203588902
+1223 1242 1243 0.133400908392016 0.133400908392016
+1224 1243 1247 0.135380581131659 0.135380581131659
+1225 1247 1248 0.134002229768192 0.134002229768192
+1226 1248 1249 0.133545106900313 0.133545106900313
+1227 1249 1250 0.135368900396577 0.135368900396577
+1228 1250 1251 0.135024432224222 0.135024432224222
+1229 1251 1252 0.104469760585228 0.104469760585228
+1230 1252 1253 0.0306570001135196 0.0306570001135196
+1231 1253 1254 0.0720522950545032 0.0720522950545032
+1232 1254 1255 0.0658986376594475 0.0658986376594475
+1233 1255 1256 0.0399746208950617 0.0399746208950617
+1234 1256 1257 0.0944491578366609 0.0944491578366609
+1235 1257 1258 0.132766928353997 0.132766928353997
+1236 1258 1259 0.135424431672451 0.135424431672451
+1237 1259 1260 0.140672385455392 0.140672385455392
+1238 1260 1261 0.134975501941172 0.134975501941172
+1239 1261 1262 0.0645486549169547 0.0645486549169547
+1240 1262 1263 0.0682069680036474 0.0682069680036474
+1241 1263 1264 0.132661334326961 0.132661334326961
+1242 1264 1265 0.198750077150319 0.198750077150319
+1243 1265 1266 0.153240793837705 0.153240793837705
+1245 273 1267 0.0675767060379672 0.0675767060379672
+1247 1268 1269 0.0991648269688332 0.0991648269688332
+1248 1269 1270 0.105715575753422 0.105715575753422
+1249 1270 1271 0.096909170039208 0.096909170039208
+1251 1272 1273 0.132822339876578 0.132822339876578
+1252 1273 1274 0.108602805332053 0.108602805332053
+1253 1274 1275 0.0271637528935803 0.0271637528935803
+1254 1275 1276 0.112230208152067 0.112230208152067
+1255 1276 1277 0.0176649567962355 0.0176649567962355
+1256 1277 1278 0.135399208639876 0.135399208639876
+1257 1278 1279 0.134958357098824 0.134958357098824
+1258 1279 1280 0.13471438954866 0.13471438954866
+1259 1280 1281 0.0527317447874755 0.0527317447874755
+1260 1281 1282 0.0822068643990868 0.0822068643990868
+1262 24 1283 0.0541075654220215 0.0541075654220215
+1263 1283 1284 0.0277584904979192 0.0277584904979192
+1264 1284 1285 0.0119510600074318 0.0119510600074318
+1265 1285 1286 0.00765101800505865 0.00765101800505865
+1267 1287 1288 0.0102422085479252 0.0102422085479252
+1269 1289 1290 0.18749026453307 0.18749026453307
+1270 1290 1291 0.200784792674354 0.200784792674354
+1271 1291 1292 0.406662337861329 0.406662337861329
+1272 1293 1028 0.104130177494266 0.104130177494266
+1274 1294 1295 0.209580478517529 0.209580478517529
+1275 1295 1296 0.202179673681852 0.202179673681852
+1276 1296 1297 0.102644670381459 0.102644670381459
+1277 1297 1298 0.08553722531747 0.08553722531747
+1278 1299 1300 0.10911250090994 0.10911250090994
+1279 1300 1305 0.103516561820708 0.103516561820708
+1280 1305 1306 0.107188605435255 0.107188605435255
+1282 1307 1308 0.104254785791266 0.104254785791266
+1283 1308 1309 0.104981820314566 0.104981820314566
+1284 1309 1310 0.0539236153779667 0.0539236153779667
+1285 1310 1311 0.0525379554780919 0.0525379554780919
+1287 1312 1313 0.0516652738700608 0.0516652738700608
+1288 1313 1314 0.0506813468547144 0.0506813468547144
+1289 1314 1315 0.0508976456987324 0.0508976456987324
+1290 1315 1316 0.0521616744394787 0.0521616744394787
+1291 1316 1317 0.0506396099336441 0.0506396099336441
+1292 1317 1318 0.0516214270666003 0.0516214270666003
+1293 1318 1319 0.0518951446578895 0.0518951446578895
+1294 1319 1320 0.0518013233234396 0.0518013233234396
+1295 1320 1321 0.0498510970504219 0.0498510970504219
+1296 1321 1322 0.0511186989957182 0.0511186989957182
+1297 1322 1323 0.0508331487974254 0.0508331487974254
+1300 1325 1326 0.08881123864976 0.08881123864976
+1304 499 1329 0.167484239247501 0.167484239247501
+1305 1329 1332 0.203905657642638 0.203905657642638
+1306 1332 1333 0.204847680679676 0.204847680679676
+1307 1333 1334 0.201123583387407 0.201123583387407
+1309 1335 1336 0.157474175144751 0.157474175144751
+1310 1336 1337 0.117575441930224 0.117575441930224
+1311 1337 1338 0.0942761529447682 0.0942761529447682
+1313 1339 1340 0.0991229934735866 0.0991229934735866
+1314 1340 193 0.100574656408132 0.100574656408132
+1315 193 1341 0.102057084030905 0.102057084030905
+1316 1341 1342 0.101342753238197 0.101342753238197
+1317 1342 1343 0.0983873083767276 0.0983873083767276
+1318 1343 1344 0.103799446896886 0.103799446896886
+1320 1345 1346 0.0125938712274396 0.0125938712274396
+1323 1348 1349 0.273909093656176 0.273909093656176
+1325 1350 1351 0.136546503712986 0.136546503712986
+1326 1351 1352 0.134960662965356 0.134960662965356
+1327 1352 1353 0.12926179848792 0.12926179848792
+1328 1353 1354 0.137757238088674 0.137757238088674
+1329 1354 1355 0.134312853283448 0.134312853283448
+1330 1355 1356 0.132780195397846 0.132780195397846
+1334 1359 1360 0.200708631878513 0.200708631878513
+1336 142 1364 0.213116678885437 0.213116678885437
+1338 1365 1366 0.152775417186349 0.152775417186349
+1339 1367 1368 0.213588518747439 0.213588518747439
+1341 1369 1370 0.0932290478454428 0.0932290478454428
+1342 1371 1372 0.0501807359890933 0.0501807359890933
+1343 1372 1373 0.0506488838331464 0.0506488838331464
+1344 1373 1374 0.0509778039678037 0.0509778039678037
+1345 1374 1375 0.0510804446988023 0.0510804446988023
+1346 1375 1376 0.0530938888935116 0.0530938888935116
+1347 1376 1377 0.0533676128248485 0.0533676128248485
+1348 1377 1378 0.0492215264037076 0.0492215264037076
+1349 1378 1379 0.0493909004241748 0.0493909004241748
+1350 1379 1380 0.102775081126436 0.102775081126436
+1351 1380 1381 0.100172308119327 0.100172308119327
+1353 1382 1383 0.0341877559991377 0.0341877559991377
+1354 1383 1384 0.104577694208817 0.104577694208817
+1356 1385 1386 0.193890579001187 0.193890579001187
+2459 714 2450 0.108569713532818 0.108569713532818
+1358 1387 1388 0.203368582544414 0.203368582544414
+1359 1388 1389 0.203745939128333 0.203745939128333
+1361 1390 1391 0.199208620541168 0.199208620541168
+1362 1391 1392 0.199941300123434 0.199941300123434
+1364 1393 1394 0.177657657089983 0.177657657089983
+1365 1394 1395 0.177656134299769 0.177656134299769
+1366 1395 1396 0.0721099099294465 0.0721099099294465
+1367 1396 1397 0.103333445330309 0.103333445330309
+1368 1397 1398 0.177111308895875 0.177111308895875
+1369 1398 1399 0.177390305757292 0.177390305757292
+1370 1399 1400 0.0617135848764214 0.0617135848764214
+1371 1400 1401 0.0203196347458361 0.0203196347458361
+1373 1402 1403 0.0235752242204257 0.0235752242204257
+1375 1404 1402 0.00627534757508794 0.00627534757508794
+1377 1405 1406 0.205561430653916 0.205561430653916
+1378 1406 1407 0.198211407371417 0.198211407371417
+1379 1407 1404 0.205478920022626 0.205478920022626
+1381 1408 1409 0.100293396704139 0.100293396704139
+2482 2015 1998 0.0374209544699414 0.0374209544699414
+1382 1409 1410 0.293581023203639 0.293581023203639
+1386 1413 1414 0.135399373352711 0.135399373352711
+1387 1414 1415 0.134222064866511 0.134222064866511
+1388 1415 1416 0.135554703950228 0.135554703950228
+1390 1417 1418 0.0459508709120374 0.0459508709120374
+1391 1418 1419 0.202303287973101 0.202303287973101
+1394 1421 1422 0.101428183167069 0.101428183167069
+1395 1422 1423 0.0971760324958247 0.0971760324958247
+1396 1423 1424 0.100465380366459 0.100465380366459
+1397 1424 1425 0.0503823697773718 0.0503823697773718
+1398 1425 1426 0.0484682644313395 0.0484682644313395
+1399 1426 1427 0.0493995225121813 0.0493995225121813
+1400 1427 1138 0.0500574902796296 0.0500574902796296
+1401 1138 1428 0.0487273610513856 0.0487273610513856
+1403 1429 1430 0.0510517494638005 0.0510517494638005
+1404 1430 1431 0.0485479238043371 0.0485479238043371
+1405 1431 1432 0.0499990939034271 0.0499990939034271
+1406 1432 1433 0.0540496336498359 0.0540496336498359
+1408 1434 1435 0.101502735016485 0.101502735016485
+1409 1435 1436 0.0975542961638382 0.0975542961638382
+1410 1436 1437 0.099750341261668 0.099750341261668
+1411 1437 1265 0.0977907961309881 0.0977907961309881
+1413 1438 1439 0.100436447451859 0.100436447451859
+1416 1441 1442 0.100952147732681 0.100952147732681
+1417 1442 1329 0.0966125375658313 0.0966125375658313
+1418 1329 1386 0.101098635736807 0.101098635736807
+1419 1386 1443 0.103303628365074 0.103303628365074
+1420 1443 1444 0.105351454494942 0.105351454494942
+1421 1444 1445 0.104823988220675 0.104823988220675
+1422 1445 1446 0.0939934684249721 0.0939934684249721
+1424 1447 1448 0.0986593061594928 0.0986593061594928
+1425 1448 1449 0.102799709683289 0.102799709683289
+1426 1449 1450 0.0947158385157811 0.0947158385157811
+1427 1450 1451 0.0999075147918272 0.0999075147918272
+1429 1452 784 0.0977509062908684 0.0977509062908684
+1431 1453 1454 0.0719801500300486 0.0719801500300486
+1432 1454 147 0.198407848383786 0.198407848383786
+1433 147 1455 0.0338525123105229 0.0338525123105229
+1435 151 1456 0.201963345264684 0.201963345264684
+1438 1458 1459 0.393387760227334 0.393387760227334
+1439 1460 1343 0.203476082408649 0.203476082408649
+1440 1343 1461 0.205811743637529 0.205811743637529
+1441 1461 1462 0.203884797606556 0.203884797606556
+1442 1462 1463 0.199707411933497 0.199707411933497
+1443 1463 1464 0.202654089186264 0.202654089186264
+1444 1464 1465 0.201184980777767 0.201184980777767
+1446 778 1466 0.187246918966658 0.187246918966658
+1447 1466 1467 0.197539000166948 0.197539000166948
+1448 1467 1468 0.208212504536917 0.208212504536917
+1450 1469 1470 0.186875447219802 0.186875447219802
+1451 173 1471 0.256211082856798 0.256211082856798
+1454 1473 1474 0.0115011236026218 0.0115011236026218
+1455 1474 1475 0.0782239536830869 0.0782239536830869
+1456 1475 1476 0.086773238144748 0.086773238144748
+1457 1476 1479 0.0924870142175924 0.0924870142175924
+1458 1479 1480 0.37958729242533 0.37958729242533
+1460 1482 1483 0.0482525610515095 0.0482525610515095
+1463 1183 1360 0.0998764831880159 0.0998764831880159
+1464 1360 1485 0.101348070124559 0.101348070124559
+1465 1485 1486 0.0984049068298888 0.0984049068298888
+1467 1487 1488 0.111519868825334 0.111519868825334
+1471 1454 1491 0.201276239535877 0.201276239535877
+1473 1492 1493 0.102671300709598 0.102671300709598
+1474 1493 1494 0.114201675013651 0.114201675013651
+1475 1494 1495 0.100620235623392 0.100620235623392
+1476 1495 1496 0.0991406161889474 0.0991406161889474
+1477 1496 1497 0.0998844924107287 0.0998844924107287
+1478 1497 1498 0.102075212599034 0.102075212599034
+1479 1498 1499 0.0984215743592215 0.0984215743592215
+1480 1499 1500 0.710275264674714 0.710275264674714
+1481 1501 1502 0.109574036549915 0.109574036549915
+1482 1502 1503 0.290817056726042 0.290817056726042
+1484 1504 1505 0.0925327391334129 0.0925327391334129
+1485 1505 1506 0.0984021297067109 0.0984021297067109
+1486 1506 1508 0.0976913946915281 0.0976913946915281
+1489 1509 1510 0.0972031962531711 0.0972031962531711
+1490 1510 1511 0.029446204772298 0.029446204772298
+1494 1514 1515 0.0918220075397064 0.0918220075397064
+1499 1518 1519 0.202094906389576 0.202094906389576
+1500 1519 1520 0.199707443263373 0.199707443263373
+1501 1520 1521 0.202063984146535 0.202063984146535
+1502 1521 1522 0.20219834838932 0.20219834838932
+1503 1522 1523 0.199783925434931 0.199783925434931
+1504 1523 47 0.203533027899534 0.203533027899534
+2599 2565 2566 0.0719878134592224 0.0719878134592224
+1506 1524 1525 0.202471618520659 0.202471618520659
+1507 1525 1526 0.207090708341307 0.207090708341307
+1508 1526 1527 0.19569314849173 0.19569314849173
+1509 1527 1528 0.200397251106195 0.200397251106195
+1511 1529 1530 2.00893755060013 2.00893755060013
+1516 1535 1536 0.100586492660266 0.100586492660266
+1518 1009 1537 0.0517503943444181 0.0517503943444181
+1519 1537 1540 0.0418405299236717 0.0418405299236717
+1520 1540 1541 0.0515572086033239 0.0515572086033239
+1521 1541 1542 0.0506297333875711 0.0506297333875711
+1522 1542 1547 0.050402272284143 0.050402272284143
+1523 1547 972 0.0996461444866795 0.0996461444866795
+1524 972 1548 0.0962022319753865 0.0962022319753865
+1525 1548 1549 0.0953657467513535 0.0953657467513535
+1526 1549 1550 0.0963437695650725 0.0963437695650725
+1528 1551 1552 0.142721374587541 0.142721374587541
+1529 1552 1553 0.0277011537567162 0.0277011537567162
+1530 1554 1555 0.0435488620803952 0.0435488620803952
+1531 1555 1053 0.0900813280777187 0.0900813280777187
+1532 1053 1556 0.091689363858679 0.091689363858679
+1537 1560 1561 0.060529314582724 0.060529314582724
+1538 1561 1562 0.0982757577888809 0.0982757577888809
+16447 9904 9905 0.234187757526107 0.234187757526107
+1539 1562 1563 0.0964555264462913 0.0964555264462913
+1540 1563 1564 0.0948745488688521 0.0948745488688521
+1541 1564 1565 0.0967033454927318 0.0967033454927318
+1542 1565 1566 0.0968058200777679 0.0968058200777679
+1543 1566 1567 0.0857541821683109 0.0857541821683109
+1544 1567 1568 0.099340207555012 0.099340207555012
+1545 1568 1571 0.0938405349536985 0.0938405349536985
+1546 1571 1572 0.0960880186310076 0.0960880186310076
+1548 1573 1574 0.0687509395523497 0.0687509395523497
+1551 1576 1577 0.102936179368501 0.102936179368501
+1555 1580 1581 0.0874483930882581 0.0874483930882581
+1558 1583 1584 0.322225767594647 0.322225767594647
+1559 1585 158 0.325178498041831 0.325178498041831
+1560 158 1586 0.248813969770461 0.248813969770461
+1562 1587 1588 0.682458212363131 0.682458212363131
+1563 1589 1590 0.093984831401002 0.093984831401002
+1564 1590 1591 0.0969174980637894 0.0969174980637894
+1565 1591 1592 0.0961947351154639 0.0961947351154639
+1566 1592 1593 0.0903125194205546 0.0903125194205546
+1567 1593 768 0.157881413911052 0.157881413911052
+1568 768 1596 0.172691061788589 0.172691061788589
+1569 1596 1597 0.125221889854682 0.125221889854682
+11466 780 781 0.0395520182900152 0.0395520182900152
+14682 727 782 0.194557772372847 0.194557772372847
+1575 1603 1604 0.122808892568626 0.122808892568626
+1576 1604 1605 0.14134447308364 0.14134447308364
+1577 1605 1606 0.00315234288642188 0.00315234288642188
+1578 1606 1607 0.00237760055681402 0.00237760055681402
+1579 1607 1034 0.102833271602923 0.102833271602923
+1580 1034 1608 0.043468513404088 0.043468513404088
+1581 1608 1033 0.049915824892393 0.049915824892393
+1582 1033 1609 0.0942592902205972 0.0942592902205972
+1583 1609 1610 0.146590259158182 0.146590259158182
+1585 1611 1612 0.124755429872932 0.124755429872932
+1587 1613 1614 0.146275547777326 0.146275547777326
+1588 1614 1615 0.26514479082652 0.26514479082652
+1589 1615 1616 0.120777633356172 0.120777633356172
+1590 1616 1617 0.146979440780155 0.146979440780155
+1591 1617 1618 0.586436662116935 0.586436662116935
+10219 5410 5429 0.0496147818599398 0.0496147818599398
+1592 1618 1619 0.120318550023187 0.120318550023187
+1593 1620 1621 0.123170513487948 0.123170513487948
+1594 1621 1622 0.0891128334653611 0.0891128334653611
+1595 1622 1623 0.0126945079405001 0.0126945079405001
+1597 1624 1625 0.0361628363016983 0.0361628363016983
+1598 1625 1626 0.0965078268867085 0.0965078268867085
+1599 1626 1627 0.122881556236448 0.122881556236448
+1601 1628 1629 0.0514694071076013 0.0514694071076013
+1604 1635 1337 0.196038913624896 0.196038913624896
+1605 1337 1636 0.207228602655476 0.207228602655476
+1606 1636 1637 0.20264296962565 0.20264296962565
+1607 1637 1638 0.203387402917304 0.203387402917304
+1608 1638 1639 0.0190931929940632 0.0190931929940632
+1609 1639 1640 0.0954982678568342 0.0954982678568342
+1612 1642 1643 0.0969376424953903 0.0969376424953903
+1613 1643 1644 0.0932591849763066 0.0932591849763066
+1614 1644 769 0.109404688325734 0.109404688325734
+1616 1645 1646 0.0870106428010285 0.0870106428010285
+1617 1646 1647 0.21369947718983 0.21369947718983
+1618 1647 160 0.103968034130831 0.103968034130831
+1619 160 1648 0.148969074067601 0.148969074067601
+1620 1648 1649 0.102090714125769 0.102090714125769
+1621 1649 1650 0.152016365267068 0.152016365267068
+1624 1652 1653 3.12548314855053 3.12548314855053
+1625 1654 1655 0.099787477314555 0.099787477314555
+1626 1655 1656 0.0573939833292015 0.0573939833292015
+1627 1656 1657 0.0412244638452508 0.0412244638452508
+1628 1657 1658 0.159748945001355 0.159748945001355
+1630 1659 1660 0.0562485254553907 0.0562485254553907
+1631 1660 1661 0.140693983223782 0.140693983223782
+1632 1661 1662 0.199243791884909 0.199243791884909
+1633 1662 1663 0.200873345889282 0.200873345889282
+1634 1663 1664 0.200754056548572 0.200754056548572
+1636 1665 1626 0.102716653811918 0.102716653811918
+1637 1626 1666 0.1010071593638 0.1010071593638
+1638 1666 1667 0.101237955319616 0.101237955319616
+1639 1667 1668 0.101237948338119 0.101237948338119
+1640 1668 711 0.101306598900241 0.101306598900241
+1641 711 1669 0.10042603616611 0.10042603616611
+1642 1669 1670 0.0958961450641524 0.0958961450641524
+1644 1671 1672 0.137716093557474 0.137716093557474
+2762 2714 2715 0.0991860693431078 0.0991860693431078
+1651 1678 1679 0.133306617824866 0.133306617824866
+1652 1679 1250 0.131938339831678 0.131938339831678
+1653 1250 1680 0.132959450261057 0.132959450261057
+1654 1680 1681 0.132733669106231 0.132733669106231
+1655 1681 1682 0.132964768190064 0.132964768190064
+1657 1683 1684 0.0490945965896849 0.0490945965896849
+1658 1684 1685 0.0490108159838641 0.0490108159838641
+1659 1685 1686 0.0499458328019049 0.0499458328019049
+1660 1686 1687 0.0506073899683783 0.0506073899683783
+1661 1687 1688 0.0999922931051382 0.0999922931051382
+1663 1689 1690 0.0532341368396536 0.0532341368396536
+1664 1690 1691 0.0494816378016481 0.0494816378016481
+1665 1691 1129 0.0483962553320354 0.0483962553320354
+2786 2740 2741 0.204165004811902 0.204165004811902
+1669 1694 1695 0.0515058444916569 0.0515058444916569
+1670 1695 1696 0.049583388064832 0.049583388064832
+1672 1697 1698 0.164817053327799 0.164817053327799
+1674 1699 1700 0.200184975462711 0.200184975462711
+1676 1701 1702 0.0562043024646792 0.0562043024646792
+1677 1702 1703 0.0473559609478773 0.0473559609478773
+1679 1704 1705 0.398746605392666 0.398746605392666
+1681 1706 1365 0.144540603588288 0.144540603588288
+1682 1365 1707 0.0528990154558718 0.0528990154558718
+1683 1707 1708 0.10134484884037 0.10134484884037
+1684 1708 1709 0.0991459088544214 0.0991459088544214
+1685 1709 1710 0.100657696530189 0.100657696530189
+1686 1710 1711 0.102825031241611 0.102825031241611
+1687 1711 1712 0.0822822408497534 0.0822822408497534
+1688 1712 1713 0.0873989484445677 0.0873989484445677
+1689 1713 1714 0.083724486939572 0.083724486939572
+1691 1715 1716 0.0772899080720762 0.0772899080720762
+1693 1717 1718 0.0829924152482612 0.0829924152482612
+12973 1824 2797 0.01303984476973 0.01303984476973
+1695 1719 1720 0.0851881782403355 0.0851881782403355
+1696 1720 1721 0.0815306594337643 0.0815306594337643
+1697 1721 1586 0.0807934684584117 0.0807934684584117
+1698 1586 1722 0.0815207303880199 0.0815207303880199
+1699 1722 1649 0.0940041718050458 0.0940041718050458
+1702 1723 1724 0.079056501466603 0.079056501466603
+1703 1724 1725 0.0798640413181071 0.0798640413181071
+1707 204 1728 0.0808035328564148 0.0808035328564148
+1708 1728 1729 0.0793099389847985 0.0793099389847985
+1709 1729 1471 0.0807902086419881 0.0807902086419881
+1710 1471 1730 0.159227595521595 0.159227595521595
+1712 1731 1732 0.00918106235729301 0.00918106235729301
+1713 1732 1733 0.0904244628649386 0.0904244628649386
+1714 1733 1734 0.1024374483727 0.1024374483727
+1715 1734 1735 0.102816532682191 0.102816532682191
+1716 1735 1736 0.0492571813589573 0.0492571813589573
+1718 1737 1738 0.0480836518232765 0.0480836518232765
+1720 1456 1739 0.0851993535054976 0.0851993535054976
+1722 1740 1741 0.0851913863702705 0.0851913863702705
+1724 1742 1743 1.05721580006997 1.05721580006997
+1727 1746 1747 0.203318990561603 0.203318990561603
+1728 1747 1748 0.105159616756228 0.105159616756228
+1730 1749 1750 0.0560818664301058 0.0560818664301058
+1732 1751 1752 0.478248386364013 0.478248386364013
+1733 1752 1753 0.443656760721259 0.443656760721259
+1735 1754 1755 0.1348267792147 0.1348267792147
+1736 1755 1756 0.129877519863856 0.129877519863856
+1738 1757 1758 0.139572444331893 0.139572444331893
+1740 1759 151 0.222068972422621 0.222068972422621
+1742 1760 1761 0.217075886587119 0.217075886587119
+1744 95 1762 0.0857577538793466 0.0857577538793466
+1746 1763 1764 0.202675621070888 0.202675621070888
+1747 1764 1765 0.199646627713467 0.199646627713467
+1749 1768 1769 0.203715891739879 0.203715891739879
+18799 8969 430 0.0787540687567586 0.0787540687567586
+1751 1772 1773 0.1980611092504 0.1980611092504
+1752 1773 1774 0.203412766578772 0.203412766578772
+1753 1774 1775 0.202109933054243 0.202109933054243
+1754 1775 43 0.202669215310678 0.202669215310678
+1755 43 1776 0.197841814631247 0.197841814631247
+1756 1776 1777 0.202676328377112 0.202676328377112
+1757 1777 1778 0.204936151058667 0.204936151058667
+1758 1778 1779 0.1977714314521 0.1977714314521
+1759 1779 1780 0.0315877327413917 0.0315877327413917
+1760 1780 1781 0.0188253963586558 0.0188253963586558
+1763 1782 570 0.0446437216270623 0.0446437216270623
+1764 570 1783 0.0483070548371257 0.0483070548371257
+1765 1783 1784 0.0445253123220399 0.0445253123220399
+1766 1784 1785 0.0510546887722961 0.0510546887722961
+1768 1786 1787 0.0533839966500878 0.0533839966500878
+1769 1787 1788 0.0521924619717138 0.0521924619717138
+1770 1788 1789 0.0490694542852552 0.0490694542852552
+1771 1789 1790 0.0491381693257593 0.0491381693257593
+1774 1792 1793 0.188232081449375 0.188232081449375
+1775 1793 1794 0.0938047512624172 0.0938047512624172
+1777 1795 1796 0.0479551643273822 0.0479551643273822
+1779 1797 1798 0.0506257576844139 0.0506257576844139
+1780 1798 1778 0.0476226019606038 0.0476226019606038
+1781 1778 1799 0.0506000833049729 0.0506000833049729
+1782 1799 1800 0.0489339836382716 0.0489339836382716
+1783 1800 1801 0.0520587364066008 0.0520587364066008
+1784 1801 1526 0.0499381116869285 0.0499381116869285
+1785 1526 1802 0.0482912843745838 0.0482912843745838
+1786 1802 1803 0.052312654556816 0.052312654556816
+1788 466 1804 0.00820558552351573 0.00820558552351573
+1789 1804 1805 0.0939988504660162 0.0939988504660162
+1790 1805 1806 0.0853375028247139 0.0853375028247139
+1792 1807 1808 0.0203438851658787 0.0203438851658787
+1793 1808 1809 0.0251680266073563 0.0251680266073563
+1794 1809 1810 0.203784780502352 0.203784780502352
+1795 1810 1811 0.245267310527272 0.245267310527272
+1797 1812 1513 0.252426666173968 0.252426666173968
+1799 1479 1813 0.176119796231885 0.176119796231885
+1800 1813 1814 0.410709550491308 0.410709550491308
+1802 1815 1816 0.0577133885110317 0.0577133885110317
+1805 1818 1819 0.0740878722178254 0.0740878722178254
+1806 1819 1820 0.135457901381645 0.135457901381645
+1808 1821 1822 0.206145194610924 0.206145194610924
+1812 1828 1829 0.106425576539939 0.106425576539939
+1813 1829 1830 0.105266693821804 0.105266693821804
+1814 1830 1831 0.0587144262982408 0.0587144262982408
+1815 1831 1832 0.0458724352500271 0.0458724352500271
+1817 1833 1834 0.199229532947629 0.199229532947629
+1820 1836 1837 0.0309799563804686 0.0309799563804686
+1822 1838 1839 0.146418601014837 0.146418601014837
+1823 1839 1840 0.141683677614281 0.141683677614281
+1824 1840 1841 0.111588649653809 0.111588649653809
+1827 1844 1845 0.101354924922083 0.101354924922083
+1828 1845 1397 0.106656735273228 0.106656735273228
+1829 1397 1846 0.052351737797171 0.052351737797171
+1831 1847 1848 0.0531037804059208 0.0531037804059208
+1832 1848 1849 0.0506063775898189 0.0506063775898189
+1833 1849 1850 0.0517100300362486 0.0517100300362486
+1834 1850 1851 0.0523258164287328 0.0523258164287328
+1835 1851 1852 0.0499829479152778 0.0499829479152778
+1836 1852 1853 0.051505297770613 0.051505297770613
+1837 1853 1854 0.051498980863322 0.051498980863322
+1840 1856 1857 0.051410475877809 0.051410475877809
+1841 1857 1858 0.0513674435994921 0.0513674435994921
+1842 1858 1109 0.0515213919005775 0.0515213919005775
+1843 1109 1859 0.0506198107739765 0.0506198107739765
+1844 1859 1860 0.0511967416282439 0.0511967416282439
+1845 1860 1861 0.0519748871795966 0.0519748871795966
+1847 1862 1863 0.0554265580601903 0.0554265580601903
+1848 1863 1864 0.397067534239407 0.397067534239407
+1849 1865 1481 0.206774260684103 0.206774260684103
+1850 1481 136 0.199116779757445 0.199116779757445
+1852 1866 1867 0.100566373592942 0.100566373592942
+1853 1867 1868 0.101320817159016 0.101320817159016
+1855 1869 1295 0.0991404141660552 0.0991404141660552
+1856 1295 1368 0.0970426412791379 0.0970426412791379
+1857 1368 1870 0.108154398880898 0.108154398880898
+1859 1871 1872 0.100234830388367 0.100234830388367
+1860 1872 1873 0.0980754533399867 0.0980754533399867
+1861 1873 1874 0.101854943741879 0.101854943741879
+1862 1874 1875 0.0125795021137856 0.0125795021137856
+1863 1875 1876 0.0797821176517698 0.0797821176517698
+1864 1876 1877 0.103719210283603 0.103719210283603
+1866 1740 1878 0.161887620550325 0.161887620550325
+1868 1879 1880 0.0487542093720633 0.0487542093720633
+1869 1880 1122 0.0510369170722426 0.0510369170722426
+1871 1882 1883 0.588595740779303 0.588595740779303
+1872 1884 1885 0.152111272923972 0.152111272923972
+1873 1885 1886 0.199118819593963 0.199118819593963
+1874 1886 1887 0.200266209543398 0.200266209543398
+1876 1891 1892 0.0559298383062073 0.0559298383062073
+2989 776 2928 0.18503947742992 0.18503947742992
+1878 1893 1894 0.32823055853467 0.32823055853467
+1880 1895 1896 0.106010053095039 0.106010053095039
+1881 1896 1897 0.0966039225045284 0.0966039225045284
+1882 1897 1898 0.101329648076306 0.101329648076306
+1883 1898 1899 0.105723867542497 0.105723867542497
+1884 1899 1900 0.100059117952088 0.100059117952088
+1885 1900 1901 0.0102909725043749 0.0102909725043749
+1886 1901 1902 0.0917204387150709 0.0917204387150709
+1887 1902 1903 0.0488400104067164 0.0488400104067164
+1888 1903 1904 0.0516943831129701 0.0516943831129701
+1889 1904 1905 0.0485157141379251 0.0485157141379251
+1890 1905 1906 0.00454251169325352 0.00454251169325352
+1891 1906 1907 0.0474170350841876 0.0474170350841876
+1892 1907 1908 0.0520037008543052 0.0520037008543052
+1893 1908 1772 0.0471189408868131 0.0471189408868131
+1894 1772 1909 0.0492432884260358 0.0492432884260358
+1896 1910 1911 0.0495320112775386 0.0495320112775386
+1897 1911 1520 0.0493945814205325 0.0493945814205325
+1898 1520 1912 0.0533971088216985 0.0533971088216985
+1899 1912 1913 0.0492909868241652 0.0492909868241652
+1902 1914 1915 0.0940987095228026 0.0940987095228026
+1903 1915 1916 0.102901306177953 0.102901306177953
+1904 1916 1917 0.099610911557729 0.099610911557729
+1905 1917 1918 0.102910577647033 0.102910577647033
+1906 1918 1919 0.0967734482498666 0.0967734482498666
+1908 1920 1921 0.0462806189179572 0.0462806189179572
+1910 1922 1923 0.0456516788886206 0.0456516788886206
+1911 1923 1924 0.0505452419126903 0.0505452419126903
+1912 1924 1925 0.0504057374799388 0.0504057374799388
+1913 1925 1926 0.0476340401482501 0.0476340401482501
+1914 1926 1927 0.051053036843087 0.051053036843087
+1915 1927 1928 0.049153971321488 0.049153971321488
+1918 1930 1931 0.0561439680866497 0.0561439680866497
+1919 1931 1932 0.053826281457259 0.053826281457259
+3034 2965 2966 0.00876223324596343 0.00876223324596343
+1920 1932 1933 0.0477206876272752 0.0477206876272752
+1923 1935 1936 0.066876205689997 0.066876205689997
+1924 1937 1938 0.0446617758397252 0.0446617758397252
+1925 1938 1939 0.0840391912235338 0.0840391912235338
+1926 1939 1940 0.227469383602409 0.227469383602409
+1931 1944 1945 0.0952703264542464 0.0952703264542464
+1932 1945 1946 0.0974265293580338 0.0974265293580338
+1933 1947 1948 0.151605873109213 0.151605873109213
+1938 1952 1953 0.109258836266427 0.109258836266427
+1939 1953 1954 0.122481399421688 0.122481399421688
+1940 1954 1955 0.119684093740802 0.119684093740802
+1943 1957 1958 0.204446635842756 0.204446635842756
+1944 1958 1959 0.0997279110592744 0.0997279110592744
+1945 1959 1960 1.05168738215655 1.05168738215655
+1946 1960 1961 1.71048983577162 1.71048983577162
+1947 1962 1963 2.33567129984142 2.33567129984142
+1948 1963 1964 1.08148581800227 1.08148581800227
+1950 1965 1966 0.103934061554546 0.103934061554546
+1951 1966 1967 0.0454999873171455 0.0454999873171455
+1952 1967 1968 0.0964089929828049 0.0964089929828049
+1953 1968 1969 0.125489170754965 0.125489170754965
+1954 1969 1972 0.165851140560008 0.165851140560008
+1955 1972 1973 0.145299005046435 0.145299005046435
+1956 1973 1974 0.145772913358701 0.145772913358701
+1957 1974 1975 0.149974913959851 0.149974913959851
+1958 1975 1976 0.145057930633755 0.145057930633755
+1959 1976 1977 0.143477867614704 0.143477867614704
+1961 1978 420 0.0932140793920545 0.0932140793920545
+1963 1963 1979 1.08603450886527 1.08603450886527
+1964 1979 1980 0.0983329965983175 0.0983329965983175
+1965 1980 1981 0.0917353737473226 0.0917353737473226
+1966 1981 1982 0.055771341470748 0.055771341470748
+1967 1982 1983 0.0968737393586206 0.0968737393586206
+1968 1983 1984 0.0954710209286709 0.0954710209286709
+1969 1984 1985 0.0293519873253464 0.0293519873253464
+1970 1985 1986 0.0704554284720801 0.0704554284720801
+1971 1986 1988 0.095403189447009 0.095403189447009
+1972 1988 1989 0.146040552740524 0.146040552740524
+1973 1989 1990 0.147511070915923 0.147511070915923
+1974 1990 1991 0.147511070914708 0.147511070914708
+1975 1991 1992 0.145306416846094 0.145306416846094
+1976 1992 1993 0.143786568306041 0.143786568306041
+1977 1993 1994 0.0151225768059817 0.0151225768059817
+1978 1994 420 0.0955903616259906 0.0955903616259906
+1980 1995 157 0.328733376766768 0.328733376766768
+1981 157 1721 0.24955962831592 0.24955962831592
+1983 1996 1997 0.475009767293493 0.475009767293493
+1984 1998 1999 0.203988417966153 0.203988417966153
+1985 1999 2000 0.200819821039785 0.200819821039785
+1986 2000 794 0.198875475027904 0.198875475027904
+1987 794 2001 0.203566311480143 0.203566311480143
+1988 2001 2002 0.201451879254481 0.201451879254481
+1989 2002 2003 0.203252240244887 0.203252240244887
+1990 2003 2004 0.204825535738971 0.204825535738971
+1991 2004 2005 0.188227904196053 0.188227904196053
+1992 2005 2006 0.0174353644977756 0.0174353644977756
+1994 353 2007 0.251582112428801 0.251582112428801
+1995 2007 2008 0.132634173204781 0.132634173204781
+1996 2008 2009 0.107027307843563 0.107027307843563
+1999 2011 646 0.139457974349072 0.139457974349072
+2000 646 2012 0.135033465549491 0.135033465549491
+2001 2012 1990 0.089412705524254 0.089412705524254
+2002 1990 1974 0.0383268944933106 0.0383268944933106
+2003 1974 2013 0.133766034901227 0.133766034901227
+2004 2013 2014 0.133581539638141 0.133581539638141
+2005 2014 2015 0.142379951799733 0.142379951799733
+2007 2016 2017 0.251899237124673 0.251899237124673
+2008 2017 2018 0.133367826813466 0.133367826813466
+2009 2018 2019 0.10602884511386 0.10602884511386
+2010 2019 2020 0.0337181930055553 0.0337181930055553
+2011 2020 2021 0.200388320757191 0.200388320757191
+2014 2023 2024 0.171565352607288 0.171565352607288
+2016 2025 2026 0.0477258088803687 0.0477258088803687
+2017 2026 2027 0.0809138557734271 0.0809138557734271
+2018 2027 2028 0.105296432652635 0.105296432652635
+2021 2030 2031 0.0518714690593594 0.0518714690593594
+2023 2032 2033 0.10377665457529 0.10377665457529
+2024 2033 2034 0.105027724692891 0.105027724692891
+2025 2034 2035 0.0547353150471903 0.0547353150471903
+2026 2035 2036 0.0513505470015755 0.0513505470015755
+2027 2036 2037 0.0518915831567366 0.0518915831567366
+2028 2038 2039 0.101144662033058 0.101144662033058
+2029 2039 2040 0.00469012569566242 0.00469012569566242
+2030 2040 2041 0.105219334964384 0.105219334964384
+2032 2042 2043 0.0933903014689556 0.0933903014689556
+2033 2043 559 0.0150758315973471 0.0150758315973471
+2034 559 2044 0.0636386622186814 0.0636386622186814
+2035 2044 2045 0.0177005397698663 0.0177005397698663
+2039 2048 1918 0.201578926546004 0.201578926546004
+2040 1918 2049 0.199006200917286 0.199006200917286
+2043 2051 70 0.203396158473628 0.203396158473628
+2045 1197 2052 0.0220081346494975 0.0220081346494975
+2046 2052 2053 0.200331631924477 0.200331631924477
+2047 2053 2054 0.154360922478377 0.154360922478377
+2048 2054 948 0.176666608936966 0.176666608936966
+2049 948 2055 0.165719712872644 0.165719712872644
+2050 2055 2056 0.169383792792816 0.169383792792816
+2052 2057 2058 0.174576187564815 0.174576187564815
+2053 2058 2059 0.172745648066703 0.172745648066703
+2054 2059 2060 0.176912657229173 0.176912657229173
+2055 2060 2061 0.164650081589568 0.164650081589568
+2057 2062 746 0.0627806188777907 0.0627806188777907
+2059 1564 2063 0.138541795103745 0.138541795103745
+2060 2063 2064 0.12093608528602 0.12093608528602
+2062 2065 693 0.201596255528806 0.201596255528806
+2063 693 2066 0.202309385780635 0.202309385780635
+2065 2067 2068 0.201208296937256 0.201208296937256
+2069 2072 2073 0.141581011374908 0.141581011374908
+2072 2075 2076 0.13960716604907 0.13960716604907
+2073 2076 2077 0.137352432815083 0.137352432815083
+2074 2077 2078 0.139172335676639 0.139172335676639
+2075 2078 2079 0.137570556837278 0.137570556837278
+2077 2080 2081 0.124260733003778 0.124260733003778
+2078 2081 2082 0.0143334567754311 0.0143334567754311
+2079 2082 1169 0.140817691182502 0.140817691182502
+2080 1169 889 0.136202795453782 0.136202795453782
+2081 889 2083 0.140272589797925 0.140272589797925
+2082 2083 2084 0.132655733622477 0.132655733622477
+2084 2085 2086 0.130758013034065 0.130758013034065
+2085 1055 2087 0.365531347335866 0.365531347335866
+2086 2087 2088 0.13568199350655 0.13568199350655
+2087 2088 2089 0.14074386927803 0.14074386927803
+2088 2089 2090 0.132744503428598 0.132744503428598
+2090 2091 2092 0.0599168224199403 0.0599168224199403
+2091 2093 1220 0.0866154902836551 0.0866154902836551
+2093 2095 2096 0.243872573445978 0.243872573445978
+2094 2096 2097 0.241082179338788 0.241082179338788
+2096 2098 2099 0.174814701889178 0.174814701889178
+2097 2099 2100 0.175154975379932 0.175154975379932
+2100 2102 2103 0.114419579517541 0.114419579517541
+2101 2103 2104 0.285214999643623 0.285214999643623
+2102 2104 2107 0.394315301182406 0.394315301182406
+2104 333 2108 0.278529398579064 0.278529398579064
+2106 1150 1822 0.102734424254821 0.102734424254821
+2108 2109 2110 0.202389435684367 0.202389435684367
+2109 2110 2111 0.203214045748693 0.203214045748693
+2110 2111 2112 0.241815761631872 0.241815761631872
+2111 2112 2113 0.100823640639482 0.100823640639482
+2112 2113 2114 0.00265953685516916 0.00265953685516916
+2114 2115 2116 0.238307263458502 0.238307263458502
+2116 2117 2118 0.172019623051487 0.172019623051487
+2117 2118 2119 0.0267252812490126 0.0267252812490126
+2118 2119 2120 0.200138632498134 0.200138632498134
+2119 2120 2121 0.20340922729078 0.20340922729078
+2120 2121 2122 0.197749465935997 0.197749465935997
+2121 2122 2123 0.20148284791492 0.20148284791492
+2122 2123 2124 0.206967663578278 0.206967663578278
+2123 2124 688 0.198127359399408 0.198127359399408
+2124 688 1981 0.162008033573987 0.162008033573987
+2127 2127 2128 0.0963587083366664 0.0963587083366664
+2128 2128 1149 0.101309363144821 0.101309363144821
+2130 2129 2130 0.268413747321973 0.268413747321973
+15791 2106 2131 0.0329007751166605 0.0329007751166605
+2131 2130 2132 0.135315648859656 0.135315648859656
+2133 2133 2134 0.206936888424913 0.206936888424913
+2134 2134 2135 0.199680286737687 0.199680286737687
+2135 2135 801 0.201106069676904 0.201106069676904
+2136 801 2136 0.201743876713814 0.201743876713814
+2137 2136 2137 0.208870260631958 0.208870260631958
+2138 2137 2138 0.202159360168084 0.202159360168084
+2139 2138 2139 0.199627649413879 0.199627649413879
+2140 2139 2140 0.186052011799078 0.186052011799078
+2142 2141 2142 0.0396569310433899 0.0396569310433899
+2168 2167 2168 0.189234637777307 0.189234637777307
+2143 2142 2143 0.0683760552809121 0.0683760552809121
+2144 2143 2144 0.00806043179372478 0.00806043179372478
+2145 2144 2145 0.00436074705638217 0.00436074705638217
+2146 2145 2146 0.00359181344508779 0.00359181344508779
+2147 2146 2147 0.00395340009925433 0.00395340009925433
+2148 2147 2148 0.136610372293043 0.136610372293043
+2149 2148 2149 0.180604844053974 0.180604844053974
+2152 2152 2153 0.132023781927159 0.132023781927159
+2153 2153 2154 0.135708940609739 0.135708940609739
+2154 2154 1415 0.130555983926377 0.130555983926377
+2155 1415 1355 0.134241500709378 0.134241500709378
+2156 1355 2155 0.0746101236889861 0.0746101236889861
+2161 2159 2161 0.133841125283574 0.133841125283574
+2162 2161 2162 0.1372260849468 0.1372260849468
+2163 2162 2163 0.128741940100472 0.128741940100472
+2164 2163 2164 0.135391700615332 0.135391700615332
+2169 2168 2169 0.201124079513876 0.201124079513876
+2170 2169 2170 0.108103708021473 0.108103708021473
+2172 2172 2173 0.13444261016809 0.13444261016809
+2173 2173 2174 0.13827137965728 0.13827137965728
+2174 2174 2175 0.134068324786893 0.134068324786893
+2175 2175 2176 0.133067365005956 0.133067365005956
+2176 2176 2177 0.135535927176987 0.135535927176987
+2177 2177 2178 0.134471884610529 0.134471884610529
+2180 2180 2181 0.201420608111328 0.201420608111328
+2182 2182 2183 0.0166632573599522 0.0166632573599522
+2183 2183 2184 0.101864448677803 0.101864448677803
+2184 2184 2185 0.047789206759145 0.047789206759145
+2185 2185 2186 0.0423227378750124 0.0423227378750124
+4423 3782 4133 0.154572357311794 0.154572357311794
+2186 2186 2187 0.66062410841751 0.66062410841751
+2188 2188 1945 0.10637947146537 0.10637947146537
+2189 1945 2189 0.148995294788127 0.148995294788127
+2211 2212 2213 0.0467155303221573 0.0467155303221573
+2190 2189 2190 0.327169136665339 0.327169136665339
+2192 2191 2192 0.0188299118027414 0.0188299118027414
+2193 2192 2193 0.210910851782462 0.210910851782462
+2195 2194 2195 0.365278744815015 0.365278744815015
+2196 2195 2196 0.0130424738912125 0.0130424738912125
+2197 2196 2197 0.0449464311286017 0.0449464311286017
+2198 2197 2198 0.0030293307914236 0.0030293307914236
+2199 2198 2199 0.128682754082238 0.128682754082238
+2200 2199 2200 0.110573702095649 0.110573702095649
+2202 2203 2204 0.10817464433389 0.10817464433389
+2203 2204 2205 0.107622599984834 0.107622599984834
+2204 2205 2206 0.108403921870099 0.108403921870099
+2205 2206 2207 0.060733439657354 0.060733439657354
+2206 2207 2208 0.0534350684854931 0.0534350684854931
+2207 2208 2209 0.0529414575701877 0.0529414575701877
+2208 2209 2210 0.0527447832774698 0.0527447832774698
+2209 2210 2211 0.102434337721347 0.102434337721347
+2210 2211 2212 0.0503091444283059 0.0503091444283059
+2212 2213 2214 0.0457845256573543 0.0457845256573543
+2213 2214 2215 0.0483154919494593 0.0483154919494593
+2214 2215 2216 0.0500256719211907 0.0500256719211907
+2215 2216 2217 0.0483324272045254 0.0483324272045254
+2216 2217 2218 0.0492693454756351 0.0492693454756351
+2217 2218 2219 0.0514417765088717 0.0514417765088717
+2218 2219 2220 0.0488786158333744 0.0488786158333744
+2219 2220 981 0.0498905437062621 0.0498905437062621
+2220 981 2221 0.0506165357374516 0.0506165357374516
+2221 2221 2222 0.046223636949906 0.046223636949906
+2224 2224 2225 0.051453756147013 0.051453756147013
+2225 2225 2226 0.0468957891600155 0.0468957891600155
+2226 2226 2227 0.0492631927304953 0.0492631927304953
+2227 2227 2228 0.0520252151650071 0.0520252151650071
+2228 2228 2229 0.0550486617142997 0.0550486617142997
+2229 2230 2231 0.0139385553943917 0.0139385553943917
+2230 2231 2232 0.0929550410270359 0.0929550410270359
+2234 2236 2237 0.0961215858652653 0.0961215858652653
+2235 2237 2238 0.0993231725885536 0.0993231725885536
+19654 10604 10606 0.0711515052063537 0.0711515052063537
+2236 2238 2239 0.0986901078011995 0.0986901078011995
+2237 2239 2120 0.100412717366674 0.100412717366674
+2238 2120 2240 0.0994425769829808 0.0994425769829808
+2239 2240 2241 0.0986741447066025 0.0986741447066025
+2240 2241 2242 0.196986803845301 0.196986803845301
+2241 2245 2246 0.0853554831080311 0.0853554831080311
+2242 2246 1017 0.10642802452306 0.10642802452306
+2243 1017 2247 0.0517185594306615 0.0517185594306615
+2244 2247 2248 0.0530774886579764 0.0530774886579764
+16655 3462 3463 0.083025520087948 0.083025520087948
+2245 2248 2249 0.0515725288155829 0.0515725288155829
+2246 2249 2250 0.0550106406637853 0.0550106406637853
+2247 2250 2251 0.0492291609495858 0.0492291609495858
+2250 2253 2254 0.068064098421736 0.068064098421736
+2251 2254 381 0.0653278702953464 0.0653278702953464
+2253 2255 2256 0.176933367276823 0.176933367276823
+2255 2257 1830 0.176665129086282 0.176665129086282
+2257 1817 2258 0.0851310356517557 0.0851310356517557
+2258 2258 2259 0.0498677366751348 0.0498677366751348
+2260 2260 2261 0.20430957984894 0.20430957984894
+2263 2263 2264 0.172785898975569 0.172785898975569
+2265 2265 2266 0.17364958356586 0.17364958356586
+2266 2266 2267 0.245119251352525 0.245119251352525
+2267 2267 2268 0.132589695523512 0.132589695523512
+2268 2268 2269 0.106738596174206 0.106738596174206
+2269 2269 2270 0.0337285830402062 0.0337285830402062
+20279 7555 7554 0.0146999916602211 0.0146999916602211
+2270 2270 2271 0.269363966522552 0.269363966522552
+2273 2275 684 0.204569111503518 0.204569111503518
+2274 684 1986 0.157853726642528 0.157853726642528
+2278 2278 2279 0.207434558661452 0.207434558661452
+2279 2279 2280 0.20034839537718 0.20034839537718
+2280 2280 798 0.19667070755531 0.19667070755531
+2281 798 2281 0.204476797355414 0.204476797355414
+2283 2282 2283 0.201226119347201 0.201226119347201
+2284 2283 2284 0.201775247020165 0.201775247020165
+2287 2286 2287 0.00679684653457476 0.00679684653457476
+2288 2287 2288 0.00351717235619697 0.00351717235619697
+2289 2288 2289 0.00475072672267961 0.00475072672267961
+2290 2289 2290 0.085203263947135 0.085203263947135
+2292 2291 2292 0.21658567369152 0.21658567369152
+2293 2292 2293 0.294285406846423 0.294285406846423
+2295 1532 2294 0.0895735364116296 0.0895735364116296
+2296 2294 2295 0.130472447344756 0.130472447344756
+2298 2044 560 0.0834414685220809 0.0834414685220809
+2299 560 913 0.519257886958262 0.519257886958262
+2300 913 2297 0.14849143076931 0.14849143076931
+2301 2297 2299 0.276635413291223 0.276635413291223
+2356 2345 2346 0.126022029068994 0.126022029068994
+2302 2299 2300 0.882147486934507 0.882147486934507
+2304 2301 2302 0.171837385748798 0.171837385748798
+2305 2302 2303 0.168190952055295 0.168190952055295
+2308 1995 1585 0.0793668846267203 0.0793668846267203
+2310 1646 2305 0.0800618116658591 0.0800618116658591
+2311 2305 2306 0.0800532572745142 0.0800532572745142
+2312 2306 2307 0.0808374839403145 0.0808374839403145
+2313 2307 2308 0.0793040216351705 0.0793040216351705
+2315 2309 2310 0.0976846110372701 0.0976846110372701
+2317 2311 2312 0.131380688058575 0.131380688058575
+2318 2312 2313 0.00313000089825153 0.00313000089825153
+2319 2313 2157 0.109122831884578 0.109122831884578
+2320 2157 2314 0.0470081550211631 0.0470081550211631
+2321 2314 441 0.0450344666647882 0.0450344666647882
+2326 1614 2317 0.105832922283753 0.105832922283753
+2327 2317 2319 0.101211119794553 0.101211119794553
+2328 2319 914 0.105388128978222 0.105388128978222
+2351 2100 2341 0.101951720072048 0.101951720072048
+2352 2341 2342 0.101030261985598 0.101030261985598
+2353 2342 2330 0.0997965680595524 0.0997965680595524
+2354 2330 2343 0.101856778567858 0.101856778567858
+2355 2344 2345 0.0735649917770033 0.0735649917770033
+2357 2346 2347 0.106673075682264 0.106673075682264
+2358 2347 2348 0.104262034499471 0.104262034499471
+2359 2348 2057 0.103127373430199 0.103127373430199
+2360 2057 2350 0.104860273903505 0.104860273903505
+2361 2350 2351 0.102072059078566 0.102072059078566
+2362 2351 2352 0.10208795508847 0.10208795508847
+2363 2352 2353 0.103003886322398 0.103003886322398
+2364 2353 2354 0.104842753763622 0.104842753763622
+2365 2354 2355 0.102079170592138 0.102079170592138
+2366 2355 2356 0.104157794922069 0.104157794922069
+2367 2356 2357 0.102771960719463 0.102771960719463
+2368 2357 843 0.10323381873133 0.10323381873133
+2369 843 2358 0.104166303367793 0.104166303367793
+2370 2358 2359 0.04678514768012 0.04678514768012
+2372 2360 2361 0.106536201799638 0.106536201799638
+2373 2361 2362 0.0524641553188961 0.0524641553188961
+2374 2362 2363 0.0542089866141956 0.0542089866141956
+2376 964 2364 0.101990510698998 0.101990510698998
+2377 2364 2365 0.0991028819964669 0.0991028819964669
+2378 2365 2366 0.101583146356588 0.101583146356588
+2379 2366 2367 0.0976663347579885 0.0976663347579885
+2380 2367 2368 0.137463391512845 0.137463391512845
+2382 2369 2370 0.0935927888835794 0.0935927888835794
+2383 2370 2371 0.22137940675351 0.22137940675351
+2384 93 2372 0.144113051799641 0.144113051799641
+2386 2373 2374 0.118928753039855 0.118928753039855
+18871 9233 10374 0.171083495652578 0.171083495652578
+2387 2374 2375 0.0543464584708682 0.0543464584708682
+2389 2378 2379 0.0407086995566738 0.0407086995566738
+2392 2381 2382 0.0375038196347678 0.0375038196347678
+2393 2383 2384 0.0259773773232023 0.0259773773232023
+2416 2406 2407 0.0997923351013975 0.0997923351013975
+2417 2407 2408 0.102411248163046 0.102411248163046
+2418 2408 2410 0.102005785733823 0.102005785733823
+2419 2410 2411 0.0465568279250156 0.0465568279250156
+2420 2411 1116 0.0498480806250605 0.0498480806250605
+2421 1116 2412 0.0524212085974951 0.0524212085974951
+2422 2412 2413 0.00643722349691115 0.00643722349691115
+2423 2413 2414 0.0569639986120168 0.0569639986120168
+2424 2414 2415 0.054429107165009 0.054429107165009
+2426 1254 2416 0.203595366987771 0.203595366987771
+2427 2416 2418 0.194946286421225 0.194946286421225
+2429 2419 2420 0.10553685574305 0.10553685574305
+2430 2420 2421 0.100987191369147 0.100987191369147
+2431 2421 2422 0.140456845404627 0.140456845404627
+2432 2423 2424 0.132127040761259 0.132127040761259
+2433 2424 2425 0.0836330996531634 0.0836330996531634
+2434 2425 2426 0.048846065804279 0.048846065804279
+2435 2426 2427 0.133578105271454 0.133578105271454
+2437 2428 2429 0.0517867804859422 0.0517867804859422
+2438 2429 2430 0.0498462274807045 0.0498462274807045
+2439 2430 2431 0.0505796838521555 0.0505796838521555
+2440 2431 2432 0.04930585188023 0.04930585188023
+2441 2432 2433 0.0511391992663707 0.0511391992663707
+2442 2433 2434 0.049421053488602 0.049421053488602
+2444 2435 2436 0.0499548965774192 0.0499548965774192
+2446 2437 2438 0.0498278119665032 0.0498278119665032
+2447 2438 1131 0.0475201423687532 0.0475201423687532
+2448 1131 2440 0.0499034161165238 0.0499034161165238
+2449 2440 2441 0.0519460604074748 0.0519460604074748
+2450 2441 2442 0.103666385736129 0.103666385736129
+2451 2442 2443 0.0495636449318867 0.0495636449318867
+2452 2443 2444 0.0508868110117968 0.0508868110117968
+2454 2445 2446 0.0992414144632343 0.0992414144632343
+2455 2446 2447 0.0995661619141735 0.0995661619141735
+2456 2447 2448 0.102918667647187 0.102918667647187
+2457 2448 2449 0.103317708000917 0.103317708000917
+2458 2449 714 0.103614639817309 0.103614639817309
+2460 2450 2451 0.0843633084104915 0.0843633084104915
+2462 2452 2453 0.133209824518529 0.133209824518529
+2463 2453 2454 0.136026824487267 0.136026824487267
+2464 2454 1228 0.0997640460624544 0.0997640460624544
+2466 2455 2173 0.100670279604477 0.100670279604477
+2467 2173 2456 0.101681998391895 0.101681998391895
+2468 2456 2457 0.135717601546705 0.135717601546705
+2469 2457 2458 0.125216072912334 0.125216072912334
+2470 2458 1253 0.13515574813911 0.13515574813911
+2472 1811 2459 0.0528114155967436 0.0528114155967436
+2474 489 2460 0.0154146680516237 0.0154146680516237
+2475 2460 2461 0.0956622199995578 0.0956622199995578
+2476 2461 2462 0.050324686032827 0.050324686032827
+2477 2462 2463 0.0440541436649478 0.0440541436649478
+2478 2463 2464 0.09025955144498 0.09025955144498
+2479 2464 2465 0.00954118829962817 0.00954118829962817
+2480 2465 2466 0.0924623221003645 0.0924623221003645
+2481 2466 2015 0.0557729059183765 0.0557729059183765
+2483 1998 2467 0.0939242873690555 0.0939242873690555
+2485 2468 2469 0.0807187230923558 0.0807187230923558
+2486 2469 2470 0.0660886283093114 0.0660886283093114
+2487 2470 2471 0.0307524582434291 0.0307524582434291
+2488 2471 2277 0.0631719504961159 0.0631719504961159
+2489 2277 2278 0.040321437937915 0.040321437937915
+2490 2278 2472 0.0579924273198359 0.0579924273198359
+2491 2472 2473 0.039564008523498 0.039564008523498
+2492 2473 2474 0.0566191459993118 0.0566191459993118
+2493 2474 2475 0.0461657995077916 0.0461657995077916
+2494 2475 2476 0.0573841993244499 0.0573841993244499
+2495 2476 2133 0.0413742441677564 0.0413742441677564
+2496 2133 2477 0.100557820130683 0.100557820130683
+2497 2477 2478 0.100232094382669 0.100232094382669
+2523 1412 1352 0.126262872161581 0.126262872161581
+2498 2478 2479 3.80416722159948 3.80416722159948
+17380 5747 2721 0.292296181002999 0.292296181002999
+2500 2481 2482 0.133762433378551 0.133762433378551
+2502 2483 2484 0.132763004680832 0.132763004680832
+2503 2484 2153 0.135437121880425 0.135437121880425
+2506 2486 2487 0.0976687527368442 0.0976687527368442
+2507 2487 2488 0.100497620432408 0.100497620432408
+2508 2488 1263 0.0968234302487817 0.0968234302487817
+2510 2489 2490 0.129998303918767 0.129998303918767
+2511 2490 2491 0.131427328920895 0.131427328920895
+2512 2491 2492 0.134959393077107 0.134959393077107
+2513 2492 2493 0.13352181172892 0.13352181172892
+2514 2493 2494 0.134977098269894 0.134977098269894
+2515 2494 2495 0.133660770711518 0.133660770711518
+2517 2496 1452 0.127643758305543 0.127643758305543
+2519 2497 2498 0.181370133617083 0.181370133617083
+2521 2481 2499 0.0828768372746742 0.0828768372746742
+2522 2499 1412 0.137652613646732 0.137652613646732
+2524 1352 2502 0.0676943813373141 0.0676943813373141
+2526 2503 2504 0.133817315449894 0.133817315449894
+2527 2504 2505 0.135673996947998 0.135673996947998
+2528 2505 2506 0.131966049224978 0.131966049224978
+2529 2506 2507 0.147529903316466 0.147529903316466
+2530 2507 2508 0.139391603159038 0.139391603159038
+16296 2509 2510 0.0284493842376544 0.0284493842376544
+2532 2511 2512 0.0269759988952267 0.0269759988952267
+2533 2512 2513 0.0303785309203703 0.0303785309203703
+2534 2513 2514 0.100988065805353 0.100988065805353
+2535 2514 2515 0.134258813820628 0.134258813820628
+2536 2515 2516 0.1356600895436 0.1356600895436
+2537 2516 2517 0.13329676442141 0.13329676442141
+2538 2517 1672 0.132852712666159 0.132852712666159
+2539 1672 2518 0.137264898504848 0.137264898504848
+2540 2518 2453 0.136447294484888 0.136447294484888
+2541 2453 2519 0.136891385699314 0.136891385699314
+2542 2519 2520 0.134024921907499 0.134024921907499
+2544 2521 2522 0.0902887501429021 0.0902887501429021
+2545 2522 2523 0.0432770654501463 0.0432770654501463
+2546 2523 2524 0.0452800647802491 0.0452800647802491
+2547 2524 2525 0.0887962039212883 0.0887962039212883
+2549 2526 2527 0.14861247431244 0.14861247431244
+2550 2527 2528 0.177718576341635 0.177718576341635
+2552 2529 2530 0.0550007858390758 0.0550007858390758
+2553 2530 2531 0.0537231597686698 0.0537231597686698
+2557 254 1937 0.0763145446596447 0.0763145446596447
+2562 2536 2537 0.0969383510155091 0.0969383510155091
+2564 2523 2538 0.041595541767366 0.041595541767366
+2565 2538 2539 0.0446801019224323 0.0446801019224323
+2567 2540 2541 0.0535606711091096 0.0535606711091096
+2568 2541 2542 0.0510376050613383 0.0510376050613383
+2569 2542 2543 0.048208042370787 0.048208042370787
+2570 2543 2544 0.0495068215823226 0.0495068215823226
+2571 2544 2545 0.0497291777137453 0.0497291777137453
+2572 2545 2546 0.0482680412228731 0.0482680412228731
+2573 2546 2547 0.0511986246623993 0.0511986246623993
+2574 2547 2548 0.0481311400848056 0.0481311400848056
+2575 2548 2549 0.05133533567668 0.05133533567668
+2576 2549 1090 0.0473365047010202 0.0473365047010202
+2578 2550 2551 0.0490112208554607 0.0490112208554607
+2579 2551 2552 0.0504551815276218 0.0504551815276218
+2580 2552 2553 0.0492845875119232 0.0492845875119232
+2581 2553 2554 0.0515497460521136 0.0515497460521136
+2582 2554 2555 0.0526862102053863 0.0526862102053863
+2583 2555 2556 0.0982237295878 0.0982237295878
+2584 2556 2557 0.264254691363992 0.264254691363992
+2585 1004 2558 0.099742520234474 0.099742520234474
+2588 2560 1078 0.149639182772472 0.149639182772472
+2589 1078 2522 0.184839011544187 0.184839011544187
+2591 1484 2561 0.33893453481304 0.33893453481304
+2592 2561 2562 0.36930331062994 0.36930331062994
+2594 2563 2295 0.235151876914131 0.235151876914131
+2596 2141 2564 0.0808696846181639 0.0808696846181639
+2628 2589 2590 0.046646895086832 0.046646895086832
+2597 2564 1224 0.24032404212478 0.24032404212478
+2600 2373 2567 0.1712601795962 0.1712601795962
+2601 2567 2568 0.00945648555666562 0.00945648555666562
+2603 2565 2569 0.0807956808253844 0.0807956808253844
+2604 2569 2570 0.076951583144574 0.076951583144574
+2605 2570 2571 0.0476131935554626 0.0476131935554626
+2607 2572 2568 0.0312593605711727 0.0312593605711727
+2609 2569 2573 0.0486149705677772 0.0486149705677772
+2610 2570 2574 0.0674260333743846 0.0674260333743846
+2612 2567 2575 0.0505261001159507 0.0505261001159507
+2615 2577 2578 0.10424034664628 0.10424034664628
+2616 2578 2579 0.103512640883379 0.103512640883379
+2617 2579 1398 0.105102630546257 0.105102630546257
+2618 1398 2580 0.0531367598624707 0.0531367598624707
+2619 2580 2581 0.0517085263170068 0.0517085263170068
+2620 2581 2582 0.0723991341895349 0.0723991341895349
+2621 2582 2583 0.0331676268132885 0.0331676268132885
+2622 2583 2584 0.0138525911142565 0.0138525911142565
+2623 2584 2585 0.037416228202987 0.037416228202987
+2624 2585 2586 0.00994286750486891 0.00994286750486891
+2625 2586 2587 0.040254104254433 0.040254104254433
+2629 2590 2591 0.00335375549834044 0.00335375549834044
+2630 2591 2592 0.0463774647105825 0.0463774647105825
+2631 2592 2593 0.00549997045042586 0.00549997045042586
+2632 2593 2594 0.0383542392436341 0.0383542392436341
+2634 2595 2596 0.0344869484873441 0.0344869484873441
+2635 2596 2597 0.0176627396467139 0.0176627396467139
+2636 2597 2598 0.0280292044334563 0.0280292044334563
+2637 2598 2599 0.0242403080070769 0.0242403080070769
+2638 2599 1569 0.0218944112855232 0.0218944112855232
+2639 1569 2600 0.0286200762867591 0.0286200762867591
+2640 2600 1094 0.018347539243156 0.018347539243156
+2642 1110 2601 0.0142742072830798 0.0142742072830798
+2643 2601 2602 0.0369383896439539 0.0369383896439539
+2644 2602 2603 0.00917687822572764 0.00917687822572764
+2645 2603 2604 0.0430608643022986 0.0430608643022986
+2646 2604 2605 0.00238679099543715 0.00238679099543715
+2647 2605 2606 0.0472847267591164 0.0472847267591164
+2648 2606 2607 0.0508445190476207 0.0508445190476207
+2649 2607 2608 0.00234361810734104 0.00234361810734104
+2650 2608 2609 0.0517900277245267 0.0517900277245267
+2652 2610 2611 0.145180979465517 0.145180979465517
+2674 2632 2634 0.599531015097949 0.599531015097949
+2675 2635 2181 0.0871692653780363 0.0871692653780363
+2676 2181 2638 0.0863959675292808 0.0863959675292808
+2679 2640 2641 0.121944822987822 0.121944822987822
+2681 2642 2643 0.0194925006650245 0.0194925006650245
+2682 2643 2350 0.134347723988409 0.134347723988409
+2683 2350 2644 0.173564798460366 0.173564798460366
+2684 2644 2645 0.174686152075606 0.174686152075606
+2685 2645 2646 0.175389969986131 0.175389969986131
+2688 2648 747 0.0612580153194998 0.0612580153194998
+2689 747 1565 0.142756107755667 0.142756107755667
+2690 1565 2649 0.138016127389502 0.138016127389502
+2691 2649 2650 0.12023627946696 0.12023627946696
+2693 2651 694 0.200802439501944 0.200802439501944
+2695 2652 2653 0.127019992895419 0.127019992895419
+2696 2653 2654 0.201028199806741 0.201028199806741
+2697 2654 2655 0.134212276460076 0.134212276460076
+2698 2655 2656 0.140083368586782 0.140083368586782
+2699 2656 2657 0.13046105136647 0.13046105136647
+2702 2633 2659 0.199675824720705 0.199675824720705
+2704 2660 949 0.174693421852154 0.174693421852154
+2705 949 2661 0.165148304595761 0.165148304595761
+2706 2661 2662 0.173966950291824 0.173966950291824
+2707 2662 2663 0.184218102738583 0.184218102738583
+2708 2663 2664 0.172496811774092 0.172496811774092
+2710 2665 2666 0.394651095737645 0.394651095737645
+2711 2667 2668 0.201414903082426 0.201414903082426
+17301 8745 4260 0.201420130125937 0.201420130125937
+2713 2669 2388 0.109456559825348 0.109456559825348
+2714 2388 2670 0.140828374595316 0.140828374595316
+2717 2672 2673 0.139177577172101 0.139177577172101
+2718 2673 2674 0.137352749762486 0.137352749762486
+2719 2674 2675 0.139830667816654 0.139830667816654
+2720 2675 2676 0.136669684605715 0.136669684605715
+2722 2677 2678 0.12447911414286 0.12447911414286
+2750 2704 2705 0.0292446267270126 0.0292446267270126
+2751 2705 2706 0.00658282845173238 0.00658282845173238
+2752 2706 2707 0.0151449443945988 0.0151449443945988
+2753 2707 2708 0.0714770438658631 0.0714770438658631
+2754 2708 2709 0.00822853556213401 0.00822853556213401
+2756 2710 8 0.130042568169854 0.130042568169854
+2757 8 2711 0.118166571537094 0.118166571537094
+2759 2712 2713 0.102388493919056 0.102388493919056
+2760 2713 2416 0.103111259495513 0.103111259495513
+2761 2416 2714 0.100631617654013 0.100631617654013
+2764 2716 2717 0.200655449563851 0.200655449563851
+2765 2717 2718 0.200753725915124 0.200753725915124
+2766 2718 1440 0.196942260224429 0.196942260224429
+2767 1440 2719 0.00947384243402213 0.00947384243402213
+2768 2719 2720 0.190389032049707 0.190389032049707
+2770 2723 2724 0.133138466543617 0.133138466543617
+2771 2724 2725 0.135835722389097 0.135835722389097
+2772 2725 2726 0.133534041022806 0.133534041022806
+2773 2726 2727 0.134234713813183 0.134234713813183
+2774 2727 1681 0.134687505819062 0.134687505819062
+2775 1681 2728 0.137316317225174 0.137316317225174
+2777 2729 2730 0.104120921025978 0.104120921025978
+2778 2730 2731 0.201486044854047 0.201486044854047
+2779 2731 2732 0.409054627036075 0.409054627036075
+2780 2733 2734 0.231399786377778 0.231399786377778
+2781 2734 2735 0.0901704059113055 0.0901704059113055
+2782 2735 2736 0.0825094909725568 0.0825094909725568
+2783 2737 2738 0.200363396709187 0.200363396709187
+2784 2738 2739 0.20121833925615 0.20121833925615
+2785 2739 2740 0.202399438971847 0.202399438971847
+2788 2742 2743 0.404396545451488 0.404396545451488
+2789 2744 1762 0.0647074290459755 0.0647074290459755
+2790 1762 2372 0.0925216625359094 0.0925216625359094
+2791 2372 2745 0.0223137340397398 0.0223137340397398
+2792 2745 2737 0.050045237249892 0.050045237249892
+2794 2746 2747 0.14840065064165 0.14840065064165
+2796 2748 2749 0.200822547172327 0.200822547172327
+2797 2749 2750 0.193145905748916 0.193145905748916
+2821 908 2770 0.128136612557408 0.128136612557408
+2824 2261 2772 0.10049786598023 0.10049786598023
+2825 2772 2773 0.106378037300959 0.106378037300959
+2826 2773 2110 0.093897002068377 0.093897002068377
+2827 2110 2774 0.107389868338328 0.107389868338328
+2828 2774 2775 0.0994873393877801 0.0994873393877801
+2850 2776 2777 0.10879749556538 0.10879749556538
+2855 2804 866 0.20027757395038 0.20027757395038
+2829 2775 2778 1.00147658782101 1.00147658782101
+2830 2779 2780 0.0530172029480301 0.0530172029480301
+2832 2781 2782 0.107966324930259 0.107966324930259
+2833 2782 2783 0.103296913871679 0.103296913871679
+2834 2783 2784 0.105735267915707 0.105735267915707
+2835 2784 2785 0.104367827383757 0.104367827383757
+2836 2785 2786 0.106026097865505 0.106026097865505
+2837 2786 2787 0.104661406473263 0.104661406473263
+2838 2787 2788 0.109120444986171 0.109120444986171
+2842 2790 2791 0.105111335997404 0.105111335997404
+2843 2791 2792 0.100650542913524 0.100650542913524
+2844 2792 2793 0.105228706955749 0.105228706955749
+2845 2793 2794 0.119444969275907 0.119444969275907
+2846 2794 2795 0.0942235633572651 0.0942235633572651
+2847 2795 2084 0.102241906689643 0.102241906689643
+2848 2084 2796 0.105000278025472 0.105000278025472
+2849 2796 2776 0.104992294488636 0.104992294488636
+2851 2777 2799 0.102990536508203 0.102990536508203
+2852 2799 2802 0.104419262818378 0.104419262818378
+3832 3274 3648 0.198107670536066 0.198107670536066
+2853 2802 2803 0.106343009363166 0.106343009363166
+2854 2803 2804 0.0880619154851023 0.0880619154851023
+2856 866 2805 0.0997722055250997 0.0997722055250997
+2857 2805 2806 0.0898296288997372 0.0898296288997372
+2858 2806 2807 0.0154103032800591 0.0154103032800591
+2860 1345 2808 0.0745089191630195 0.0745089191630195
+2862 2809 2810 0.0999390470653334 0.0999390470653334
+2863 2810 2811 0.098203415750831 0.098203415750831
+2864 2811 2812 0.105704456533214 0.105704456533214
+2865 2812 1841 0.178602078382633 0.178602078382633
+2867 2813 2814 0.147059691176011 0.147059691176011
+2869 2815 2816 0.0358929050784097 0.0358929050784097
+2871 2817 2818 0.202436914455554 0.202436914455554
+2872 2818 721 0.208959052889522 0.208959052889522
+2873 721 2819 0.195578398743409 0.195578398743409
+2874 2819 2820 0.132104447079437 0.132104447079437
+2875 2820 2499 0.133495572380704 0.133495572380704
+2877 2821 2823 0.131028201505055 0.131028201505055
+2878 2823 2154 0.134224367729179 0.134224367729179
+2879 2154 2824 0.137197819412826 0.137197819412826
+2881 2825 2828 0.100509300133652 0.100509300133652
+2882 2828 2829 0.098379052864586 0.098379052864586
+2883 2829 1264 0.0995905743898471 0.0995905743898471
+2884 1264 2830 0.0991885382845514 0.0991885382845514
+2885 2830 2831 0.0990153060665791 0.0990153060665791
+2886 2831 2718 0.0991269733313679 0.0991269733313679
+2887 2718 2832 0.100500652429342 0.100500652429342
+2888 2832 2833 0.0102715407543069 0.0102715407543069
+2889 2833 2834 0.0960953974534679 0.0960953974534679
+2890 2834 2835 0.0326867749280955 0.0326867749280955
+2891 2835 2836 0.134256786764763 0.134256786764763
+2892 2836 2837 0.113988792124523 0.113988792124523
+2893 2837 2838 0.0204082374430359 0.0204082374430359
+2895 2839 2840 0.113685974247049 0.113685974247049
+2896 2840 2841 0.132754406259035 0.132754406259035
+2897 2841 2842 0.136852657742897 0.136852657742897
+2899 1793 2843 0.0809702263007341 0.0809702263007341
+2900 2843 2844 0.0969425296921621 0.0969425296921621
+2901 2844 2845 0.413436446480526 0.413436446480526
+2903 2263 2847 0.179984264422638 0.179984264422638
+2904 2847 2848 0.174004040987329 0.174004040987329
+2905 2848 2849 0.194108624427032 0.194108624427032
+2907 2850 1276 0.172413086756907 0.172413086756907
+2909 2853 785 0.245123885631009 0.245123885631009
+2911 2854 2855 0.0854841952170884 0.0854841952170884
+2912 2855 2747 0.0762350203886263 0.0762350203886263
+2913 2747 2856 0.0859704175448271 0.0859704175448271
+2914 2856 2857 0.100779098585589 0.100779098585589
+2915 2857 2858 0.0905252463288938 0.0905252463288938
+2917 2859 2860 0.0227727209766704 0.0227727209766704
+2918 361 1735 0.198105222979832 0.198105222979832
+2919 1735 2861 0.0382126884100893 0.0382126884100893
+2920 148 2862 0.0438716250050412 0.0438716250050412
+2921 1003 2863 0.0520715649387988 0.0520715649387988
+2922 2863 2864 0.0982728809134093 0.0982728809134093
+2923 2864 2865 0.0994946507259965 0.0994946507259965
+3895 3698 3699 0.204838159377623 0.204838159377623
+2924 2865 2869 0.090463384362138 0.090463384362138
+2925 2869 2870 0.0564720828613131 0.0564720828613131
+2926 2870 2871 0.0608640771597173 0.0608640771597173
+2927 2872 2873 0.044011799999607 0.044011799999607
+2928 2873 2088 0.0931496819660856 0.0931496819660856
+2929 2088 2655 0.0960691148224413 0.0960691148224413
+2930 2655 2874 0.0937706080748846 0.0937706080748846
+2931 2874 2875 0.0828791997484075 0.0828791997484075
+2932 2875 2876 0.093218621711434 0.093218621711434
+2933 2876 2877 0.0704167162147941 0.0704167162147941
+2935 2878 2879 0.0887403720940643 0.0887403720940643
+2936 2879 2880 0.0909098673154509 0.0909098673154509
+2937 2880 2881 0.0882058988614067 0.0882058988614067
+2938 2881 2882 0.181777411929199 0.181777411929199
+2940 2883 2884 0.115661337881372 0.115661337881372
+2941 2884 2885 0.14826485880128 0.14826485880128
+2942 2885 2886 0.112251623213379 0.112251623213379
+2943 2886 2887 0.119994591224275 0.119994591224275
+2944 2887 2888 0.178622958928809 0.178622958928809
+2945 2888 2889 0.00412533177852682 0.00412533177852682
+2946 2889 2890 0.00481474032387871 0.00481474032387871
+2947 2890 2893 0.135290874001292 0.135290874001292
+2948 2893 2894 0.137892832771659 0.137892832771659
+2949 2894 817 0.140150092060959 0.140150092060959
+2950 817 2895 0.143808402694827 0.143808402694827
+2951 2895 2896 0.0697081016101773 0.0697081016101773
+2952 2896 2897 0.0168682725384664 0.0168682725384664
+2954 2898 2899 0.139071498957887 0.139071498957887
+2956 2900 2901 0.139727551358826 0.139727551358826
+2957 2901 2902 0.00293554606295758 0.00293554606295758
+2958 2902 2903 0.102721876435386 0.102721876435386
+2959 2903 2904 0.0305452475451112 0.0305452475451112
+2960 2904 2905 0.00503713742922791 0.00503713742922791
+2961 2905 2906 0.0458567885450819 0.0458567885450819
+2962 2906 2907 0.0981295261146626 0.0981295261146626
+2963 2907 628 0.0369055971430695 0.0369055971430695
+2964 628 1143 0.0958611496898419 0.0958611496898419
+2966 2908 2909 0.0463126901024473 0.0463126901024473
+2967 2909 872 0.0318684671228471 0.0318684671228471
+2968 872 2910 0.0711758745978235 0.0711758745978235
+2969 2910 2911 0.067495322638235 0.067495322638235
+2970 2911 2912 0.033747661319103 0.033747661319103
+2971 2912 2913 0.0475024757380027 0.0475024757380027
+2973 2914 2915 0.202578999998173 0.202578999998173
+2975 2916 2917 0.184685764171195 0.184685764171195
+2976 2917 2918 0.00737265767013589 0.00737265767013589
+2978 2919 2920 0.110148820147866 0.110148820147866
+2979 2920 584 0.039258317875865 0.039258317875865
+2980 584 2921 0.228363185041033 0.228363185041033
+2982 2922 1341 0.198962442111046 0.198962442111046
+2983 1341 2923 0.207039061514662 0.207039061514662
+2984 2923 2924 0.201175175238786 0.201175175238786
+2985 2924 2925 0.203376851393596 0.203376851393596
+2986 2925 2926 0.201920207523594 0.201920207523594
+2987 2926 2927 0.200452413161122 0.200452413161122
+2988 2927 776 0.201931296094781 0.201931296094781
+2990 2928 2930 0.209285084837907 0.209285084837907
+2991 2930 2931 0.197960209647655 0.197960209647655
+2992 2931 171 0.402036974102358 0.402036974102358
+2994 2932 2933 0.200508042098485 0.200508042098485
+2995 170 1728 0.257039245710078 0.257039245710078
+2996 1728 2934 0.145411467525923 0.145411467525923
+2999 2935 2936 0.0880513532781809 0.0880513532781809
+3025 2957 2958 0.01030947748559 0.01030947748559
+3000 2936 209 0.228338005511316 0.228338005511316
+3002 2937 2938 0.107611509993879 0.107611509993879
+3005 2940 2941 0.175855452328419 0.175855452328419
+3006 2941 2942 0.174909636552997 0.174909636552997
+3007 2942 2943 0.192197232795451 0.192197232795451
+3009 2944 546 0.0293283601170504 0.0293283601170504
+3010 546 2945 0.155746660532693 0.155746660532693
+3012 1475 2946 0.311303155924368 0.311303155924368
+3013 2946 2947 0.184883982264712 0.184883982264712
+3014 2947 2948 0.224685205653341 0.224685205653341
+3016 2949 2950 0.0888669853746646 0.0888669853746646
+3017 2950 2951 0.114577615588497 0.114577615588497
+3018 1225 2952 0.114132076273042 0.114132076273042
+3019 2952 2161 0.115442153745618 0.115442153745618
+3020 2161 2953 0.105428749590907 0.105428749590907
+3022 2954 2955 0.0114463280554541 0.0114463280554541
+3023 2955 639 0.18619297340356 0.18619297340356
+3024 639 2957 0.0509835810434449 0.0509835810434449
+3026 2958 2959 0.0353738821651235 0.0353738821651235
+3027 2959 2960 0.00284670794487764 0.00284670794487764
+3028 2960 1288 0.104793015683124 0.104793015683124
+3029 1288 2961 0.051496901479137 0.051496901479137
+3030 2961 2962 0.00960868888037157 0.00960868888037157
+3031 2962 2963 0.0208687174266634 0.0208687174266634
+3032 2963 2964 0.0498882614596582 0.0498882614596582
+3033 2964 2965 0.123304259264834 0.123304259264834
+3035 2966 2967 0.00908677871596767 0.00908677871596767
+3036 2967 2968 0.115854235202851 0.115854235202851
+3037 2968 2969 0.00700956571064615 0.00700956571064615
+3038 2969 2970 0.00940368205913038 0.00940368205913038
+3039 2970 2971 0.0666840110355875 0.0666840110355875
+3040 2971 2972 0.0679662165544488 0.0679662165544488
+3041 2972 2973 0.0630976433471776 0.0630976433471776
+3042 2973 2974 0.0491600079555241 0.0491600079555241
+3044 2975 2976 0.0997731403964804 0.0997731403964804
+3045 2976 2977 0.100715566829797 0.100715566829797
+3046 2977 2978 0.0996876914159973 0.0996876914159973
+3047 2978 2979 0.10126058971698 0.10126058971698
+3048 2979 2980 0.103346225532192 0.103346225532192
+3049 2980 2981 0.0983114005972926 0.0983114005972926
+3050 2981 2982 0.09874223460454 0.09874223460454
+3051 2982 2983 0.0510749251490339 0.0510749251490339
+3053 2984 2985 0.0505192363533637 0.0505192363533637
+3054 2985 1120 0.0491942863881514 0.0491942863881514
+3055 1120 2986 0.0517085444587275 0.0517085444587275
+3056 2986 2987 0.0504766444323722 0.0504766444323722
+3057 2987 2988 0.0508471211122413 0.0508471211122413
+3058 2988 2989 0.0482147566017866 0.0482147566017866
+3059 2989 2990 0.0513143127772338 0.0513143127772338
+3060 2990 2991 0.0501432318630803 0.0501432318630803
+3061 2991 2992 0.788648410502006 0.788648410502006
+3062 2993 2994 0.01555628530979 0.01555628530979
+3063 2994 2995 0.10729267423115 0.10729267423115
+13562 2999 2165 0.242533262128423 0.242533262128423
+3067 2998 3000 0.0998948824480635 0.0998948824480635
+3068 3000 3001 0.145910673725247 0.145910673725247
+3069 3001 3002 0.147264770664277 0.147264770664277
+3070 3002 3003 0.145706831644125 0.145706831644125
+3071 3003 3004 0.146381189481243 0.146381189481243
+3073 3006 3007 0.143637545441942 0.143637545441942
+3074 3007 3008 0.14139337588105 0.14139337588105
+3075 3008 3009 0.0340034784472366 0.0340034784472366
+3076 3009 3010 0.117637494210671 0.117637494210671
+3077 3010 3011 0.1483412167568 0.1483412167568
+3078 3011 3012 0.146200597856632 0.146200597856632
+3079 3012 3013 0.146656153847153 0.146656153847153
+3080 3013 3014 0.219897120549826 0.219897120549826
+3081 3014 2686 0.0729664723843293 0.0729664723843293
+3082 2686 3015 0.146055074464899 0.146055074464899
+3083 3015 3016 0.115984680072215 0.115984680072215
+3084 3016 3017 0.0102106792826024 0.0102106792826024
+3085 3017 3018 0.0188093561808277 0.0188093561808277
+3087 3019 3020 0.14624208166964 0.14624208166964
+3088 3020 3021 0.149932974568378 0.149932974568378
+3089 3021 2900 0.114654486829615 0.114654486829615
+3091 3022 3023 0.0936947193853168 0.0936947193853168
+3093 3024 3025 0.0922829109447797 0.0922829109447797
+3095 3026 3027 0.10419715248802 0.10419715248802
+3096 3027 3028 0.108587123231645 0.108587123231645
+3097 3028 3029 0.103455866634876 0.103455866634876
+3099 3030 3031 0.0828114972096423 0.0828114972096423
+3100 3031 3032 0.0151385207198175 0.0151385207198175
+3102 3035 3036 0.131928682141755 0.131928682141755
+3103 3036 3037 0.0286281442546585 0.0286281442546585
+3104 3037 3038 0.0830678583996061 0.0830678583996061
+3105 3038 3039 0.0820487800074757 0.0820487800074757
+3107 3040 3041 0.0592379768525999 0.0592379768525999
+3108 3041 1041 0.101867076922678 0.101867076922678
+3109 1041 3042 0.108431988254042 0.108431988254042
+3110 3042 3043 0.103209130509255 0.103209130509255
+3111 3043 3044 0.103439867243447 0.103439867243447
+3113 3045 3046 0.1080426022678 0.1080426022678
+3114 3046 3047 0.106399445317148 0.106399445317148
+3115 3047 2078 0.104328053424176 0.104328053424176
+3116 2078 2675 0.103849131822114 0.103849131822114
+3117 2675 3048 0.106371798877004 0.106371798877004
+3118 3048 3049 0.1089909908922 0.1089909908922
+3120 2995 3050 0.0829711714500804 0.0829711714500804
+3123 3051 3052 0.0304368475861105 0.0304368475861105
+19556 10441 10561 0.00875730102663828 0.00875730102663828
+3124 3053 3054 0.10469695146486 0.10469695146486
+3125 3054 3026 0.105413327506124 0.105413327506124
+3127 3055 3056 0.0146859459125862 0.0146859459125862
+3128 3056 3057 0.0899179636493607 0.0899179636493607
+3129 3057 3058 0.0968918459632465 0.0968918459632465
+3130 3058 3059 0.0931803123592361 0.0931803123592361
+3131 3059 3060 0.0924628769882567 0.0924628769882567
+3132 3060 2004 0.0909779529022995 0.0909779529022995
+3134 3061 2758 0.0983285272926963 0.0983285272926963
+3135 2758 3062 0.094848132376921 0.094848132376921
+3137 2284 3063 0.10273020958756 0.10273020958756
+3138 3063 3064 0.09684156688728 0.09684156688728
+3139 3064 2139 0.105654196010103 0.105654196010103
+3141 3065 3066 0.101995188106893 0.101995188106893
+4424 4133 950 0.17542265784203 0.17542265784203
+3142 3066 3067 1.00083609181461 1.00083609181461
+3143 3068 3069 0.10392860568863 0.10392860568863
+3144 3069 3070 0.10232907709913 0.10232907709913
+3145 3070 3071 0.103927869583062 0.103927869583062
+3146 3071 3072 0.102097379803977 0.102097379803977
+3147 3072 3073 0.0487909895079958 0.0487909895079958
+3149 1294 3074 0.105333551259412 0.105333551259412
+3150 3074 3075 0.0524798747272766 0.0524798747272766
+3151 3075 3076 0.0475858963921332 0.0475858963921332
+3152 3076 3077 0.00514079080382434 0.00514079080382434
+3154 3078 3079 0.0117186508515134 0.0117186508515134
+3155 3079 3080 0.0860074021370197 0.0860074021370197
+3156 3080 3081 0.0112654570741388 0.0112654570741388
+3157 3081 3082 0.0998426271509478 0.0998426271509478
+3159 3083 3084 0.0978722553449722 0.0978722553449722
+3161 3085 3086 0.0498003240048994 0.0498003240048994
+3162 3086 3087 0.0499820755044021 0.0499820755044021
+3163 3087 1765 0.0500932715547668 0.0500932715547668
+3164 1765 3089 0.0453737460403596 0.0453737460403596
+3165 3089 3090 0.0566344564433548 0.0566344564433548
+3166 3090 3091 0.0479788729039099 0.0479788729039099
+3167 3091 1517 0.0504584819239423 0.0504584819239423
+3168 1517 3092 0.0513918113913408 0.0513918113913408
+3169 3092 3093 0.0524695902697227 0.0524695902697227
+3170 3093 1084 0.0829756278031258 0.0829756278031258
+3171 1084 3094 0.018362425266723 0.018362425266723
+3172 3094 3095 0.100037197959638 0.100037197959638
+3173 3095 3096 0.0986501993185581 0.0986501993185581
+3174 3096 3097 0.100130714805898 0.100130714805898
+3175 3097 2046 0.103528392648025 0.103528392648025
+3176 2046 3098 0.0976518708062817 0.0976518708062817
+3177 3098 3099 0.0995509890492463 0.0995509890492463
+3179 1954 3100 0.060604506910361 0.060604506910361
+3182 3102 3103 0.0990114382918269 0.0990114382918269
+3183 3103 3104 0.100593787088956 0.100593787088956
+3184 3104 3105 0.0983789631442794 0.0983789631442794
+3185 3105 2848 0.0976433646550276 0.0976433646550276
+3186 2848 3106 0.102064870879311 0.102064870879311
+3187 3106 3107 0.10100271733246 0.10100271733246
+3188 3107 3108 0.0995828832367363 0.0995828832367363
+3189 3108 2942 0.101438732689929 0.101438732689929
+3190 2942 3109 0.100378814460195 0.100378814460195
+3191 3109 3110 1.25206634961555 1.25206634961555
+3192 3111 3112 0.015422388825789 0.015422388825789
+3193 3112 3113 0.11412427509118 0.11412427509118
+3194 3113 3114 0.468645573431598 0.468645573431598
+3196 2023 3115 0.177146580591063 0.177146580591063
+3197 3115 3102 0.173943728587952 0.173943728587952
+3198 3102 3116 0.193451028525805 0.193451028525805
+3200 3117 1806 0.211443534426126 0.211443534426126
+3201 1806 3118 0.193022911848757 0.193022911848757
+3203 3119 3120 0.0940041909856305 0.0940041909856305
+3204 3120 3121 0.197561396619787 0.197561396619787
+3206 3122 3123 0.200799900699528 0.200799900699528
+3207 3124 3125 0.200863237154928 0.200863237154928
+3208 3125 3126 0.201874389323119 0.201874389323119
+3210 3127 3128 0.0750470474178356 0.0750470474178356
+3211 3128 3131 0.0761135403806392 0.0761135403806392
+3213 3029 3132 0.132611387982682 0.132611387982682
+3214 3132 3133 0.00539409864485362 0.00539409864485362
+3215 3133 3134 0.139160450695908 0.139160450695908
+3216 3134 1160 0.139291641031025 0.139291641031025
+3217 1160 879 0.139609262878975 0.139609262878975
+3218 879 3135 0.138493325710101 0.138493325710101
+3219 3135 2787 0.134090008076189 0.134090008076189
+3220 2787 3136 0.1321642245327 0.1321642245327
+3221 3136 3137 0.21408080552497 0.21408080552497
+3222 3137 3138 0.144895915790921 0.144895915790921
+3223 3138 3139 0.169628584853264 0.169628584853264
+3226 3141 3142 0.202888440515448 0.202888440515448
+3227 3142 2878 0.162092717607055 0.162092717607055
+3251 3162 2365 0.110303719018863 0.110303719018863
+3254 3164 3165 0.240177393696762 0.240177393696762
+3255 3165 3166 0.102768151984011 0.102768151984011
+3256 3166 3167 0.0509818546092244 0.0509818546092244
+3258 3168 3169 0.0591373244934598 0.0591373244934598
+3259 3169 3170 0.0530870196657507 0.0530870196657507
+3261 3171 3172 0.201914360897617 0.201914360897617
+3262 3172 3173 0.203130900823478 0.203130900823478
+3263 3173 3174 0.201562825315852 0.201562825315852
+3264 3174 3175 0.19958273918251 0.19958273918251
+3265 3175 3177 0.402921101557674 0.402921101557674
+3266 3178 3179 0.0905536808669309 0.0905536808669309
+3267 3179 3180 0.0577627490058349 0.0577627490058349
+3268 3180 3181 0.0505235668696686 0.0505235668696686
+3269 3181 3182 0.065160532538722 0.065160532538722
+3270 3182 3183 0.00793078546182679 0.00793078546182679
+3271 3183 3184 0.0531842364372946 0.0531842364372946
+3273 2386 3186 0.0378622155960126 0.0378622155960126
+3274 3186 3187 0.0069150542380481 0.0069150542380481
+3275 3187 3188 0.0174713630038869 0.0174713630038869
+3277 3189 3190 0.10095397068423 0.10095397068423
+3278 3190 3191 0.102948552858793 0.102948552858793
+3279 3191 3192 0.099117357243018 0.099117357243018
+3280 3192 3193 0.10499121023248 0.10499121023248
+3282 3194 3195 0.0985672231580753 0.0985672231580753
+3283 3195 3196 0.0975023503923766 0.0975023503923766
+16511 8899 8896 0.0458243741253751 0.0458243741253751
+3284 3196 3197 0.0505627463090716 0.0505627463090716
+3285 3197 3198 0.0500221717072617 0.0500221717072617
+3286 3198 3199 0.046867135973938 0.046867135973938
+3287 3199 1768 0.0529832159562647 0.0529832159562647
+3288 1768 3200 0.0470467690925653 0.0470467690925653
+3289 3200 3201 0.0524586560775799 0.0524586560775799
+3290 3201 3202 0.0495946350720587 0.0495946350720587
+3291 3202 1518 0.052984641558086 0.052984641558086
+3292 1518 3203 0.100125608990258 0.100125608990258
+3293 3203 1085 0.0831191573838339 0.0831191573838339
+3294 1085 3204 0.01719627237498 0.01719627237498
+3295 3204 3205 0.100278521536605 0.100278521536605
+3296 3205 3206 0.100159169300764 0.100159169300764
+3297 3206 3207 0.0980766730481921 0.0980766730481921
+3299 2047 3208 0.0998503328239714 0.0998503328239714
+3300 3208 3209 0.0991174142787685 0.0991174142787685
+3301 3209 3210 0.0465862087261248 0.0465862087261248
+3303 3211 3212 0.0483226107842397 0.0483226107842397
+3304 3212 3213 0.0508033572812722 0.0508033572812722
+3305 3213 3214 0.0520095145740976 0.0520095145740976
+3307 3215 3216 0.047636983079693 0.047636983079693
+3308 3216 3217 0.00228390635402469 0.00228390635402469
+3309 3217 3218 0.0492156902021281 0.0492156902021281
+3310 3218 3219 0.105720878983862 0.105720878983862
+3312 3220 3221 0.135734479783406 0.135734479783406
+3313 3221 2519 0.14595602798476 0.14595602798476
+3314 2519 3222 0.126165217374209 0.126165217374209
+3315 3222 1229 0.098841689459618 0.098841689459618
+3316 1229 3223 0.098924974953348 0.098924974953348
+3317 3223 2174 0.100839404349716 0.100839404349716
+3318 2174 3224 0.101432888438354 0.101432888438354
+3319 3224 3225 0.137343472225008 0.137343472225008
+3321 3226 379 0.0754564811292303 0.0754564811292303
+3322 379 63 0.0417835231628563 0.0417835231628563
+3323 63 1255 0.0152981335887719 0.0152981335887719
+3326 3228 3229 0.0836292502069327 0.0836292502069327
+3327 3229 3230 0.0485562677029858 0.0485562677029858
+3330 3232 3233 0.105369806952797 0.105369806952797
+3331 3233 3234 0.0244901910381055 0.0244901910381055
+3332 3235 3236 0.101967463967826 0.101967463967826
+3333 3236 3237 0.10049747789636 0.10049747789636
+3334 3237 3238 0.0983034665163014 0.0983034665163014
+3335 3238 3239 0.103439327677052 0.103439327677052
+3336 3239 715 0.100109252929192 0.100109252929192
+3337 715 3240 0.10857516210103 0.10857516210103
+3338 3240 3241 0.0836693243428755 0.0836693243428755
+3340 1256 2714 0.204938708369458 0.204938708369458
+3341 2714 3242 0.194775016549959 0.194775016549959
+3343 3243 3244 0.104619278832535 0.104619278832535
+3344 3244 3245 0.0999091629456622 0.0999091629456622
+3345 3245 3246 0.0969207243261653 0.0969207243261653
+3346 3246 3247 0.100620613481727 0.100620613481727
+3347 3247 3248 0.051818780315465 0.051818780315465
+3348 3248 3249 0.0493068623564548 0.0493068623564548
+3349 3249 3250 0.102061915203609 0.102061915203609
+3350 3250 3251 0.0474417721331526 0.0474417721331526
+3351 3251 3252 0.0496832213808208 0.0496832213808208
+3352 3252 3253 0.00274646412019378 0.00274646412019378
+3353 3253 3254 0.0454267490135207 0.0454267490135207
+3354 3254 3255 0.00458544852460102 0.00458544852460102
+3355 3255 3256 0.0483268582508211 0.0483268582508211
+3357 3257 3258 0.0459440862493274 0.0459440862493274
+3358 3258 3259 0.236332489020417 0.236332489020417
+3360 3260 2735 0.173472989255867 0.173472989255867
+3362 594 2050 0.105283533842597 0.105283533842597
+3363 2050 3261 0.0509100007310826 0.0509100007310826
+3364 3261 3262 0.0467523465641757 0.0467523465641757
+3365 3262 3263 0.0481309278210478 0.0481309278210478
+3366 3263 3264 0.051732585346973 0.051732585346973
+3367 3264 3265 0.0457622961694799 0.0457622961694799
+3368 3265 3266 0.0530171123380122 0.0530171123380122
+3369 3266 3267 0.0451783444295864 0.0451783444295864
+3370 3267 3268 0.0542978455447466 0.0542978455447466
+3371 3268 3269 0.0466844058034087 0.0466844058034087
+3372 3269 3270 0.050646295110284 0.050646295110284
+3373 3270 3271 0.0484988623690369 0.0484988623690369
+3374 3271 3272 0.0498932625841468 0.0498932625841468
+3375 3272 3273 0.0470944745658083 0.0470944745658083
+3376 3273 3274 0.0579078107783869 0.0579078107783869
+3377 3274 3275 0.151893561253266 0.151893561253266
+3378 3275 3276 0.0516549077274405 0.0516549077274405
+3379 3276 2734 0.0976564411094966 0.0976564411094966
+3380 2734 3277 0.0486100790727351 0.0486100790727351
+3381 3277 3278 0.0497906140365211 0.0497906140365211
+3382 3278 3279 0.0484124404037645 0.0484124404037645
+3383 3279 3280 0.00653599515433254 0.00653599515433254
+3384 3280 3178 0.0418764820732136 0.0418764820732136
+3385 3178 3284 0.0979449587868123 0.0979449587868123
+3386 3284 3285 0.201022039935831 0.201022039935831
+3389 3287 2316 0.156303067302058 0.156303067302058
+20281 10719 10710 0.0549191742699874 0.0549191742699874
+3390 2316 3288 0.10952595107857 0.10952595107857
+3391 3288 3289 0.0403941356128906 0.0403941356128906
+3392 3289 3290 0.0912238346425634 0.0912238346425634
+3393 3290 3291 0.0816082032445177 0.0816082032445177
+3394 3291 3292 0.0169509581328033 0.0169509581328033
+3395 3292 3293 0.0433466637454668 0.0433466637454668
+3396 3293 3294 0.0186582685984772 0.0186582685984772
+3397 3294 3295 0.152140762364393 0.152140762364393
+3403 3299 1325 0.177116632986756 0.177116632986756
+3404 1325 1381 0.178046664647513 0.178046664647513
+3406 1057 3300 0.119136901138604 0.119136901138604
+3408 3301 1581 0.141640668502809 0.141640668502809
+3409 1581 3302 0.308989164663259 0.308989164663259
+3411 3304 3305 0.143837220516125 0.143837220516125
+3412 3305 3306 0.147698693465714 0.147698693465714
+3414 3307 3308 0.146426311775338 0.146426311775338
+3415 3308 3309 0.146463761248984 0.146463761248984
+3416 3309 3310 0.146549783304075 0.146549783304075
+3417 3310 2029 0.145425360285073 0.145425360285073
+3418 2029 3311 0.146713513284486 0.146713513284486
+3419 3311 634 0.143866210964815 0.143866210964815
+3420 634 3312 0.147112545494359 0.147112545494359
+3421 3312 3313 0.145900102395242 0.145900102395242
+3422 3313 2321 0.147128656269274 0.147128656269274
+3424 3314 3315 0.0970240945457023 0.0970240945457023
+3425 3315 2190 0.185651929243496 0.185651929243496
+3427 737 1557 0.13315596414531 0.13315596414531
+3429 3316 3317 0.0821429797668101 0.0821429797668101
+3434 3321 3322 0.579886710164932 0.579886710164932
+3436 3323 3324 0.139196729808835 0.139196729808835
+3438 3325 3326 0.13668278082176 0.13668278082176
+3439 3326 3045 0.137860640994287 0.137860640994287
+3440 3045 3327 0.13778919161955 0.13778919161955
+3441 3327 3328 0.00447003605120276 0.00447003605120276
+3442 3328 3329 0.0233867925544547 0.0233867925544547
+3443 3329 3330 0.116012449407873 0.116012449407873
+3444 3330 1166 0.139882774592672 0.139882774592672
+3445 1166 886 0.137525679366119 0.137525679366119
+3446 886 3332 0.139657446365043 0.139657446365043
+3447 3332 2793 0.133361291612613 0.133361291612613
+3448 2793 3333 0.132228102569741 0.132228102569741
+3450 3334 3335 0.0903059057199572 0.0903059057199572
+3451 3335 3336 0.154418186694308 0.154418186694308
+3452 3336 3337 0.192225493046604 0.192225493046604
+3453 3337 3338 0.174660133594583 0.174660133594583
+3454 3338 3339 0.202477883587996 0.202477883587996
+3455 3339 3340 0.0759856229646665 0.0759856229646665
+3456 3340 3341 0.00965813264254578 0.00965813264254578
+3458 3342 1191 0.166878049186437 0.166878049186437
+3459 1191 3343 0.0216063183857929 0.0216063183857929
+3460 3343 3344 0.200920604325059 0.200920604325059
+3462 2346 3345 0.174959253236807 0.174959253236807
+3463 3345 1535 0.0463919707335885 0.0463919707335885
+3465 3346 3347 0.27909963341584 0.27909963341584
+3466 3347 740 0.112084486383373 0.112084486383373
+3467 740 1560 0.139918597194563 0.139918597194563
+3468 1560 3348 0.140278682022104 0.140278682022104
+3469 3348 3349 0.121438604958881 0.121438604958881
+3471 3350 3351 0.173966017570494 0.173966017570494
+3472 3351 3352 0.16543284170321 0.16543284170321
+3474 3353 3354 0.201189633952299 0.201189633952299
+3477 3356 3357 0.174637614655306 0.174637614655306
+3479 2467 3359 0.203720276949683 0.203720276949683
+3480 3359 3360 0.200874146006411 0.200874146006411
+3481 3360 795 0.199720493083652 0.199720493083652
+3482 795 3361 0.203163577363555 0.203163577363555
+3484 3362 3363 0.203261629260278 0.203261629260278
+3485 3363 3061 0.206912153397241 0.206912153397241
+3486 3061 3364 0.186005329793712 0.186005329793712
+3488 3365 1140 0.135699508009882 0.135699508009882
+3490 907 3366 0.12816779719188 0.12816779719188
+3492 3367 1297 0.200952363448705 0.200952363448705
+3494 3368 3369 0.101405416836813 0.101405416836813
+3495 3369 3370 0.0983850243457341 0.0983850243457341
+3497 3371 3372 0.0654246270475212 0.0654246270475212
+3498 3372 2939 0.0903071880553539 0.0903071880553539
+3499 2939 3373 0.0855248234583031 0.0855248234583031
+3500 3373 59 0.083918142781954 0.083918142781954
+3502 3374 3375 0.253631602277532 0.253631602277532
+3503 3376 3377 0.201161683466984 0.201161683466984
+3505 3378 623 0.0117822953093903 0.0117822953093903
+3506 623 3379 0.132533255410588 0.132533255410588
+3507 3379 3380 0.0779035335014782 0.0779035335014782
+3508 3380 3381 0.206545256567466 0.206545256567466
+20694 10906 10909 0.0421787313564029 0.0421787313564029
+3509 3381 3382 0.13283549460514 0.13283549460514
+3510 3382 3383 0.135569425081515 0.135569425081515
+3511 3383 3384 0.136156970349478 0.136156970349478
+3512 3384 3385 0.132775661568888 0.132775661568888
+3514 2584 3386 0.177011208890761 0.177011208890761
+3515 3386 3387 0.0885846426355864 0.0885846426355864
+3518 3389 3390 0.176205550995696 0.176205550995696
+3519 3390 3391 0.169210992899206 0.169210992899206
+3520 3391 3392 0.0099077669914251 0.0099077669914251
+3521 3392 1849 0.175456016508954 0.175456016508954
+3522 1849 2583 0.178501996899051 0.178501996899051
+3524 600 3393 0.2153977841733 0.2153977841733
+3526 3394 3395 0.118920951518272 0.118920951518272
+3527 3395 3396 0.142989811640976 0.142989811640976
+3528 3396 3397 0.262177718796624 0.262177718796624
+3530 14 3398 0.133564321671034 0.133564321671034
+3531 3398 3399 0.133563180552006 0.133563180552006
+3532 3399 3400 0.135746766447532 0.135746766447532
+3533 3400 3401 0.133513247236878 0.133513247236878
+3534 3401 3402 0.0998328095575455 0.0998328095575455
+3535 3402 3403 0.0352154332682272 0.0352154332682272
+3536 3403 2405 0.0667725534497617 0.0667725534497617
+3537 2405 3404 0.0682403264820305 0.0682403264820305
+3538 3404 3405 0.033013773721009 0.033013773721009
+3539 3405 3409 0.0499933274562477 0.0499933274562477
+3540 3409 3410 0.0543299225353451 0.0543299225353451
+3541 3410 1767 0.0526619512572465 0.0526619512572465
+3542 1767 3411 0.150417295173728 0.150417295173728
+3543 3411 2979 0.204011051874628 0.204011051874628
+3544 2979 656 0.0515792906446319 0.0515792906446319
+3546 1887 591 0.0491592770696459 0.0491592770696459
+3547 591 3412 0.0481379602388448 0.0481379602388448
+3548 3412 3413 0.102266489872996 0.102266489872996
+3549 3413 1888 0.0486842125387167 0.0486842125387167
+3550 1888 3414 0.0510943840977224 0.0510943840977224
+3551 3414 3415 0.00919583632372114 0.00919583632372114
+3552 3415 3416 0.0353489043837471 0.0353489043837471
+17077 3568 8074 0.699339640197117 0.699339640197117
+3553 3416 3417 0.050093361124945 0.050093361124945
+3554 3417 3418 0.0498820440925909 0.0498820440925909
+3555 3418 3419 0.0498984530952944 0.0498984530952944
+3556 3419 3420 0.00880663819045291 0.00880663819045291
+3557 3420 3421 0.0410819827191675 0.0410819827191675
+3558 3421 3422 0.0491592770696459 0.0491592770696459
+3559 3422 3423 0.0205377029518591 0.0205377029518591
+3560 3423 3424 0.02549703249469 0.02549703249469
+3562 3425 3425 0.000442266584977921 0.000442266584977921
+3563 3425 3426 0.0816315051221547 0.0816315051221547
+3565 3427 1664 0.0502947464100412 0.0502947464100412
+3567 1683 3428 0.020460323508623 0.020460323508623
+3568 3428 3429 0.0515955226949506 0.0515955226949506
+3569 3429 3430 0.133978887334031 0.133978887334031
+3570 3430 2427 0.13659869274501 0.13659869274501
+3571 2427 2428 0.063830021941611 0.063830021941611
+3572 2428 3231 0.0696897365044123 0.0696897365044123
+3573 3231 3431 0.132766742414187 0.132766742414187
+3574 3431 3432 0.106360486773292 0.106360486773292
+3575 3432 3433 0.0970117847237812 0.0970117847237812
+3576 3433 3434 0.1971376871667 0.1971376871667
+19819 5606 10648 0.0581167522759965 0.0581167522759965
+3577 3434 3435 0.133491532527273 0.133491532527273
+3582 2842 3438 0.0923852774741301 0.0923852774741301
+3584 1421 317 0.102691144252484 0.102691144252484
+3585 317 513 0.0772222660891488 0.0772222660891488
+3586 513 3439 0.0612593596381532 0.0612593596381532
+3587 3439 3440 0.148872782400453 0.148872782400453
+3588 3440 2540 0.197920167618774 0.197920167618774
+3589 2540 3441 0.415850973508269 0.415850973508269
+3590 3442 699 0.201963508155417 0.201963508155417
+3591 699 3443 0.200352700158165 0.200352700158165
+3593 3444 3445 0.0185806742090463 0.0185806742090463
+20212 5504 7078 0.147322900830237 0.147322900830237
+20213 7078 2034 0.146401533431931 0.146401533431931
+20214 2034 5323 0.145002332578884 0.145002332578884
+20215 5323 632 0.146882687938452 0.146882687938452
+4488 138 4177 0.203369481928684 0.203369481928684
+4489 4177 1741 0.0411375852444616 0.0411375852444616
+4490 1741 4178 0.159371364409943 0.159371364409943
+4492 4179 4180 0.471114595558298 0.471114595558298
+4493 4180 4181 0.219268705400549 0.219268705400549
+4495 4182 4183 0.0994268923770179 0.0994268923770179
+4496 4183 1296 0.100075433980265 0.100075433980265
+4497 1296 1369 0.0964029757899856 0.0964029757899856
+5794 5116 3795 0.199284062960758 0.199284062960758
+18557 318 10316 0.0220547227626022 0.0220547227626022
+4499 4184 4185 0.301634217878433 0.301634217878433
+4501 2809 3744 0.0998445716696615 0.0998445716696615
+4502 3744 4186 0.10131230641957 0.10131230641957
+4504 4187 4188 0.132156563746112 0.132156563746112
+4505 4188 4189 0.132402395077485 0.132402395077485
+4506 4189 4190 0.137552756241722 0.137552756241722
+4507 4190 4191 0.13379771872617 0.13379771872617
+4508 4191 1671 0.132214775902914 0.132214775902914
+4509 1671 4192 0.137147368544834 0.137147368544834
+4510 4192 2452 0.138219895716206 0.138219895716206
+4511 2452 3221 0.134932977312539 0.134932977312539
+4512 3221 4193 0.133628518122145 0.133628518122145
+4515 4195 554 0.154583323244677 0.154583323244677
+4516 554 4196 0.0224725093154139 0.0224725093154139
+4517 4083 4197 0.170590775930264 0.170590775930264
+4518 4197 3764 0.0397497113610314 0.0397497113610314
+4520 2820 1411 0.135923564862653 0.135923564862653
+4521 1411 1351 0.125050095081124 0.125050095081124
+4523 4198 4199 0.454148647656551 0.454148647656551
+4525 4200 4201 0.133477223659273 0.133477223659273
+4526 4201 4202 0.132617384077965 0.132617384077965
+4527 4202 4203 0.134214836424706 0.134214836424706
+4531 4206 1274 0.135021280032386 0.135021280032386
+4533 4207 4208 0.280988389053987 0.280988389053987
+4534 4209 4210 0.209285084830873 0.209285084830873
+4535 4210 4211 0.203065667561202 0.203065667561202
+4537 4212 3742 0.11682398880887 0.11682398880887
+4538 3742 4213 0.111567725645095 0.111567725645095
+4539 4213 1339 0.201798845648163 0.201798845648163
+4541 4214 4215 0.203408625976642 0.203408625976642
+4542 4215 4216 0.204114710404745 0.204114710404745
+4543 4216 4217 0.199718562750948 0.199718562750948
+4544 4217 4218 0.198271148516705 0.198271148516705
+4545 4218 771 0.17255385564489 0.17255385564489
+4547 2307 165 0.313487377331004 0.313487377331004
+4549 4219 4220 0.186213228977795 0.186213228977795
+4551 754 1537 0.148966155582635 0.148966155582635
+4553 4221 4222 0.161148121345995 0.161148121345995
+4554 4222 4223 0.216135114601666 0.216135114601666
+4555 4223 2863 0.186375265274556 0.186375265274556
+4556 2863 4224 0.202043234198664 0.202043234198664
+4558 2306 163 0.315813218507964 0.315813218507964
+4560 2936 4225 0.221837398274975 0.221837398274975
+4561 4226 4227 0.032037204481033 0.032037204481033
+4562 4227 3117 0.0749583948430369 0.0749583948430369
+4563 3117 4228 0.116878015161696 0.116878015161696
+4564 4228 4229 0.198835732908948 0.198835732908948
+4565 4229 3631 0.67836534857008 0.67836534857008
+4567 4230 4231 0.0278521738101303 0.0278521738101303
+4568 4231 3626 0.0483370034898742 0.0483370034898742
+4569 3626 4232 0.0510217447847317 0.0510217447847317
+4570 4232 4233 0.0469996469262497 0.0469996469262497
+4571 4233 4234 0.00322569080192639 0.00322569080192639
+4572 4234 4235 0.0476498478152495 0.0476498478152495
+4573 4235 4236 0.00275575991011001 0.00275575991011001
+4574 4236 4237 0.0466374525425622 0.0466374525425622
+4575 4237 4176 0.0490297893404984 0.0490297893404984
+4577 1777 4238 0.0499406466420926 0.0499406466420926
+4578 4238 4239 0.0481565861804565 0.0481565861804565
+4579 4239 4241 0.0519465642125291 0.0519465642125291
+4580 4241 1525 0.0497346926389818 0.0497346926389818
+4581 1525 4242 0.0484856348902157 0.0484856348902157
+4582 4242 4243 0.0507187078501555 0.0507187078501555
+4584 4244 4245 0.0527177379947323 0.0527177379947323
+4585 4245 4246 0.0464286276535365 0.0464286276535365
+4586 4246 4247 0.0517965186978674 0.0517965186978674
+4587 4247 4248 0.0444043495278385 0.0444043495278385
+4588 4248 569 0.0503939700372948 0.0503939700372948
+4589 569 4249 0.0487604458581461 0.0487604458581461
+4590 4249 4250 0.049686610105401 0.049686610105401
+4591 4250 3757 0.0516485422129312 0.0516485422129312
+4593 233 4251 0.0506501019029544 0.0506501019029544
+4594 4251 4252 0.049085285550805 0.049085285550805
+4595 4252 4253 0.0509968613887819 0.0509968613887819
+4596 4253 4254 0.0502265448038836 0.0502265448038836
+4597 4254 4255 0.0465382189133341 0.0465382189133341
+4598 4255 4256 0.0510900830663337 0.0510900830663337
+4599 4256 4257 0.0497787434592631 0.0497787434592631
+4600 4257 3481 0.048623750791878 0.048623750791878
+4601 3481 4258 0.0500598342416855 0.0500598342416855
+4602 4258 4259 0.0490673464291656 0.0490673464291656
+4603 4259 4260 0.0504371465498466 0.0504371465498466
+4604 4260 3695 0.0479901081376225 0.0479901081376225
+4606 4261 4262 0.0501538740654185 0.0501538740654185
+4607 4262 4263 0.0491706548036751 0.0491706548036751
+4608 4263 4264 0.0565833994828839 0.0565833994828839
+4610 277 4265 0.0528934097089145 0.0528934097089145
+4611 4265 4266 0.0968160140004115 0.0968160140004115
+20627 10752 10756 0.0716547469239426 0.0716547469239426
+4612 4266 4267 0.0968245593658874 0.0968245593658874
+4613 4267 973 0.0982940228399724 0.0982940228399724
+4614 973 4268 0.0961120665100732 0.0961120665100732
+4615 4268 3151 0.0982830823377853 0.0982830823377853
+4616 3151 4269 0.0956500899819903 0.0956500899819903
+4617 4269 4270 0.0774758788411222 0.0774758788411222
+4619 4271 3870 0.115440404669678 0.115440404669678
+4620 3870 839 0.0968819352907846 0.0968819352907846
+4621 839 4272 0.0909531666656291 0.0909531666656291
+4623 3911 4273 0.0389706485750465 0.0389706485750465
+4624 369 4274 0.037543890411303 0.037543890411303
+4625 4274 4275 0.0617087098520115 0.0617087098520115
+4629 2912 4277 0.0342245606725147 0.0342245606725147
+4630 4277 4278 0.104948893572031 0.104948893572031
+4631 4278 3313 0.105285822276279 0.105285822276279
+4632 3313 4279 0.10593807567588 0.10593807567588
+4634 1347 1613 0.100174688565551 0.100174688565551
+4635 1613 4280 0.104997472753206 0.104997472753206
+4665 4282 4283 0.0977314379471645 0.0977314379471645
+4639 4284 4285 0.190476396365953 0.190476396365953
+4640 4285 4286 0.254383171783508 0.254383171783508
+4642 4287 1279 0.116253581720056 0.116253581720056
+4643 1279 4288 0.133001385838575 0.133001385838575
+4644 4288 4289 0.132041969489344 0.132041969489344
+4645 4289 4290 0.131385678442372 0.131385678442372
+4647 3405 4291 0.101549832168715 0.101549832168715
+4648 4291 4292 0.100523519517599 0.100523519517599
+4649 4292 4293 0.100138462817161 0.100138462817161
+5953 5195 5227 0.170006104257124 0.170006104257124
+4650 4293 4294 0.099847555472709 0.099847555472709
+4651 4294 4295 0.0503614009997415 0.0503614009997415
+4652 4295 1117 0.0494296215921 0.0494296215921
+4653 1117 4296 0.050087846881447 0.050087846881447
+4654 4296 4297 0.0495578429804187 0.0495578429804187
+4655 4297 4298 0.0515578068709943 0.0515578068709943
+20458 10785 10812 0.0256322806680483 0.0256322806680483
+4656 4298 4299 0.00303478875120781 0.00303478875120781
+4659 4300 1508 0.0639307257992365 0.0639307257992365
+4660 1508 179 0.201223720751325 0.201223720751325
+4661 179 1707 0.203441168484602 0.203441168484602
+4663 4301 4302 0.143365965722663 0.143365965722663
+4686 4303 4304 0.0764005624211503 0.0764005624211503
+4664 4302 4305 2.47136733106287 2.47136733106287
+17126 4306 4307 0.198891077653185 0.198891077653185
+17128 4308 4309 0.137004722426324 0.137004722426324
+4666 4283 4310 0.00807297378678342 0.00807297378678342
+4667 4310 4311 0.088125570928718 0.088125570928718
+4668 4311 4312 0.0140203745468903 0.0140203745468903
+19629 10518 10593 0.0691965251351115 0.0691965251351115
+4670 4313 4314 0.114544256923558 0.114544256923558
+4671 4314 4315 0.197539157423005 0.197539157423005
+4672 4315 4035 0.10133193665102 0.10133193665102
+4675 3389 4317 0.176922247784819 0.176922247784819
+4676 4317 1313 0.17698917639034 0.17698917639034
+4677 1313 4318 0.2429613537943 0.2429613537943
+4678 4318 4319 0.0830631503019858 0.0830631503019858
+4679 4319 4320 0.0977203133854136 0.0977203133854136
+4680 4320 4321 0.113818121601187 0.113818121601187
+4681 4321 4322 0.0984100223094627 0.0984100223094627
+4683 4323 4324 0.0484810817232728 0.0484810817232728
+4684 4324 4325 0.0969202903062125 0.0969202903062125
+4685 4325 4303 0.026431034063363 0.026431034063363
+4687 4304 4326 0.107959479077584 0.107959479077584
+4689 4302 1574 0.191677995814021 0.191677995814021
+4691 3672 4328 0.125428790986072 0.125428790986072
+4692 4328 4329 0.0951720176425212 0.0951720176425212
+4693 4329 4330 0.139038263486678 0.139038263486678
+4694 4330 4331 0.139714401472726 0.139714401472726
+4700 4334 4335 0.200429884058467 0.200429884058467
+4702 2368 4336 0.0171503416673458 0.0171503416673458
+4704 2899 4337 0.105099867009157 0.105099867009157
+4705 4337 4338 0.106056680315678 0.106056680315678
+4706 4338 4339 0.104589847143113 0.104589847143113
+4707 4339 4340 0.370832351150224 0.370832351150224
+4708 4340 4341 0.0529480373416704 0.0529480373416704
+4709 4341 3902 0.107541125657943 0.107541125657943
+4710 3902 1039 0.104784630542914 0.104784630542914
+4711 1039 4342 0.104777071004161 0.104777071004161
+4712 4342 4343 0.105248493254523 0.105248493254523
+4713 4343 4344 0.101108879740712 0.101108879740712
+4714 4344 3325 0.105024412220906 0.105024412220906
+4715 3325 4345 0.102246237774905 0.102246237774905
+4716 4345 4346 0.102726745739932 0.102726745739932
+4717 4346 2076 0.108443527267173 0.108443527267173
+4718 2076 2673 0.108454042008862 0.108454042008862
+6026 4668 5275 0.106680903376796 0.106680903376796
+20495 10837 10818 0.00314569094185422 0.00314569094185422
+4719 2673 4123 0.102664740305431 0.102664740305431
+4720 4123 4347 0.110043125382133 0.110043125382133
+4721 4347 4348 0.0925868711229396 0.0925868711229396
+4722 4348 4349 0.101256639304288 0.101256639304288
+4723 4349 3471 0.100333218908324 0.100333218908324
+4724 3471 4350 0.101033713236321 0.101033713236321
+4726 850 4351 0.101364060095961 0.101364060095961
+4727 4351 4352 0.0951618291875102 0.0951618291875102
+4728 4352 4353 0.0166431794757682 0.0166431794757682
+4729 4353 4354 0.0900251519018866 0.0900251519018866
+4730 4354 4355 0.0948464364966571 0.0948464364966571
+4731 4355 4356 0.0929916889983271 0.0929916889983271
+4732 4356 4357 0.0946584559856625 0.0946584559856625
+4733 4357 2002 0.0939147825318954 0.0939147825318954
+4734 2002 3362 0.0961201849767339 0.0961201849767339
+4735 3362 2756 0.0936202724465644 0.0936202724465644
+4736 2756 4358 0.0928604520153806 0.0928604520153806
+4738 4359 3874 0.0985792493705747 0.0985792493705747
+4740 4360 4361 0.589746493190754 0.589746493190754
+4742 501 1385 0.0995647502781281 0.0995647502781281
+4745 4363 4364 0.205829363021429 0.205829363021429
+4746 4364 4365 0.0921122756854079 0.0921122756854079
+4747 4365 4366 0.00988128080256074 0.00988128080256074
+4748 4366 4367 0.0897681081567516 0.0897681081567516
+4749 4367 4368 0.098598628932225 0.098598628932225
+4750 4368 4369 0.0959412440063823 0.0959412440063823
+4751 4369 4370 0.102131783313602 0.102131783313602
+4752 4370 783 0.172155062898013 0.172155062898013
+4753 783 4373 0.095162556755669 0.095162556755669
+4754 4373 4374 0.0961947364240104 0.0961947364240104
+4755 4374 2746 0.0976874440589729 0.0976874440589729
+4756 2746 4375 0.105035684135392 0.105035684135392
+4757 4375 4376 0.0939930714928361 0.0939930714928361
+4758 4376 4031 0.0955624767971731 0.0955624767971731
+4759 4031 4377 0.0560443290529964 0.0560443290529964
+4760 4377 1489 0.204591889958277 0.204591889958277
+4762 145 1731 0.201807709171719 0.201807709171719
+4763 1731 360 0.203461803126836 0.203461803126836
+4767 2902 2038 0.0702037411311871 0.0702037411311871
+4769 4380 4381 0.147155318321419 0.147155318321419
+4770 4381 4382 0.144957308053315 0.144957308053315
+4771 4382 4383 0.149312485085308 0.149312485085308
+4774 2688 4385 0.0765539017627299 0.0765539017627299
+4775 4385 4386 0.0705753548513159 0.0705753548513159
+4776 4386 4387 0.146933743759007 0.146933743759007
+4777 4387 4388 0.145923980731529 0.145923980731529
+4778 4388 4389 0.144339759907671 0.144339759907671
+4779 4389 4390 0.150103166473839 0.150103166473839
+4780 4390 4391 0.137983810664432 0.137983810664432
+4781 4391 4392 0.0104056356944031 0.0104056356944031
+4782 4392 4393 0.140241416108271 0.140241416108271
+4783 4393 4394 0.1481833156111 0.1481833156111
+4784 4394 4395 0.146837535132845 0.146837535132845
+4785 4395 4396 0.147176845167591 0.147176845167591
+4786 4396 4397 0.145625871999305 0.145625871999305
+4788 1072 4398 0.0934237929296376 0.0934237929296376
+4790 4399 4400 0.1229191337931 0.1229191337931
+4791 4400 4401 0.117696624021516 0.117696624021516
+4792 4401 3916 0.0730141443209756 0.0730141443209756
+4794 4402 4403 3.26030129970045 3.26030129970045
+4795 4403 1705 0.202698536609182 0.202698536609182
+4796 1705 176 0.202718600973581 0.202718600973581
+4797 176 1503 0.201219684641614 0.201219684641614
+4798 1503 4404 0.202286968554481 0.202286968554481
+4799 4404 4405 0.200141278145387 0.200141278145387
+4800 4405 4406 0.0308542467827185 0.0308542467827185
+4801 4406 4407 0.168200323230532 0.168200323230532
+4802 4407 4408 0.11307645922142 0.11307645922142
+4803 4408 4409 0.0961947310408444 0.0961947310408444
+4804 4409 4410 0.0983990775592717 0.0983990775592717
+4806 4411 4413 0.099863884884034 0.099863884884034
+4809 4415 4416 0.102810116828889 0.102810116828889
+4810 4416 4417 0.0991628298509216 0.0991628298509216
+4811 4417 4418 0.0969872745595907 0.0969872745595907
+4812 4418 4419 0.0998556913489604 0.0998556913489604
+4813 4419 4420 0.0958355207238061 0.0958355207238061
+4814 4420 1307 0.243760388907656 0.243760388907656
+4815 1307 4421 0.179135026824832 0.179135026824832
+4818 4422 477 0.0591204183570981 0.0591204183570981
+4819 477 486 0.338636165035717 0.338636165035717
+4820 486 320 0.186794052108965 0.186794052108965
+4821 320 324 0.464671835959624 0.464671835959624
+4822 324 531 0.0559979023034973 0.0559979023034973
+4823 531 534 0.263162604733165 0.263162604733165
+4825 475 530 0.435551136576821 0.435551136576821
+4826 530 393 0.115152140819887 0.115152140819887
+4827 393 4423 0.203655322253385 0.203655322253385
+4828 4423 4424 0.538171924126244 0.538171924126244
+4829 4424 4426 0.419488421877639 0.419488421877639
+4830 4426 4427 0.0323139283448777 0.0323139283448777
+4833 4428 4429 0.198930926845217 0.198930926845217
+4837 4432 4433 0.200460087837485 0.200460087837485
+4839 2920 3260 0.28373274915572 0.28373274915572
+4842 4436 726 0.0998645775500999 0.0998645775500999
+4843 726 52 0.170560718436498 0.170560718436498
+4844 52 4437 0.100090869280248 0.100090869280248
+4845 4437 3658 0.0591716781283333 0.0591716781283333
+4846 3658 4438 0.103033016475492 0.103033016475492
+4847 4438 4439 0.00533542340358722 0.00533542340358722
+4848 4439 3530 0.0426683766285225 0.0426683766285225
+4850 4440 1490 0.0653862418347059 0.0653862418347059
+4851 1490 146 0.199762763358791 0.199762763358791
+4853 1733 4441 0.200262923415945 0.200262923415945
+4855 3554 4442 0.0495302719350299 0.0495302719350299
+4856 4442 4443 0.0498850541236187 0.0498850541236187
+4857 4443 4444 0.0512856921549244 0.0512856921549244
+4858 4444 3019 0.0117591853989501 0.0117591853989501
+4860 4445 4382 0.0530835076360593 0.0530835076360593
+4861 4382 4446 0.0528074946120117 0.0528074946120117
+4863 4447 4448 0.00600839331926655 0.00600839331926655
+4865 4449 4450 0.0531891993832321 0.0531891993832321
+4866 4450 4451 0.0546720224408421 0.0546720224408421
+4867 4451 4452 0.0492877204975977 0.0492877204975977
+4868 4452 4453 0.0555740263590881 0.0555740263590881
+4869 4453 4454 0.0508522899950145 0.0508522899950145
+4870 4454 4455 0.0539540438907939 0.0539540438907939
+4871 4455 4456 0.05278127500741 0.05278127500741
+4872 4456 4457 0.0520682148022883 0.0520682148022883
+4873 4457 4458 0.0535945839553328 0.0535945839553328
+4874 4458 3308 0.105299206866662 0.105299206866662
+4875 3308 4459 0.0532887340145185 0.0532887340145185
+4876 4459 4460 0.0519293867850164 0.0519293867850164
+4878 2911 4461 0.104626210772024 0.104626210772024
+4879 4461 4462 0.107626289516013 0.107626289516013
+4880 4462 4463 0.104079175744358 0.104079175744358
+4881 4463 4464 0.104771521557699 0.104771521557699
+4882 4464 4465 0.105968126634263 0.105968126634263
+6192 5399 5400 0.276164012064383 0.276164012064383
+4883 4465 4466 0.105797186557688 0.105797186557688
+4884 4466 3135 0.104882643737148 0.104882643737148
+4885 3135 3907 0.109352834062615 0.109352834062615
+4886 3907 1046 0.105412573797977 0.105412573797977
+4887 1046 4467 0.052770391738213 0.052770391738213
+4888 4467 4468 0.0520438840305316 0.0520438840305316
+4889 4468 4469 0.10568608900916 0.10568608900916
+4890 4469 4470 0.101335564568208 0.101335564568208
+4891 4470 3332 0.103121923835041 0.103121923835041
+4892 3332 4471 0.106386988921342 0.106386988921342
+4893 4471 4472 0.0168550696022494 0.0168550696022494
+4894 4472 4473 0.0917114246562582 0.0917114246562582
+4895 4473 2083 0.101916806851718 0.101916806851718
+4896 2083 4474 0.104993787286419 0.104993787286419
+4897 4474 4129 0.105139069056382 0.105139069056382
+4898 4129 4475 0.108754567624091 0.108754567624091
+4899 4475 4476 0.10144670106953 0.10144670106953
+4900 4476 4477 0.106139118962841 0.106139118962841
+4901 4477 3446 0.105344236005182 0.105344236005182
+4903 4478 4479 0.0124618097268169 0.0124618097268169
+4904 4479 4480 0.085822453683645 0.085822453683645
+4905 4480 3886 0.0198123941785865 0.0198123941785865
+4907 865 4481 0.0967884909448593 0.0967884909448593
+4909 345 4482 0.111183183932549 0.111183183932549
+4910 4483 1892 0.0285476317873184 0.0285476317873184
+4912 4360 4484 0.465117334225162 0.465117334225162
+4913 4484 4485 0.0326010116755978 0.0326010116755978
+4915 4486 4487 0.175931100170174 0.175931100170174
+4916 4487 4489 0.100342363380826 0.100342363380826
+4917 4489 4490 0.161656025882071 0.161656025882071
+4918 4490 4491 0.0905242566324277 0.0905242566324277
+4919 4491 1950 0.169005169872083 0.169005169872083
+4920 1950 4492 0.126063150124326 0.126063150124326
+4924 4081 3762 0.180617937803326 0.180617937803326
+4926 2559 4495 0.0875396307338273 0.0875396307338273
+4927 4495 4496 0.0902282586364627 0.0902282586364627
+4928 4496 4497 0.0878475091612825 0.0878475091612825
+4929 4497 4498 0.266301743580547 0.266301743580547
+4930 180 1708 0.203431976552675 0.203431976552675
+4931 1708 4499 0.201230804203475 0.201230804203475
+4932 4499 1575 0.27729796539772 0.27729796539772
+4933 1575 4500 0.182259795470885 0.182259795470885
+4934 4501 4502 0.199005560216138 0.199005560216138
+4935 4502 4503 0.153202263597584 0.153202263597584
+4937 4504 4505 0.176923776962641 0.176923776962641
+4938 4505 1315 0.176127860687443 0.176127860687443
+4939 1315 1371 0.176782045374234 0.176782045374234
+4940 1371 4506 0.0626491861453163 0.0626491861453163
+4941 4506 4507 0.0851767549198192 0.0851767549198192
+4943 3035 4508 0.210570172682267 0.210570172682267
+4945 54 4510 0.19332295953062 0.19332295953062
+4946 4510 3640 0.0466160975278989 0.0466160975278989
+4948 4511 3531 0.0618894465423491 0.0618894465423491
+4949 3531 4512 0.0905408166059636 0.0905408166059636
+4951 3926 707 0.0755598922064861 0.0755598922064861
+4952 707 4513 0.0978688769552162 0.0978688769552162
+4953 4513 4514 0.0992771410926943 0.0992771410926943
+4954 4514 4188 0.135836888761709 0.135836888761709
+4955 4188 2514 0.135033448601963 0.135033448601963
+4956 2514 4515 0.13515296788921 0.13515296788921
+4957 4515 4516 0.136409392488761 0.136409392488761
+4959 4517 4518 0.0356088442137805 0.0356088442137805
+4960 4518 4519 0.0503802448307333 0.0503802448307333
+4961 4519 4520 0.127581150438839 0.127581150438839
+4962 4520 4521 0.132742519290442 0.132742519290442
+4963 4521 4522 0.13263462094456 0.13263462094456
+4964 4522 1243 0.132622916068163 0.132622916068163
+4965 1243 4523 0.132744954601011 0.132744954601011
+4966 4523 2724 0.131940306625131 0.131940306625131
+4967 2724 4524 0.125887507119952 0.125887507119952
+4968 4524 4525 0.0073166618478819 0.0073166618478819
+4970 4526 4527 0.188224997765616 0.188224997765616
+4971 4527 3419 0.20066865963842 0.20066865963842
+4973 4528 4529 0.132643815391647 0.132643815391647
+4974 4529 4288 0.134447795927953 0.134447795927953
+4975 4288 4530 0.0675286789518799 0.0675286789518799
+4976 4530 4531 0.0681514911729941 0.0681514911729941
+4978 1833 2628 0.0976402650867344 0.0976402650867344
+4980 4532 4428 0.101312368020336 0.101312368020336
+4981 4428 4533 0.0998335149833254 0.0998335149833254
+4982 4533 4534 0.1027774706977 0.1027774706977
+4984 4535 1833 0.103500237720645 0.103500237720645
+4986 4536 4537 0.0953225774659935 0.0953225774659935
+4988 4538 4539 0.19878482816443 0.19878482816443
+4989 4539 2830 0.201604542004037 0.201604542004037
+4990 2830 1438 0.197694612690532 0.197694612690532
+4991 1438 4540 0.179002123409013 0.179002123409013
+4993 4541 25 0.138059623303707 0.138059623303707
+4994 25 4542 0.0645746983944002 0.0645746983944002
+4995 4542 2964 0.0670651945252806 0.0670651945252806
+4999 4545 4546 0.142258977482996 0.142258977482996
+5001 4547 115 0.110830423505847 0.110830423505847
+5003 4548 4549 0.0776585367690646 0.0776585367690646
+5004 4549 4550 0.199094650034446 0.199094650034446
+5005 4550 4551 0.100232131513911 0.100232131513911
+5007 4552 2292 0.132777862181536 0.132777862181536
+5008 2292 4553 0.0918166647273585 0.0918166647273585
+5009 4553 2534 0.18135507208955 0.18135507208955
+5011 2627 4554 0.0924500575644084 0.0924500575644084
+5012 4554 4555 0.10983037862614 0.10983037862614
+5014 4523 4556 0.135380005592348 0.135380005592348
+5015 4556 4557 0.134346145402708 0.134346145402708
+5016 4557 4558 0.133189336887005 0.133189336887005
+5017 4558 1680 0.13514752705788 0.13514752705788
+5018 1680 4559 0.137419251565084 0.137419251565084
+5020 4560 4064 0.13135456684589 0.13135456684589
+5021 4064 4561 0.134278993416053 0.134278993416053
+5023 4101 4562 0.159933235501875 0.159933235501875
+5025 4563 4564 0.407964486856081 0.407964486856081
+5026 4565 2188 0.10962848253063 0.10962848253063
+17150 4780 4781 0.199841658014134 0.199841658014134
+5028 4566 687 0.202530686471354 0.202530686471354
+5029 687 1982 0.159069792202276 0.159069792202276
+5030 1982 1967 0.0383650278893233 0.0383650278893233
+5033 4567 1928 0.199711508236703 0.199711508236703
+5034 1928 4568 0.201653602761609 0.201653602761609
+5035 4568 3272 0.202185746700204 0.202185746700204
+5036 3272 4569 0.20093413075273 0.20093413075273
+5037 4569 85 0.20339775981857 0.20339775981857
+5038 85 3521 0.203998373883698 0.203998373883698
+5039 3521 4262 0.200473333246826 0.200473333246826
+5040 4262 4570 0.200485802986416 0.200485802986416
+5041 4570 4571 0.201223720769428 0.201223720769428
+5042 4571 4572 0.205786578364508 0.205786578364508
+5043 4572 4573 0.200686081138238 0.200686081138238
+5044 4573 4574 0.200311699167283 0.200311699167283
+5045 4575 4576 0.13275170286213 0.13275170286213
+5046 4576 4011 0.136238719327193 0.136238719327193
+5049 4578 3382 0.130912952312419 0.130912952312419
+5050 3382 4579 0.10420964387947 0.10420964387947
+5051 4579 4580 0.100328081358343 0.100328081358343
+5053 4581 4582 0.100688559836452 0.100688559836452
+5054 4582 1104 0.099555514740453 0.099555514740453
+5055 1104 4583 0.100465419279427 0.100465419279427
+5056 4583 4584 0.100511332021349 0.100511332021349
+5057 4584 4585 0.0999153218838928 0.0999153218838928
+5059 3498 4586 0.198271673699608 0.198271673699608
+5060 4586 4587 0.203313884946152 0.203313884946152
+5062 4588 3598 0.162446986671654 0.162446986671654
+5065 4590 4591 0.145581982651648 0.145581982651648
+20699 10909 10894 0.00288177410229764 0.00288177410229764
+5066 4591 4592 0.145302049591696 0.145302049591696
+5067 4592 2013 0.147364635735888 0.147364635735888
+5068 2013 4593 0.147376079792043 0.147376079792043
+5069 4593 4594 0.146031742389181 0.146031742389181
+5071 4595 4596 0.179128666689522 0.179128666689522
+5072 4596 4597 0.0491363059718978 0.0491363059718978
+5073 4597 4598 0.0534283507033442 0.0534283507033442
+5074 4598 4599 0.051162571237203 0.051162571237203
+5076 1025 3894 0.103299911807114 0.103299911807114
+5077 3894 4600 0.113012549862716 0.113012549862716
+5078 4600 4601 0.103445240313361 0.103445240313361
+5079 4601 4602 0.110216736617757 0.110216736617757
+5080 4602 4603 0.098537605440947 0.098537605440947
+5081 4603 4604 0.10689939615188 0.10689939615188
+5082 4604 4605 0.104556664577465 0.104556664577465
+5083 4605 4606 0.106796784548208 0.106796784548208
+5084 4606 2884 0.106044347623682 0.106044347623682
+5085 2884 4607 0.118270695339941 0.118270695339941
+6370 5524 5525 0.0492521789985846 0.0492521789985846
+5087 4608 4609 0.117800444995037 0.117800444995037
+5088 4609 4610 0.102641376464428 0.102641376464428
+5089 4610 4611 0.0494099001663831 0.0494099001663831
+5090 4611 4612 0.0461096147761951 0.0461096147761951
+5091 4612 4613 0.102709817700352 0.102709817700352
+5092 4613 4614 0.107788478157863 0.107788478157863
+5093 4614 4615 0.106309381819152 0.106309381819152
+5095 4618 4619 0.107514865026302 0.107514865026302
+5096 4619 4620 0.109618128547838 0.109618128547838
+5098 4621 4622 0.0890723635550207 0.0890723635550207
+5100 4623 4522 0.133190665745901 0.133190665745901
+5102 4624 4625 0.133658094916269 0.133658094916269
+5103 4625 4626 0.133656501053085 0.133656501053085
+5104 4626 1679 0.135152153872346 0.135152153872346
+5105 1679 4627 0.135024432224219 0.135024432224219
+5106 4627 2458 0.13515140493347 0.13515140493347
+5107 2458 3226 0.138004027692966 0.138004027692966
+5108 3226 4628 0.134323473833378 0.134323473833378
+5110 4629 4630 0.135446542572512 0.135446542572512
+19829 9519 10649 0.210072579992032 0.210072579992032
+5113 4632 4633 0.0947313767183171 0.0947313767183171
+5115 4634 4635 0.0557913419625853 0.0557913419625853
+5116 4635 4636 0.0662366225916723 0.0662366225916723
+5117 4636 4637 0.113593419326123 0.113593419326123
+5120 4639 4640 0.132773960128622 0.132773960128622
+5121 4640 2488 0.134241502580257 0.134241502580257
+5122 2488 2829 0.133449886794901 0.133449886794901
+5123 2829 1437 0.199500232175966 0.199500232175966
+5124 1437 4641 0.151025004831673 0.151025004831673
+5126 4642 114 0.107737280643715 0.107737280643715
+5127 114 4643 0.05007218616811 0.05007218616811
+5129 4644 4645 0.207043620739087 0.207043620739087
+5130 4645 1842 0.100003312332805 0.100003312332805
+5131 1842 2639 0.103345313678593 0.103345313678593
+5132 2639 4646 0.199597531872746 0.199597531872746
+5133 4646 4647 0.110338949764664 0.110338949764664
+5134 4647 4648 0.0862326024249021 0.0862326024249021
+5135 4648 4649 0.00885483385456902 0.00885483385456902
+5136 4649 4650 0.198772614686204 0.198772614686204
+5138 275 4651 0.385379364010995 0.385379364010995
+5139 4651 4652 0.41471692527459 0.41471692527459
+5140 4652 4653 0.0539741907357585 0.0539741907357585
+5141 4653 4654 0.022194548523775 0.022194548523775
+5142 4654 4206 0.207869157343365 0.207869157343365
+5144 4655 4656 0.134281006104493 0.134281006104493
+5145 4656 2404 0.0664009097985413 0.0664009097985413
+5146 2404 4287 0.0661523414774278 0.0661523414774278
+5147 4287 4657 0.134479579019433 0.134479579019433
+5149 4658 4659 0.0841530151799317 0.0841530151799317
+5150 4659 23 0.134991372812694 0.134991372812694
+5152 4098 4660 0.191146561014702 0.191146561014702
+5153 4660 4661 0.201619149588839 0.201619149588839
+5154 4661 4662 0.406108499193961 0.406108499193961
+5155 1948 2564 0.13210280054913 0.13210280054913
+5157 4663 388 0.102051980712047 0.102051980712047
+5159 1442 4664 0.0822712120832148 0.0822712120832148
+5160 4664 4665 0.119816357959701 0.119816357959701
+5161 4665 4666 0.204097543225869 0.204097543225869
+5162 4666 4667 0.203014171650501 0.203014171650501
+5164 4668 1869 0.212544115775742 0.212544115775742
+5165 1869 4183 0.200120502606903 0.200120502606903
+5167 4669 2615 0.177891060007606 0.177891060007606
+5169 4670 4671 0.124038366426802 0.124038366426802
+5171 2421 3232 0.143042998317255 0.143042998317255
+5173 4672 2028 0.132076698976753 0.132076698976753
+5174 2028 4673 0.145972981302679 0.145972981302679
+5175 4673 4674 0.125161327150552 0.125161327150552
+5177 3368 4675 0.102054188376367 0.102054188376367
+5178 4675 3714 0.0982241705421038 0.0982241705421038
+5179 3714 4676 0.103510692140635 0.103510692140635
+5181 4677 4678 0.0648734285683964 0.0648734285683964
+5182 4678 615 0.177689539069832 0.177689539069832
+5183 615 4679 0.176110549937417 0.176110549937417
+5184 4679 4680 0.173776320124656 0.173776320124656
+5186 4681 4682 0.184513059882878 0.184513059882878
+5187 4682 4685 0.175211932943401 0.175211932943401
+5189 4686 4687 0.349232193394911 0.349232193394911
+5191 1357 4688 0.13277378561117 0.13277378561117
+5193 4689 4690 0.459634230640815 0.459634230640815
+5194 4691 4692 0.0991279407871357 0.0991279407871357
+5195 4692 4693 0.0976485109623955 0.0976485109623955
+5197 4694 4695 0.0991197857977998 0.0991197857977998
+5198 4695 4696 0.10132403770971 0.10132403770971
+5199 4696 4697 0.0991849406088648 0.0991849406088648
+5201 1637 4698 0.104258284661182 0.104258284661182
+5202 4698 4215 0.0991281021081487 0.0991281021081487
+5203 4215 4699 0.0976569662788289 0.0976569662788289
+5204 4699 195 0.10058858208642 0.10058858208642
+5205 195 2924 0.0991416985641161 0.0991416985641161
+5206 2924 4700 0.0991366648288655 0.0991366648288655
+5207 4700 1462 0.100582700478246 0.100582700478246
+5208 1462 4701 0.102418321557774 0.102418321557774
+5212 4704 1872 0.0821525251365273 0.0821525251365273
+17295 10015 3501 0.20024191652091 0.20024191652091
+5214 1445 4705 0.199727367553687 0.199727367553687
+5215 4705 4706 0.203375496003776 0.203375496003776
+5216 4706 4707 0.201909493723453 0.201909493723453
+5218 4708 403 0.0454257390325356 0.0454257390325356
+5219 403 314 0.0562503326449317 0.0562503326449317
+5220 314 4709 0.11119492664509 0.11119492664509
+5222 4711 4170 0.194203357035268 0.194203357035268
+5223 4170 4712 0.208127290131148 0.208127290131148
+5224 4712 4713 0.198927723766577 0.198927723766577
+5225 4713 4714 0.204935128047674 0.204935128047674
+5226 4714 4715 0.188520271439654 0.188520271439654
+5227 4715 3793 0.199712422815397 0.199712422815397
+5228 3793 4716 0.152617432717184 0.152617432717184
+5229 4716 944 0.17742675257367 0.17742675257367
+5230 944 2228 0.183696049186415 0.183696049186415
+5231 2228 4717 0.162619098965448 0.162619098965448
+5232 4717 4718 0.189722276081874 0.189722276081874
+5233 4718 4719 0.171945095410338 0.171945095410338
+5234 4719 4720 0.177429725627003 0.177429725627003
+5235 4720 4721 0.102690706769844 0.102690706769844
+5236 4721 4722 0.0746285232074726 0.0746285232074726
+5237 4722 668 0.00411462210691817 0.00411462210691817
+5238 668 4723 0.00380364497345728 0.00380364497345728
+5240 4724 4604 0.175355420651263 0.175355420651263
+5242 1146 875 0.136296969384937 0.136296969384937
+5244 4463 2783 0.133890793284356 0.133890793284356
+5245 2783 4725 0.132805963492264 0.132805963492264
+5246 4725 4726 0.129702593554695 0.129702593554695
+5247 4726 4727 0.147549019452937 0.147549019452937
+5249 4728 4729 0.134556994040934 0.134556994040934
+5250 4729 4730 0.00403637583696172 0.00403637583696172
+5251 4730 4731 0.00537071495727797 0.00537071495727797
+5252 4731 4732 0.135502150823282 0.135502150823282
+5253 4732 4733 0.139193822038205 0.139193822038205
+5254 4733 820 0.139638598300339 0.139638598300339
+5255 820 3561 0.13948292881931 0.13948292881931
+5256 3561 4734 0.140172337301063 0.140172337301063
+5257 4734 4339 0.137170074560425 0.137170074560425
+5258 4339 4735 0.138982548276464 0.138982548276464
+5259 4735 3054 0.142752059367152 0.142752059367152
+5260 3054 4736 0.133100340642693 0.133100340642693
+5261 4736 4737 0.00492593525024253 0.00492593525024253
+5263 4738 3350 0.0528651873534889 0.0528651873534889
+5264 3350 4739 0.10426363885095 0.10426363885095
+5265 4739 4740 0.102034414473958 0.102034414473958
+14766 5462 7420 0.173120091654239 0.173120091654239
+5266 4740 2059 0.102862063735102 0.102862063735102
+5267 2059 2645 0.103513208640623 0.103513208640623
+5268 2645 4111 0.104240888550753 0.104240888550753
+5270 4741 4742 0.102769926646245 0.102769926646245
+5271 4742 4743 0.104240916363933 0.104240916363933
+5272 4743 3452 0.105180194746781 0.105180194746781
+5273 3452 4744 0.10036641032569 0.10036641032569
+5274 4744 3882 0.105711927066125 0.105711927066125
+5275 3882 845 0.10371038656759 0.10371038656759
+5276 845 4745 0.104689829390385 0.104689829390385
+5277 4745 4746 0.0469848225431211 0.0469848225431211
+5279 2610 4747 0.106209148179485 0.106209148179485
+5280 4747 4748 0.0529916423937814 0.0529916423937814
+5282 4749 4750 0.0385383772070312 0.0385383772070312
+5283 4750 966 0.102580898845139 0.102580898845139
+5285 990 4751 0.0998368598850094 0.0998368598850094
+5286 4751 4752 0.0507426333200071 0.0507426333200071
+5287 4752 4753 0.0483650078238011 0.0483650078238011
+5288 4753 1987 0.0507354905741477 0.0507354905741477
+5289 1987 4754 0.0483663202205498 0.0483663202205498
+5290 4754 446 0.051479549664384 0.051479549664384
+5291 446 4712 0.0483577654581108 0.0483577654581108
+5292 4712 4755 0.101297109225192 0.101297109225192
+5293 4755 4756 0.0117741801721385 0.0117741801721385
+5294 4756 4757 0.0826634733388868 0.0826634733388868
+5295 4757 4758 0.0342509974874732 0.0342509974874732
+5296 4758 4759 0.0175268141449879 0.0175268141449879
+5297 4759 4760 0.0234785463070149 0.0234785463070149
+5298 4760 4761 0.0484972333709921 0.0484972333709921
+5299 4761 3126 0.0271800985558075 0.0271800985558075
+5300 3126 3148 0.0183600177870361 0.0183600177870361
+5301 3148 3143 0.0330468719768483 0.0330468719768483
+5302 3143 4762 0.0646645186035183 0.0646645186035183
+5303 4762 3915 0.0595606911380279 0.0595606911380279
+5304 3915 1052 0.123917065152439 0.123917065152439
+5305 1052 4399 0.111768087862579 0.111768087862579
+5306 4399 4763 0.0469346079446244 0.0469346079446244
+5308 4764 4765 0.103730937833073 0.103730937833073
+5311 3155 4767 0.101587564129846 0.101587564129846
+5312 4767 4768 0.101450282305199 0.101450282305199
+5313 4768 4769 0.102136172096814 0.102136172096814
+5314 4769 4770 0.0492382919352757 0.0492382919352757
+5316 4771 4772 0.100332506519832 0.100332506519832
+5317 4772 4773 0.0490390048099826 0.0490390048099826
+5318 4773 989 0.0495269165196006 0.0495269165196006
+5320 4774 4775 0.110656269548842 0.110656269548842
+5321 4775 4776 0.0922568863786424 0.0922568863786424
+5322 4776 4777 0.0968744294941002 0.0968744294941002
+5323 4777 4778 0.0933681364009737 0.0933681364009737
+5324 4778 2017 0.096243154582377 0.096243154582377
+5325 2017 2007 0.0302079551181684 0.0302079551181684
+5326 2007 4779 0.0612998845077431 0.0612998845077431
+5327 4779 2763 0.0939372654248904 0.0939372654248904
+5328 2763 4782 0.0939831368366747 0.0939831368366747
+5329 4782 2267 0.0946761779636641 0.0946761779636641
+5330 2267 3596 0.0957452269737562 0.0957452269737562
+5332 4783 2096 0.0938496563543502 0.0938496563543502
+5333 2096 4784 0.0942585077375453 0.0942585077375453
+5334 4784 4785 0.0947863905236846 0.0947863905236846
+5335 4785 2332 0.0940516760171392 0.0940516760171392
+6607 5694 5695 0.0154325675938591 0.0154325675938591
+5337 4089 4787 0.198005363606862 0.198005363606862
+5339 4788 4789 0.404049086255387 0.404049086255387
+5340 4790 119 0.0976422064224313 0.0976422064224313
+5341 119 4791 0.0958834096516534 0.0958834096516534
+5342 4791 2312 0.0465244099907656 0.0465244099907656
+5344 4792 2484 0.133450471266853 0.133450471266853
+5345 2484 2823 0.13353766665554 0.13353766665554
+5346 2823 1414 0.132023734494372 0.132023734494372
+5347 1414 1354 0.131894209152808 0.131894209152808
+5348 1354 4793 0.0769784662870068 0.0769784662870068
+5350 4794 4795 0.0387509077758481 0.0387509077758481
+5351 4795 2952 0.134935498636386 0.134935498636386
+5352 2952 4796 0.136197421914805 0.136197421914805
+5353 4796 4797 0.129998438382796 0.129998438382796
+5354 4797 4798 0.134935065412598 0.134935065412598
+5356 2635 4799 0.200962590925039 0.200962590925039
+5357 4799 4800 0.183883066303689 0.183883066303689
+5358 4801 4802 0.0508168176081005 0.0508168176081005
+5359 4802 4516 0.0829526060571819 0.0829526060571819
+6631 5709 5710 0.263510763458761 0.263510763458761
+5360 4516 4803 0.133849874797103 0.133849874797103
+5361 4803 4804 0.135491260752817 0.135491260752817
+5363 4805 1674 0.127474088546245 0.127474088546245
+5364 1674 4806 0.138137679733803 0.138137679733803
+5366 4807 2455 0.134491411129426 0.134491411129426
+5367 2455 3223 0.138294178425788 0.138294178425788
+5369 4808 4809 0.133134706345954 0.133134706345954
+5370 4809 4810 0.135569856870466 0.135569856870466
+5371 4810 4811 0.134368341783309 0.134368341783309
+5372 4811 4812 0.133035455825063 0.133035455825063
+5374 4813 4814 0.201931453578911 0.201931453578911
+5376 123 4815 0.0586808902574419 0.0586808902574419
+5377 1608 1158 0.0531893778682351 0.0531893778682351
+5378 1158 4816 0.0522853387259307 0.0522853387259307
+5379 4816 4817 0.0528559175260399 0.0528559175260399
+5380 4817 4818 0.0526139267336242 0.0526139267336242
+5382 4819 4820 0.146802081972091 0.146802081972091
+5383 4820 4821 0.146390170205012 0.146390170205012
+5384 4821 4822 0.0767990953688077 0.0767990953688077
+5386 3289 4824 0.0733337823028737 0.0733337823028737
+5387 4824 4825 0.151650147757225 0.151650147757225
+5389 97 3502 0.20326475820455 0.20326475820455
+5390 3502 4826 0.200021830134173 0.200021830134173
+5391 4826 4827 0.204558997826367 0.204558997826367
+5392 4827 4828 0.201476703732084 0.201476703732084
+5394 4829 4830 0.558813274805265 0.558813274805265
+5395 3635 1894 0.33996915967689 0.33996915967689
+5396 1894 4831 0.234959433855918 0.234959433855918
+5397 4831 3288 0.0548366602436518 0.0548366602436518
+5399 3879 4832 0.175154251791819 0.175154251791819
+5400 4832 3070 0.175288290924905 0.175288290924905
+5402 4833 4834 0.239573627081124 0.239573627081124
+5404 3962 4835 0.197156843459588 0.197156843459588
+5405 4835 4836 0.094417767822886 0.094417767822886
+5406 4836 388 0.087554257922167 0.087554257922167
+5407 388 1384 0.157773442883539 0.157773442883539
+5408 1384 4837 0.0895725883825947 0.0895725883825947
+5409 4837 325 0.282856295391869 0.282856295391869
+6684 2175 5744 0.101148378971839 0.101148378971839
+5410 325 4838 0.0837092029011689 0.0837092029011689
+5411 4838 4840 0.0963811879451104 0.0963811879451104
+5412 4840 4841 0.421707851811283 0.421707851811283
+5415 1486 144 0.196859858102641 0.196859858102641
+5417 2194 4843 0.069400098080988 0.069400098080988
+5418 4843 4844 0.128982538897387 0.128982538897387
+5420 4845 4846 0.127385402005959 0.127385402005959
+5421 4846 4847 0.0485354577138893 0.0485354577138893
+5422 4847 2197 0.0570536883887032 0.0570536883887032
+5423 2197 2198 0.0030293307914236 0.0030293307914236
+5425 2191 4848 0.228805525488878 0.228805525488878
+5427 4281 2319 0.149466526420244 0.149466526420244
+5428 2319 4849 0.264070561759483 0.264070561759483
+5430 4850 4851 0.124106376215018 0.124106376215018
+5432 4852 4853 0.107373531206162 0.107373531206162
+5433 4853 4854 0.108589473424165 0.108589473424165
+5434 4854 4855 0.105767467639199 0.105767467639199
+5435 4855 4856 0.0608956612626877 0.0608956612626877
+5436 4856 4857 0.0536676140413411 0.0536676140413411
+5438 4858 4859 0.053767328384899 0.053767328384899
+5439 4859 4860 0.0517270733374725 0.0517270733374725
+5440 4860 4861 0.0506527251945452 0.0506527251945452
+5441 4861 4862 0.0500931909858678 0.0500931909858678
+5442 4862 4863 0.0473439516711298 0.0473439516711298
+5444 4864 4865 0.0521797446029276 0.0521797446029276
+17093 9466 677 0.17846620541914 0.17846620541914
+17094 677 3719 0.359015096413943 0.359015096413943
+5446 4866 4867 0.0492134016241179 0.0492134016241179
+5447 4867 4868 0.0506066180898924 0.0506066180898924
+5448 4868 4869 0.0483319487475015 0.0483319487475015
+5449 4869 4870 0.0507611555520018 0.0507611555520018
+5450 4870 980 0.0494869052239766 0.0494869052239766
+5451 980 4871 0.0481249293188332 0.0481249293188332
+5452 4871 4872 0.0462779203242365 0.0462779203242365
+20332 10741 10746 0.00836528320993219 0.00836528320993219
+5453 4872 4873 0.0504026300689218 0.0504026300689218
+5454 4873 4874 0.0485554829183078 0.0485554829183078
+5455 4874 4875 0.0534696334958417 0.0534696334958417
+6731 5782 5783 0.00425137254991275 0.00425137254991275
+5456 4875 4876 0.0484412552758981 0.0484412552758981
+5458 4877 4717 0.0471074620934606 0.0471074620934606
+5459 4717 4878 0.132709338239974 0.132709338239974
+5461 4879 3888 0.0983476297531957 0.0983476297531957
+5462 3888 1018 0.103492590132028 0.103492590132028
+5463 1018 4880 0.0514136092144711 0.0514136092144711
+5464 4880 4881 0.0525893579522226 0.0525893579522226
+5465 4881 3721 0.0533162444253223 0.0533162444253223
+5466 3721 4882 0.0519823122660099 0.0519823122660099
+5467 4882 4883 0.0522344210852062 0.0522344210852062
+5468 4883 4884 0.0505876398657049 0.0505876398657049
+5469 4884 3336 0.0998762512001326 0.0998762512001326
+5470 3336 4885 0.0991185753255084 0.0991185753255084
+5471 4885 4886 0.0963539908668941 0.0963539908668941
+5472 4886 4887 0.0885379825241657 0.0885379825241657
+5473 4887 4888 0.0119373214867398 0.0119373214867398
+5474 4888 2056 0.0843994384439808 0.0843994384439808
+5475 2056 4889 0.0133131298111966 0.0133131298111966
+5476 4889 2662 0.0974967707832978 0.0974967707832978
+5477 2662 4135 0.0954371783119999 0.0954371783119999
+5479 4890 4891 0.0937877451974264 0.0937877451974264
+5480 4891 4892 0.0948153596322219 0.0948153596322219
+5482 3459 4893 0.0478001833146321 0.0478001833146321
+5484 4894 4895 0.0479027082737571 0.0479027082737571
+5485 4895 4896 0.0478122905377956 0.0478122905377956
+5486 4896 859 0.0923773172496592 0.0923773172496592
+5487 859 454 0.0453886692992681 0.0453886692992681
+5488 454 4897 0.0453208554339034 0.0453208554339034
+5489 4897 458 0.0453479211780813 0.0453479211780813
+5492 4899 4900 0.0139467367099566 0.0139467367099566
+5493 4900 4901 0.0360421538971705 0.0360421538971705
+5494 4901 4902 0.0578381423218813 0.0578381423218813
+5495 4902 4903 0.00552719826630604 0.00552719826630604
+5496 4903 4904 0.0875768226675012 0.0875768226675012
+5497 4904 4905 0.0943606682528015 0.0943606682528015
+5498 4905 4906 0.0967192189659533 0.0967192189659533
+5499 4906 4907 0.098185525305783 0.098185525305783
+5501 4908 2748 0.100541646868693 0.100541646868693
+5502 2748 4909 0.0966275722613029 0.0966275722613029
+5503 4909 4910 0.0992689355907326 0.0992689355907326
+5504 4910 4911 0.101479918551735 0.101479918551735
+6779 5822 3617 0.0484295076881561 0.0484295076881561
+5505 4911 4912 0.0969181343296834 0.0969181343296834
+5507 2121 4913 0.0979459294550903 0.0979459294550903
+5508 4913 4914 0.0979869433285632 0.0979869433285632
+5509 4914 4915 0.197888030311115 0.197888030311115
+5510 3113 4916 0.205521796352519 0.205521796352519
+5511 4916 4917 0.213014583006008 0.213014583006008
+5514 1222 4919 0.098914174918745 0.098914174918745
+5516 4920 1622 0.0585646429204787 0.0585646429204787
+5517 1622 4921 0.122620409777708 0.122620409777708
+5518 4921 4922 0.218423462474676 0.218423462474676
+5520 2815 4923 0.167710746898946 0.167710746898946
+5521 4923 4924 0.0980438120983448 0.0980438120983448
+5523 4677 4925 0.0746274432259007 0.0746274432259007
+5525 4926 617 0.0797365701263369 0.0797365701263369
+5526 617 4927 0.125187481931903 0.125187481931903
+5527 4927 4928 0.0778528067673226 0.0778528067673226
+5528 4928 4929 0.199074396611122 0.199074396611122
+5532 4932 4933 0.00438034032424269 0.00438034032424269
+5533 4933 4934 0.0884200199820011 0.0884200199820011
+5534 4934 4935 0.245891005874257 0.245891005874257
+5535 4935 4936 0.142250751986944 0.142250751986944
+5536 4936 4937 0.0173695104401488 0.0173695104401488
+5538 4938 4939 0.203545296385478 0.203545296385478
+5540 1358 4940 0.12982829991663 0.12982829991663
+5543 4079 2536 0.319784261068233 0.319784261068233
+5545 4926 616 0.0701041786984163 0.0701041786984163
+5546 616 4942 0.177022653633518 0.177022653633518
+5547 4942 4943 0.172063039899941 0.172063039899941
+5549 4944 4945 0.149558307265757 0.149558307265757
+5550 4945 3715 0.0517838841978355 0.0517838841978355
+5551 3715 4948 0.104024626392335 0.104024626392335
+5552 4948 4949 0.174823058982553 0.174823058982553
+5553 4949 2616 0.177668474307762 0.177668474307762
+5554 2616 4950 0.0535070014349516 0.0535070014349516
+5555 4950 4951 0.124049062817869 0.124049062817869
+5556 4951 4952 0.174777210980769 0.174777210980769
+5557 4952 4953 0.127620790205472 0.127620790205472
+5558 4953 4954 0.0551759306609038 0.0551759306609038
+5559 4954 4955 0.176133032867453 0.176133032867453
+5560 4955 4956 0.177512737206305 0.177512737206305
+5562 4406 4957 0.277669971565855 0.277669971565855
+5564 4958 4959 0.199658223163124 0.199658223163124
+5566 1598 1655 0.160087686125488 0.160087686125488
+5568 4960 1592 0.199275601482479 0.199275601482479
+5569 1592 1643 0.201203252625689 0.201203252625689
+5571 4961 4369 0.0888591183295397 0.0888591183295397
+5572 4369 1450 0.193863730230332 0.193863730230332
+5573 1450 4962 0.20633144077854 0.20633144077854
+5575 4963 4964 0.865026893272847 0.865026893272847
+5577 4966 4413 0.196777109156883 0.196777109156883
+5578 4413 4967 0.224682445917882 0.224682445917882
+5579 4967 4304 0.221012468473467 0.221012468473467
+5582 4969 4970 0.107069922554974 0.107069922554974
+5583 4970 4972 0.0948495530272937 0.0948495530272937
+5586 4269 4973 0.080198786030782 0.080198786030782
+5587 4974 4767 0.0973607348320062 0.0973607348320062
+5588 4767 4975 0.179413565332346 0.179413565332346
+5589 4975 4976 0.169917329199621 0.169917329199621
+5590 4976 4977 0.181948721536683 0.181948721536683
+5591 4977 3805 0.200239828466703 0.200239828466703
+5592 3805 4978 0.152216995314545 0.152216995314545
+5594 3620 4979 0.203157103314032 0.203157103314032
+5595 4979 2366 0.112909559408727 0.112909559408727
+5596 2366 4147 0.176980531073324 0.176980531073324
+5597 4147 4980 0.0231632311908037 0.0231632311908037
+5599 4981 4982 0.122490029160582 0.122490029160582
+5600 4982 4983 0.198021379234554 0.198021379234554
+5602 4831 3290 0.14433688220634 0.14433688220634
+5604 4248 1783 0.203809923376497 0.203809923376497
+5605 1783 4984 0.197266471488896 0.197266471488896
+5606 4984 4985 0.203487572214077 0.203487572214077
+5607 4985 4986 0.197825547248631 0.197825547248631
+5608 4986 4987 2.41542068401941 2.41542068401941
+5610 4989 4990 0.0962172324904451 0.0962172324904451
+5611 4990 3077 0.102766134165042 0.102766134165042
+5613 4991 322 0.0217232354992756 0.0217232354992756
+5614 322 4992 0.0357866971477297 0.0357866971477297
+5615 4992 4993 0.0111993418256192 0.0111993418256192
+5618 4994 3114 0.0796924849623814 0.0796924849623814
+5619 3114 4995 0.20745656668227 0.20745656668227
+5621 4996 4997 0.202175143533063 0.202175143533063
+5622 4997 4998 0.201486340865611 0.201486340865611
+5623 4998 4999 0.201289887939002 0.201289887939002
+5624 4999 5000 0.201274447612783 0.201274447612783
+5625 5000 5001 0.402211090441065 0.402211090441065
+5627 1058 5002 0.0523412516567849 0.0523412516567849
+5628 5002 5003 0.185331167798599 0.185331167798599
+5629 5003 3655 0.0518833582791727 0.0518833582791727
+5632 5004 4344 0.139169147250759 0.139169147250759
+5633 4344 5005 0.13717907888566 0.13717907888566
+5634 5005 3044 0.136502893019444 0.136502893019444
+5635 3044 5006 0.140687498507325 0.140687498507325
+5636 5006 5007 0.0045870406114538 0.0045870406114538
+5637 5007 5008 0.137903992793689 0.137903992793689
+5638 5008 1165 0.1390388743026 0.1390388743026
+5640 885 4470 0.139218366547603 0.139218366547603
+5641 4470 2792 0.134293285442621 0.134293285442621
+5642 2792 5009 0.131431211174063 0.131431211174063
+5644 5012 739 0.391173244940122 0.391173244940122
+5645 739 1559 0.139743785900176 0.139743785900176
+5646 1559 4275 0.141288921951359 0.141288921951359
+5647 4275 5013 0.120791048813674 0.120791048813674
+5648 5013 5014 0.0105624832499152 0.0105624832499152
+5649 5014 5015 0.0438951959332696 0.0438951959332696
+5650 5015 5016 0.160752036464104 0.160752036464104
+5652 5017 2345 0.117820938280592 0.117820938280592
+5654 4151 1536 0.0491815160552347 0.0491815160552347
+5655 1536 4765 0.126517768209698 0.126517768209698
+5656 4765 5019 0.175921623374803 0.175921623374803
+5657 5019 5020 0.0764689744574068 0.0764689744574068
+5658 5020 5021 0.102480731304504 0.102480731304504
+5659 5021 1190 0.167860102396295 0.167860102396295
+5660 1190 5022 0.022286088803945 0.022286088803945
+5661 5022 3787 0.1996828431131 0.1996828431131
+5662 3787 5023 0.154628071522294 0.154628071522294
+5687 5040 1763 0.201152967219908 0.201152967219908
+5663 5023 2252 0.333559522830682 0.333559522830682
+5664 2252 5024 0.0290309763494638 0.0290309763494638
+5665 5024 4884 0.148258019557603 0.148258019557603
+5666 4884 5025 0.194698119191853 0.194698119191853
+5667 5025 5026 0.176313474196241 0.176313474196241
+5668 5026 5027 0.192373972114261 0.192373972114261
+5669 5027 679 0.169442185038323 0.169442185038323
+5672 5029 4596 0.157086480064782 0.157086480064782
+5674 5030 5031 0.105448542276863 0.105448542276863
+5677 5032 5034 0.00520403492524916 0.00520403492524916
+5678 5034 5035 0.00442576451440448 0.00442576451440448
+5679 5035 5036 0.135764863246336 0.135764863246336
+5681 5037 813 0.139038307562208 0.139038307562208
+5682 813 3554 0.152271167865336 0.152271167865336
+5684 5038 5039 0.16037248823512 0.16037248823512
+5686 2368 5040 0.131780679502724 0.131780679502724
+5689 5041 5042 0.178235693488978 0.178235693488978
+5690 5042 663 0.00303458618342364 0.00303458618342364
+5691 663 5043 0.17896901951739 0.17896901951739
+5692 5043 4608 0.175810797673871 0.175810797673871
+5693 4608 5044 0.116588664300191 0.116588664300191
+5694 5044 5045 0.0312349930548565 0.0312349930548565
+5695 5045 3670 0.147012417470316 0.147012417470316
+5697 5046 4162 0.0660609059196111 0.0660609059196111
+5698 4162 4771 0.262084611870375 0.262084611870375
+5699 4771 5047 0.17859412824458 0.17859412824458
+5700 5047 5048 0.1691727396202 0.1691727396202
+5701 5048 5049 0.184472749838431 0.184472749838431
+5702 5049 3801 0.20027318311003 0.20027318311003
+5703 3801 5050 0.154503416019497 0.154503416019497
+5704 5050 932 0.176703352691921 0.176703352691921
+5706 2217 4867 0.160601247675141 0.160601247675141
+5707 4867 5051 0.19278749199245 0.19278749199245
+5708 5051 5052 0.171738832244774 0.171738832244774
+5709 5052 5053 0.125039053144726 0.125039053144726
+5710 5053 5054 0.0536646579213684 0.0536646579213684
+5712 2413 5055 0.0539797182371141 0.0539797182371141
+5713 5055 5056 0.0555511846145791 0.0555511846145791
+5714 5056 5057 0.0564985233788716 0.0564985233788716
+5715 5058 5059 0.0116997793337229 0.0116997793337229
+5716 5059 369 0.121769364056454 0.121769364056454
+5717 369 1558 0.13936986171661 0.13936986171661
+5718 1558 738 0.139138948896028 0.139138948896028
+5719 738 5060 0.392796141218442 0.392796141218442
+5721 5061 5062 0.12142771399357 0.12142771399357
+5722 5062 5063 0.0553958184996893 0.0553958184996893
+5723 5063 4434 0.0566894209705876 0.0566894209705876
+5724 4434 2921 0.313688166061769 0.313688166061769
+5726 5062 422 0.127478280907992 0.127478280907992
+5727 422 5063 0.108364291033736 0.108364291033736
+5729 5066 5067 0.177224259300569 0.177224259300569
+5730 5067 1319 0.176633232309172 0.176633232309172
+5731 1319 1375 0.177680959479223 0.177680959479223
+5732 1375 5068 0.0602164425054291 0.0602164425054291
+5733 5068 288 0.02427348670764 0.02427348670764
+5734 288 5069 0.0611513015273674 0.0611513015273674
+5735 5069 4693 0.113806398942027 0.113806398942027
+5736 4693 5070 0.156397394554719 0.156397394554719
+5738 1493 182 0.220724132280051 0.220724132280051
+5739 182 1710 0.202718600976859 0.202718600976859
+5742 5072 5073 0.0235981208081862 0.0235981208081862
+5743 5073 5074 0.173346209176791 0.173346209176791
+5744 5074 5075 0.183560584904857 0.183560584904857
+5746 5076 5077 0.201201481229781 0.201201481229781
+5747 5077 5078 0.196158089713223 0.196158089713223
+5750 5080 304 0.450334409862505 0.450334409862505
+5755 5083 4179 0.23271473726582 0.23271473726582
+5757 5084 5085 0.100586570089845 0.100586570089845
+5758 5085 3712 0.0974495496468689 0.0974495496468689
+5759 3712 5088 0.107190885250137 0.107190885250137
+5761 1840 2612 0.176114771519943 0.176114771519943
+5762 2612 5089 0.0532850041931226 0.0532850041931226
+5763 5089 5090 0.123805391077944 0.123805391077944
+5764 5090 5091 0.0921824286504112 0.0921824286504112
+5765 5091 5092 0.0849604613604367 0.0849604613604367
+5767 5093 4077 0.0433656831085181 0.0433656831085181
+5768 4077 5094 0.807132686207363 0.807132686207363
+5769 5092 5095 0.184721084541763 0.184721084541763
+5770 5095 5096 0.112121546650621 0.112121546650621
+5771 5096 5097 0.012405493892182 0.012405493892182
+12067 8534 8532 0.0417307390941294 0.0417307390941294
+5774 5099 5100 0.195348601056539 0.195348601056539
+5775 5100 5101 1.61385249170336 1.61385249170336
+5776 4334 5102 0.201130889411283 0.201130889411283
+5778 5103 2576 0.52830768269949 0.52830768269949
+5782 1145 874 0.139433776255124 0.139433776255124
+5783 874 4462 0.13822164303959 0.13822164303959
+5784 4462 2782 0.134807869792579 0.134807869792579
+5786 5108 5109 0.136531475414142 0.136531475414142
+5787 5110 5111 0.166792389966844 0.166792389966844
+5788 5111 5112 0.0444779706577198 0.0444779706577198
+5789 5113 4169 0.194541086455447 0.194541086455447
+5790 4169 4754 0.20739031390672 0.20739031390672
+5791 4754 5114 0.19819923300798 0.19819923300798
+5792 5114 5115 0.205574207946515 0.205574207946515
+5793 5115 5116 0.18969176296687 0.18969176296687
+5795 3795 5117 0.153449380032665 0.153449380032665
+5796 5117 942 0.178860285004076 0.178860285004076
+5797 942 2226 0.181510674241125 0.181510674241125
+5798 2226 4876 0.162456954471732 0.162456954471732
+5799 4876 5118 0.192077540660028 0.192077540660028
+5800 5118 5119 0.169639680241679 0.169639680241679
+5801 5119 5120 0.176431836448169 0.176431836448169
+5805 5123 5124 0.138482206224941 0.138482206224941
+5807 5125 5126 0.196467690434778 0.196467690434778
+5809 5127 5128 0.177236972666439 0.177236972666439
+5810 5128 666 0.00411429224620583 0.00411429224620583
+5811 666 5129 0.00398081510277296 0.00398081510277296
+5812 5129 5130 0.0219503048251099 0.0219503048251099
+5813 5130 5131 0.152662411900591 0.152662411900591
+5814 5131 4605 0.174323615227633 0.174323615227633
+5815 4605 3691 0.233536002014651 0.233536002014651
+5816 3691 5132 0.0578224768050087 0.0578224768050087
+5817 4901 5133 0.0573209620432963 0.0573209620432963
+5819 5134 5135 0.102452742724465 0.102452742724465
+5820 5135 5136 0.101180875593513 0.101180875593513
+5821 5136 5137 0.0993172550227887 0.0993172550227887
+5822 5137 5138 0.0973174615516026 0.0973174615516026
+5823 5138 5139 0.0592813821516456 0.0592813821516456
+5824 5139 5140 0.0572628386692297 0.0572628386692297
+5825 5140 5141 0.0908568563064313 0.0908568563064313
+5826 5141 5142 0.108696465338082 0.108696465338082
+5827 5142 5143 0.117446225438567 0.117446225438567
+5828 5143 5144 0.115052510861077 0.115052510861077
+5831 2118 5146 0.132113404680538 0.132113404680538
+5832 5146 5147 0.0733188328504862 0.0733188328504862
+5833 5147 5148 0.0348417204507369 0.0348417204507369
+5860 3449 5168 0.101446764740706 0.101446764740706
+5835 4903 5149 0.0928559279225574 0.0928559279225574
+5836 5149 5150 0.101009488468598 0.101009488468598
+5837 5150 5151 0.101494340144734 0.101494340144734
+12222 8597 8598 0.00932829170104997 0.00932829170104997
+12223 8598 8599 0.0244824521093208 0.0244824521093208
+5838 5151 5152 0.100261540674961 0.100261540674961
+5839 5152 5153 0.221241395423211 0.221241395423211
+5840 5153 2236 0.0908651857276488 0.0908651857276488
+5841 2236 5154 0.10116756602451 0.10116756602451
+5842 5154 5155 0.114191873365342 0.114191873365342
+5843 5155 5156 0.113038208940698 0.113038208940698
+5844 5156 2119 0.121856512679973 0.121856512679973
+5845 2119 5157 0.125333022212683 0.125333022212683
+5846 5157 5158 0.121389833666029 0.121389833666029
+5847 5158 5159 0.0390946612702668 0.0390946612702668
+5850 5160 2133 0.195466658548015 0.195466658548015
+5854 5163 2476 0.202535777887142 0.202535777887142
+5856 5164 5165 0.0156138568041909 0.0156138568041909
+5857 5165 5166 0.100589160353206 0.100589160353206
+5858 5166 5167 0.104247833927165 0.104247833927165
+5859 5167 3449 0.104250422099089 0.104250422099089
+5861 5168 3879 0.102808830950679 0.102808830950679
+5862 3879 841 0.103522696858037 0.103522696858037
+5863 841 5169 0.102719682704035 0.102719682704035
+5864 5169 5170 0.0474110701835865 0.0474110701835865
+5866 5171 5172 0.106685417852495 0.106685417852495
+5867 5172 5173 0.0515553847760644 0.0515553847760644
+5868 5173 4988 0.0505202363313306 0.0505202363313306
+17163 5107 1802 0.195280530173469 0.195280530173469
+5869 4988 962 0.105015490507221 0.105015490507221
+5870 962 4141 0.100506431839732 0.100506431839732
+5871 4141 3161 0.101307790482977 0.101307790482977
+5872 3161 3620 0.0948143449717999 0.0948143449717999
+5873 3620 1826 0.102953991217456 0.102953991217456
+5874 1826 4334 0.0954488426398559 0.0954488426398559
+5876 5174 1763 0.050455869495655 0.050455869495655
+5877 1763 4616 0.0477367574799653 0.0477367574799653
+5878 4616 5175 0.0514444022852647 0.0514444022852647
+5879 5175 4306 0.0486177089369888 0.0486177089369888
+5880 4306 994 0.0512355770161431 0.0512355770161431
+5881 994 4309 0.0460747606120818 0.0460747606120818
+5882 4309 2915 0.0558782384698847 0.0558782384698847
+5883 2915 2916 0.0205535416898751 0.0205535416898751
+5909 5190 5191 0.0526195895778432 0.0526195895778432
+5887 587 588 0.0168822192889414 0.0168822192889414
+5888 588 5177 0.110837670707715 0.110837670707715
+5889 5177 1399 0.106464576541899 0.106464576541899
+5890 1399 5178 0.00837287829367045 0.00837287829367045
+5891 5178 5179 0.0973274399582508 0.0973274399582508
+5892 5179 5180 0.0713882284598403 0.0713882284598403
+5893 5180 3386 0.0465173628433736 0.0465173628433736
+5894 3386 5181 0.0466294338105993 0.0466294338105993
+5895 5181 5182 0.0461505269276214 0.0461505269276214
+5896 5182 2801 0.0476762891770853 0.0476762891770853
+5897 2801 5183 0.0462906353191723 0.0462906353191723
+5898 5183 5184 0.0462689908237556 0.0462689908237556
+5899 5184 5185 0.0466469950505128 0.0466469950505128
+5900 5185 5186 0.0471146492559741 0.0471146492559741
+5901 5186 5187 0.045278465180898 0.045278465180898
+5902 5187 1570 0.0464406557272166 0.0464406557272166
+5903 1570 1095 0.0464745881593838 0.0464745881593838
+5904 1095 5188 0.0475893065083787 0.0475893065083787
+7153 6059 6060 0.0479619125752321 0.0479619125752321
+5905 5188 5189 0.0454253204645735 0.0454253204645735
+5906 5189 1538 0.0460968804258839 0.0460968804258839
+5907 1538 3854 0.04697776477365 0.04697776477365
+5908 3854 5190 0.0530473283120516 0.0530473283120516
+5911 5192 5193 0.0515193353777817 0.0515193353777817
+5913 5194 5195 0.0687779636933597 0.0687779636933597
+5914 5195 5090 0.141994718426853 0.141994718426853
+5915 5090 5196 0.112634336237225 0.112634336237225
+5916 5196 5197 0.0575743623042855 0.0575743623042855
+5917 5197 4671 0.100935765794822 0.100935765794822
+5918 4671 4951 0.0999693670841652 0.0999693670841652
+5919 4951 5198 0.0511858126232579 0.0511858126232579
+5921 5199 5200 0.0499779255146796 0.0499779255146796
+5922 5200 5201 0.0499920394458099 0.0499920394458099
+5923 5201 5202 0.0457134833999458 0.0457134833999458
+5924 5202 5203 0.0421294446780762 0.0421294446780762
+5925 5203 3957 0.137188173752203 0.137188173752203
+5926 3957 5204 0.0640931318030062 0.0640931318030062
+5927 5204 5205 0.0544857674041209 0.0544857674041209
+5928 5205 5206 0.0521757463337926 0.0521757463337926
+5929 5207 5208 0.0487730947754618 0.0487730947754618
+5930 5208 5209 0.0493635031974476 0.0493635031974476
+5932 5211 5212 0.207489392195287 0.207489392195287
+5933 5212 4646 0.099390326989904 0.099390326989904
+5935 3645 4555 0.0986517427687235 0.0986517427687235
+5937 5213 5214 0.322259629928437 0.322259629928437
+5938 5215 5216 0.143730822686287 0.143730822686287
+5939 5216 5217 0.0599126619694891 0.0599126619694891
+5940 5217 5218 0.202016907937226 0.202016907937226
+5942 5219 5220 0.186576382334646 0.186576382334646
+5944 5221 5222 0.13343391197395 0.13343391197395
+5945 5222 2558 0.200662474351154 0.200662474351154
+5946 2558 5224 0.208372800213582 0.208372800213582
+5947 5225 4431 0.102067442103011 0.102067442103011
+5948 4431 3711 0.0989108306469789 0.0989108306469789
+5949 3711 5226 0.107183313746265 0.107183313746265
+5950 5226 1839 0.179335285582576 0.179335285582576
+17165 4242 3547 0.202237742052361 0.202237742052361
+5951 1839 2611 0.178227308228011 0.178227308228011
+5952 2611 5195 0.176210949140518 0.176210949140518
+20492 10836 10813 0.00305693422510609 0.00305693422510609
+7198 6089 1755 0.0565523921918465 0.0565523921918465
+18301 5526 5737 0.156444459924747 0.156444459924747
+5957 4512 5230 0.200430868604248 0.200430868604248
+5959 5231 5232 0.20240814685365 0.20240814685365
+5960 5232 5233 0.200177276698155 0.200177276698155
+5961 5233 5234 0.403649470879027 0.403649470879027
+5962 3278 3181 0.152742056397443 0.152742056397443
+5964 3927 3703 0.0675866941557576 0.0675866941557576
+5965 3703 708 0.0999635221991015 0.0999635221991015
+5966 708 5235 0.0981118109963614 0.0981118109963614
+5967 5235 5236 0.0989915986442654 0.0989915986442654
+5968 5236 4189 0.135714784882046 0.135714784882046
+5969 4189 2515 0.133468058331593 0.133468058331593
+5970 2515 5237 0.135326951582466 0.135326951582466
+5971 5237 4803 0.135895734874124 0.135895734874124
+5972 4803 5238 0.136371570616542 0.136371570616542
+5973 5238 5239 0.126834347813211 0.126834347813211
+5974 5239 5240 0.133492367602304 0.133492367602304
+5975 5240 4624 0.131817065741689 0.131817065741689
+7224 4702 6106 0.102350270818551 0.102350270818551
+5979 2725 5242 0.133090700331069 0.133090700331069
+5981 5243 5244 0.0777207800874593 0.0777207800874593
+5982 5244 5245 0.710188326706697 0.710188326706697
+5983 3974 5246 0.196425810260379 0.196425810260379
+5984 5246 3422 0.201357225192724 0.201357225192724
+5986 3423 5247 0.0491810142725505 0.0491810142725505
+5987 5247 5248 0.0477450735797267 0.0477450735797267
+5989 5249 5250 0.055676102895211 0.055676102895211
+5990 5250 5251 0.140244564447974 0.140244564447974
+5991 5251 5252 0.170294636723478 0.170294636723478
+5993 5253 5254 0.106323677730181 0.106323677730181
+5994 5254 5108 0.109212547805518 0.109212547805518
+5995 5108 4725 0.103272467122344 0.103272467122344
+5996 4725 5255 0.103742512264204 0.103742512264204
+5997 5255 5256 0.105340810076794 0.105340810076794
+5999 5257 3136 0.108092936006134 0.108092936006134
+6000 3136 3908 0.107682657630117 0.107682657630117
+7243 6117 6118 0.0967566510311658 0.0967566510311658
+6001 3908 1048 0.108571568461532 0.108571568461532
+6002 1048 5258 0.101973343920372 0.101973343920372
+6003 5258 5259 0.106357911571636 0.106357911571636
+6005 5260 5009 0.0315381518095178 0.0315381518095178
+6006 5009 3333 0.108118604625977 0.108118604625977
+6007 3333 5261 0.119315074925742 0.119315074925742
+6008 5261 5263 0.0963665691070474 0.0963665691070474
+6009 5263 5264 0.0432816561908272 0.0432816561908272
+6010 5264 2085 0.0535379351296007 0.0535379351296007
+6011 2085 5265 0.105640004427027 0.105640004427027
+6012 5265 4130 0.106366490545515 0.106366490545515
+6013 4130 5266 0.109451940113279 0.109451940113279
+6014 5266 5267 0.101101610243622 0.101101610243622
+6018 5269 5270 0.0982982274574071 0.0982982274574071
+6019 5270 804 0.0991956500472809 0.0991956500472809
+6020 804 5271 0.0978879869631794 0.0978879869631794
+6021 5271 5272 0.0909649766992318 0.0909649766992318
+6022 5272 5273 0.0146836193769648 0.0146836193769648
+6024 5274 1956 0.174868207801427 0.174868207801427
+6027 5275 5276 0.0506368419660478 0.0506368419660478
+6028 5276 4990 0.0537681631666927 0.0537681631666927
+6029 4990 5277 0.102832227368728 0.102832227368728
+6030 5277 5278 0.0856095541145101 0.0856095541145101
+6032 1548 4268 0.202455793335308 0.202455793335308
+6033 4268 283 0.117344693446838 0.117344693446838
+6035 4141 5279 0.202925527060843 0.202925527060843
+6036 5279 2364 0.110547560275979 0.110547560275979
+6037 2364 4146 0.176928363643229 0.176928363643229
+6038 4146 5281 0.187030458155785 0.187030458155785
+6039 5281 5282 0.011246856594195 0.011246856594195
+6041 5283 2870 0.194705331985994 0.194705331985994
+6043 5285 5286 0.301111320410511 0.301111320410511
+6044 5287 5288 0.185724938270304 0.185724938270304
+6045 5288 5289 0.213285003773079 0.213285003773079
+6047 5290 5291 0.13629389839255 0.13629389839255
+6048 5291 5292 0.13355771854799 0.13355771854799
+6049 5292 4013 0.133867532403999 0.133867532403999
+6052 5294 3384 0.128421314744864 0.128421314744864
+6053 3384 5295 0.104229219478348 0.104229219478348
+6054 5295 3817 0.102592362577248 0.102592362577248
+6056 5296 5297 0.0990440053907464 0.0990440053907464
+6057 5297 5298 0.00501097787172802 0.00501097787172802
+6058 5298 5299 0.26852367463784 0.26852367463784
+6059 5299 5300 0.02711052781377 0.02711052781377
+6060 5300 5301 0.101042477184366 0.101042477184366
+6061 5301 5302 0.0980158544732548 0.0980158544732548
+6062 5302 5303 0.68853335666363 0.68853335666363
+6063 4532 3739 0.10058657036035 0.10058657036035
+6064 3739 5305 0.101344660556636 0.101344660556636
+6065 5305 1342 0.202678391855073 0.202678391855073
+6067 5306 4700 0.20166419460726 0.20166419460726
+6068 4700 5307 0.201175175307418 0.201175175307418
+6069 5307 5308 0.201920176537304 0.201920176537304
+6070 5308 5309 0.201920207593883 0.201920207593883
+6071 5309 777 0.201196100270561 0.201196100270561
+6072 777 5310 0.185040940142678 0.185040940142678
+6073 5310 5311 0.201942415647541 0.201942415647541
+6074 5311 5312 0.206000886771111 0.206000886771111
+7322 6161 6162 0.200977808302969 0.200977808302969
+6077 1729 5313 0.145417053241999 0.145417053241999
+6079 5314 5315 0.262924523321611 0.262924523321611
+6080 5316 3497 0.142809169887552 0.142809169887552
+6082 2903 5317 0.0402215187360589 0.0402215187360589
+6083 5317 5318 0.00632191300841853 0.00632191300841853
+6084 5318 5319 0.00945274881783772 0.00945274881783772
+6085 5319 5320 0.102488283152376 0.102488283152376
+6086 5320 5321 0.105737259840933 0.105737259840933
+6087 5321 5322 0.104280118546109 0.104280118546109
+6088 5322 5323 0.105008595801197 0.105008595801197
+6089 5323 5324 0.107079302112312 0.107079302112312
+6090 5324 3311 0.104784168499708 0.104784168499708
+6091 3311 5325 0.104972132929345 0.104972132929345
+6093 5328 5329 0.148443179384572 0.148443179384572
+6094 5329 4320 0.122968314186663 0.122968314186663
+6095 4320 5331 0.133138685881437 0.133138685881437
+6096 5331 5332 0.129500346452113 0.129500346452113
+6097 5332 5072 0.094543402764425 0.094543402764425
+6098 5072 5333 0.0140267468815188 0.0140267468815188
+7348 5506 4458 0.146478928082641 0.146478928082641
+6099 5333 5334 0.0971985352126134 0.0971985352126134
+6100 5334 5335 0.0675695345311337 0.0675695345311337
+6101 5335 5336 0.135628949553031 0.135628949553031
+6102 5336 5337 0.134096180080561 0.134096180080561
+6103 5337 5338 0.121603742223712 0.121603742223712
+6104 5338 5339 0.288999775625269 0.288999775625269
+6105 5339 5340 0.295278488962845 0.295278488962845
+6106 5340 5341 0.386769671992271 0.386769671992271
+6107 5341 5342 0.199175415622423 0.199175415622423
+18500 9718 6670 0.0335166183519053 0.0335166183519053
+6108 272 2532 0.233490999842372 0.233490999842372
+6109 2532 2534 0.010275790210419 0.010275790210419
+6111 5343 5344 0.134883731263317 0.134883731263317
+6112 5344 2487 0.132908396505932 0.132908396505932
+6113 2487 2828 0.130466466605355 0.130466466605355
+6114 2828 1436 0.203164250472258 0.203164250472258
+6115 1436 5345 0.151025004833817 0.151025004833817
+6117 5346 5347 0.17552323432827 0.17552323432827
+6118 5347 3107 0.175398997422213 0.175398997422213
+6119 3107 5348 0.192385063711178 0.192385063711178
+6121 1515 5349 0.354712199012844 0.354712199012844
+6123 4219 5350 0.184992548254205 0.184992548254205
+6124 5350 5351 0.809194581386362 0.809194581386362
+6125 3828 5352 0.158319505042179 0.158319505042179
+6127 3683 5353 0.00756991430853718 0.00756991430853718
+6128 5353 5354 0.0600900021718448 0.0600900021718448
+6129 5354 5355 0.0486030977669072 0.0486030977669072
+6130 5355 5356 0.00770962942235081 0.00770962942235081
+6132 5357 5358 0.0529187112553076 0.0529187112553076
+6133 5358 5359 0.0513821813874635 0.0513821813874635
+6134 5359 5360 0.0534444522847469 0.0534444522847469
+6135 5360 5361 0.0503260757639254 0.0503260757639254
+6137 5362 5363 0.199678713236371 0.199678713236371
+6139 4554 5364 0.257952059435159 0.257952059435159
+6141 2203 5365 0.125513593247199 0.125513593247199
+6142 5365 5366 0.121103405669087 0.121103405669087
+6143 5366 5367 0.118905793541669 0.118905793541669
+6144 5367 5368 0.110432655754222 0.110432655754222
+7394 6208 6209 0.0520019237828089 0.0520019237828089
+6145 5368 4924 0.050653673780936 0.050653673780936
+6146 4924 5369 0.0113612305905717 0.0113612305905717
+6148 5370 5371 0.0511886893302135 0.0511886893302135
+6149 5371 3733 0.0547546687048594 0.0547546687048594
+6150 3733 5372 0.0739604711312813 0.0739604711312813
+6151 5372 5373 0.0333758188249575 0.0333758188249575
+6152 5373 5374 0.0326832624474652 0.0326832624474652
+6153 5374 4487 0.0687015455014252 0.0687015455014252
+6155 5375 5376 0.083676019608772 0.083676019608772
+6157 5377 5378 0.539527941615599 0.539527941615599
+6158 5379 5380 0.024339909926927 0.024339909926927
+6159 5380 5381 0.0572545808576417 0.0572545808576417
+6161 5382 5383 0.0919429478923695 0.0919429478923695
+6162 5383 4632 0.0667555867186957 0.0667555867186957
+6163 4632 4638 0.073630878201174 0.073630878201174
+6164 4638 4551 0.135095610306562 0.135095610306562
+6165 4551 5384 0.293762175707744 0.293762175707744
+6167 2098 5385 0.176238767515036 0.176238767515036
+6168 5385 3108 0.175113982885218 0.175113982885218
+6169 3108 5386 0.213105615274275 0.213105615274275
+6170 5386 5387 0.16568697132589 0.16568697132589
+6171 5387 5388 0.0444779706577198 0.0444779706577198
+6173 1958 3829 0.172873649500925 0.172873649500925
+6174 3829 3827 0.0048313839727239 0.0048313839727239
+6175 3827 5389 0.152170039924714 0.152170039924714
+6176 5389 547 0.0103214739502372 0.0103214739502372
+6177 547 3259 0.110383801281946 0.110383801281946
+6178 3259 3297 0.0174353644977756 0.0174353644977756
+6180 4220 5391 0.40468883776866 0.40468883776866
+6181 1473 5392 0.374922653008132 0.374922653008132
+6182 5392 2947 0.18613051410303 0.18613051410303
+6184 5393 5394 0.133683449538656 0.133683449538656
+6185 5394 5395 0.00436494876438714 0.00436494876438714
+6186 5395 5396 0.00413948116283948 0.00413948116283948
+6187 5396 5397 0.135591162545584 0.135591162545584
+6188 5397 5398 0.140883972058497 0.140883972058497
+6189 5398 823 0.138673141914839 0.138673141914839
+6190 823 3564 0.136111333534187 0.136111333534187
+6191 3564 5399 0.14331239683406 0.14331239683406
+6193 5400 3028 0.141885844467344 0.141885844467344
+7436 5227 5219 0.0266079784612615 0.0266079784612615
+6195 5401 5402 0.00584885314190653 0.00584885314190653
+6196 5402 5403 0.138593356569714 0.138593356569714
+6197 5403 1157 0.139497033685325 0.139497033685325
+6198 1157 878 0.139538816070218 0.139538816070218
+6199 878 4466 0.138604668182001 0.138604668182001
+6200 4466 2786 0.1346682214983 0.1346682214983
+6201 2786 5257 0.131712815882714 0.131712815882714
+6202 5257 5404 0.212033227364557 0.212033227364557
+6203 5404 5405 0.140381205630714 0.140381205630714
+6204 5405 5406 0.175882952103236 0.175882952103236
+6206 4761 5407 0.0777628340765697 0.0777628340765697
+6207 5407 5411 0.121860688460736 0.121860688460736
+6208 5411 5412 0.203436645645446 0.203436645645446
+6211 5413 3128 0.197988223180436 0.197988223180436
+6213 5414 5415 0.127346625489507 0.127346625489507
+6214 5415 5416 0.202431697844534 0.202431697844534
+6216 5417 5418 0.0360920642856509 0.0360920642856509
+18249 10283 10284 0.0379598203284706 0.0379598203284706
+6217 5418 5419 0.175688258529037 0.175688258529037
+6218 5419 5420 0.176513424391556 0.176513424391556
+6219 5420 671 0.183363162969023 0.183363162969023
+6220 671 5421 0.00332688246962709 0.00332688246962709
+6221 5421 5422 0.175194594065608 0.175194594065608
+6222 5422 4601 0.174116514777802 0.174116514777802
+6223 4601 5423 0.141050765485302 0.141050765485302
+6225 2950 5424 0.133468479991587 0.133468479991587
+6226 5425 3096 0.198372842511786 0.198372842511786
+6227 3096 3206 0.203187034114148 0.203187034114148
+6228 3206 5426 0.199398136177365 0.199398136177365
+6229 5426 1916 0.200785704053696 0.200785704053696
+6231 5427 5428 0.208049356186156 0.208049356186156
+6232 5428 5429 0.195358366621449 0.195358366621449
+6233 5429 5430 0.0822508872394256 0.0822508872394256
+6234 5431 3740 0.099853044127537 0.099853044127537
+6235 3740 5432 0.079904711368683 0.079904711368683
+6236 5432 5433 0.0177357578673254 0.0177357578673254
+6237 5433 1299 0.160881213225809 0.160881213225809
+6238 1299 1344 0.0431325120453993 0.0431325120453993
+6239 1344 5434 0.202930771593003 0.202930771593003
+6240 5434 5435 0.195937805328833 0.195937805328833
+6241 5435 4701 0.00964060014055181 0.00964060014055181
+6242 4701 5436 0.088911763330732 0.088911763330732
+6243 5436 5437 0.105079205678488 0.105079205678488
+6244 5437 5438 0.0943047001329777 0.0943047001329777
+6245 5438 5439 0.100620360394738 0.100620360394738
+6246 5439 5440 0.0146794154501444 0.0146794154501444
+6247 5440 4965 0.086276226710605 0.086276226710605
+6248 4965 5441 0.10739345579216 0.10739345579216
+6249 5441 5442 0.0951717377148208 0.0951717377148208
+6250 5442 5443 0.0976857174224503 0.0976857174224503
+6252 779 5444 0.0823735255229089 0.0823735255229089
+6253 5444 5445 0.102122427250782 0.102122427250782
+6254 5445 4958 0.133513290288167 0.133513290288167
+6255 4958 5446 0.0684224753039321 0.0684224753039321
+6256 5446 5447 0.00769468892365438 0.00769468892365438
+6257 5447 5448 0.199639504943165 0.199639504943165
+6258 5448 1501 0.201263981115328 0.201263981115328
+6259 1501 174 0.201029338652354 0.201029338652354
+6261 1704 1730 0.0545082426213867 0.0545082426213867
+6262 1730 5451 0.146076957823045 0.146076957823045
+6263 5451 5452 1.20615427321132 1.20615427321132
+6265 5456 5457 0.107171013555617 0.107171013555617
+6266 5457 5458 0.0551341429674013 0.0551341429674013
+6267 5458 5459 0.053860211885536 0.053860211885536
+6268 5459 5460 0.109859438734606 0.109859438734606
+6269 5460 5461 0.104952215686531 0.104952215686531
+6270 5461 5462 0.0537660564474852 0.0537660564474852
+6271 5462 5463 0.0468001440268365 0.0468001440268365
+6273 5464 5465 0.0487076064705391 0.0487076064705391
+6274 5465 5466 0.096682643717806 0.096682643717806
+6275 5466 5052 0.0976295695745084 0.0976295695745084
+6276 5052 5467 0.0498503558842522 0.0498503558842522
+6277 5467 5468 0.0500897185974344 0.0500897185974344
+6279 5223 978 0.0483462615206691 0.0483462615206691
+6280 978 5469 0.0500186833718628 0.0500186833718628
+6281 5469 5470 0.0466179289686935 0.0466179289686935
+6282 5470 5471 0.0496889709391185 0.0496889709391185
+6283 5471 5472 0.0500395303728477 0.0500395303728477
+6284 5472 4947 0.0500649255411997 0.0500649255411997
+6285 4947 5119 0.0486069729184005 0.0486069729184005
+6286 5119 5473 0.0497694572157541 0.0497694572157541
+6287 5473 4719 0.0482501223288259 0.0482501223288259
+6288 4719 5474 0.0825694493004343 0.0825694493004343
+6289 5474 5475 0.013401399089124 0.013401399089124
+6290 5475 5476 0.103889728134339 0.103889728134339
+6291 5476 5419 0.103815153646491 0.103815153646491
+6292 5419 5477 0.109635415021011 0.109635415021011
+6294 3890 1020 0.105962717150938 0.105962717150938
+6295 1020 5478 0.052027246508575 0.052027246508575
+6296 5478 5479 0.0524872333525023 0.0524872333525023
+6297 5479 3719 0.052252544610622 0.052252544610622
+6298 3719 5480 0.0538013756911254 0.0538013756911254
+6299 5480 5481 0.0436600330786078 0.0436600330786078
+6300 5481 5482 0.00837974421686285 0.00837974421686285
+14763 7162 4611 0.176903840452458 0.176903840452458
+6301 5482 5026 0.040489278057912 0.040489278057912
+6302 5026 3338 0.107876149200874 0.107876149200874
+6303 3338 5483 0.0990429074228521 0.0990429074228521
+6304 5483 5484 0.0966066822218646 0.0966066822218646
+6305 5484 5485 0.085086759759281 0.085086759759281
+6306 5485 5486 0.0169728889677259 0.0169728889677259
+6307 5486 2067 0.0825646387998858 0.0825646387998858
+6309 5487 2667 0.0866869262626222 0.0866869262626222
+6310 2667 2664 0.00897895817052901 0.00897895817052901
+6311 2664 4137 0.0908182867369719 0.0908182867369719
+6312 4137 5488 0.0965705527653259 0.0965705527653259
+6313 5488 5489 0.0942751679467969 0.0942751679467969
+6314 5489 5490 0.0959916716400224 0.0959916716400224
+6315 5490 3461 0.0933212956911074 0.0933212956911074
+6316 3461 5491 0.0467923341231575 0.0467923341231575
+6317 5491 5492 0.0479894648111637 0.0479894648111637
+6318 5492 5493 0.094030978726141 0.094030978726141
+6319 5493 861 0.0920531787302436 0.0920531787302436
+6320 861 5494 0.092346282981082 0.092346282981082
+6321 5494 5495 0.091117734759624 0.091117734759624
+20501 10824 10839 0.0279151158292869 0.0279151158292869
+6323 5496 5497 0.0512308809047994 0.0512308809047994
+6324 5497 5498 0.0547050066584288 0.0547050066584288
+6325 5498 5499 0.0532065647068504 0.0532065647068504
+6326 5499 5500 0.0520026026999989 0.0520026026999989
+6327 5500 5501 0.0600453089722235 0.0600453089722235
+6328 5501 5502 0.0451373924487277 0.0451373924487277
+7588 6319 6320 0.0874047970677394 0.0874047970677394
+6330 5503 5504 0.0512021800904844 0.0512021800904844
+6331 5504 5505 0.0535897595927606 0.0535897595927606
+6332 5505 5506 0.0503264318858696 0.0503264318858696
+6333 5506 5507 0.0549843628648472 0.0549843628648472
+6334 5507 3309 0.0521587927419047 0.0521587927419047
+6335 3309 5508 0.0557422576502987 0.0557422576502987
+6336 5508 5509 0.0498065817995712 0.0498065817995712
+6338 5510 5511 0.10273263586878 0.10273263586878
+6339 5511 5512 0.103095987250104 0.103095987250104
+6340 5512 3020 0.0125186689867189 0.0125186689867189
+6341 3020 5513 0.0466432236195876 0.0466432236195876
+6342 5513 4381 0.0509815437370977 0.0509815437370977
+6344 5514 5515 0.103259680904514 0.103259680904514
+6345 5515 3934 0.0990266173550878 0.0990266173550878
+6346 3934 5516 0.10122291130851 0.10122291130851
+6347 5516 3707 0.107162793104657 0.107162793104657
+6348 3707 717 0.101965718351369 0.101965718351369
+6349 717 5517 0.10489500722876 0.10489500722876
+6350 5517 5518 0.0880249775504832 0.0880249775504832
+6352 5519 4201 0.0955388621117037 0.0955388621117037
+6353 4201 1068 0.10398483351111 0.10398483351111
+6354 1068 2504 0.101881809876575 0.101881809876575
+6355 2504 5520 0.10295538196753 0.10295538196753
+6356 5520 1231 0.0964004159007037 0.0964004159007037
+6357 1231 4809 0.0995624903271375 0.0995624903271375
+6358 4809 2176 0.101169164261142 0.101169164261142
+6359 2176 5521 0.102032335854251 0.102032335854251
+6360 5521 348 0.0731550647240869 0.0731550647240869
+6361 348 351 0.0329026304601732 0.0329026304601732
+6363 5522 4629 0.122115753805888 0.122115753805888
+6364 4629 1258 0.132003632804436 0.132003632804436
+6366 377 4544 0.0548661978897115 0.0548661978897115
+6367 4544 2700 0.136738193723685 0.136738193723685
+6368 2700 5523 0.130559333935347 0.130559333935347
+6371 5525 1133 0.0486624445582808 0.0486624445582808
+6372 1133 5526 0.0510752177714687 0.0510752177714687
+6373 5526 5527 0.0534768474459495 0.0534768474459495
+6374 5527 3849 0.0993499397911337 0.0993499397911337
+20247 6972 10718 0.0278784612667637 0.0278784612667637
+6375 3849 5528 0.0502810849564127 0.0502810849564127
+6376 5528 5529 0.0506206995449551 0.0506206995449551
+6378 3432 5530 0.0954898525843842 0.0954898525843842
+6379 5530 1409 0.0985492973952367 0.0985492973952367
+6380 1409 5531 0.102140021124127 0.102140021124127
+6381 5531 3995 0.106588318724824 0.106588318724824
+6382 3995 5532 0.089989655098645 0.089989655098645
+6383 5532 5533 0.0940983975381981 0.0940983975381981
+6384 5533 3749 0.102559803256087 0.102559803256087
+6385 3749 5534 0.132377311804748 0.132377311804748
+6388 2028 5536 0.103552176267271 0.103552176267271
+6391 3402 5538 0.101285303038309 0.101285303038309
+6392 5538 5539 0.0982612440798091 0.0982612440798091
+6393 5539 5540 0.104203916508807 0.104203916508807
+6394 5540 5541 0.0994909347746214 0.0994909347746214
+6395 5541 5542 0.0496866830167122 0.0496866830167122
+6396 5542 1115 0.0483270289965061 0.0483270289965061
+6397 1115 5543 0.0505090974663915 0.0505090974663915
+6398 5543 5544 0.051466523607823 0.051466523607823
+6399 5544 5545 0.0509771831188889 0.0509771831188889
+18369 6894 6889 0.0506808956189271 0.0506808956189271
+6400 5545 3837 0.0484293465449961 0.0484293465449961
+6402 5546 5547 0.0572465530818606 0.0572465530818606
+6403 5547 4036 0.051041556606541 0.051041556606541
+6404 4036 5548 0.0609619584955507 0.0609619584955507
+6405 1878 4178 0.0543518295000293 0.0543518295000293
+6406 4178 5549 0.0885356562805968 0.0885356562805968
+6408 1863 2630 0.0954187587481574 0.0954187587481574
+6409 2630 2609 0.0942841337329746 0.0942841337329746
+6410 2609 5207 0.106776685868403 0.106776685868403
+6411 5207 5191 0.0702035466323056 0.0702035466323056
+6412 5191 5550 0.105689823753241 0.105689823753241
+6414 5551 5552 0.13548002915508 0.13548002915508
+6415 5552 5553 0.0682592832885596 0.0682592832885596
+6416 5553 19 0.0650116042038798 0.0650116042038798
+6417 19 2991 0.133631170313494 0.133631170313494
+6418 2991 5554 0.0524731372315077 0.0524731372315077
+6419 5554 1882 0.0490816557393864 0.0490816557393864
+6420 1882 5555 0.0508829391590993 0.0508829391590993
+6421 5555 5556 0.0494818870663145 0.0494818870663145
+6422 5556 5557 0.0511609921162368 0.0511609921162368
+6423 5557 5558 0.0498069369814246 0.0498069369814246
+6424 5558 5559 0.0494751154031395 0.0494751154031395
+6425 5559 5560 0.0510095826256232 0.0510095826256232
+18695 5978 4055 0.196460738141722 0.196460738141722
+6426 5560 5561 0.100658038986824 0.100658038986824
+6427 5561 5562 0.100189919501299 0.100189919501299
+6428 5562 5243 0.0999621826427635 0.0999621826427635
+6429 5243 5563 0.0514845629022423 0.0514845629022423
+6430 5563 5564 0.0509507800422364 0.0509507800422364
+6431 5564 5565 0.0506384299937204 0.0506384299937204
+6432 5565 5566 0.0502094012018427 0.0502094012018427
+6433 5566 5567 0.0352773306402212 0.0352773306402212
+6434 5567 1696 0.0663073245001768 0.0663073245001768
+6435 1696 5568 0.200475700974595 0.200475700974595
+6436 5568 2444 0.175243279627828 0.175243279627828
+6438 5569 5570 0.150878938410471 0.150878938410471
+6439 5570 5571 0.0520399442807291 0.0520399442807291
+6440 5571 5572 0.00805055351559969 0.00805055351559969
+6441 5572 5573 0.0547971824088202 0.0547971824088202
+6442 5573 5529 0.0419651880906561 0.0419651880906561
+6443 5529 5574 0.00738334312936163 0.00738334312936163
+6444 5574 5575 0.0892116998808573 0.0892116998808573
+6445 5575 5576 0.0587189734757016 0.0587189734757016
+6446 5576 5577 0.143444822058071 0.143444822058071
+6447 5577 5578 0.0305007791534936 0.0305007791534936
+6448 5578 5579 0.0181914980281834 0.0181914980281834
+6449 5579 5580 0.150469022298562 0.150469022298562
+6450 5580 5581 0.204922214354376 0.204922214354376
+6451 5581 5582 0.0983186744589269 0.0983186744589269
+6452 5582 1433 0.108782481382419 0.108782481382419
+6453 1433 5583 0.123482673613688 0.123482673613688
+6454 5583 5584 0.0754033254163114 0.0754033254163114
+6455 5584 5585 0.194791277181441 0.194791277181441
+6456 5585 5586 0.0533068649535537 0.0533068649535537
+6457 5586 2555 0.14827848293408 0.14827848293408
+6458 2555 5587 0.408042656170713 0.408042656170713
+6459 5588 5589 0.135112968623698 0.135112968623698
+6460 5589 5590 0.203702085134274 0.203702085134274
+6461 5590 5591 0.207620262278034 0.207620262278034
+6462 5591 4585 0.131035476997682 0.131035476997682
+6463 4585 5592 0.072769358589151 0.072769358589151
+6464 5592 5593 0.0625746572307696 0.0625746572307696
+6465 5593 5301 0.137225765514935 0.137225765514935
+6467 5594 5595 0.274145349571988 0.274145349571988
+6468 5595 5596 0.205443804135366 0.205443804135366
+6469 5596 5597 0.121926623756206 0.121926623756206
+6470 5597 5598 0.202580256912195 0.202580256912195
+6472 4361 5599 0.206258701511779 0.206258701511779
+6474 5600 5601 0.168149469233138 0.168149469233138
+6476 2625 5205 0.166253482314503 0.166253482314503
+6502 5622 5516 0.138783948073856 0.138783948073856
+6477 5205 5602 0.15603138237828 0.15603138237828
+6478 5602 5603 0.0341829476854199 0.0341829476854199
+6479 5603 5604 0.162233690102157 0.162233690102157
+6480 5604 5605 0.176890418224524 0.176890418224524
+6481 5605 5606 0.121703194532156 0.121703194532156
+6482 5606 5609 0.0547747917576354 0.0547747917576354
+6483 5609 5610 0.177274555583034 0.177274555583034
+6484 5610 5611 0.0562757523743122 0.0562757523743122
+6485 5611 5381 0.0971287684245127 0.0971287684245127
+6486 5381 5370 0.0242294178668139 0.0242294178668139
+6487 5370 5612 0.177146422666141 0.177146422666141
+6488 5612 5613 0.176947014024794 0.176947014024794
+6489 5613 5614 0.177715418603807 0.177715418603807
+6490 5614 5615 0.0918268918834614 0.0918268918834614
+6491 5615 5616 0.00795060277662081 0.00795060277662081
+6493 5617 5618 0.0159556400855116 0.0159556400855116
+6496 5619 5620 0.132547309025511 0.132547309025511
+6497 5620 1667 0.132931219459218 0.132931219459218
+6498 1667 5621 0.138273532739947 0.138273532739947
+6499 5621 2448 0.13601631946961 0.13601631946961
+6500 2448 3238 0.136726308588665 0.136726308588665
+6501 3238 5622 0.14083949408811 0.14083949408811
+6503 5516 5623 0.135704638458681 0.135704638458681
+6504 5623 5624 0.00588469429500613 0.00588469429500613
+6505 5624 5625 0.115900802279231 0.115900802279231
+6506 5625 5626 0.19877742240622 0.19877742240622
+6507 5626 110 0.101954628240396 0.101954628240396
+6508 110 2818 0.0990079626838536 0.0990079626838536
+6509 2818 1419 0.203073935940985 0.203073935940985
+6510 1419 5627 0.11954884298017 0.11954884298017
+6511 2917 5628 0.0366435746314918 0.0366435746314918
+6513 3710 5629 0.104723848956837 0.104723848956837
+6514 5629 5630 0.0524718119166661 0.0524718119166661
+6515 5630 5631 0.0523604583661445 0.0523604583661445
+6516 5631 963 0.102688945741692 0.102688945741692
+6519 2898 5632 0.0542316769914945 0.0542316769914945
+6520 5632 5633 0.0508977749431617 0.0508977749431617
+6521 5633 5634 0.106035617894042 0.106035617894042
+6522 5634 4734 0.104599442261749 0.104599442261749
+6524 5635 5399 0.0949731678048623 0.0949731678048623
+6525 5399 5636 0.053273863098243 0.053273863098243
+6526 5636 5637 0.0532054766684841 0.0532054766684841
+6527 5637 3901 0.105282590951624 0.105282590951624
+6528 3901 1038 0.105350981348288 0.105350981348288
+6530 5638 5639 0.103436146317209 0.103436146317209
+6531 5639 5004 0.104923546637106 0.104923546637106
+6532 5004 3324 0.10200854500581 0.10200854500581
+20515 10842 6731 0.00724303302685487 0.00724303302685487
+6533 3324 5640 0.105949384946318 0.105949384946318
+6534 5640 5641 0.102726616753478 0.102726616753478
+6535 5641 2075 0.105470656717315 0.105470656717315
+6536 2075 2672 0.106385362776241 0.106385362776241
+6537 2672 4122 0.107308593371936 0.107308593371936
+6538 4122 5642 0.107983920400391 0.107983920400391
+6539 5642 5643 0.0919555733248638 0.0919555733248638
+7832 6456 349 0.0697483782641925 0.0697483782641925
+6540 5643 5644 0.101410180701687 0.101410180701687
+6541 5644 3470 0.100777601888944 0.100777601888944
+6542 3470 5645 0.101863251928372 0.101863251928372
+6543 5645 3873 0.0981959903542781 0.0981959903542781
+6544 3873 849 0.100085165894781 0.100085165894781
+6546 1400 5646 0.00898751016812899 0.00898751016812899
+6547 5646 5647 0.190632434837625 0.190632434837625
+6548 5647 3388 0.011727623160982 0.011727623160982
+6549 3388 5648 0.0568259028608414 0.0568259028608414
+6550 5648 5649 0.00637619061562419 0.00637619061562419
+6551 5649 5650 0.0463019954871414 0.0463019954871414
+6552 5650 2800 0.0477133812275841 0.0477133812275841
+6553 2800 5651 0.0470719166287448 0.0470719166287448
+6554 5651 5652 0.0458325636837201 0.0458325636837201
+6555 5652 5653 0.046653544202397 0.046653544202397
+6556 5653 5654 0.0464726377537293 0.0464726377537293
+6557 5654 5655 0.0469344544346564 0.0469344544346564
+6558 5655 2751 0.046215112991852 0.046215112991852
+6559 2751 1096 0.0461039483088431 0.0461039483088431
+6560 1096 5656 0.0452023576254509 0.0452023576254509
+6561 5656 5657 0.0460150379661812 0.0460150379661812
+6562 5657 1539 0.0464321875423527 0.0464321875423527
+6563 1539 3855 0.0473472190950861 0.0473472190950861
+6565 4485 345 0.22138299033862 0.22138299033862
+6566 345 5661 0.163308085042962 0.163308085042962
+6567 5661 5662 0.065819748510902 0.065819748510902
+6568 5661 5663 0.0801840013229962 0.0801840013229962
+6569 3287 5665 0.0688755620206119 0.0688755620206119
+6570 5665 5666 0.0427865432685629 0.0427865432685629
+6571 5666 523 0.0741847082758752 0.0741847082758752
+6572 523 5667 0.0513515905827488 0.0513515905827488
+6573 5667 597 0.0787762757947461 0.0787762757947461
+6574 597 4825 0.152733980621547 0.152733980621547
+6576 2530 1931 0.0607754389242505 0.0607754389242505
+6578 5668 5669 0.20518077925237 0.20518077925237
+6580 5670 2976 0.052930873102536 0.052930873102536
+6582 5671 5672 0.0669604143503768 0.0669604143503768
+6583 5672 3722 0.0539771509338677 0.0539771509338677
+6584 3722 5673 0.103203771462203 0.103203771462203
+6585 5673 5674 0.175725539559539 0.175725539559539
+6587 5675 5676 0.204879915807757 0.204879915807757
+6588 5677 5678 0.00677682168687122 0.00677682168687122
+6589 5678 1665 0.0567234226799308 0.0567234226799308
+6590 1665 5679 0.122659531226911 0.122659531226911
+6592 5680 5681 0.862768870925976 0.862768870925976
+6593 5682 5683 0.164927546324728 0.164927546324728
+6594 5683 4367 0.0355730578333277 0.0355730578333277
+6595 4367 1448 0.193853665061985 0.193853665061985
+6596 1448 5688 0.205590441563944 0.205590441563944
+6598 5689 5690 0.100594816308247 0.100594816308247
+6599 5690 5691 0.0991234853564762 0.0991234853564762
+6601 5438 5692 0.211107914724763 0.211107914724763
+6602 5692 4415 0.193109246091061 0.193109246091061
+6603 4415 5693 0.226139344299967 0.226139344299967
+6606 4323 5694 0.0859068688818743 0.0859068688818743
+6608 5695 5696 0.0748977449692987 0.0748977449692987
+6609 5696 5073 0.0868839085552243 0.0868839085552243
+6610 5073 5333 0.0187220275557185 0.0187220275557185
+6612 5697 1590 0.201198112839976 0.201198112839976
+18141 10274 10269 0.134684266769083 0.134684266769083
+6613 1590 1640 0.20125093456728 0.20125093456728
+6615 5698 5699 0.200385663675414 0.200385663675414
+6617 5700 5701 0.196514919519562 0.196514919519562
+6618 5701 5248 0.110632746994 0.110632746994
+6619 5248 5702 0.0945616875172071 0.0945616875172071
+6620 5702 1685 0.205454867561864 0.205454867561864
+6621 1685 5703 0.206063854698429 0.206063854698429
+6622 5703 2430 0.199691165132387 0.199691165132387
+6623 2430 5704 0.202603259150386 0.202603259150386
+6625 4504 4050 0.176201016140026 0.176201016140026
+6626 4050 5707 0.173108439499024 0.173108439499024
+6628 1851 2587 0.179402678295732 0.179402678295732
+6630 5708 5709 0.275624196707738 0.275624196707738
+6632 5710 5711 0.261275347332411 0.261275347332411
+6634 5712 5713 0.0444779706577198 0.0444779706577198
+6635 5714 5715 0.183336097782058 0.183336097782058
+6636 5715 5716 0.203064462732684 0.203064462732684
+6638 5717 5718 0.153081250432522 0.153081250432522
+6639 5718 5719 0.011675447758709 0.011675447758709
+6641 1422 5720 0.117935613657917 0.117935613657917
+6643 5721 5722 0.194099197890973 0.194099197890973
+6644 5722 2542 0.201930616083342 0.201930616083342
+6645 2542 5723 0.411877202316789 0.411877202316789
+6646 5724 624 0.116891424974631 0.116891424974631
+6648 5725 5726 0.225973303098124 0.225973303098124
+6649 5726 3656 0.0613034024300807 0.0613034024300807
+6651 5727 5728 0.116763945302488 0.116763945302488
+6652 3634 5729 0.249262670016259 0.249262670016259
+6653 5729 5730 0.0886979206005476 0.0886979206005476
+6654 5730 5731 0.061003880318824 0.061003880318824
+6655 5731 3294 0.169569384240282 0.169569384240282
+6657 5730 5729 0.0886979206005476 0.0886979206005476
+18322 2543 7478 0.411854888798545 0.411854888798545
+6660 716 5733 0.106180030125168 0.106180030125168
+6661 5733 5734 0.0889628078792179 0.0889628078792179
+6663 5735 5736 0.0499420076759338 0.0499420076759338
+6664 5736 1132 0.0480445960055664 0.0480445960055664
+6665 1132 5737 0.0493807651843696 0.0493807651843696
+6666 5737 5738 0.0542607296398929 0.0542607296398929
+6667 5738 3848 0.102653360815707 0.102653360815707
+6668 3848 5739 0.0481952973910705 0.0481952973910705
+6669 5739 5570 0.0504068578554883 0.0504068578554883
+6671 5740 5741 0.102055279401325 0.102055279401325
+6672 5741 3933 0.103350213888063 0.103350213888063
+6675 5742 4200 0.0968208569301817 0.0968208569301817
+6676 4200 4193 0.0357662020116287 0.0357662020116287
+6677 4193 1067 0.0660115016724451 0.0660115016724451
+6678 1067 2520 0.0682249892032966 0.0682249892032966
+6679 2520 2503 0.0444235862340648 0.0444235862340648
+6680 2503 5743 0.0929237526477458 0.0929237526477458
+6681 5743 1230 0.097564382820973 0.097564382820973
+6682 1230 4808 0.0974618272678182 0.0974618272678182
+6683 4808 2175 0.100974351727253 0.100974351727253
+6685 5744 5745 0.139227813146129 0.139227813146129
+20421 10782 10783 0.171335167034037 0.171335167034037
+6686 5745 4628 0.122998125096167 0.122998125096167
+6687 4628 378 0.0772242252157125 0.0772242252157125
+6688 378 1257 0.0550380704812319 0.0550380704812319
+6689 1257 4543 0.132381944494249 0.132381944494249
+6690 4543 2715 0.0724896248395526 0.0724896248395526
+7972 6547 5411 0.11011441218455 0.11011441218455
+6691 2715 2699 0.0727973179644107 0.0727973179644107
+6692 2699 5748 0.121810190364873 0.121810190364873
+6696 5750 5751 0.00763183841002978 0.00763183841002978
+6697 5751 5752 0.692257458082336 0.692257458082336
+6698 2026 4672 0.134236367930218 0.134236367930218
+6699 4672 5753 0.102239429594337 0.102239429594337
+6700 5753 5754 0.100506379378587 0.100506379378587
+6702 5755 5756 0.2002287044093 0.2002287044093
+6704 5757 5758 0.173042563926175 0.173042563926175
+6706 5759 744 0.063721377479395 0.063721377479395
+6707 744 1562 0.141424652289019 0.141424652289019
+6708 1562 5760 0.139452228533295 0.139452228533295
+6709 5760 5761 0.121153404070921 0.121153404070921
+6710 5761 5762 0.0103214683330101 0.0103214683330101
+6711 5762 5763 0.04652452941841 0.04652452941841
+6712 5764 5765 0.155984788161682 0.155984788161682
+6716 5767 5768 0.200784793626825 0.200784793626825
+6743 3756 5769 0.0494129956173261 0.0494129956173261
+7994 6557 2764 0.0940480727939324 0.0940480727939324
+6717 5768 5772 0.846413211947238 0.846413211947238
+6718 5772 517 0.0606861281340196 0.0606861281340196
+6719 517 5773 0.188473310975888 0.188473310975888
+6721 5774 5775 0.0796153059223016 0.0796153059223016
+6722 5775 5776 0.00646390558051832 0.00646390558051832
+6723 5776 3007 0.1066159594542 0.1066159594542
+6724 3007 5777 0.100407769542541 0.100407769542541
+6725 5777 4393 0.00579135202620092 0.00579135202620092
+6726 4393 5778 0.102044175747327 0.102044175747327
+6727 5778 5779 0.107668499777307 0.107668499777307
+6728 5779 5780 0.108043382155599 0.108043382155599
+6729 5780 5781 0.101222003009649 0.101222003009649
+6730 5781 5782 0.103527244594317 0.103527244594317
+6733 5784 5785 0.0519740547318723 0.0519740547318723
+6734 5785 5786 0.0540518378903488 0.0540518378903488
+6735 5786 5787 0.105403398355375 0.105403398355375
+6736 5787 5788 0.0515636589786252 0.0515636589786252
+6737 5788 5789 0.0542361941294726 0.0542361941294726
+6738 5789 1159 0.0519632563805573 0.0519632563805573
+6739 1159 1609 0.055296326623055 0.055296326623055
+6742 5791 3756 0.0502859716725157 0.0502859716725157
+6744 5769 5792 0.0505152652453619 0.0505152652453619
+6745 5792 5793 0.0487326254633791 0.0487326254633791
+6746 5793 5794 0.0492772484970981 0.0492772484970981
+6747 5794 5795 0.0490197084274457 0.0490197084274457
+6748 5795 4008 0.0494402902066907 0.0494402902066907
+6749 4008 5796 0.0498144967732103 0.0498144967732103
+6750 5796 5797 0.0492676243070722 0.0492676243070722
+6751 5797 5798 0.0496699296957128 0.0496699296957128
+6752 5798 1392 0.0490530110641543 0.0490530110641543
+6753 1392 5799 0.0511729331725758 0.0511729331725758
+6755 5800 5801 0.0504747882864981 0.0504747882864981
+6756 5801 2540 0.0519704512694329 0.0519704512694329
+6758 5802 5803 0.0134893781959873 0.0134893781959873
+6759 5803 5804 0.0651761990637723 0.0651761990637723
+6760 5804 5805 0.00867856878189995 0.00867856878189995
+6761 5805 5806 0.145096674327765 0.145096674327765
+6762 5806 5807 0.146807263740651 0.146807263740651
+6763 5807 5808 0.0971857772299024 0.0971857772299024
+8041 6591 5218 0.10367384999594 0.10367384999594
+6766 5810 5811 0.146768415759705 0.146768415759705
+6768 1701 5812 0.0556890737408001 0.0556890737408001
+6769 5812 5813 0.0500299056894462 0.0500299056894462
+6770 5813 572 0.048773855210923 0.048773855210923
+6771 572 4985 0.0488849816155661 0.0488849816155661
+6772 4985 5815 0.0487728428614096 0.0487728428614096
+6773 5815 5816 0.0486567223604475 0.0486567223604475
+6774 5816 5817 0.0490027802416811 0.0490027802416811
+6775 5817 5819 0.0533578755133891 0.0533578755133891
+6776 5819 5820 0.0539390556466382 0.0539390556466382
+6778 5821 5822 0.0489941039004867 0.0489941039004867
+6780 3617 5823 0.0506292858836976 0.0506292858836976
+6781 5823 5824 0.0500724300001191 0.0500724300001191
+6782 5824 5825 0.0499880884355422 0.0499880884355422
+6783 5825 5099 0.0484306981291016 0.0484306981291016
+6784 5099 5826 0.0978349213689401 0.0978349213689401
+8066 6604 2108 0.411848469661871 0.411848469661871
+6786 3484 5827 0.0514683137992155 0.0514683137992155
+6787 5827 5828 0.0484135897290906 0.0484135897290906
+6789 5829 3698 0.0457527085543311 0.0457527085543311
+6790 3698 5705 0.0484471809833024 0.0484471809833024
+6791 5705 4572 0.0515108919391295 0.0515108919391295
+6792 4572 5830 0.105767692426024 0.105767692426024
+6793 5830 5831 0.0553912495449553 0.0553912495449553
+6794 5831 5832 0.0496407969110197 0.0496407969110197
+6795 5832 5833 0.0474198419855964 0.0474198419855964
+6796 5833 5834 0.0495588851512039 0.0495588851512039
+6797 5834 5835 0.0489032950107884 0.0489032950107884
+6798 5835 2741 0.0480512246257303 0.0480512246257303
+6800 5836 5232 0.0488850197079726 0.0488850197079726
+6801 5232 5837 0.0498079610709467 0.0498079610709467
+6802 5837 3174 0.0480709718129458 0.0480709718129458
+6803 3174 5838 0.0510747433773575 0.0510747433773575
+6804 5838 4999 0.0480555922075882 0.0480555922075882
+8084 6614 6615 0.0939591856631224 0.0939591856631224
+6805 4999 5839 0.0491139247433474 0.0491139247433474
+6806 5839 731 0.0513728158017048 0.0513728158017048
+18529 9525 9153 0.0559524577768326 0.0559524577768326
+6807 731 5840 0.100363141472313 0.100363141472313
+6810 4683 1528 0.0512242368793757 0.0512242368793757
+6811 1528 5087 0.0490096920376181 0.0490096920376181
+6812 5087 5841 0.0531197353238214 0.0531197353238214
+6813 5841 5011 0.0514391840217863 0.0514391840217863
+6814 5011 1747 0.0499193361712115 0.0499193361712115
+6815 1747 5608 0.0521168381912245 0.0521168381912245
+6816 5608 5842 0.0474458476070982 0.0474458476070982
+6817 5842 5449 0.0516188826793533 0.0516188826793533
+6818 5449 5428 0.0497563082276933 0.0497563082276933
+6819 5428 5390 0.0522374705433985 0.0522374705433985
+6820 5390 5843 0.0480447601658553 0.0480447601658553
+6822 5844 5845 0.0146913941785162 0.0146913941785162
+6823 5845 1699 0.184528247922268 0.184528247922268
+6824 1699 5846 0.0932680068963059 0.0932680068963059
+6825 5846 5847 0.0932852372069282 0.0932852372069282
+6826 5847 3120 0.098410300465854 0.098410300465854
+6827 3120 5848 0.0905968964383526 0.0905968964383526
+6828 5848 5849 0.19461602791519 0.19461602791519
+8104 239 6631 0.0428753899381976 0.0428753899381976
+6830 5850 5851 0.0206820775273506 0.0206820775273506
+6833 1635 5853 0.0933590693142476 0.0933590693142476
+6834 5853 5854 0.015431953306933 0.015431953306933
+6835 5854 4213 0.0860217230993429 0.0860217230993429
+6836 4213 5855 0.0995731813164872 0.0995731813164872
+6837 5855 192 0.102944368273924 0.102944368273924
+6838 192 2922 0.0977156398673512 0.0977156398673512
+6840 5305 1460 0.094441811393562 0.094441811393562
+6841 1460 5433 0.104542660065313 0.104542660065313
+6843 5856 1868 0.210287860037949 0.210287860037949
+6844 1868 4186 0.189585415099738 0.189585415099738
+6846 5432 5857 0.104903215241116 0.104903215241116
+6847 5857 5858 0.105720950651237 0.105720950651237
+6848 5858 5859 0.105743888331652 0.105743888331652
+6849 5859 4421 0.104252361029944 0.104252361029944
+6852 5861 5862 0.0519463280728807 0.0519463280728807
+6853 5862 5863 0.0520746976816124 0.0520746976816124
+6854 5863 5864 0.053223022054701 0.053223022054701
+6855 5864 4317 0.0510499917933612 0.0510499917933612
+8127 6232 6642 0.179146147134138 0.179146147134138
+6857 5865 4505 0.0514748271562017 0.0514748271562017
+6858 4505 3608 0.0515275362522861 0.0515275362522861
+6859 3608 5866 0.050240952107019 0.050240952107019
+6860 5866 5867 0.0507479546434346 0.0507479546434346
+6861 5867 5067 0.0521453287858806 0.0521453287858806
+6862 5067 5868 0.051338093574988 0.051338093574988
+6863 5868 5869 0.0516032507649761 0.0516032507649761
+6864 5869 5870 0.0504748368648883 0.0504748368648883
+6865 5870 5871 0.0517263613465763 0.0517263613465763
+6866 5871 5872 0.102624635673 0.102624635673
+6867 5872 3299 0.100255573957512 0.100255573957512
+6869 5873 5874 0.0663164411935832 0.0663164411935832
+6870 5874 5875 0.0488050085545576 0.0488050085545576
+6871 5875 5876 0.702184603750594 0.702184603750594
+6874 4525 5880 0.0113022768719971 0.0113022768719971
+6875 5880 5881 0.00806516295239482 0.00806516295239482
+6876 5881 5882 0.0293119532501538 0.0293119532501538
+6877 5882 5883 0.0236481545130312 0.0236481545130312
+6878 5883 5884 0.0171068759325808 0.0171068759325808
+6879 5884 5885 0.034181660212992 0.034181660212992
+6880 5885 5887 0.100387180512852 0.100387180512852
+6882 4433 5888 0.29159089003557 0.29159089003557
+6883 5888 4667 0.102395884967111 0.102395884967111
+6885 1334 1389 0.100271016747699 0.100271016747699
+6886 1389 5889 0.10737593920352 0.10737593920352
+6887 5889 5890 0.105882607972477 0.105882607972477
+6888 5890 4707 0.0969202900217867 0.0969202900217867
+6889 4707 5891 0.0993764614715991 0.0993764614715991
+6890 5891 5892 0.0973957865151901 0.0973957865151901
+6891 5892 5894 0.0203600085186263 0.0203600085186263
+6893 5697 5895 0.0355610028885881 0.0355610028885881
+6894 5895 5896 0.0640153359599377 0.0640153359599377
+6896 4960 5897 0.0913255616395888 0.0913255616395888
+6897 5897 766 0.157641216727225 0.157641216727225
+6898 766 5898 0.395381245817633 0.395381245817633
+6899 5898 5899 0.0981801741162947 0.0981801741162947
+6900 5899 5900 0.174689811260162 0.174689811260162
+6902 2304 156 0.331433636002878 0.331433636002878
+6903 156 1720 0.249409879986366 0.249409879986366
+6904 1720 5901 0.152027484629828 0.152027484629828
+6906 5902 5903 1.05455714042968 1.05455714042968
+6907 491 5904 0.0146888160266615 0.0146888160266615
+6908 5904 5905 0.0975979556077691 0.0975979556077691
+6910 5906 5907 0.0945117172125904 0.0945117172125904
+6911 5907 5908 0.096024253167286 0.096024253167286
+6913 1999 3359 0.0933322730569792 0.0933322730569792
+6914 3359 2753 0.0957031890234733 0.0957031890234733
+6915 2753 5909 0.0964098595755736 0.0964098595755736
+6916 5909 2279 0.103797892128295 0.103797892128295
+6917 2279 3601 0.0979307072208472 0.0979307072208472
+6918 3601 5910 0.101687049589159 0.101687049589159
+6919 5910 2134 0.103076736979193 0.103076736979193
+6920 2134 5911 0.0994872973933105 0.0994872973933105
+6921 5911 5912 0.098205073412404 0.098205073412404
+6944 5930 5931 0.00713304879374381 0.00713304879374381
+6922 5912 5913 1.00880972234204 1.00880972234204
+6923 5914 3921 0.0830806742363044 0.0830806742363044
+6924 3921 1014 0.0989804018365723 0.0989804018365723
+6925 1014 5915 0.0998222515540108 0.0998222515540108
+6926 5915 5916 0.104139822117371 0.104139822117371
+6927 5916 5023 0.0793768943130485 0.0793768943130485
+6929 5917 5918 0.112165266092601 0.112165266092601
+6930 5918 5919 0.108065845165718 0.108065845165718
+6931 5919 5920 0.0537421133423824 0.0537421133423824
+6932 5920 5921 0.0547683090118863 0.0547683090118863
+6933 5921 5922 0.0617512871216813 0.0617512871216813
+6934 5922 5923 0.0505486132029595 0.0505486132029595
+6935 5923 5924 0.0485674117985671 0.0485674117985671
+6936 5924 5925 0.00910751947845144 0.00910751947845144
+6937 5925 3160 0.040672974998317 0.040672974998317
+6938 3160 5926 0.0119123696733134 0.0119123696733134
+6939 5926 5927 0.0422638247579918 0.0422638247579918
+6940 5927 5928 0.00946046354749371 0.00946046354749371
+6941 5928 4978 0.0392608349230605 0.0392608349230605
+6942 4978 5929 0.00830374951839601 0.00830374951839601
+6943 5929 5930 0.04322033436118 0.04322033436118
+12307 8642 8643 0.0298175315684779 0.0298175315684779
+6945 5931 5932 0.0454758802600548 0.0454758802600548
+6946 5932 5933 0.0473060152011751 0.0473060152011751
+6947 5933 5934 0.0496187677804403 0.0496187677804403
+6948 5934 5935 0.0504477908402203 0.0504477908402203
+6949 5935 5050 0.0515402266931002 0.0515402266931002
+6950 5050 5687 0.0468197679026621 0.0468197679026621
+6953 5453 982 0.0502364246424336 0.0502364246424336
+6954 982 5937 0.0968891441459385 0.0968891441459385
+6955 5937 5938 0.0503259455718068 0.0503259455718068
+6956 5938 5939 0.0502893520356679 0.0502893520356679
+6957 5939 3129 0.0485573864514234 0.0485573864514234
+6958 3129 5117 0.0498372694791184 0.0498372694791184
+6959 5117 5941 0.0493022558846739 0.0493022558846739
+6960 5941 4716 0.0507626244890517 0.0507626244890517
+6961 4716 5942 0.142284142826663 0.142284142826663
+6963 5943 5944 0.01393899602166 0.01393899602166
+6964 5944 5945 0.364458473389243 0.364458473389243
+6965 5945 5946 0.0993153072226578 0.0993153072226578
+6966 5946 5947 0.101492282005104 0.101492282005104
+6967 5947 5948 0.101164116161519 0.101164116161519
+6968 5948 5949 0.102917574680079 0.102917574680079
+6969 5949 5950 0.099000654458151 0.099000654458151
+6970 5950 5951 0.102683540906436 0.102683540906436
+6972 5952 5145 0.0645729302199529 0.0645729302199529
+6973 5145 2119 0.0381578888853594 0.0381578888853594
+6975 5953 5954 0.100685153983508 0.100685153983508
+6976 5954 5955 0.195476970380349 0.195476970380349
+6978 5511 5956 0.144816938742182 0.144816938742182
+6979 5956 2899 0.0164641943336492 0.0164641943336492
+6981 5957 5776 0.0786471324555583 0.0786471324555583
+6982 5776 5958 0.142074016754489 0.142074016754489
+6984 5959 5960 0.119153206354199 0.119153206354199
+6985 5960 5961 0.0270871445537288 0.0270871445537288
+6986 5961 5962 0.145839788109516 0.145839788109516
+6987 5962 5963 0.00712354730707594 0.00712354730707594
+6988 5963 5964 0.140131025523345 0.140131025523345
+6989 5964 5965 0.140225597174846 0.140225597174846
+6990 5965 4943 0.0161740048379517 0.0161740048379517
+6992 5354 5966 0.0365984296224293 0.0365984296224293
+8275 6722 2311 0.00867549185460531 0.00867549185460531
+6993 5966 5967 0.107476511645453 0.107476511645453
+6994 5967 5968 0.147256677185358 0.147256677185358
+6995 5968 5969 0.146721278462678 0.146721278462678
+6996 5969 5361 0.147170892096024 0.147170892096024
+6997 5361 2684 0.148391053722383 0.148391053722383
+6999 5970 807 0.0217813759552713 0.0217813759552713
+7001 5971 4332 0.0931508534748433 0.0931508534748433
+7002 4332 5038 0.0953468172233397 0.0953468172233397
+7004 5972 5857 0.176936009900748 0.176936009900748
+7005 5857 1300 0.178425403895618 0.178425403895618
+7006 1300 5973 0.247668336727678 0.247668336727678
+7008 5974 5975 0.19695744936537 0.19695744936537
+7010 1502 4378 0.103568243200344 0.103568243200344
+7012 5976 2341 0.175343347413509 0.175343347413509
+7013 2341 5977 0.176971375987128 0.176971375987128
+7014 5977 4784 0.243234077821538 0.243234077821538
+7015 4784 5979 0.240492752461347 0.240492752461347
+7016 5979 5980 0.0330257004550899 0.0330257004550899
+7017 5980 5981 0.271622774119548 0.271622774119548
+7018 5981 5982 0.132843712894559 0.132843712894559
+7020 5983 5984 0.0865708728240205 0.0865708728240205
+7021 5984 5985 0.115162845747273 0.115162845747273
+7023 758 5986 0.228351368086018 0.228351368086018
+7026 5146 5157 0.0344312485594002 0.0344312485594002
+7027 5157 5953 0.0793791794144798 0.0793791794144798
+7028 5953 2240 0.201141072863101 0.201141072863101
+7029 2240 4913 0.204101361959596 0.204101361959596
+7031 5988 5989 0.202410682591791 0.202410682591791
+7032 5989 5990 0.204104998697393 0.204104998697393
+7033 5990 689 0.195952399265096 0.195952399265096
+7034 689 1980 0.165723809852799 0.165723809852799
+7035 1980 1965 0.0389234534803582 0.0389234534803582
+7036 1965 5991 0.211595737081182 0.211595737081182
+7037 5991 2477 0.19787541766453 0.19787541766453
+7039 5911 5992 0.199600309761125 0.199600309761125
+7040 5992 802 0.200311937766574 0.200311937766574
+7041 802 5993 0.204076160777324 0.204076160777324
+7042 5993 5994 0.207502868601311 0.207502868601311
+7043 5994 5995 0.201507936335064 0.201507936335064
+18161 10256 2170 0.118696748630409 0.118696748630409
+7044 5995 3065 0.198422916856477 0.198422916856477
+7045 3065 5996 0.187785068593932 0.187785068593932
+7048 5998 1151 0.103522476706234 0.103522476706234
+7049 1151 5999 0.201885859106491 0.201885859106491
+7050 5999 2774 0.203030941446461 0.203030941446461
+7051 2774 6000 0.200151361396455 0.200151361396455
+7053 4375 2856 0.142504312909228 0.142504312909228
+7054 2856 6001 0.0983652484533134 0.0983652484533134
+7055 6001 6002 0.0964239306891795 0.0964239306891795
+7056 6002 6003 0.098310599923513 0.098310599923513
+7057 6003 1761 0.137700629072643 0.137700629072643
+7058 1761 6004 0.100513600298964 0.100513600298964
+7059 6004 3822 0.0995871831820294 0.0995871831820294
+7060 3822 5898 0.137360760654976 0.137360760654976
+7061 5898 6005 0.132447355715672 0.132447355715672
+7063 1597 1654 0.133194225128182 0.133194225128182
+7064 1654 6006 0.125247640008909 0.125247640008909
+7065 6006 4209 0.0896990215886268 0.0896990215886268
+7067 6007 200 0.0969312782671765 0.0969312782671765
+7069 6008 6009 0.237519218216988 0.237519218216988
+7071 6010 700 0.202130694041649 0.202130694041649
+7072 700 6011 0.200920157017241 0.200920157017241
+7074 1752 6012 0.41064210801689 0.41064210801689
+7076 6013 898 0.069285729612221 0.069285729612221
+7079 5168 6014 0.173942254032852 0.173942254032852
+7080 6014 2356 0.178647695597581 0.178647695597581
+7081 2356 4157 0.173431342052579 0.173431342052579
+7082 4157 4744 0.174265758482508 0.174265758482508
+7083 4744 6015 0.17586665041424 0.17586665041424
+7084 6015 6017 0.166030537226764 0.166030537226764
+7085 6017 1206 0.168368552768231 0.168368552768231
+7086 1206 6018 0.0222310506019077 0.0222310506019077
+7087 6018 3777 0.199517083270274 0.199517083270274
+7088 3777 6019 0.15332994885881 0.15332994885881
+7089 6019 956 0.176955920540622 0.176955920540622
+7090 956 6020 0.174665514088028 0.174665514088028
+7091 6020 4894 0.161958937862416 0.161958937862416
+7092 4894 6021 0.18390531780345 0.18390531780345
+7093 6021 5492 0.174079428498661 0.174079428498661
+7094 5492 6022 0.20029370655809 0.20029370655809
+7096 3037 6023 0.213499262828813 0.213499262828813
+7098 3578 5645 0.141952777714747 0.141952777714747
+8369 876 4464 0.138360134725968 0.138360134725968
+7100 4359 4350 0.0475473932483631 0.0475473932483631
+7101 4350 1533 0.0507609705805194 0.0507609705805194
+7102 1533 6024 0.087689125787215 0.087689125787215
+7103 6024 3036 0.0935380351023268 0.0935380351023268
+7105 2396 6026 0.14381066174273 0.14381066174273
+7107 1270 4534 0.202622361744701 0.202622361744701
+7108 4534 6027 0.199229442979025 0.199229442979025
+7110 6028 6029 0.912875631293974 0.912875631293974
+7112 1075 2498 0.0816070075181441 0.0816070075181441
+7113 2498 6030 0.0415787253165096 0.0415787253165096
+7114 6030 6031 0.0433303737265817 0.0433303737265817
+7116 6032 6033 0.0508682336735258 0.0508682336735258
+7117 6033 1215 0.0487831269807967 0.0487831269807967
+7118 1215 6034 0.0505678656124617 0.0505678656124617
+7119 6034 4787 0.0490298276079548 0.0490298276079548
+7120 4787 6035 0.0502099740409632 0.0502099740409632
+7121 6035 2168 0.0503125854793333 0.0503125854793333
+7122 2168 6036 0.0482434584483166 0.0482434584483166
+17215 8403 8420 0.200752773596098 0.200752773596098
+7123 6036 6037 0.0486536038515005 0.0486536038515005
+7125 6038 6039 0.0499795151912972 0.0499795151912972
+7126 6039 6040 0.0491412278477837 0.0491412278477837
+7127 6040 6041 0.0497771068440158 0.0497771068440158
+7128 6041 6042 0.0494653664650395 0.0494653664650395
+7129 6042 4660 0.0491491990718702 0.0491491990718702
+7130 4660 6043 0.0497609288638681 0.0497609288638681
+7131 6043 1290 0.0489747324983769 0.0489747324983769
+7133 6044 4562 0.0495973986652376 0.0495973986652376
+7134 4562 6045 0.0489640905184848 0.0489640905184848
+7135 6045 6046 0.0491691479666822 0.0491691479666822
+7136 6046 6047 0.0507578186257211 0.0507578186257211
+7137 6047 2730 0.0500913644840885 0.0500913644840885
+7138 2730 6048 0.0486937991070737 0.0486937991070737
+7139 6048 6049 0.0563508416708434 0.0563508416708434
+7140 6049 6050 0.0543668616299433 0.0543668616299433
+7141 6050 3755 0.049786406684993 0.049786406684993
+7142 3755 6051 0.0495857892809515 0.0495857892809515
+7143 6051 6052 0.0496881410470813 0.0496881410470813
+7144 6052 6053 0.0491149994031363 0.0491149994031363
+18545 5563 7539 0.0787059485791879 0.0787059485791879
+7145 6053 6054 0.0498540025598143 0.0498540025598143
+7146 6054 6055 0.0489875409651698 0.0489875409651698
+7147 6055 4007 0.0499802866726516 0.0499802866726516
+7148 4007 6056 0.0488162842829032 0.0488162842829032
+7149 6056 6057 0.0489359547659716 0.0489359547659716
+7150 6057 6058 0.0509862761511403 0.0509862761511403
+7151 6058 1391 0.0507897478531174 0.0507897478531174
+7152 1391 6059 0.0484575520219378 0.0484575520219378
+7154 6060 6061 0.051268887373703 0.051268887373703
+7155 6061 3440 0.0523540538479921 0.0523540538479921
+7156 3440 6062 0.0526542821957606 0.0526542821957606
+7157 6062 5722 0.0500652354639954 0.0500652354639954
+7158 5722 6063 0.0491749564449066 0.0491749564449066
+7159 6063 6064 0.0490553316653512 0.0490553316653512
+7160 6064 6065 0.0504053225202572 0.0504053225202572
+7161 6065 6066 0.0491577785316978 0.0491577785316978
+7162 6066 6067 0.0500917004504544 0.0500917004504544
+7163 6067 6068 0.0487330457346556 0.0487330457346556
+7164 6068 6069 0.0500468552276867 0.0500468552276867
+7165 6069 1089 0.0473039342434908 0.0473039342434908
+7166 1089 6070 0.0519349767204956 0.0519349767204956
+7167 6070 6071 0.0483547253107021 0.0483547253107021
+7169 6072 3860 0.0495593243927177 0.0495593243927177
+7170 3860 6073 0.0493012970703545 0.0493012970703545
+7171 6073 5585 0.0529959751032204 0.0529959751032204
+7173 1003 5222 0.108094382628624 0.108094382628624
+7175 6074 3213 0.169273308004073 0.169273308004073
+7176 3213 6075 0.200540081035548 0.200540081035548
+7177 6075 1924 0.199718283006537 0.199718283006537
+7178 1924 6076 0.202212418704144 0.202212418704144
+7179 6076 3268 0.201184980777767 0.201184980777767
+7180 3268 6077 0.201398824177077 0.201398824177077
+7181 6077 81 0.202519482529809 0.202519482529809
+7182 81 3517 0.205035908609294 0.205035908609294
+7183 3517 4259 0.201561198640626 0.201561198640626
+7184 4259 6078 0.201877222241407 0.201877222241407
+7185 6078 6079 0.198020897047098 0.198020897047098
+7186 6079 5828 0.204359521871182 0.204359521871182
+7187 5828 6080 0.203452288011347 0.203452288011347
+7188 6080 6081 0.199577893436046 0.199577893436046
+7189 6082 4198 0.0554105901874734 0.0554105901874734
+8462 1578 6834 0.296770354889592 0.296770354889592
+7190 4198 6083 0.479532197769768 0.479532197769768
+7193 6085 3417 0.199987779646285 0.199987779646285
+7195 5561 6086 0.0785728419075768 0.0785728419075768
+7196 6086 6087 0.711200705359908 0.711200705359908
+7197 6088 6089 0.0569381576865727 0.0569381576865727
+7199 1755 4797 0.0569796757564415 0.0569796757564415
+7200 4797 6090 0.0568688820659326 0.0568688820659326
+7201 6090 2163 0.0576467707798926 0.0576467707798926
+7202 2163 6091 0.115287318699314 0.115287318699314
+7204 4029 6092 0.199820514844545 0.199820514844545
+7205 6092 3413 0.201407533266255 0.201407533266255
+7207 6093 6094 0.0604203300865654 0.0604203300865654
+7208 6094 6095 0.0494745769978518 0.0494745769978518
+7209 6095 6096 0.0926701881064251 0.0926701881064251
+7210 6096 4028 0.05825540400242 0.05825540400242
+7212 5558 6097 0.589453817263917 0.589453817263917
+7213 111 6098 0.0840698350347185 0.0840698350347185
+7214 6098 5387 0.102649580636379 0.102649580636379
+7216 6099 4834 0.0618019179836103 0.0618019179836103
+7217 4834 6100 0.103506880889302 0.103506880889302
+7218 6100 6101 0.102436270515026 0.102436270515026
+7219 6101 6102 0.0462582791506537 0.0462582791506537
+7221 5388 6103 0.0951666989097628 0.0951666989097628
+7222 6103 6104 0.103533109860882 0.103533109860882
+17793 6179 8402 0.062258154453335 0.062258154453335
+7223 6104 6105 1.01266363478673 1.01266363478673
+7226 6107 6108 0.0985711721031886 0.0985711721031886
+7227 6108 6109 0.106459269312792 0.106459269312792
+7228 6109 6110 0.106833918076069 0.106833918076069
+7229 6110 3622 0.0989181087898918 0.0989181087898918
+7230 3622 6111 0.098886772683552 0.098886772683552
+7231 6111 6112 0.0498651872917774 0.0498651872917774
+7232 6112 6113 0.0465544361472323 0.0465544361472323
+7233 6113 6114 0.048644459525012 0.048644459525012
+7234 6114 1769 0.0504837415599517 0.0504837415599517
+7235 1769 4488 0.0559949291466801 0.0559949291466801
+7236 4488 6115 0.0469382916231929 0.0469382916231929
+7237 6115 4839 0.0486148679353184 0.0486148679353184
+7239 1519 5280 0.0508144170388461 0.0508144170388461
+7240 5280 6116 0.0496680994860777 0.0496680994860777
+7241 6116 1086 0.0854394240121282 0.0854394240121282
+7244 6118 5426 0.102968153598516 0.102968153598516
+7245 5426 6119 0.101169119900675 0.101169119900675
+7246 6119 2048 0.10059076820208 0.10059076820208
+7247 2048 6120 0.0997250287478783 0.0997250287478783
+7248 6120 6121 0.100591265363907 0.100591265363907
+7249 6121 6122 0.0474195280765072 0.0474195280765072
+7250 6122 3477 0.0495243305794908 0.0495243305794908
+7251 3477 6123 0.0472960657562571 0.0472960657562571
+7252 6123 6075 0.0518212274102399 0.0518212274102399
+7253 6075 6124 0.0477720158174774 0.0477720158174774
+7254 6124 3692 0.0491494225474026 0.0491494225474026
+7255 3692 6125 0.0492733746042409 0.0492733746042409
+7256 6125 4567 0.0513179295413005 0.0513179295413005
+7257 4567 6126 0.104996585237884 0.104996585237884
+7259 6127 6128 0.202552708883543 0.202552708883543
+7260 6128 6129 0.200575382409089 0.200575382409089
+7261 6129 6130 0.200851528697639 0.200851528697639
+7263 6131 4042 0.178407205955933 0.178407205955933
+7264 4042 6132 0.176658257473219 0.176658257473219
+7265 6132 6133 0.173893747367395 0.173893747367395
+7266 6133 1832 0.00321363581065808 0.00321363581065808
+7267 1832 6134 0.0979518830790181 0.0979518830790181
+7268 6134 2577 0.0768544895315019 0.0768544895315019
+7270 2974 713 0.0553033256449361 0.0553033256449361
+7271 713 1884 0.049816225531446 0.049816225531446
+7272 1884 269 0.0489259588819734 0.0489259588819734
+7273 269 6135 0.049929244786193 0.049929244786193
+7274 6135 6095 0.0608968307992014 0.0608968307992014
+7276 1819 6136 0.206807888451467 0.206807888451467
+7278 6137 6138 0.137211297869344 0.137211297869344
+7280 6139 4576 0.0888580713995718 0.0888580713995718
+7281 4576 6140 0.134023429450374 0.134023429450374
+7282 6140 5292 0.135037120828343 0.135037120828343
+7283 5292 6141 0.134292125855752 0.134292125855752
+7285 11 6142 0.134290112908847 0.134290112908847
+7286 6142 6143 0.134379347336523 0.134379347336523
+7287 6143 6144 0.135319045428869 0.135319045428869
+7288 6144 6145 0.133823509557072 0.133823509557072
+7289 6145 6146 0.133595456488811 0.133595456488811
+7290 6146 6147 0.132813208199385 0.132813208199385
+7291 6147 6148 0.135903166352965 0.135903166352965
+7293 6149 5532 0.117263436099258 0.117263436099258
+7294 5532 6150 0.292646155170772 0.292646155170772
+7296 4069 6054 0.143532163506992 0.143532163506992
+7297 6054 5794 0.200517814130868 0.200517814130868
+7299 6151 6152 0.134234537479531 0.134234537479531
+7300 6152 2491 0.134965193585355 0.134965193585355
+7301 2491 2836 0.132191750515313 0.132191750515313
+7303 2760 6153 0.17786816992516 0.17786816992516
+7304 6153 3104 0.174733256162163 0.174733256162163
+7305 3104 6156 0.194828104098244 0.194828104098244
+7307 62 3549 0.192897189560382 0.192897189560382
+7309 191 5855 0.144500472019434 0.144500472019434
+7313 1335 6158 0.164940728280041 0.164940728280041
+7315 3709 719 0.105637457999026 0.105637457999026
+7317 3184 6159 0.175088076753778 0.175088076753778
+7318 6159 91 0.0479220492178455 0.0479220492178455
+7319 91 3527 0.203258724621779 0.203258724621779
+7320 3527 6160 0.201096029386997 0.201096029386997
+7321 6160 6161 0.201913621123293 0.201913621123293
+7323 6162 5834 0.203525395170747 0.203525395170747
+7324 5834 6163 0.200952914390398 0.200952914390398
+7326 3276 3651 0.182839298131176 0.182839298131176
+7329 6166 4285 0.103763551261197 0.103763551261197
+7331 1617 6167 0.103830241851319 0.103830241851319
+7333 6168 2159 0.117895446926253 0.117895446926253
+7334 2159 4795 0.11289998607803 0.11289998607803
+7335 4795 1226 0.113625921506999 0.113625921506999
+7337 4401 4400 0.117696624021516 0.117696624021516
+7341 2320 4278 0.147648925220672 0.147648925220672
+7342 4278 6174 0.145039413918761 0.145039413918761
+7343 6174 633 0.147839808469135 0.147839808469135
+7344 633 5324 0.144274087604939 0.144274087604939
+7345 5324 2036 0.144878759704946 0.144878759704946
+7346 2036 6175 0.146765627629388 0.146765627629388
+7347 6175 5506 0.146988764364424 0.146988764364424
+7349 4458 6176 0.146285529633972 0.146285529633972
+7350 6176 6177 0.143815084290611 0.143815084290611
+7351 6177 6178 0.149072223288683 0.149072223288683
+7352 6178 6179 0.102502676747671 0.102502676747671
+7353 6179 6180 0.0433701075577025 0.0433701075577025
+7354 6180 6181 0.146972104646326 0.146972104646326
+7355 6181 6182 0.147344314502621 0.147344314502621
+7356 6182 6183 0.145754933885852 0.145754933885852
+7357 6183 6184 0.147948446924155 0.147948446924155
+7358 6184 6185 0.145005273136899 0.145005273136899
+7359 6185 6186 0.141478743986661 0.141478743986661
+7360 6186 5784 0.0051191432185562 0.0051191432185562
+7361 5784 6187 0.145606807182671 0.145606807182671
+7362 6187 6188 0.145777030768037 0.145777030768037
+7363 6188 6189 0.147177496711371 0.147177496711371
+7365 999 4221 0.0806091686632927 0.0806091686632927
+7366 4221 6190 0.102381971527348 0.102381971527348
+7367 6190 6193 0.0984965085324321 0.0984965085324321
+7368 6193 969 0.0952400858484175 0.0952400858484175
+7369 969 6194 0.0506536388127553 0.0506536388127553
+7370 6194 5287 0.0506057613654141 0.0506057613654141
+7371 5287 3152 0.0954510374534177 0.0954510374534177
+7372 3152 4968 0.0960843478924756 0.0960843478924756
+7373 4968 6195 0.0415654887010154 0.0415654887010154
+15921 9749 9750 0.0318908811678005 0.0318908811678005
+7401 6213 6214 0.0495719593537107 0.0495719593537107
+7374 335 340 0.288826145863276 0.288826145863276
+7378 519 6197 0.0784497798176465 0.0784497798176465
+7379 6197 6198 0.0395399248279629 0.0395399248279629
+7380 6198 6199 0.019955626672929 0.019955626672929
+7382 6200 6201 0.0919482301684137 0.0919482301684137
+7383 6201 6202 0.111020276961071 0.111020276961071
+7385 4485 6203 0.0919528384362936 0.0919528384362936
+7386 6203 4199 0.0670783480641165 0.0670783480641165
+7387 4199 6204 0.129739883939344 0.129739883939344
+7388 6204 6083 0.021522983414344 0.021522983414344
+7390 1820 6205 0.059780784078693 0.059780784078693
+7391 6205 6206 0.0520794903588436 0.0520794903588436
+7392 6206 6207 0.0535277276856965 0.0535277276856965
+7393 6207 6208 0.052616435606338 0.052616435606338
+7395 6209 6210 0.054197774205049 0.054197774205049
+7396 6210 600 0.122572832169608 0.122572832169608
+7397 600 6211 0.0472521628905724 0.0472521628905724
+7398 6211 5708 0.0430357389006543 0.0430357389006543
+7399 5708 6212 0.0495085394583916 0.0495085394583916
+7400 6212 6213 0.0462483397604104 0.0462483397604104
+7402 6214 6215 0.0428153220943109 0.0428153220943109
+7403 6215 6216 0.0471000262746752 0.0471000262746752
+7404 6216 6217 0.0473822229177533 0.0473822229177533
+7405 6217 1100 0.091970261814681 0.091970261814681
+7406 1100 6218 0.0449415553049736 0.0449415553049736
+7407 6218 6219 0.0480654852744355 0.0480654852744355
+7408 6219 6221 0.0454218674668918 0.0454218674668918
+7409 6221 3858 0.0463369187822574 0.0463369187822574
+7410 3858 6222 0.0463493111972249 0.0463493111972249
+7411 6222 5594 0.0512843332286284 0.0512843332286284
+7412 5594 6223 0.0568069326737853 0.0568069326737853
+7413 6223 6224 0.0525700432289869 0.0525700432289869
+7414 6224 6225 0.0976339163821139 0.0976339163821139
+7439 6242 6243 0.0662881511283164 0.0662881511283164
+7415 6225 6226 0.598121759063317 0.598121759063317
+7416 3855 6227 0.0533569775705536 0.0533569775705536
+7417 6227 5550 0.054545728952838 0.054545728952838
+7419 6228 6229 0.0491582246006862 0.0491582246006862
+7420 6229 6230 0.632851875022697 0.632851875022697
+7421 4649 6231 0.0998318489902405 0.0998318489902405
+7423 3956 6232 0.132968901609209 0.132968901609209
+7424 6232 6233 0.0436348818689085 0.0436348818689085
+7425 6233 6234 0.0454822742996404 0.0454822742996404
+7426 6234 6235 0.049945575036802 0.049945575036802
+7427 6235 6236 0.0503304157761669 0.0503304157761669
+7428 6236 6237 0.0508263629674458 0.0508263629674458
+7429 6237 4952 0.0505868421691217 0.0505868421691217
+7430 4952 4681 0.10191805721873 0.10191805721873
+7431 4681 6238 0.099594470461032 0.099594470461032
+7432 6238 6239 0.057251122773958 0.057251122773958
+7433 6239 6240 0.108863184827896 0.108863184827896
+7434 6240 5092 0.0381385955203522 0.0381385955203522
+7435 5092 5227 0.108194428858344 0.108194428858344
+7437 5219 6241 0.0418231546106276 0.0418231546106276
+7438 6241 6242 0.0122130870650471 0.0122130870650471
+7442 1601 1657 0.147607723017958 0.147607723017958
+7444 5765 6244 0.238854062350574 0.238854062350574
+7445 6244 5899 0.278312459096762 0.278312459096762
+7446 5899 1600 0.0794217837629518 0.0794217837629518
+7448 4405 4957 0.275380198668453 0.275380198668453
+7450 4315 4502 0.0962009886521744 0.0962009886521744
+7451 4502 6245 0.0998685092157526 0.0998685092157526
+7452 6245 5078 0.0969948238046964 0.0969948238046964
+7453 5078 6246 0.102086344844989 0.102086344844989
+7454 6246 6247 0.102069890156656 0.102069890156656
+7455 6247 6248 0.0998684901150858 0.0998684901150858
+7456 6248 6249 0.099157147424293 0.099157147424293
+7457 6249 6250 0.0998927126402804 0.0998927126402804
+7459 4376 2857 0.174778525570848 0.174778525570848
+7461 1656 6251 0.113089099397014 0.113089099397014
+7462 6251 4210 0.0895877408394824 0.0895877408394824
+7463 4210 6252 0.0984078699260149 0.0984078699260149
+7464 6252 202 0.0984164433029134 0.0984164433029134
+7465 202 2930 0.0999116533304243 0.0999116533304243
+7467 5311 1467 0.0969591422712861 0.0969591422712861
+7468 1467 5446 0.104331765041419 0.104331765041419
+7470 6253 6254 0.108544830855141 0.108544830855141
+7471 6254 6255 0.0440614876081187 0.0440614876081187
+7472 6255 6256 0.10258169252724 0.10258169252724
+7473 6256 6257 0.0426791560290334 0.0426791560290334
+7474 6257 1181 0.0541704333597994 0.0541704333597994
+7476 6258 5341 0.664349456749629 0.664349456749629
+7480 1556 736 0.1281317837441 0.1281317837441
+7482 6260 6261 0.0586102720745076 0.0586102720745076
+7484 1188 6262 0.0214828666370953 0.0214828666370953
+7485 6262 3789 0.199388923153335 0.199388923153335
+7486 3789 5915 0.154872293830304 0.154872293830304
+7487 5915 6263 0.0506492890867135 0.0506492890867135
+7488 6264 2248 0.0665325760000431 0.0665325760000431
+7489 2248 4881 0.176090081583566 0.176090081583566
+7490 4881 6265 0.19613430259676 0.19613430259676
+7491 6265 5479 0.175348484443179 0.175348484443179
+7492 5479 6266 0.176845636908204 0.176845636908204
+7493 6266 6267 0.178089834743743 0.178089834743743
+7494 6267 676 0.00240181041514711 0.00240181041514711
+7495 676 6268 0.00459391026290071 0.00459391026290071
+7496 6268 6269 0.174858851790528 0.174858851790528
+7497 6269 4598 0.173764465207871 0.173764465207871
+7500 6270 6271 0.133612621428605 0.133612621428605
+7501 6271 6272 0.00412533177852682 0.00412533177852682
+7502 6272 6273 0.00367565176707242 0.00367565176707242
+7503 6273 6274 0.134146296121319 0.134146296121319
+20534 10849 10832 0.00532626442143788 0.00532626442143788
+7504 6274 6275 0.138338671785307 0.138338671785307
+7505 6275 829 0.140763564032817 0.140763564032817
+7506 829 3569 0.13985476308825 0.13985476308825
+7507 3569 5638 0.139885286720423 0.139885286720423
+7508 5638 4342 0.139394668795268 0.139394668795268
+7509 4342 6276 0.136887040523289 0.136887040523289
+7510 6276 3042 0.135179672321338 0.135179672321338
+7511 3042 6277 0.141328751765533 0.141328751765533
+7512 6277 6278 0.0048613905607292 0.0048613905607292
+7513 6278 6279 0.138461653724603 0.138461653724603
+7514 6279 1163 0.137550674895164 0.137550674895164
+7515 1163 883 0.14127337175944 0.14127337175944
+7516 883 4468 0.137815416161984 0.137815416161984
+7517 4468 2790 0.135224582480649 0.135224582480649
+7518 2790 5258 0.130698751805084 0.130698751805084
+7519 5258 6280 0.127788689349157 0.127788689349157
+7521 6281 4149 0.293690516229792 0.293690516229792
+7522 4149 4399 0.168839008279682 0.168839008279682
+7524 6202 6282 0.107543949920042 0.107543949920042
+7525 6282 6283 0.203165579542053 0.203165579542053
+7526 6283 2881 0.158375292404745 0.158375292404745
+7528 6284 6285 0.199406415880408 0.199406415880408
+7530 2831 1439 0.198717844078091 0.198717844078091
+7531 1439 6286 0.198972452931936 0.198972452931936
+7533 4103 6046 0.129598634612641 0.129598634612641
+7534 6046 6287 0.200664408696912 0.200664408696912
+7535 6287 6288 0.407763176533057 0.407763176533057
+7536 3356 6289 0.17574244534878 0.17574244534878
+7537 6289 3103 0.174022554549137 0.174022554549137
+7538 3103 6290 0.195576263268451 0.195576263268451
+7539 6290 6291 0.0184164625226683 0.0184164625226683
+7543 5848 6293 0.0908806324614032 0.0908806324614032
+7544 6293 6294 0.111642131539399 0.111642131539399
+7546 6295 6296 0.199763041133193 0.199763041133193
+7547 6297 4228 0.205146518268072 0.205146518268072
+7548 4228 6298 0.220075142380819 0.220075142380819
+7549 6299 6300 0.269225278413762 0.269225278413762
+7550 6300 6301 0.135380699238895 0.135380699238895
+7551 6301 6037 0.201685647547083 0.201685647547083
+7552 6037 4092 0.180825512734332 0.180825512734332
+8788 5909 7005 0.202308283638507 0.202308283638507
+7555 1356 1434 0.0619921139139986 0.0619921139139986
+7556 1434 1416 0.0702533335118034 0.0702533335118034
+7557 1416 2824 0.130534926760632 0.130534926760632
+7558 2824 2485 0.13649413612348 0.13649413612348
+7559 2485 6304 0.132600390611243 0.132600390611243
+7560 6304 6305 0.13375224687231 0.13375224687231
+7562 6293 6306 0.193932773048905 0.193932773048905
+7564 6307 4033 0.1068931298406 0.1068931298406
+7566 6308 1505 0.201208565153675 0.201208565153675
+7567 1505 178 0.201696340498873 0.201696340498873
+7568 178 1706 0.202420430939935 0.202420430939935
+7569 1706 6310 0.205872571954156 0.205872571954156
+7571 1393 5861 0.176199480761084 0.176199480761084
+7573 1309 5328 0.243304763536767 0.243304763536767
+17643 524 9824 0.0585508481458027 0.0585508481458027
+7575 6311 6312 0.480549704702292 0.480549704702292
+7576 4368 1449 0.194542255499986 0.194542255499986
+7577 1449 6313 0.208609985343506 0.208609985343506
+7578 6313 6314 0.103555170544593 0.103555170544593
+7579 6314 6315 0.0981349608621905 0.0981349608621905
+7581 3820 5895 0.101734690953305 0.101734690953305
+7583 6316 6317 0.456743307850688 0.456743307850688
+7584 5896 1591 0.201196573887444 0.201196573887444
+7585 1591 1642 0.201704599280981 0.201704599280981
+7587 4303 6319 0.0895876341901528 0.0895876341901528
+7589 6320 5074 0.0881249654942257 0.0881249654942257
+7590 5074 6321 0.0822356991688935 0.0822356991688935
+7592 3098 3208 0.20139821402018 0.20139821402018
+7593 3208 6120 0.199810792778826 0.199810792778826
+7594 6120 1919 0.202180610053987 0.202180610053987
+7595 1919 6322 0.202387552164505 0.202387552164505
+7596 6322 3262 0.201452153939087 0.201452153939087
+7597 3262 6323 0.198460905873661 0.198460905873661
+7599 6325 6326 0.0490995020648654 0.0490995020648654
+7600 6326 6327 0.055368676730927 0.055368676730927
+7601 6327 6328 0.0309445801475025 0.0309445801475025
+7602 6328 992 0.0695937269558986 0.0695937269558986
+7603 992 5033 0.0562459052664965 0.0562459052664965
+8836 2977 657 0.0520837064464313 0.0520837064464313
+7604 5033 6329 0.0516777216994855 0.0516777216994855
+7605 6329 5046 0.105372499364086 0.105372499364086
+7606 5046 4160 0.118696493530277 0.118696493530277
+7607 4160 6330 0.136699581092316 0.136699581092316
+7608 6330 4974 0.128955324206818 0.128955324206818
+7609 4974 4766 0.151821196012923 0.151821196012923
+7610 4766 6331 0.118237006648706 0.118237006648706
+7611 6331 6332 0.150079343538278 0.150079343538278
+7612 6332 6333 0.165501031184984 0.165501031184984
+7613 6333 6334 0.0461738747625761 0.0461738747625761
+7614 6334 6335 0.133457305058149 0.133457305058149
+7615 6335 1212 0.134967826650912 0.134967826650912
+7617 2900 6336 0.106167707809224 0.106167707809224
+7618 6336 6337 0.104928236912142 0.104928236912142
+7619 6337 4735 0.104475212628964 0.104475212628964
+7620 4735 6338 0.102406513567036 0.102406513567036
+7621 6338 6339 0.111236760215522 0.111236760215522
+7622 6339 5400 0.102611714232847 0.102611714232847
+7623 5400 6340 0.108937307551118 0.108937307551118
+7624 6340 3903 0.106714805368354 0.106714805368354
+7625 3903 1040 0.101833845648583 0.101833845648583
+7626 1040 6276 0.108458622663871 0.108458622663871
+7627 6276 6341 0.106851583282394 0.106851583282394
+7628 6341 5005 0.0997823108241272 0.0997823108241272
+7629 5005 3326 0.104184561842385 0.104184561842385
+7630 3326 6343 0.103107525114489 0.103107525114489
+7631 6343 6344 0.102577524667858 0.102577524667858
+7632 6344 2077 0.109057202290834 0.109057202290834
+7633 2077 2674 0.105238001385814 0.105238001385814
+7634 2674 4124 0.102908082653388 0.102908082653388
+7635 4124 6345 0.111237019236159 0.111237019236159
+7636 6345 6346 0.0932071004983952 0.0932071004983952
+7637 6346 6347 0.101110239024215 0.101110239024215
+7638 6347 3472 0.0998858354760893 0.0998858354760893
+7639 3472 6024 0.100184077827119 0.100184077827119
+7641 3875 6348 0.0931831682605449 0.0931831682605449
+7642 6348 851 0.00806942804368034 0.00806942804368034
+7644 6349 6350 0.122741608307903 0.122741608307903
+7646 6351 6352 0.0367221312616467 0.0367221312616467
+7648 6353 6352 0.031587926861642 0.031587926861642
+7649 6352 6353 0.031587926861642 0.031587926861642
+7651 4284 5406 0.209059343043956 0.209059343043956
+7652 5406 3139 0.106127827196287 0.106127827196287
+7653 3139 3924 0.0976499059560775 0.0976499059560775
+7654 3924 5060 0.353918950652385 0.353918950652385
+7655 5060 5012 0.0994873589954365 0.0994873589954365
+7658 6356 2071 0.094898000530225 0.094898000530225
+7659 2071 2669 0.0951372963506741 0.0951372963506741
+7660 2669 4139 0.0930605458860926 0.0930605458860926
+7661 4139 6357 0.0866508308410144 0.0866508308410144
+7662 6357 6358 0.100153967379628 0.100153967379628
+7663 6358 6359 0.094521960675225 0.094521960675225
+7664 6359 834 0.394334341459341 0.394334341459341
+7665 834 871 0.00699086459728944 0.00699086459728944
+7666 871 6360 0.0985643561678323 0.0985643561678323
+7667 6360 6361 0.0919153430634884 0.0919153430634884
+7668 6361 6362 0.0142210252134503 0.0142210252134503
+7670 6363 6250 0.198277134301598 0.198277134301598
+7671 6250 6258 0.115286899945233 0.115286899945233
+7672 6258 6364 0.0878557774552784 0.0878557774552784
+7673 6364 1498 0.200867314778576 0.200867314778576
+7675 187 5877 0.162832287710312 0.162832287710312
+7676 5877 1716 0.0499429374304698 0.0499429374304698
+7678 6365 1582 0.142378532382676 0.142378532382676
+7679 1582 6366 1.28806099537571 1.28806099537571
+7680 6367 2271 0.093525872105216 0.093525872105216
+7681 2271 6368 0.0953526699152847 0.0953526699152847
+7682 6368 6369 0.0956103425754401 0.0956103425754401
+7683 6369 2130 0.0946975078442247 0.0946975078442247
+7684 2130 5981 0.0976635368625979 0.0976635368625979
+7685 5981 6370 0.0910203235542429 0.0910203235542429
+7686 6370 2335 0.0939706612325521 0.0939706612325521
+7687 2335 6371 1.7470149025737 1.7470149025737
+7688 96 3500 0.202527213410831 0.202527213410831
+7689 3500 6372 0.200485391157046 0.200485391157046
+7690 6372 6373 0.200744473183588 0.200744473183588
+7691 6373 6374 0.203425216522523 0.203425216522523
+7692 6374 261 0.363896677888795 0.363896677888795
+7693 261 6375 0.041137585532266 0.041137585532266
+7694 6375 6376 0.527231991542063 0.527231991542063
+8934 2865 7087 0.201874708309178 0.201874708309178
+7696 6377 3069 0.174367166483664 0.174367166483664
+7697 3069 6378 0.175688037406208 0.175688037406208
+7698 6378 6379 0.195293035214527 0.195293035214527
+7700 5015 6380 0.0917013339896307 0.0917013339896307
+7702 380 6381 0.0601450697094338 0.0601450697094338
+7703 6381 3398 0.0950953426294514 0.0950953426294514
+7704 3398 6384 0.0512135480319707 0.0512135480319707
+7705 6384 6385 0.0512477474787707 0.0512477474787707
+7706 6385 6386 0.0508150751685789 0.0508150751685789
+7707 6386 6387 0.0467877396177586 0.0467877396177586
+7708 6387 6388 0.102738526459791 0.102738526459791
+7709 6388 6389 0.0502022657375815 0.0502022657375815
+7710 6389 6390 0.0495952560526731 0.0495952560526731
+7711 6390 6391 0.0506266673865361 0.0506266673865361
+7712 6391 1111 0.0484464674507555 0.0484464674507555
+7714 4654 1272 0.131229439030854 0.131229439030854
+7715 1272 6392 0.0233060632854453 0.0233060632854453
+7716 6392 4560 0.111717062627726 0.111717062627726
+7717 4560 2711 0.115276038939543 0.115276038939543
+7718 2711 6393 0.157827401374253 0.157827401374253
+7720 6394 6142 0.134287937529063 0.134287937529063
+7721 6142 4016 0.132933704994743 0.132933704994743
+7722 4016 6395 0.00906250528140326 0.00906250528140326
+7723 6395 382 0.124591902443133 0.124591902443133
+7725 5850 6396 0.00523272011597534 0.00523272011597534
+7726 6396 501 0.199511293598505 0.199511293598505
+7727 501 6397 0.217152349025227 0.217152349025227
+7728 6397 6398 0.36755359975324 0.36755359975324
+7730 3613 6399 0.21266860576331 0.21266860576331
+7732 6401 6402 0.038551456513769 0.038551456513769
+7733 6402 6403 0.01171446339475 0.01171446339475
+7735 2909 6404 0.0724414530545414 0.0724414530545414
+7736 6404 6405 0.105070094163828 0.105070094163828
+7737 6405 6174 0.106062498124406 0.106062498124406
+7738 6174 3312 0.104669820520163 0.104669820520163
+7739 3312 6406 0.105292804834109 0.105292804834109
+7741 5545 2415 0.0733757601851338 0.0733757601851338
+7743 5056 4299 0.0731858562049149 0.0731858562049149
+7745 5093 6407 0.0155546054802435 0.0155546054802435
+7747 3914 4762 0.124500033165113 0.124500033165113
+7750 6409 5773 0.332202382721644 0.332202382721644
+7752 6410 6411 0.0178672618817003 0.0178672618817003
+7754 6409 6412 0.0520862922994697 0.0520862922994697
+7756 6231 6413 0.198055274582402 0.198055274582402
+7758 6414 6415 0.189433856898839 0.189433856898839
+7759 6416 4038 0.0834324728266378 0.0834324728266378
+7761 6417 4521 0.134579982196382 0.134579982196382
+7762 4521 5240 0.13502405245006 0.13502405245006
+7763 5240 6418 0.13412336654487 0.13412336654487
+7764 6418 6419 0.133878890575632 0.133878890575632
+7765 6419 1678 0.134913237668999 0.134913237668999
+7766 1678 6421 0.134568146094945 0.134568146094945
+7767 6421 2457 0.135266114631303 0.135266114631303
+7768 2457 3225 0.138075006668938 0.138075006668938
+7769 3225 5745 0.134195295626898 0.134195295626898
+7770 5745 5522 0.132936679979251 0.132936679979251
+7771 5522 6422 0.135417328130375 0.135417328130375
+7772 6422 6423 0.137879539043021 0.137879539043021
+7776 6425 6426 0.131565838315989 0.131565838315989
+9014 7117 7118 0.0653478278832396 0.0653478278832396
+7778 2486 2825 0.134659485620958 0.134659485620958
+7779 2825 1435 0.20171777298344 0.20171777298344
+7780 1435 6427 0.150355567395556 0.150355567395556
+7782 4094 6039 0.18817564016619 0.18817564016619
+7783 6039 6428 0.201342188276825 0.201342188276825
+7784 6428 6429 0.404705192201308 0.404705192201308
+7785 6430 2403 0.202864038761159 0.202864038761159
+7786 2403 6431 0.0331723473682169 0.0331723473682169
+7787 6431 6432 0.176045966759895 0.176045966759895
+7789 6433 6434 0.0826623084672878 0.0826623084672878
+7790 6434 6435 0.102944521823956 0.102944521823956
+7791 6435 6436 0.00978588535341196 0.00978588535341196
+7793 6131 5859 0.176922247784819 0.176922247784819
+7794 5859 1306 0.176947022701008 0.176947022701008
+7795 1306 6437 0.245961882429388 0.245961882429388
+7797 4379 175 0.0949912703955897 0.0949912703955897
+7799 6438 6439 0.118265132463411 0.118265132463411
+7800 426 6440 0.136068759302944 0.136068759302944
+7801 6440 6140 0.13326442219696 0.13326442219696
+7802 6140 4012 0.134504046499466 0.134504046499466
+7803 4012 6441 0.132430300578831 0.132430300578831
+7804 6441 6442 0.13523718007968 0.13523718007968
+7805 6442 3383 0.131020837855346 0.131020837855346
+7807 6443 5593 0.101318153214668 0.101318153214668
+7809 5592 6444 0.0976166388579658 0.0976166388579658
+7810 6444 6445 0.491425863708822 0.491425863708822
+7814 2400 6448 0.282522157819803 0.282522157819803
+7817 2813 6450 0.086833012009872 0.086833012009872
+7819 6451 6452 0.0978256934477298 0.0978256934477298
+7820 6452 3935 0.102019422492613 0.102019422492613
+7821 3935 5623 0.0992172562512715 0.0992172562512715
+7823 6453 4202 0.100516365940058 0.100516365940058
+7824 4202 1069 0.100502974298411 0.100502974298411
+7825 1069 2505 0.106288157429336 0.106288157429336
+7827 6454 1236 0.0948029547901802 0.0948029547901802
+7828 1236 4810 0.0999111243280575 0.0999111243280575
+7829 4810 2177 0.101346858256007 0.101346858256007
+7830 2177 595 0.0594373309242362 0.0594373309242362
+7831 595 6456 0.0424911721972826 0.0424911721972826
+7833 349 6422 0.0713248739505624 0.0713248739505624
+7834 6422 4630 0.121079515215535 0.121079515215535
+7836 1259 376 0.0755636106904258 0.0755636106904258
+7837 376 4545 0.0608816123146845 0.0608816123146845
+7838 4545 2701 0.135701731606855 0.135701731606855
+7839 2701 6457 0.126994454068005 0.126994454068005
+7841 6458 6459 0.0454788769710747 0.0454788769710747
+7842 6459 6460 0.0496400956308302 0.0496400956308302
+7843 6460 6461 0.0515972381206 0.0515972381206
+7845 6462 6463 0.0483118204156802 0.0483118204156802
+7846 6463 1134 0.0499784066419261 0.0499784066419261
+7847 1134 6464 0.0497410465605515 0.0497410465605515
+7849 6465 6466 0.0544130408961272 0.0544130408961272
+7850 6466 3850 0.0472855484942146 0.0472855484942146
+7851 3850 6467 0.0501739162143614 0.0501739162143614
+7852 6467 5576 0.0486954285842123 0.0486954285842123
+7854 6468 4673 0.110758148850492 0.110758148850492
+7855 4673 6469 0.101963932591745 0.101963932591745
+7857 5575 6471 0.0065719182159958 0.0065719182159958
+7858 6471 6472 0.0420124186537075 0.0420124186537075
+7859 6472 6473 0.0412603655949121 0.0412603655949121
+7860 6473 6474 0.00681975388326533 0.00681975388326533
+7862 6476 3433 0.101986471383689 0.101986471383689
+7864 6477 6478 0.14533158628719 0.14533158628719
+7865 6478 6479 0.146043976986052 0.146043976986052
+7866 6479 2014 0.145258231311968 0.145258231311968
+7867 2014 6480 0.148541120069898 0.148541120069898
+7868 6480 6481 0.146497737165933 0.146497737165933
+7870 6482 6483 0.108282286689265 0.108282286689265
+7871 6483 6484 0.108491401341724 0.108491401341724
+7873 6485 6486 0.107588206878742 0.107588206878742
+7874 6486 6487 0.108152480667507 0.108152480667507
+7875 6487 6488 0.101444382501879 0.101444382501879
+7876 6488 6489 0.0964116258051976 0.0964116258051976
+7877 6489 6490 0.100996661509111 0.100996661509111
+7878 6490 6491 0.0875395650093709 0.0875395650093709
+7879 6491 5045 0.0321137501610987 0.0321137501610987
+7880 5045 6492 0.117702359393688 0.117702359393688
+7882 6493 6494 0.102121868544675 0.102121868544675
+7885 5423 6497 0.104998299985498 0.104998299985498
+7887 6498 2276 0.0954001386196214 0.0954001386196214
+7888 2276 3599 0.06824353272523 0.06824353272523
+7889 3599 6499 0.0293198911712676 0.0293198911712676
+7890 6499 6500 0.100538255640661 0.100538255640661
+7891 6500 5163 0.0991059325809468 0.0991059325809468
+7892 5163 5160 0.0380087655441681 0.0380087655441681
+7893 5160 5991 0.104706554354607 0.104706554354607
+7894 5991 6501 0.100402260808534 0.100402260808534
+7895 6501 6502 1.04365943145138 1.04365943145138
+7898 435 6505 0.0386263503887606 0.0386263503887606
+7899 6505 335 0.101999106210783 0.101999106210783
+18520 9719 10306 0.125645609854682 0.125645609854682
+7901 6506 6507 1.29783680025226 1.29783680025226
+7902 6507 5983 0.103637474886707 0.103637474886707
+7903 5983 2101 0.103292266259067 0.103292266259067
+9126 1424 7178 0.131577423131136 0.131577423131136
+7904 2101 6508 0.248902894245049 0.248902894245049
+7906 6509 6510 0.360508984578831 0.360508984578831
+7907 6510 6511 0.0349379067210739 0.0349379067210739
+7909 6512 6513 0.304262851034051 0.304262851034051
+7910 6513 6198 0.252538456966519 0.252538456966519
+7911 6198 576 0.0366939406022336 0.0366939406022336
+7912 576 6515 0.0946945974761285 0.0946945974761285
+7915 89 3525 0.202675004351493 0.202675004351493
+7916 3525 6516 0.201208326437589 0.201208326437589
+7917 6516 6517 0.125720317267139 0.125720317267139
+7919 6518 6519 0.200829668984099 0.200829668984099
+7920 6519 5832 0.202502182884777 0.202502182884777
+7921 5832 6520 0.201241567556278 0.201241567556278
+7922 6520 6521 0.396923547399649 0.396923547399649
+7923 6522 6523 0.133027344486413 0.133027344486413
+7924 6523 4230 0.0509058477475031 0.0509058477475031
+7925 4230 3627 0.095634183764131 0.095634183764131
+7926 3627 1795 0.17402508350424 0.17402508350424
+7928 6524 4175 0.0888021060703878 0.0888021060703878
+17651 395 780 0.411550362143881 0.411550362143881
+7930 6525 1780 0.0441669339202922 0.0441669339202922
+7931 1780 4371 0.0730695211007641 0.0730695211007641
+7932 4371 6527 0.0615136660388587 0.0615136660388587
+7933 6527 365 0.0331373286455635 0.0331373286455635
+7935 6528 6529 0.918393000112345 0.918393000112345
+7936 6529 6530 0.220602612202271 0.220602612202271
+7938 6531 6533 0.0857049610334614 0.0857049610334614
+7940 5175 3090 0.40371590303619 0.40371590303619
+7941 3090 3201 0.197838998920199 0.197838998920199
+7943 6407 4688 0.196571833896643 0.196571833896643
+7944 4688 4940 0.140125445900248 0.140125445900248
+7946 6170 5019 0.102773469761832 0.102773469761832
+7947 5019 3351 0.103514032973499 0.103514032973499
+7948 3351 6534 0.103149871890818 0.103149871890818
+7949 6534 6535 0.102775789327764 0.102775789327764
+9173 5349 5392 0.0859339245649361 0.0859339245649361
+7950 6535 2060 0.103192691678964 0.103192691678964
+7951 2060 2646 0.101884046964041 0.101884046964041
+7952 2646 4112 0.105519033634909 0.105519033634909
+7953 4112 6536 0.103005071327601 0.103005071327601
+7954 6536 6537 0.102995851811127 0.102995851811127
+7955 6537 6539 0.1029998815793 0.1029998815793
+7956 6539 3453 0.102546625331303 0.102546625331303
+7958 6015 3883 0.103459903316916 0.103459903316916
+7959 3883 846 0.104834602248929 0.104834602248929
+7960 846 6540 0.101388253991195 0.101388253991195
+7961 6540 6541 0.0479102302548626 0.0479102302548626
+7963 988 6542 0.0976255225844962 0.0976255225844962
+7964 6542 6543 0.0510763365802728 0.0510763365802728
+7966 6544 2318 0.0507276043625414 0.0507276043625414
+7967 2318 5114 0.0505908057304328 0.0505908057304328
+7968 5114 445 0.0485658434846568 0.0485658434846568
+7969 445 4713 0.0498146803357513 0.0498146803357513
+7970 4713 6546 0.0983637452954902 0.0983637452954902
+7971 6546 6547 0.0998347883215936 0.0998347883215936
+7973 5411 3144 0.088816521791746 0.088816521791746
+7974 3144 3916 0.112464236744585 0.112464236744585
+7976 6332 6548 0.108272865647673 0.108272865647673
+7977 6548 3156 0.104441457482765 0.104441457482765
+7978 3156 4975 0.102775440582403 0.102775440582403
+7979 4975 6549 0.100365138716245 0.100365138716245
+7980 6549 6550 0.102792800397101 0.102792800397101
+7982 6526 5047 0.0492847670519182 0.0492847670519182
+7983 5047 6551 0.0975745067522553 0.0975745067522553
+17653 9285 10141 0.0935043743671756 0.0935043743671756
+7984 6551 5065 0.0520838428726065 0.0520838428726065
+7985 5065 987 0.0487655351272014 0.0487655351272014
+7987 6552 6553 0.11141163822183 0.11141163822183
+7988 6553 6554 0.0931288050453943 0.0931288050453943
+7989 6554 6555 0.0954267012259227 0.0954267012259227
+7990 6555 6556 0.0932230978560399 0.0932230978560399
+7991 6556 2018 0.096637647678534 0.096637647678534
+7992 2018 2008 0.0302895913994428 0.0302895913994428
+7993 2008 6557 0.0614415106208342 0.0614415106208342
+7995 2764 6558 0.0940583318372542 0.0940583318372542
+7996 6558 2268 0.0933570415002435 0.0933570415002435
+7998 5192 6559 0.0436786412585742 0.0436786412585742
+7999 6559 6560 0.0106994466158069 0.0106994466158069
+8002 6562 6563 0.0505000952437127 0.0505000952437127
+8004 3018 6564 0.0487830282291943 0.0487830282291943
+8005 6564 4383 0.0508423763728808 0.0508423763728808
+8006 4383 6565 0.0576100244421376 0.0576100244421376
+8008 6566 6567 0.00412306976586438 0.00412306976586438
+8009 6567 6568 0.0539582974681531 0.0539582974681531
+8010 6568 6569 0.0519961096093482 0.0519961096093482
+8011 6569 6570 0.0542246799430147 0.0542246799430147
+8012 6570 6571 0.0518803862854092 0.0518803862854092
+17654 10141 10140 0.10337885268614 0.10337885268614
+8013 6571 6572 0.0555098728995741 0.0555098728995741
+8014 6572 6573 0.0518861583127315 0.0518861583127315
+8015 6573 6574 0.0518860343451018 0.0518860343451018
+8016 6574 6575 0.0508332520538339 0.0508332520538339
+8017 6575 6576 0.0544506518702307 0.0544506518702307
+8018 6576 6176 0.0529383120108553 0.0529383120108553
+8019 6176 6577 0.0529043310628525 0.0529043310628525
+8020 6577 3307 0.0513720664630444 0.0513720664630444
+8021 3307 6578 0.0555027664653656 0.0555027664653656
+8022 6578 6579 0.0497858933197237 0.0497858933197237
+8026 916 6582 0.0644004913493865 0.0644004913493865
+8027 6582 6583 0.0568408799781512 0.0568408799781512
+8028 6583 6584 0.122686442934717 0.122686442934717
+8029 6584 6585 0.119086225858405 0.119086225858405
+8031 4637 6586 0.0681807162053014 0.0681807162053014
+8032 6586 4550 0.0899357767109733 0.0899357767109733
+8033 4550 6587 0.293817867332518 0.293817867332518
+8034 6587 6588 0.104136881172081 0.104136881172081
+8035 6588 6589 0.0983651040648428 0.0983651040648428
+8036 6589 6129 0.0990923096855932 0.0990923096855932
+8037 6129 3972 0.0982639550962464 0.0982639550962464
+8038 3972 6590 0.099057650475641 0.099057650475641
+17935 10221 8779 0.0167456719913715 0.0167456719913715
+8039 6590 1407 0.099982611141039 0.099982611141039
+8040 1407 6591 0.096574089288832 0.096574089288832
+8042 5218 3376 0.0125708011673062 0.0125708011673062
+8043 3376 3397 0.0411038350876113 0.0411038350876113
+8044 3397 6592 0.0474630685655207 0.0474630685655207
+8045 6592 5717 0.0112629167716475 0.0112629167716475
+8046 5717 5711 0.0353931291626462 0.0353931291626462
+8049 6594 6595 0.0372589458613009 0.0372589458613009
+8051 6596 6597 0.0491446235593822 0.0491446235593822
+8052 6597 6598 0.0512739101828601 0.0512739101828601
+8053 6598 6599 0.0445968134228137 0.0445968134228137
+8054 6599 6600 0.0456401369039379 0.0456401369039379
+8055 6600 252 0.0644261415780049 0.0644261415780049
+8056 252 3949 0.0630622102110069 0.0630622102110069
+8057 3949 6601 0.0624388506180743 0.0624388506180743
+8058 6601 5610 0.057495014751868 0.057495014751868
+8059 5610 6602 0.0530621910173341 0.0530621910173341
+8060 6602 3731 0.0543021802328704 0.0543021802328704
+8061 3731 6603 0.107126213030051 0.107126213030051
+8062 6603 4486 0.0992014153017681 0.0992014153017681
+8064 302 396 0.456543205648827 0.456543205648827
+8065 396 6604 0.263692963912388 0.263692963912388
+8067 2108 5986 0.103617400145952 0.103617400145952
+8068 5986 6605 0.103377873268697 0.103377873268697
+9343 7304 2051 0.0535709121596095 0.0535709121596095
+8070 4763 6169 0.176859243925992 0.176859243925992
+8123 6640 6641 0.17629957299909 0.17629957299909
+8071 6169 6260 0.145538243855646 0.145538243855646
+8072 6260 3917 0.186355414418251 0.186355414418251
+8075 6608 6609 0.216668843775513 0.216668843775513
+8076 6609 5988 0.0945207273969085 0.0945207273969085
+8077 5988 2122 0.100941576479339 0.100941576479339
+8078 2122 6610 0.0983635555045419 0.0983635555045419
+8079 6610 6611 0.0970315915473971 0.0970315915473971
+8081 6612 6613 0.0935811526066721 0.0935811526066721
+8082 6613 2749 0.0990634268639465 0.0990634268639465
+8083 2749 6614 0.105679418235948 0.105679418235948
+8085 6615 6616 0.101635566171867 0.101635566171867
+8086 6616 6617 0.0962607674133666 0.0962607674133666
+8087 6617 6618 0.0951534169408166 0.0951534169408166
+8088 6618 6619 0.0938879229278784 0.0938879229278784
+17940 6560 10223 0.0802385671723254 0.0802385671723254
+8090 6620 6621 0.160330485968093 0.160330485968093
+8094 6623 1791 0.109097036983099 0.109097036983099
+8095 1791 3615 0.039522374569603 0.039522374569603
+8096 3615 6624 0.0738542372087066 0.0738542372087066
+8097 6624 6625 0.00831390386589708 0.00831390386589708
+8098 6625 6626 0.070757439886615 0.070757439886615
+8099 6626 6627 0.0728730586061825 0.0728730586061825
+8100 6627 5098 0.0960515227378026 0.0960515227378026
+8101 5098 6628 0.0550201636939116 0.0550201636939116
+8103 6630 239 0.0379460853943731 0.0379460853943731
+13573 9130 3 0.109013561390269 0.109013561390269
+8105 6631 6632 0.0782857815609104 0.0782857815609104
+8106 6632 6533 0.166563544591406 0.166563544591406
+8108 4496 6633 0.110872689467253 0.110872689467253
+8109 6633 2525 0.333067333185797 0.333067333185797
+8111 6530 6634 0.0105197308884475 0.0105197308884475
+9336 7300 4780 0.0501146245066156 0.0501146245066156
+8112 6634 6635 2.4458667171276 2.4458667171276
+8113 6636 3095 0.197330202512711 0.197330202512711
+8114 3095 3205 0.202310741049047 0.202310741049047
+8115 3205 6118 0.200935805580311 0.200935805580311
+8116 6118 1915 0.200185455389542 0.200185455389542
+8118 6637 5842 0.204932644380513 0.204932644380513
+8119 5842 6638 0.194625839062785 0.194625839062785
+8121 6639 3724 0.202719550339155 0.202719550339155
+8122 3724 6640 0.104515203903702 0.104515203903702
+8124 6641 2622 0.176067278462879 0.176067278462879
+8125 2622 5203 0.176917243967006 0.176917243967006
+8126 5203 6232 0.177139986115085 0.177139986115085
+8129 6643 6644 0.177268373064057 0.177268373064057
+8130 6644 6600 0.175826872766799 0.175826872766799
+8131 6600 6646 0.177773484713149 0.177773484713149
+8133 6647 6648 0.177957472274986 0.177957472274986
+8134 6648 6649 0.169816854222751 0.169816854222751
+8135 6649 6650 0.0183704581232897 0.0183704581232897
+8136 6650 6651 0.180283145370232 0.180283145370232
+8137 6651 6652 0.0228081566299403 0.0228081566299403
+8139 6653 1499 0.197154421185115 0.197154421185115
+8140 1499 188 0.204153885319108 0.204153885319108
+8141 188 5878 0.159028819712238 0.159028819712238
+8142 5878 6654 0.24236157922448 0.24236157922448
+8144 1583 6655 0.303396334779096 0.303396334779096
+8145 6656 5874 0.176427569810156 0.176427569810156
+8146 5874 6657 0.00810609260917888 0.00810609260917888
+8147 6657 6658 0.0470608013663409 0.0470608013663409
+8150 6659 6660 0.255748331282284 0.255748331282284
+8151 6661 6662 0.00688301382680834 0.00688301382680834
+8152 6662 6663 0.392909871907801 0.392909871907801
+8153 6664 1758 0.130752459577202 0.130752459577202
+8154 1758 6314 0.0908112834588078 0.0908112834588078
+8155 6314 6665 0.191679756807403 0.191679756807403
+8156 6665 763 0.155864734453911 0.155864734453911
+8157 763 6668 0.0989081569703109 0.0989081569703109
+8158 6668 1760 0.0778502447443476 0.0778502447443476
+8159 1760 6003 0.221657363761595 0.221657363761595
+8160 6003 5765 0.101345142024656 0.101345142024656
+8161 5765 4032 0.0976983696193598 0.0976983696193598
+8162 4032 6669 0.0654151166199609 0.0654151166199609
+8164 2301 1759 0.0929594689620956 0.0929594689620956
+8165 1759 150 0.2063607315498 0.2063607315498
+8166 150 1738 0.199773882802826 0.199773882802826
+8168 1953 3100 0.166887359049361 0.166887359049361
+8170 370 2529 0.0016410050164606 0.0016410050164606
+8171 2529 6670 0.0654370448512421 0.0654370448512421
+8200 6684 1172 0.140728922414785 0.140728922414785
+8172 6670 1937 0.344573874886115 0.344573874886115
+8174 6671 6672 0.176399723080376 0.176399723080376
+8176 3101 6673 0.188864615641403 0.188864615641403
+8178 4227 1805 0.201844384843532 0.201844384843532
+8179 1805 6674 0.203096969054999 0.203096969054999
+8180 6674 5847 0.205632777843381 0.205632777843381
+8181 5847 6675 0.197984723567939 0.197984723567939
+8183 6676 4226 0.190839047917349 0.190839047917349
+8185 4212 1268 0.185384243862507 0.185384243862507
+8187 6677 2875 0.129732620530101 0.129732620530101
+8188 2875 6678 0.138723736947104 0.138723736947104
+8189 6678 6679 0.13144235424121 0.13144235424121
+8190 6679 6680 0.782596772143326 0.782596772143326
+8191 3575 5642 0.141762411979774 0.141762411979774
+8192 5642 4347 0.140039066988463 0.140039066988463
+8193 4347 6345 0.13859354874742 0.13859354874742
+8194 6345 3049 0.140317315615912 0.140317315615912
+8195 3049 3024 0.0669551847418331 0.0669551847418331
+8196 3024 6681 0.0663747225163875 0.0663747225163875
+8197 6681 6682 0.00550527045183645 0.00550527045183645
+8198 6682 6683 0.122014480736259 0.122014480736259
+8199 6683 6684 0.0145554158979999 0.0145554158979999
+8201 1172 892 0.137892873302074 0.137892873302074
+8202 892 4475 0.139838739747675 0.139838739747675
+8203 4475 2777 0.135724572944392 0.135724572944392
+8204 2777 5266 0.129198654341627 0.129198654341627
+8205 5266 6685 0.122514628608539 0.122514628608539
+8206 6685 6686 0.20769100942942 0.20769100942942
+8207 6686 6357 0.202692590161251 0.202692590161251
+8208 6357 2390 0.107324644883127 0.107324644883127
+8209 2390 6687 0.139594845742255 0.139594845742255
+8210 6687 6688 0.0752686220951058 0.0752686220951058
+8211 6688 749 0.0665961818211898 0.0665961818211898
+8212 749 1567 0.140763317861176 0.140763317861176
+8213 1567 6689 0.140174033607804 0.140174033607804
+8215 6691 696 0.200953877059722 0.200953877059722
+8216 696 6692 0.202493921890496 0.202493921890496
+8218 508 6693 0.0440506867837982 0.0440506867837982
+8219 6694 1202 0.170408371052522 0.170408371052522
+8220 1202 6695 0.022095029398504 0.022095029398504
+8221 6695 3781 0.199196539116323 0.199196539116323
+8222 3781 6696 0.154646276165852 0.154646276165852
+8224 951 6697 0.162889491053556 0.162889491053556
+8225 6697 4890 0.17202029430472 0.17202029430472
+8226 4890 6698 0.182585439334225 0.182585439334225
+8227 6698 5488 0.173629132461636 0.173629132461636
+8230 6700 6701 0.054263196932367 0.054263196932367
+8231 6701 5807 0.103685962200744 0.103685962200744
+8232 5807 6702 0.106632774624389 0.106632774624389
+8233 6702 6703 0.0962060876195832 0.0962060876195832
+8234 6703 5959 0.00690380150934747 0.00690380150934747
+8235 5959 6704 0.00415729025946559 0.00415729025946559
+8236 6704 3004 0.101332185729619 0.101332185729619
+8237 3004 4395 0.106412326585027 0.106412326585027
+8238 4395 6705 0.103936208820228 0.103936208820228
+8239 6705 6706 0.108885043469445 0.108885043469445
+8240 6706 6707 0.0530572853327784 0.0530572853327784
+8241 6707 6708 0.0508918154467618 0.0508918154467618
+8242 6708 6709 0.103982459974641 0.103982459974641
+8243 6709 6710 0.100220871190445 0.100220871190445
+8244 6710 6711 0.00631643031082491 0.00631643031082491
+8245 6711 6188 0.105471969629518 0.105471969629518
+8246 6188 6712 0.0552929480053166 0.0552929480053166
+8247 6712 6713 0.051155648874288 0.051155648874288
+8249 4495 6714 0.112097289917407 0.112097289917407
+8250 6714 1079 0.0913714399600763 0.0913714399600763
+8251 1079 2524 0.245312559433029 0.245312559433029
+8253 6006 6251 0.204148069385731 0.204148069385731
+8254 6251 6715 0.203065667560916 0.203065667560916
+8256 2935 6716 0.266313303297407 0.266313303297407
+8257 6416 3741 0.135496222887927 0.135496222887927
+8258 3741 5854 0.117997896305679 0.117997896305679
+8260 2305 161 0.314948131318509 0.314948131318509
+8263 6717 3071 0.175732613824838 0.175732613824838
+8264 3071 6718 0.173767654321711 0.173767654321711
+8265 6718 6100 0.243539432543733 0.243539432543733
+8267 3290 98 0.422419964097428 0.422419964097428
+8269 4373 2854 0.205542196291208 0.205542196291208
+8271 6719 1596 0.0969388330111528 0.0969388330111528
+8273 118 6721 0.0966297992771619 0.0966297992771619
+8274 6721 6722 0.0414535753801991 0.0414535753801991
+8276 2311 6580 0.108271978342533 0.108271978342533
+8277 6580 6723 0.0197325066377101 0.0197325066377101
+8301 4041 6740 0.178573713835442 0.178573713835442
+8302 6740 1829 0.177333893618754 0.177333893618754
+8279 4433 6724 0.324356944785499 0.324356944785499
+8282 6725 6088 0.0237314605310015 0.0237314605310015
+8283 6088 4822 0.0875664870066569 0.0875664870066569
+8284 4822 6726 0.0475371228844605 0.0475371228844605
+8285 6726 4515 0.133316815943664 0.133316815943664
+8286 4515 5237 0.132189806591607 0.132189806591607
+9507 2581 5179 0.178384896285487 0.178384896285487
+8287 5237 6727 0.137381332135233 0.137381332135233
+8288 6727 6728 0.132866818946611 0.132866818946611
+8289 6728 1673 0.133389434002772 0.133389434002772
+8290 1673 6729 0.137304160443328 0.137304160443328
+8292 6730 6731 0.0127908749904874 0.0127908749904874
+8324 6753 6754 0.0516246355995179 0.0516246355995179
+8293 6731 6734 0.253997048781863 0.253997048781863
+8294 6734 6735 0.103152527560213 0.103152527560213
+8296 6736 6737 0.0131672047429292 0.0131672047429292
+8298 4636 5383 0.185495216645111 0.185495216645111
+8300 5972 4041 0.174731707729605 0.174731707729605
+8303 1829 6741 0.102538685907791 0.102538685907791
+8304 4575 6440 0.137081553799117 0.137081553799117
+8305 6440 5291 0.136014333235461 0.136014333235461
+8306 5291 6742 0.135023999424587 0.135023999424587
+8307 6742 10 0.133312225882616 0.133312225882616
+8308 10 6394 0.135032006709 0.135032006709
+8309 6394 6743 0.132451340826744 0.132451340826744
+8310 6743 6744 0.135765849385072 0.135765849385072
+8311 6744 6745 0.133823531129847 0.133823531129847
+8313 6746 6747 0.134513077577228 0.134513077577228
+8314 6747 6748 0.134201163774105 0.134201163774105
+8316 6749 1938 0.0948580215175547 0.0948580215175547
+8318 307 5887 0.0912856383131267 0.0912856383131267
+8319 5887 6750 0.00721526462075332 0.00721526462075332
+8320 6750 6751 0.0269156344716724 0.0269156344716724
+8323 6752 6753 0.0510955164610192 0.0510955164610192
+8325 6754 6755 0.0510906826304937 0.0510906826304937
+8326 6755 6756 0.0511615632316368 0.0511615632316368
+8327 6756 1661 0.0519510824904343 0.0519510824904343
+8328 1661 6758 0.0509873448397052 0.0509873448397052
+8329 6758 6759 0.0522106080921687 0.0522106080921687
+8330 6759 6760 0.0506887592311432 0.0506887592311432
+18752 5186 5654 0.105380231545906 0.105380231545906
+8331 6760 6761 0.0573063184317804 0.0573063184317804
+8333 6762 6763 0.0501245455122697 0.0501245455122697
+8334 6763 6764 0.0489376044154541 0.0489376044154541
+8337 6766 6767 0.0490039328328154 0.0490039328328154
+8338 6767 6768 0.0513498171240697 0.0513498171240697
+8339 6768 6769 0.0498709246005866 0.0498709246005866
+8341 5533 6770 0.292387787290413 0.292387787290413
+8343 2972 6771 0.121066844508317 0.121066844508317
+8344 6771 6093 0.143799158144466 0.143799158144466
+8345 6093 6772 0.01594646132934 0.01594646132934
+8346 6772 6773 0.00797333604469033 0.00797333604469033
+8347 6773 6774 0.00589372782719237 0.00589372782719237
+8349 6775 6776 0.135681018337986 0.135681018337986
+8350 6776 2490 0.131411131535027 0.131411131535027
+8351 2490 2835 0.135427320939223 0.135427320939223
+8353 4067 6052 0.133451561970317 0.133451561970317
+8354 6052 5792 0.201431723471221 0.201431723471221
+8356 6777 6778 0.137939265537406 0.137939265537406
+8358 6658 6779 0.0952206682824548 0.0952206682824548
+8359 6779 1328 0.20245506080321 0.20245506080321
+9582 1393 7408 0.0523989189771459 0.0523989189771459
+8360 1328 6780 0.24344994454685 0.24344994454685
+8362 6781 6338 0.132299767169153 0.132299767169153
+18540 10312 7538 0.710682259466036 0.710682259466036
+8363 6338 3026 0.142960379522958 0.142960379522958
+8364 3026 6782 0.131957413991529 0.131957413991529
+8365 6782 6783 0.00572653872195823 0.00572653872195823
+8366 6783 6784 0.13893806084239 0.13893806084239
+8367 6784 1155 0.138805738856212 0.138805738856212
+8368 1155 876 0.139884571461894 0.139884571461894
+8370 4464 2784 0.134142589801556 0.134142589801556
+8371 2784 5255 0.132457483790055 0.132457483790055
+8372 5255 4727 0.21307200925813 0.21307200925813
+8373 4727 5126 0.0748266761428759 0.0748266761428759
+8374 5126 6785 0.0660204248306932 0.0660204248306932
+8375 6785 4284 0.173603246809035 0.173603246809035
+8377 6786 6787 0.142696164770821 0.142696164770821
+8379 5475 6788 0.1766899367412 0.1766899367412
+8380 6788 6789 0.178262795240798 0.178262795240798
+8381 6789 669 0.0038695834466259 0.0038695834466259
+8382 669 6790 0.00298242718157566 0.00298242718157566
+8383 6790 6791 0.175654700740653 0.175654700740653
+8385 4603 6493 0.141540356779896 0.141540356779896
+8386 6493 6795 0.235592097571248 0.235592097571248
+8387 6795 6796 0.135380255100289 0.135380255100289
+8388 6796 6797 0.00458123097756658 0.00458123097756658
+8389 6797 6798 0.00459235047115107 0.00459235047115107
+8390 6798 6799 0.135291654892361 0.135291654892361
+8391 6799 6800 0.141019064418211 0.141019064418211
+8392 6800 821 0.136459904501488 0.136459904501488
+8393 821 3562 0.138377698701616 0.138377698701616
+8395 5772 516 0.0304460136124682 0.0304460136124682
+8397 6411 6801 0.0202183008206165 0.0202183008206165
+8398 6802 469 0.0770276556079661 0.0770276556079661
+8399 469 4171 0.115648628347006 0.115648628347006
+8400 4171 6803 0.135804309767261 0.135804309767261
+8401 6803 4756 0.071946790437269 0.071946790437269
+8403 6804 6805 0.127899734301329 0.127899734301329
+8405 6803 4172 0.13716080109606 0.13716080109606
+8406 4172 470 0.118198242572908 0.118198242572908
+8407 470 6806 0.0738815709398357 0.0738815709398357
+8410 6807 6808 0.0966312020179035 0.0966312020179035
+8411 6808 6809 0.078738376832051 0.078738376832051
+8412 6809 3373 0.430297684252256 0.430297684252256
+8414 6810 6811 0.203442237788957 0.203442237788957
+8415 1476 6812 0.245653934383614 0.245653934383614
+8416 6812 6813 0.412460631108446 0.412460631108446
+8418 6814 6815 0.174359151043162 0.174359151043162
+8419 6815 3109 0.176366303019304 0.176366303019304
+8420 3109 6816 0.193801807541949 0.193801807541949
+8421 6816 6817 0.0198367109802725 0.0198367109802725
+8422 6817 6104 0.210336723998741 0.210336723998741
+8424 6818 4370 0.0431318765981996 0.0431318765981996
+8426 2496 1451 0.0985317859583251 0.0985317859583251
+8427 1451 2853 0.10657030011201 0.10657030011201
+8428 2853 6819 0.0983314928072937 0.0983314928072937
+8429 6819 6665 0.0998633676523793 0.0998633676523793
+8430 6665 6820 0.100599054724802 0.100599054724802
+8431 6820 3821 0.10490937410086 0.10490937410086
+8432 3821 5897 0.102058293498771 0.102058293498771
+9656 6387 7441 0.131317068143471 0.131317068143471
+8433 5897 6821 0.102847878519627 0.102847878519627
+8435 1593 1644 0.201270216910902 0.201270216910902
+8436 1644 6822 0.105737900324602 0.105737900324602
+8437 6822 4218 0.0969375306307301 0.0969375306307301
+8438 4218 6823 0.101326281592707 0.101326281592707
+8439 6823 198 0.0969958932624718 0.0969958932624718
+8440 198 2927 0.100607212393453 0.100607212393453
+8441 2927 5309 0.0991277824360909 0.0991277824360909
+8442 5309 1465 0.0998634796625755 0.0998634796625755
+8445 1176 6825 0.181656671362534 0.181656671362534
+8447 6826 6827 0.865493060175873 0.865493060175873
+8448 3119 6828 0.283790323154486 0.283790323154486
+8450 3496 6829 0.0523352446605108 0.0523352446605108
+8451 6829 6830 0.0732524388814314 0.0732524388814314
+8452 6830 3663 0.0505681915693724 0.0505681915693724
+8453 3663 4996 0.130580462322132 0.130580462322132
+8455 6831 6247 0.199011000686174 0.199011000686174
+8456 6247 6832 0.199751548882436 0.199751548882436
+8458 1495 184 0.20195222577189 0.20195222577189
+8459 184 1712 0.203399715506048 0.203399715506048
+8460 1712 6833 0.205087968397347 0.205087968397347
+8461 6833 1578 0.200928350075194 0.200928350075194
+8463 6835 5869 0.177962583931279 0.177962583931279
+8464 5869 1321 0.176970219219333 0.176970219219333
+8465 1321 1377 0.177352733194459 0.177352733194459
+8466 1377 6836 0.0602165463968322 0.0602165463968322
+8467 6836 6837 0.0823104914192672 0.0823104914192672
+8468 6837 4694 0.116790101887087 0.116790101887087
+18756 1322 1378 0.175845021978343 0.175845021978343
+8469 4694 6838 0.160065096905242 0.160065096905242
+8470 6838 5335 0.187163981040998 0.187163981040998
+8471 5335 6839 0.265241255095212 0.265241255095212
+8473 4319 4507 0.0895898957022207 0.0895898957022207
+8474 4507 6840 0.0124803827841914 0.0124803827841914
+8475 6840 6841 0.091716588631721 0.091716588631721
+8476 6841 6842 0.00740292454463184 0.00740292454463184
+8477 6842 285 0.0146970591982782 0.0146970591982782
+8478 285 5069 0.0844368792913957 0.0844368792913957
+13551 9125 9126 0.0538488930045225 0.0538488930045225
+8479 5069 6837 0.103562524850142 0.103562524850142
+8480 6837 6843 0.0961927404969427 0.0961927404969427
+8481 6843 6844 0.0998943541512786 0.0998943541512786
+8482 6844 6845 0.102052212683234 0.102052212683234
+8483 6845 6846 0.456427940885819 0.456427940885819
+8484 6847 4419 0.193121729151288 0.193121729151288
+8485 4419 6848 0.226127592349504 0.226127592349504
+8486 6848 5329 0.136063050211474 0.136063050211474
+8488 4363 1444 0.202825103543368 0.202825103543368
+8489 1444 6849 0.200067420030691 0.200067420030691
+8490 6849 6850 0.207042581432814 0.207042581432814
+8491 6850 5890 0.198967544378973 0.198967544378973
+8493 6851 6852 0.0470486102019036 0.0470486102019036
+8494 6852 6853 0.0201453367541323 0.0201453367541323
+8495 6853 6854 0.0193839654418635 0.0193839654418635
+8496 6854 6855 0.0201881052382051 0.0201881052382051
+8497 6855 6856 0.0195037980214848 0.0195037980214848
+8498 6856 6857 0.0198459509091597 0.0198459509091597
+8499 6857 6858 0.0195037180586887 0.0195037180586887
+8500 6858 6859 0.0199058270401761 0.0199058270401761
+8501 6859 1871 0.0228399539785669 0.0228399539785669
+8504 6861 6862 0.100580939051626 0.100580939051626
+8505 6862 6863 0.206622253376394 0.206622253376394
+8506 6863 6377 0.103010255262607 0.103010255262607
+8507 6377 4832 0.10370389707419 0.10370389707419
+8508 4832 6717 0.103234622646169 0.103234622646169
+8509 6717 6864 0.103703073117676 0.103703073117676
+8510 6864 6865 0.0481477570236711 0.0481477570236711
+8512 5856 6866 0.107372117361429 0.107372117361429
+8513 6866 6867 0.050649728561771 0.050649728561771
+8514 6867 4989 0.0553571225017631 0.0553571225017631
+8515 4989 6868 0.101318948663251 0.101318948663251
+8518 6869 3823 0.172685696470764 0.172685696470764
+8520 6870 5902 0.0785311515160625 0.0785311515160625
+8521 5902 6871 0.0681549663304684 0.0681549663304684
+8522 6871 1996 0.0322361485277902 0.0322361485277902
+8523 1996 1587 0.080539505433719 0.080539505433719
+8524 1587 6872 0.0787299872144713 0.0787299872144713
+8525 6872 1652 0.0828966049530784 0.0828966049530784
+9751 2441 5738 0.170975903813153 0.170975903813153
+8528 6874 5702 0.0496353984033346 0.0496353984033346
+8529 5702 6875 0.0484896470155752 0.0484896470155752
+8530 6875 6876 0.0523105680266916 0.0523105680266916
+8531 6876 6877 0.100875098780012 0.100875098780012
+8532 6877 6878 0.0515810406741165 0.0515810406741165
+8533 6878 6879 0.0480493192441991 0.0480493192441991
+8534 6879 6532 0.0493288645061034 0.0493288645061034
+8535 6532 6880 0.0170276228852009 0.0170276228852009
+8537 1128 6881 0.0506249344560303 0.0506249344560303
+8538 6881 6882 0.0501120958003525 0.0501120958003525
+8539 6882 6883 0.0495209017571618 0.0495209017571618
+8540 6883 3846 0.0513776048731037 0.0513776048731037
+8541 3846 6884 0.0512508950828751 0.0512508950828751
+8542 6884 5564 0.0499163404494349 0.0499163404494349
+8543 5564 6885 0.0796596960320095 0.0796596960320095
+8544 6885 6886 0.709637932237075 0.709637932237075
+8545 3929 5619 0.0645570027229576 0.0645570027229576
+8546 5619 3704 0.0990278562894358 0.0990278562894358
+9775 2551 7512 0.408787216175776 0.408787216175776
+8547 3704 709 0.100036425190807 0.100036425190807
+8548 709 6887 0.100506522060904 0.100506522060904
+8549 6887 6888 0.0973098804153082 0.0973098804153082
+8550 6888 4190 0.138652686970481 0.138652686970481
+8551 4190 2516 0.130567043389136 0.130567043389136
+8552 2516 6727 0.134515842897036 0.134515842897036
+8553 6727 4804 0.136148376446663 0.136148376446663
+8555 6890 6891 0.127464290413413 0.127464290413413
+8558 4625 1248 0.132737908659339 0.132737908659339
+8560 4557 2726 0.131937670977173 0.131937670977173
+8561 2726 6892 0.133086814424956 0.133086814424956
+8562 6892 6893 0.0108053798662109 0.0108053798662109
+8564 6894 6753 0.13855912942418 0.13855912942418
+8565 6753 3977 0.202975190536315 0.202975190536315
+8567 4726 5125 0.0514216994322944 0.0514216994322944
+8569 6895 2262 0.104167713702112 0.104167713702112
+8570 2262 3612 0.100511868469799 0.100511868469799
+8571 3612 6896 0.101962634245626 0.101962634245626
+8572 6896 2111 0.0983046285910296 0.0983046285910296
+8573 2111 6000 0.10637347320659 0.10637347320659
+8574 6000 6897 0.0969032855683131 0.0969032855683131
+8575 6897 6898 1.19574032306189 1.19574032306189
+8576 3909 1049 0.101955415333633 0.101955415333633
+8577 1049 6280 0.110396580345644 0.110396580345644
+8580 4727 6902 0.104166457963925 0.104166457963925
+8581 6902 5404 0.105633279342784 0.105633279342784
+8582 5404 3137 0.103462723581867 0.103462723581867
+8583 3137 3910 0.106566211179802 0.106566211179802
+8585 6685 6904 0.1009798833353 0.1009798833353
+8586 6904 6905 0.0978861772455395 0.0978861772455395
+8588 6906 6907 0.0919209174538617 0.0919209174538617
+8589 6907 3448 0.0130685497791993 0.0130685497791993
+8590 3448 6908 0.0816132292801626 0.0816132292801626
+8591 6908 6909 0.0115722967665996 0.0115722967665996
+8592 6909 6910 0.0993816484498638 0.0993816484498638
+8593 6910 805 0.0976551438474913 0.0976551438474913
+8594 805 6911 0.0993747261569693 0.0993747261569693
+8595 6911 6912 0.089888887106785 0.089888887106785
+8596 6912 6913 0.0146747703329366 0.0146747703329366
+8598 6914 1237 0.101225406841245 0.101225406841245
+8600 4811 2178 0.0990205816012607 0.0990205816012607
+8602 596 6305 0.0508308915230223 0.0508308915230223
+8603 6305 350 0.0658146671565848 0.0658146671565848
+8604 350 6425 0.0344816945169531 0.0344816945169531
+8605 6425 6423 0.0330039992635189 0.0330039992635189
+8606 6423 5343 0.065281602891384 0.065281602891384
+8607 5343 4631 0.0645633414559121 0.0645633414559121
+8608 4631 4639 0.0344816846016407 0.0344816846016407
+8610 1260 4538 0.0975702004070908 0.0975702004070908
+8611 4538 4546 0.0337389213160247 0.0337389213160247
+8612 4546 6284 0.0652815653305245 0.0652815653305245
+8613 6284 2702 0.0682127836725729 0.0682127836725729
+8614 2702 2716 0.0295959518245788 0.0295959518245788
+8615 2716 6915 0.102272155307925 0.102272155307925
+8617 277 6916 0.0242091643473284 0.0242091643473284
+8618 6916 6917 0.127799932481727 0.127799932481727
+8620 6918 6919 0.100490474583826 0.100490474583826
+8621 6919 3936 0.103902551113693 0.103902551113693
+8623 5625 109 0.104159188317199 0.104159188317199
+9852 7555 7556 0.127428116197139 0.127428116197139
+8625 720 6920 0.107136629659166 0.107136629659166
+8626 6920 6921 0.0878190742496679 0.0878190742496679
+8627 6921 760 0.053327069779034 0.053327069779034
+8628 760 4203 0.0493954421158038 0.0493954421158038
+19719 10631 10629 0.0181769844157554 0.0181769844157554
+8629 4203 4204 0.0379739020862165 0.0379739020862165
+8630 4204 1070 0.0609601987006813 0.0609601987006813
+8631 1070 1071 0.0198138913639204 0.0198138913639204
+8632 1071 2506 0.0820743434648716 0.0820743434648716
+8634 6922 6923 0.0332474984310345 0.0332474984310345
+8635 6923 6924 0.0309457475923951 0.0309457475923951
+8636 6924 6925 0.06835161173269 0.06835161173269
+8641 2302 152 0.296479047850973 0.296479047850973
+8642 152 1739 0.201132602649999 0.201132602649999
+8643 1739 1717 0.0492912051446921 0.0492912051446921
+8645 6315 6820 0.175487833230143 0.175487833230143
+8646 6820 764 0.157172405718933 0.157172405718933
+8647 764 6004 0.389410143877071 0.389410143877071
+8648 6004 6244 0.10052021368651 0.10052021368651
+11455 8264 8265 0.215908830963319 0.215908830963319
+8649 6244 6929 0.161155152616492 0.161155152616492
+8651 6930 6931 0.00809135923630026 0.00809135923630026
+8652 6931 6869 0.0905079323611068 0.0905079323611068
+8653 6869 6932 0.702159216296169 0.702159216296169
+8654 4432 6933 0.289985249196455 0.289985249196455
+8655 6933 4666 0.0976954476351155 0.0976954476351155
+8656 4666 1333 0.0998446345260267 0.0998446345260267
+8657 1333 1388 0.0991189577824547 0.0991189577824547
+8658 1388 6935 0.105783123390058 0.105783123390058
+8659 6935 6850 0.108467199591529 0.108467199591529
+8660 6850 4706 0.0984536865396038 0.0984536865396038
+8661 4706 6936 0.0998638834924626 0.0998638834924626
+8662 6936 1757 0.0991299509071506 0.0991299509071506
+8664 2103 5985 0.0990139620475444 0.0990139620475444
+8665 5985 6937 0.103423317739921 0.103423317739921
+8666 6937 6938 0.197320023520399 0.197320023520399
+8667 6939 6940 0.0449145362146055 0.0449145362146055
+8668 6940 5016 0.051579913616047 0.051579913616047
+8670 6941 5111 0.0702390251054822 0.0702390251054822
+8671 5111 4709 0.111086762480312 0.111086762480312
+8672 4709 6805 0.12579570489738 0.12579570489738
+8673 6805 6942 0.0911912161186586 0.0911912161186586
+8674 6942 6943 0.0891583873267196 0.0891583873267196
+8675 6943 5415 0.0932705447088281 0.0932705447088281
+8676 5415 3141 0.0911590609752313 0.0911590609752313
+8677 3141 6944 0.0907415627456138 0.0907415627456138
+8678 6944 6945 0.0904253930261683 0.0904253930261683
+8679 6945 6282 0.0922034833120112 0.0922034833120112
+8680 6282 6946 0.0889556226914396 0.0889556226914396
+8681 6946 6947 0.115025423362082 0.115025423362082
+19720 10629 10630 0.00318458504180934 0.00318458504180934
+8684 4222 6948 0.095205143123347 0.095205143123347
+8685 6948 6949 0.0983217542586648 0.0983217542586648
+8686 6949 970 0.0973398284250994 0.0973398284250994
+8732 6248 6975 0.200150775141685 0.200150775141685
+8687 970 6950 0.0518030391212137 0.0518030391212137
+8688 6950 5288 0.0521176321182923 0.0521176321182923
+8689 5288 3153 0.0937167269922867 0.0937167269922867
+8690 3153 4969 0.095648805014101 0.095648805014101
+8691 4969 6951 0.121296465267735 0.121296465267735
+8717 1073 2508 0.0718764157350201 0.0718764157350201
+8692 6951 6952 0.17298014935093 0.17298014935093
+8694 2653 4114 0.0446473392844233 0.0446473392844233
+8695 4114 6503 0.0806749392848293 0.0806749392848293
+11460 8268 8269 0.0284404063889237 0.0284404063889237
+8696 6503 6953 0.0279965631557129 0.0279965631557129
+8698 6779 1327 0.149226176774822 0.149226176774822
+8700 4207 6955 0.0359776758472589 0.0359776758472589
+8701 6955 6956 0.0798254305300323 0.0798254305300323
+8702 4494 6957 0.0178038045740406 0.0178038045740406
+8703 6957 6958 0.00431775087438634 0.00431775087438634
+8704 6958 2148 0.120300859607691 0.120300859607691
+8705 2148 6960 0.151431823224066 0.151431823224066
+8706 6960 6961 0.22023318510828 0.22023318510828
+8707 6961 6962 0.137151335408755 0.137151335408755
+8708 6962 6963 0.0242055632480646 0.0242055632480646
+8709 6963 2150 0.0925314192010664 0.0925314192010664
+8710 2150 6964 0.068609567754435 0.068609567754435
+8712 6808 6965 0.180937589294771 0.180937589294771
+8713 6966 761 0.0469463147130834 0.0469463147130834
+8714 761 4205 0.0748160898012537 0.0748160898012537
+8715 4205 4398 0.0770157906569643 0.0770157906569643
+8716 4398 1073 0.0796290264805075 0.0796290264805075
+8746 6967 5689 0.127751851222379 0.127751851222379
+8719 271 2710 0.601401594481822 0.601401594481822
+11825 321 7799 0.115552151499094 0.115552151499094
+8720 2710 6969 0.136362355996719 0.136362355996719
+8721 6969 6742 0.135618421861975 0.135618421861975
+8722 6742 6141 0.132822121773709 0.132822121773709
+8723 6141 4014 0.136061285283967 0.136061285283967
+8724 4014 6970 0.13345730315891 0.13345730315891
+8725 6970 6971 0.133022272157071 0.133022272157071
+8726 6971 6972 0.0472485991851602 0.0472485991851602
+8727 6972 3385 0.0819883397602158 0.0819883397602158
+8729 6959 6973 0.0390638293285452 0.0390638293285452
+19721 10630 10622 0.0559555137804764 0.0559555137804764
+8731 6974 6248 0.201212600703242 0.201212600703242
+8733 6975 1496 0.201553427836696 0.201553427836696
+8734 1496 185 0.202686112287629 0.202686112287629
+8735 185 1713 0.204711477509581 0.204711477509581
+8736 1713 6976 0.201975316682274 0.201975316682274
+8737 6976 1579 0.167005027356132 0.167005027356132
+8738 1579 6977 0.309934492691155 0.309934492691155
+8739 1105 5871 0.176266848523138 0.176266848523138
+8740 5871 1323 0.177439022365804 0.177439022365804
+8741 1323 1379 0.176412320749863 0.176412320749863
+8742 1379 6978 0.0608448771470547 0.0608448771470547
+8744 6843 4695 0.114533137035158 0.114533137035158
+11961 2694 6570 0.292174399102456 0.292174399102456
+8745 4695 6967 0.15860414860374 0.15860414860374
+8747 5689 5336 0.153402847395547 0.153402847395547
+8749 6979 6980 0.0492417429246164 0.0492417429246164
+8750 6980 6981 0.0330798745582329 0.0330798745582329
+8751 6981 6982 0.110138574841473 0.110138574841473
+8756 6986 6701 0.0557097589480938 0.0557097589480938
+8757 6701 6987 0.145037158424782 0.145037158424782
+8759 6988 648 0.139238555969963 0.139238555969963
+8760 648 683 0.0653158999110773 0.0653158999110773
+8761 683 6989 0.0669742957793313 0.0669742957793313
+8762 6989 1988 0.0901527916408211 0.0901527916408211
+8763 1988 1972 0.0388238770836602 0.0388238770836602
+8764 1972 4588 0.104222260658419 0.104222260658419
+8765 4588 4594 0.0293535516568484 0.0293535516568484
+8766 4594 6498 0.0726584855189905 0.0726584855189905
+8767 6498 6481 0.0601855426433911 0.0601855426433911
+8768 6481 2470 0.141630886586724 0.141630886586724
+10003 6678 7628 0.0924131784678609 0.0924131784678609
+8771 6991 2401 0.344415463633539 0.344415463633539
+8772 2401 6992 0.121260728440928 0.121260728440928
+8773 6992 6604 0.426798504146684 0.426798504146684
+8774 6604 6993 0.0779497578426637 0.0779497578426637
+8775 6993 6994 0.328092841207435 0.328092841207435
+8776 6994 6997 0.409387625139532 0.409387625139532
+8777 6997 6998 0.0280465218891248 0.0280465218891248
+8778 6998 6999 0.240899685742567 0.240899685742567
+8780 7001 7002 0.172502393042501 0.172502393042501
+8781 7002 2338 0.177215228547836 0.177215228547836
+8782 2338 7003 0.175043780881437 0.175043780881437
+8783 7003 4782 0.243888745485023 0.243888745485023
+8784 4782 6558 0.132880580598771 0.132880580598771
+8785 6558 7004 0.106726338328234 0.106726338328234
+8787 2471 5909 0.20581191299575 0.20581191299575
+8789 7005 797 0.197387527656916 0.197387527656916
+10028 5604 7642 0.0520984767564003 0.0520984767564003
+8790 797 7006 0.203747525811746 0.203747525811746
+8793 7007 7008 0.196982052931457 0.196982052931457
+8794 7008 3062 0.205201724322207 0.205201724322207
+8795 3062 7009 0.184895139192435 0.184895139192435
+8796 7009 7010 0.0217892666308482 0.0217892666308482
+8798 7011 7012 0.200694925007541 0.200694925007541
+8799 7012 6367 0.0706060127631708 0.0706060127631708
+8800 6367 7013 0.13113311504647 0.13113311504647
+8801 7013 5949 0.203040029193448 0.203040029193448
+11962 6570 4451 0.149457420972406 0.149457420972406
+8802 5949 5141 0.190833355605879 0.190833355605879
+8804 2236 4909 0.189094446681925 0.189094446681925
+8805 4909 6613 0.199822606976101 0.199822606976101
+8806 6613 7014 0.196131290300381 0.196131290300381
+8807 7014 7015 0.207545863379423 0.207545863379423
+10052 7653 1099 0.0482102658012733 0.0482102658012733
+8809 4072 6057 0.192026411520301 0.192026411520301
+20532 10847 10848 0.0340308021704454 0.0340308021704454
+8810 6057 5797 0.200508266391225 0.200508266391225
+8812 7016 7017 0.20408918142509 0.20408918142509
+8813 7017 6590 0.201086157953578 0.201086157953578
+8814 6590 7018 0.202602619918689 0.202602619918689
+8816 7019 4577 0.129538344988774 0.129538344988774
+8817 4577 6441 0.138680608354748 0.138680608354748
+8818 6441 5293 0.134070515766336 0.134070515766336
+8819 5293 6970 0.13449026404854 0.13449026404854
+8820 6970 13 0.134902446032247 0.134902446032247
+8822 7020 382 0.124884712447894 0.124884712447894
+8823 382 7021 0.135229787557418 0.135229787557418
+8824 7021 7022 0.132193897477211 0.132193897477211
+8826 7023 7024 0.137222417835135 0.137222417835135
+8827 7024 7025 0.130431649234377 0.130431649234377
+8828 7025 7026 0.138849105164774 0.138849105164774
+8830 6206 7027 0.182945185531037 0.182945185531037
+8831 7027 7028 0.175756239821697 0.175756239821697
+20483 10830 10831 0.0908860058291454 0.0908860058291454
+8833 7029 7030 0.203242108673725 0.203242108673725
+8834 7030 7031 0.150413392817758 0.150413392817758
+8835 7031 2977 0.0550192556799276 0.0550192556799276
+8837 657 1886 0.0454008957908892 0.0454008957908892
+8838 1886 528 0.053551482812009 0.053551482812009
+8841 6092 1889 0.0508386682559075 0.0508386682559075
+8842 1889 7033 0.0498613554304776 0.0498613554304776
+8843 7033 7034 0.00951828955857414 0.00951828955857414
+8844 7034 7035 0.036894485571684 0.036894485571684
+8845 7035 6085 0.0480584959434146 0.0480584959434146
+8847 742 4527 0.0498820470218468 0.0498820470218468
+8848 4527 7036 0.0491481642660053 0.0491481642660053
+8849 7036 5246 0.0491592800418928 0.0491592800418928
+8850 5246 7037 0.0481362905740046 0.0481362905740046
+8851 7037 7038 0.0454453697348376 0.0454453697348376
+8852 7038 7039 0.0963504134151864 0.0963504134151864
+8853 7039 7040 0.0519319872070824 0.0519319872070824
+8854 7040 1663 0.0497523111621545 0.0497523111621545
+8855 1663 7041 0.0529510578680093 0.0529510578680093
+8856 7041 7042 0.0505381295725577 0.0505381295725577
+8857 7042 7043 0.0514848181594461 0.0514848181594461
+8858 7043 7044 0.0741692266458179 0.0741692266458179
+8861 7046 2493 0.132768776448504 0.132768776448504
+20533 10817 10849 0.0041587253937853 0.0041587253937853
+8864 2531 1932 0.0596099109005186 0.0596099109005186
+8865 1932 7047 0.205921914653592 0.205921914653592
+8867 7048 4043 0.179136537042624 0.179136537042624
+8868 4043 7049 0.176989263158491 0.176989263158491
+8869 7049 7050 0.100459005094488 0.100459005094488
+8871 7051 5531 0.109415807818528 0.109415807818528
+8872 5531 7052 0.29371056329192 0.29371056329192
+8874 7053 6824 0.0545745509742182 0.0545745509742182
+8875 6824 2424 0.081950775026488 0.081950775026488
+8876 2424 7054 0.050315704306832 0.050315704306832
+8877 7054 3228 0.0836964212853156 0.0836964212853156
+8879 4957 4034 0.0947298154946536 0.0947298154946536
+8881 7055 5863 0.174726781940175 0.174726781940175
+8882 5863 1311 0.179868913340571 0.179868913340571
+8883 1311 7056 0.241558820409428 0.241558820409428
+8885 7057 1506 0.131503726493835 0.131503726493835
+8886 1506 7058 0.131454642278669 0.131454642278669
+8888 1059 7059 0.104267738567829 0.104267738567829
+10122 3779 7683 0.15407703010384 0.15407703010384
+8890 4436 56 0.118965433489173 0.118965433489173
+8891 56 5316 0.100608812091724 0.100608812091724
+8892 5316 3496 0.0998861232245216 0.0998861232245216
+8893 3496 3665 0.201207219763356 0.201207219763356
+8894 3665 7060 0.199611951396181 0.199611951396181
+8895 7060 7061 0.203598851492666 0.203598851492666
+8896 7061 5840 0.200253664127546 0.200253664127546
+8897 5840 267 0.165246780486595 0.165246780486595
+8899 7062 7063 0.478103640034168 0.478103640034168
+8900 7064 5164 0.146200467670157 0.146200467670157
+8901 5164 6860 0.179928785347538 0.179928785347538
+8902 6860 7065 0.0135383927129561 0.0135383927129561
+8903 7065 2385 0.105505653234926 0.105505653234926
+8905 3637 7066 0.183542084850882 0.183542084850882
+8907 5956 7067 0.0986953923423101 0.0986953923423101
+8908 7067 3021 0.00874922983807779 0.00874922983807779
+20416 10767 10781 0.00791916641108638 0.00791916641108638
+8910 7068 4380 0.0528744797047038 0.0528744797047038
+8911 4380 7069 0.100067477522489 0.100067477522489
+8912 7069 7070 0.00503051016222424 0.00503051016222424
+8913 7070 7071 0.0533378396892988 0.0533378396892988
+8914 7071 7072 0.0517118729985249 0.0517118729985249
+8915 7072 7073 0.0528720185185965 0.0528720185185965
+8916 7073 7074 0.0524160104100909 0.0524160104100909
+8917 7074 7075 0.0591259627190951 0.0591259627190951
+8918 7075 7076 0.0472141967853771 0.0472141967853771
+8919 7076 7077 0.0523938554164358 0.0523938554164358
+8920 7077 7078 0.0519698920804767 0.0519698920804767
+18299 6996 6464 0.157978818539649 0.157978818539649
+18300 6464 5526 0.155386531700968 0.155386531700968
+8921 7078 7079 0.0533446665935528 0.0533446665935528
+8922 7079 6175 0.0539515629761608 0.0539515629761608
+8923 6175 7080 0.0522978151475426 0.0522978151475426
+19723 10628 10634 0.0467495933951474 0.0467495933951474
+8924 7080 3310 0.051621129553778 0.051621129553778
+8925 3310 7081 0.0537939712546602 0.0537939712546602
+8926 7081 7082 0.0517442194955157 0.0517442194955157
+8957 6821 767 0.155663516472162 0.155663516472162
+8928 6333 7083 0.0368397497726965 0.0368397497726965
+8930 7084 756 0.02205451477657 0.02205451477657
+8931 756 1542 0.146566188527195 0.146566188527195
+8933 7085 7086 0.470303961651379 0.470303961651379
+8936 6193 6949 0.198646201862192 0.198646201862192
+8937 6949 7088 0.203154460121287 0.203154460121287
+8938 7088 7089 0.0315254339634626 0.0315254339634626
+11963 4451 5499 0.142902063925945 0.142902063925945
+8939 1547 4267 0.203186762796229 0.203186762796229
+8940 4267 281 0.118834586231474 0.118834586231474
+8942 4988 5631 0.199717559309749 0.199717559309749
+8943 5631 2363 0.114164400355602 0.114164400355602
+8944 2363 4145 0.172388156251151 0.172388156251151
+8945 4145 4750 0.181329134759237 0.181329134759237
+8946 4750 7090 0.0742131518569267 0.0742131518569267
+8947 7090 6563 0.101353119972535 0.101353119972535
+8949 561 652 0.180277903435168 0.180277903435168
+8950 652 7091 0.1782898608686 0.1782898608686
+8951 7091 4618 0.177690137841113 0.177690137841113
+8952 4618 6484 0.148000947434632 0.148000947434632
+8953 6484 3683 0.147902463423831 0.147902463423831
+8955 7092 562 0.138318567115304 0.138318567115304
+14765 7355 5462 0.177046926118077 0.177046926118077
+8958 767 6719 0.219350766482543 0.219350766482543
+8959 6719 6005 0.0551645975375965 0.0551645975375965
+8961 7093 7094 0.0134618314671123 0.0134618314671123
+8962 7094 7095 0.0768336523164077 0.0768336523164077
+8964 4351 7096 0.187825105408858 0.187825105408858
+8966 5169 7097 0.173957232527163 0.173957232527163
+8967 7097 2358 0.178391537286392 0.178391537286392
+8968 2358 4158 0.173186099094122 0.173186099094122
+8969 4158 4745 0.175498953556533 0.175498953556533
+8970 4745 6540 0.175479189908249 0.175479189908249
+8971 6540 7098 0.165132887334241 0.165132887334241
+8974 900 4481 0.13673901951185 0.13673901951185
+8975 4481 2805 0.133564794339907 0.133564794339907
+8976 2805 5271 0.130621351715569 0.130621351715569
+8977 5271 6911 0.123597927289001 0.123597927289001
+8978 6911 7100 0.15221685519733 0.15221685519733
+8979 7100 6360 0.259362269049004 0.259362269049004
+8981 7102 704 0.204412961923 0.204412961923
+19726 10627 10635 0.0226092820114286 0.0226092820114286
+8984 7103 1210 0.168411442672594 0.168411442672594
+8985 1210 7104 0.0210253069731913 0.0210253069731913
+8986 7104 3769 0.199568149574658 0.199568149574658
+8987 3769 7105 0.154728508227155 0.154728508227155
+8988 7105 960 0.176377624617973 0.176377624617973
+8989 960 7106 0.174688777733473 0.174688777733473
+8990 7106 4897 0.160532597504136 0.160532597504136
+8991 4897 7107 0.182971792068578 0.182971792068578
+8992 7107 5494 0.175655210225522 0.175655210225522
+8994 7108 7109 0.103100291492917 0.103100291492917
+8995 7109 7110 0.101964294660044 0.101964294660044
+8998 7112 6130 0.00642185713601216 0.00642185713601216
+8999 6130 3973 0.100482235790598 0.100482235790598
+9000 3973 7018 0.0985643830580019 0.0985643830580019
+9001 7018 1404 0.0976294798550341 0.0976294798550341
+9002 1404 7113 0.0934722476940573 0.0934722476940573
+9003 7113 3377 0.114974498647875 0.114974498647875
+9004 3377 5719 0.0923374297912636 0.0923374297912636
+9006 4633 4552 0.211900461491767 0.211900461491767
+9008 7114 1219 0.0873426128412716 0.0873426128412716
+9009 1219 7115 0.154859667381265 0.154859667381265
+9011 128 4195 0.0990809801322014 0.0990809801322014
+9012 4195 2526 0.225168737431611 0.225168737431611
+9015 7118 7119 0.0484685816363468 0.0484685816363468
+9016 7119 6647 0.0431240450937402 0.0431240450937402
+9017 6647 7120 0.0651283567093235 0.0651283567093235
+9020 7121 5612 0.0589161599786899 0.0589161599786899
+9021 5612 7122 0.0519812671049742 0.0519812671049742
+9022 7122 3734 0.0556068739901258 0.0556068739901258
+9024 4852 7123 0.126059374848785 0.126059374848785
+9025 7123 7124 0.118149722641793 0.118149722641793
+9026 7124 7125 0.121835161075312 0.121835161075312
+9027 7125 7126 0.110094663779518 0.110094663779518
+9028 7126 4678 0.101155068622002 0.101155068622002
+9029 4678 4925 0.0375558738681089 0.0375558738681089
+9031 7127 5718 0.122304701667431 0.122304701667431
+9033 7129 7130 0.00755996146089403 0.00755996146089403
+11437 7984 8034 0.589388539362218 0.589388539362218
+9034 7130 7131 0.0405147672355999 0.0405147672355999
+15917 9748 9104 0.13371062185673 0.13371062185673
+9036 7132 7133 0.0505601360898234 0.0505601360898234
+9037 7133 7134 0.050337833066874 0.050337833066874
+9039 2563 2043 0.341755774769512 0.341755774769512
+9040 2043 4280 0.587618591665046 0.587618591665046
+9041 4280 2317 0.145996435168453 0.145996435168453
+9042 2317 7135 0.26875426467805 0.26875426467805
+9044 4276 6167 0.145395831525207 0.145395831525207
+9045 6167 7136 0.583394412429138 0.583394412429138
+9046 7136 7137 0.0430989040252276 0.0430989040252276
+9048 7138 7139 0.17847978963111 0.17847978963111
+9049 7139 665 0.00426988518248375 0.00426988518248375
+9050 665 7140 0.0039363004033923 0.0039363004033923
+9051 7140 7141 0.126828000444838 0.126828000444838
+9052 7141 7142 0.0463243816448395 0.0463243816448395
+9053 7142 4606 0.175854779813893 0.175854779813893
+13036 8929 8930 0.492762775909981 0.492762775909981
+9054 4606 2885 0.129583918723674 0.129583918723674
+9056 818 3559 0.139007675873083 0.139007675873083
+9057 3559 5633 0.138607438022671 0.138607438022671
+9060 5632 7143 0.0971697431213832 0.0971697431213832
+9061 7143 4337 0.0573209846859246 0.0573209846859246
+9062 4337 6336 0.137619327969477 0.137619327969477
+9063 6336 3051 0.138690015537613 0.138690015537613
+9064 3051 7144 0.13740372400277 0.13740372400277
+9065 7144 7145 0.00531536492655497 0.00531536492655497
+9066 7145 7146 0.138359891845979 0.138359891845979
+9069 873 4461 0.138000198054367 0.138000198054367
+9070 4461 2781 0.134827246932882 0.134827246932882
+9073 6941 5768 0.263560531238909 0.263560531238909
+9074 5768 7148 0.00867578094755507 0.00867578094755507
+9075 6325 4168 0.192770537182593 0.192770537182593
+9076 4168 4753 0.208190261859574 0.208190261859574
+9077 4753 6544 0.199662965025148 0.199662965025148
+9078 6544 7149 0.203286576405629 0.203286576405629
+9079 7149 7150 0.188877376950956 0.188877376950956
+9080 7150 3796 0.199750569153682 0.199750569153682
+9081 3796 5939 0.152615142478991 0.152615142478991
+9082 5939 940 0.17776127985835 0.17776127985835
+9083 940 2224 0.184599395002716 0.184599395002716
+9084 2224 4874 0.160770298676863 0.160770298676863
+9085 4874 7151 0.191866995309803 0.191866995309803
+9086 7151 5472 0.170431656658562 0.170431656658562
+9087 5472 7152 0.177051030738846 0.177051030738846
+9089 7153 7154 0.0893451644905786 0.0893451644905786
+9090 7154 6170 0.0753374734775839 0.0753374734775839
+9091 6170 4764 0.177646502224828 0.177646502224828
+9092 4764 4150 0.173084945690311 0.173084945690311
+9094 2344 7155 0.117646857783728 0.117646857783728
+9095 7155 7156 0.0188390787773898 0.0188390787773898
+9096 7156 7157 0.234434662963778 0.234434662963778
+9097 7157 7158 0.0252454738977112 0.0252454738977112
+9100 7159 7160 0.136141908223257 0.136141908223257
+9101 7160 7161 0.134175303690261 0.134175303690261
+9102 7161 5540 0.104957650418394 0.104957650418394
+9103 5540 2408 0.0972515972300324 0.0972515972300324
+9104 2408 4293 0.0986699082335262 0.0986699082335262
+9105 4293 7163 0.053830719074408 0.053830719074408
+9107 7164 7165 0.0631810706690825 0.0631810706690825
+9108 7165 2982 0.341967827784909 0.341967827784909
+9109 2982 7166 0.203801982791161 0.203801982791161
+9110 7166 7167 0.199088364823678 0.199088364823678
+9111 7167 7168 0.00801722711592813 0.00801722711592813
+9112 7168 7169 0.0420988990456398 0.0420988990456398
+9113 7169 7170 0.153973329045923 0.153973329045923
+9114 7170 6877 0.206323620437175 0.206323620437175
+9115 6877 1688 0.202556013709455 0.202556013709455
+10335 2984 7779 0.0471482180711068 0.0471482180711068
+9116 1688 7171 0.203959165094635 0.203959165094635
+9117 7171 2434 0.200457262733771 0.200457262733771
+9118 2434 7172 0.202529539970889 0.202529539970889
+9119 7172 6459 0.289084578375032 0.289084578375032
+19730 5374 10637 0.0120223368882016 0.0120223368882016
+9120 6459 7173 0.114101346723939 0.114101346723939
+9121 7173 7174 0.184116579370581 0.184116579370581
+9122 7174 7175 0.203885371802177 0.203885371802177
+9123 7175 7176 0.042345014713444 0.042345014713444
+9124 7176 7177 0.0543545796747623 0.0543545796747623
+9125 7177 1424 0.112240471555906 0.112240471555906
+9128 7179 6066 0.193267920890686 0.193267920890686
+9129 6066 2546 0.202503184194707 0.202503184194707
+9130 2546 7180 0.41050413821522 0.41050413821522
+9131 6215 7181 0.274932291342238 0.274932291342238
+9132 7181 7182 0.263103709588239 0.263103709588239
+9133 7182 7183 0.130644941399459 0.130644941399459
+9134 2594 5185 0.17867940782894 0.17867940782894
+9137 5066 4054 0.176950276628118 0.176950276628118
+9138 4054 7184 0.19508037930475 0.19508037930475
+19295 10466 10470 0.0590667450333129 0.0590667450333129
+9139 7184 1855 0.159486883286254 0.159486883286254
+9140 1855 2595 0.177991984486361 0.177991984486361
+9142 7132 7185 0.200740739267956 0.200740739267956
+9144 317 5720 0.10120960072344 0.10120960072344
+9146 7186 7178 0.0998150102985703 0.0998150102985703
+9147 7178 7187 0.0486556483534758 0.0486556483534758
+9148 7187 7188 0.0504244958733159 0.0504244958733159
+9149 7188 6720 0.0492257170939005 0.0492257170939005
+9150 6720 1139 0.0498554245278369 0.0498554245278369
+9151 1139 6900 0.0496729718772752 0.0496729718772752
+9152 6900 7189 0.0498269762893686 0.0498269762893686
+9153 7189 7190 0.0493080365100491 0.0493080365100491
+9154 7190 3869 0.0507905077365378 0.0507905077365378
+9155 3869 7191 0.0511248031667964 0.0511248031667964
+9156 7191 5583 0.0514153335527058 0.0514153335527058
+9158 6374 7192 0.0508291685906189 0.0508291685906189
+9159 7192 4828 0.0505211822659055 0.0505211822659055
+9160 4828 7193 0.0991435070786191 0.0991435070786191
+9161 7193 7194 0.0991520630524694 0.0991520630524694
+9162 7194 7195 0.0477883926406413 0.0477883926406413
+9163 7195 7196 0.0494484339552123 0.0494484339552123
+9164 7196 7197 0.0162046310747774 0.0162046310747774
+9166 7198 6674 0.0990044216409842 0.0990044216409842
+9167 6674 3118 0.097669089391913 0.097669089391913
+9168 3118 7199 0.284505571449601 0.284505571449601
+9169 7199 6008 0.094118222257641 0.094118222257641
+9170 6008 2844 0.0930401433253343 0.0930401433253343
+9171 2844 3493 0.0866696350082772 0.0866696350082772
+9172 3493 5349 0.0889131869713594 0.0889131869713594
+9174 5392 2946 0.0903397575627338 0.0903397575627338
+9175 2946 6812 0.0903546565690543 0.0903546565690543
+9176 6812 1813 0.0889131954631002 0.0889131954631002
+9179 7201 7202 0.0514316470718889 0.0514316470718889
+9180 7202 571 0.0452247620537137 0.0452247620537137
+9181 571 4984 0.0498774301127379 0.0498774301127379
+9182 4984 7203 0.0499341834444621 0.0499341834444621
+9183 7203 7204 0.048540539361363 0.048540539361363
+9184 7204 7205 0.049454954432791 0.049454954432791
+9185 7205 7206 0.0536988191890685 0.0536988191890685
+9186 7206 7207 0.0531339953218732 0.0531339953218732
+9188 7208 7209 0.0488986834694409 0.0488986834694409
+10408 7087 974 0.0520701135747565 0.0520701135747565
+9190 3616 7210 0.0490025655343953 0.0490025655343953
+9191 7210 7211 0.0492346778344629 0.0492346778344629
+9192 7211 6627 0.0474835705848566 0.0474835705848566
+9193 6627 7212 0.0259857221754392 0.0259857221754392
+9195 7213 2937 0.0797219985274474 0.0797219985274474
+9197 4927 7214 0.0675624031978383 0.0675624031978383
+9198 7214 7215 0.172837829649445 0.172837829649445
+9199 7215 7216 0.0152456900319388 0.0152456900319388
+9201 7217 7218 0.150068688599712 0.150068688599712
+9202 7218 3717 0.0523950557178934 0.0523950557178934
+9203 3717 7219 0.104026300075926 0.104026300075926
+9204 7219 7220 0.176478214187187 0.176478214187187
+9205 7220 2618 0.176744455093666 0.176744455093666
+9206 2618 7221 0.0524078444870275 0.0524078444870275
+9207 7221 5199 0.124408908082812 0.124408908082812
+9208 5199 6236 0.175254349133775 0.175254349133775
+9209 6236 7222 0.181371367707484 0.181371367707484
+9210 7222 7223 0.17624861030264 0.17624861030264
+10431 7818 3372 0.256942906695214 0.256942906695214
+9211 7223 7224 0.177882160330428 0.177882160330428
+9212 7224 6596 0.176655139096338 0.176655139096338
+9213 6596 7225 0.176764713771947 0.176764713771947
+9214 7225 7117 0.195263815592674 0.195263815592674
+9215 7117 7226 0.162883394969853 0.162883394969853
+9217 7227 7228 0.0929813395053153 0.0929813395053153
+9218 7228 7229 0.0382886967355643 0.0382886967355643
+9220 5754 5537 0.136674994706822 0.136674994706822
+9222 7230 2419 0.0601608416165443 0.0601608416165443
+9224 7231 1877 0.0370441528846065 0.0370441528846065
+9225 1877 7232 0.131692111532173 0.131692111532173
+9227 7233 7234 0.109254283787097 0.109254283787097
+9228 7234 7235 0.0988980977520615 0.0988980977520615
+9229 7235 7236 0.100150595242985 0.100150595242985
+9230 7236 7237 0.0982491727225652 0.0982491727225652
+9231 7237 7238 0.102801611377818 0.102801611377818
+9232 7238 3624 0.10072637054969 0.10072637054969
+9233 3624 7239 0.0490877236423196 0.0490877236423196
+9234 7239 7240 0.0506406047895119 0.0506406047895119
+9236 7241 7242 0.053434962453162 0.053434962453162
+9238 7243 2049 0.0999533143701506 0.0999533143701506
+9239 2049 6322 0.101276003642563 0.101276003642563
+9240 6322 7245 0.101332248433824 0.101332248433824
+9241 7245 7246 0.0464773018813961 0.0464773018813961
+9242 7246 3478 0.0519094915924 0.0519094915924
+9243 3478 7247 0.0444674652348498 0.0444674652348498
+9244 7247 6076 0.0542711695249793 0.0542711695249793
+9245 6076 7248 0.0457685619049607 0.0457685619049607
+9246 7248 3693 0.0511581578497335 0.0511581578497335
+9247 3693 7249 0.0484213428818718 0.0484213428818718
+9248 7249 4568 0.050423249762551 0.050423249762551
+9249 4568 7250 0.105671525256593 0.105671525256593
+9251 3486 5352 0.142707971743977 0.142707971743977
+9252 5352 5389 0.0672375375003041 0.0672375375003041
+9254 6807 7251 0.174038770872886 0.174038770872886
+9255 5582 7252 0.0700127444942287 0.0700127444942287
+9256 3438 7253 0.0456922323357007 0.0456922323357007
+9257 7253 5712 0.0536735809918437 0.0536735809918437
+9258 5712 7254 0.0996465050991051 0.0996465050991051
+9259 7254 7177 0.0990312619116669 0.0990312619116669
+9261 2234 5135 0.107869698056021 0.107869698056021
+9263 5150 4905 0.0686856789021931 0.0686856789021931
+9264 4905 6617 0.200618729294218 0.200618729294218
+9265 6617 7255 0.197431040074393 0.197431040074393
+9266 7255 7256 0.208183749937444 0.208183749937444
+9267 7256 645 0.141740585620374 0.141740585620374
+9268 645 7257 0.130628958724451 0.130628958724451
+9269 7257 1991 0.0908850253123808 0.0908850253123808
+9270 1991 1975 0.0373563291181619 0.0373563291181619
+9271 1975 4592 0.133760117820733 0.133760117820733
+9272 4592 6479 0.133361447138617 0.133361447138617
+9273 6479 2465 0.142787478559072 0.142787478559072
+9275 7258 905 0.276860539558146 0.276860539558146
+9276 905 7259 0.128469118479352 0.128469118479352
+9278 7260 7261 0.202325557275685 0.202325557275685
+9279 7261 7262 0.200099452464053 0.200099452464053
+9281 6555 7263 0.106048977208119 0.106048977208119
+9283 2464 5907 0.204805215249635 0.204805215249635
+9284 5907 7264 0.200064951669816 0.200064951669816
+9285 7264 792 0.198575253788857 0.198575253788857
+9286 792 7265 0.203153130979463 0.203153130979463
+20553 10855 10830 0.00226863418878014 0.00226863418878014
+9287 7265 4356 0.200718125919129 0.200718125919129
+9288 4356 7266 0.203231013450801 0.203231013450801
+9289 7266 3059 0.208369469805255 0.208369469805255
+9290 3059 7267 0.184116398047724 0.184116398047724
+9292 7268 7269 0.172274443384772 0.172274443384772
+9293 7269 7270 0.174965358395498 0.174965358395498
+9294 7270 7271 0.171051925436011 0.171051925436011
+9295 7271 4777 0.251271094456806 0.251271094456806
+9297 7272 7273 0.142786274588455 0.142786274588455
+9298 7273 7257 0.143845033730321 0.143845033730321
+9299 7257 2012 0.148104007431453 0.148104007431453
+9300 2012 7274 0.146908840218292 0.146908840218292
+9303 3209 6121 0.198338421830571 0.198338421830571
+9305 1920 7245 0.200452444306493 0.200452444306493
+9306 7245 3264 0.201454965709232 0.201454965709232
+9307 3264 7275 0.199928677430985 0.199928677430985
+9308 7275 75 0.205218774272454 0.205218774272454
+9309 75 3514 0.203667659516003 0.203667659516003
+9310 3514 4256 0.200449218475779 0.200449218475779
+9312 7276 7277 0.199018039984475 0.199018039984475
+9314 3099 7278 0.127218718588174 0.127218718588174
+9315 7279 7280 0.0142903725965103 0.0142903725965103
+9316 7280 7281 0.105207552208829 0.105207552208829
+9317 7282 7283 0.0344899807253543 0.0344899807253543
+9318 7283 221 0.0709873405596775 0.0709873405596775
+9319 221 484 0.00880336166381634 0.00880336166381634
+9320 484 7284 0.0467023879280561 0.0467023879280561
+9321 7284 7285 0.0520434565562666 0.0520434565562666
+9322 7285 7286 0.0966986010135768 0.0966986010135768
+9324 7287 7288 0.0474221057340072 0.0474221057340072
+9325 7288 7289 0.0544896557893494 0.0544896557893494
+18313 7291 7292 0.0491935106031602 0.0491935106031602
+12266 8623 8624 0.00987394368395642 0.00987394368395642
+9326 7289 7293 0.050792182381771 0.050792182381771
+9327 7293 7294 0.0490541601102182 0.0490541601102182
+9328 7294 3625 0.0491311379128154 0.0491311379128154
+9329 3625 7295 0.0500044548990436 0.0500044548990436
+9330 7295 7296 0.0493114932484129 0.0493114932484129
+9331 7296 7297 0.0492273088766844 0.0492273088766844
+9332 7297 7298 0.0497149327544833 0.0497149327544833
+9333 7298 7299 0.052416983039433 0.052416983039433
+9334 7299 1775 0.0489179547921138 0.0489179547921138
+9335 1775 7300 0.0992252392752366 0.0992252392752366
+9338 1523 7301 0.0991304181855472 0.0991304181855472
+9340 4180 7302 0.159005264658095 0.159005264658095
+9342 7303 7304 0.0508070845581107 0.0508070845581107
+9344 2051 7305 0.0464895652372381 0.0464895652372381
+9346 6323 7306 0.0487652334573382 0.0487652334573382
+9347 7306 7275 0.0511008721086019 0.0511008721086019
+9348 7275 7307 0.0472167292045061 0.0472167292045061
+9349 7307 3479 0.0519136696037329 0.0519136696037329
+9350 3479 7308 0.0469673771341736 0.0469673771341736
+9351 7308 6077 0.0514245726695928 0.0514245726695928
+9353 7309 3694 0.0517124258100223 0.0517124258100223
+9354 3694 7310 0.0465067719763774 0.0465067719763774
+9355 7310 4569 0.0489536209610463 0.0489536209610463
+9356 4569 7311 0.0489635595580148 0.0489635595580148
+9357 7311 7312 0.0558091568866214 0.0558091568866214
+9359 5166 6862 0.178524347295205 0.178524347295205
+10575 7382 7866 0.0530283440074436 0.0530283440074436
+9361 5665 7313 0.0484754519993524 0.0484754519993524
+9362 7313 7314 0.161386441141289 0.161386441141289
+9363 7314 57 0.142345062746265 0.142345062746265
+9365 3497 7315 0.199650199137315 0.199650199137315
+9366 7315 7316 0.20195222577189 0.20195222577189
+9368 7317 7318 0.0198371749129227 0.0198371749129227
+9369 7318 2347 0.132104544578518 0.132104544578518
+9370 2347 4152 0.17573096379452 0.17573096379452
+9371 4152 4739 0.172852869151079 0.172852869151079
+9372 4739 6534 0.176755786446123 0.176755786446123
+9373 6534 7319 0.165399065875657 0.165399065875657
+9376 1193 7321 0.0221951663944447 0.0221951663944447
+9377 7321 3785 0.200018254719297 0.200018254719297
+9379 6356 2387 0.110864888603468 0.110864888603468
+9380 2387 7322 0.139379472361554 0.139379472361554
+9381 7322 7323 0.046481070265731 0.046481070265731
+9382 7323 745 0.0926146092564692 0.0926146092564692
+9383 745 1563 0.142337228385207 0.142337228385207
+9384 1563 7324 0.139015648234869 0.139015648234869
+9385 7324 7325 0.121637038292373 0.121637038292373
+9387 7326 1054 0.0187920378071022 0.0187920378071022
+9388 1054 7327 0.1804815052178 0.1804815052178
+9389 7327 7328 0.200952784069958 0.200952784069958
+9390 7328 2873 0.135770477885413 0.135770477885413
+9391 2873 7329 0.140734857106897 0.140734857106897
+9392 7329 7330 0.130551116437319 0.130551116437319
+9394 3573 5641 0.135671111475822 0.135671111475822
+9395 5641 4346 0.139178472263861 0.139178472263861
+9397 6344 3047 0.139334930188281 0.139334930188281
+9398 3047 7331 0.13779347001033 0.13779347001033
+9399 7331 7332 0.00320242529462838 0.00320242529462838
+9400 7332 7333 0.124149220639337 0.124149220639337
+9401 7333 7334 0.0152895413448354 0.0152895413448354
+9402 7334 1168 0.139240705026111 0.139240705026111
+9403 1168 888 0.137184892852111 0.137184892852111
+9404 888 4473 0.140290329638987 0.140290329638987
+9405 4473 2795 0.133122605689938 0.133122605689938
+18387 8972 8990 0.0135489498420418 0.0135489498420418
+9406 2795 5263 0.132274155849312 0.132274155849312
+9408 5264 7335 0.142105114812744 0.142105114812744
+9409 7336 7337 0.0976207961374284 0.0976207961374284
+9410 7337 4886 0.157275932372423 0.157275932372423
+9411 4886 7338 0.185720302610988 0.185720302610988
+9412 7338 5484 0.174899259954025 0.174899259954025
+9413 5484 7339 0.200596009359583 0.200596009359583
+9415 7001 7340 0.179314344082203 0.179314344082203
+9416 7340 3105 0.172536320867715 0.172536320867715
+9417 3105 7341 0.196295851159965 0.196295851159965
+9418 7341 7342 0.0146987319128723 0.0146987319128723
+9419 7342 5274 0.233778976885029 0.233778976885029
+9421 61 3550 0.201334976523304 0.201334976523304
+9423 4229 1512 0.0573285646726125 0.0573285646726125
+9424 1512 1812 0.080316497766985 0.080316497766985
+9425 1812 1792 0.0864981124104349 0.0864981124104349
+9426 1792 5766 0.0789087886834876 0.0789087886834876
+9427 5766 7199 0.0992911764787047 0.0992911764787047
+9428 7199 6828 0.11119492664509 0.11119492664509
+9429 6828 5849 0.0944254133826228 0.0944254133826228
+9430 5849 6009 0.0132155676036954 0.0132155676036954
+9431 6009 6306 0.0820521132716854 0.0820521132716854
+9432 6306 7343 0.105450198242036 0.105450198242036
+9433 7343 6621 0.143519415278471 0.143519415278471
+9434 6621 7344 1.27038946039582 1.27038946039582
+9437 4173 4758 0.21160422195521 0.21160422195521
+9439 7347 7348 0.135937832662874 0.135937832662874
+9440 7348 7349 0.00392915540186096 0.00392915540186096
+9441 7349 7350 0.00435925191977174 0.00435925191977174
+9442 7350 7351 0.134680718743296 0.134680718743296
+9443 7351 7352 0.142353643667365 0.142353643667365
+9444 7352 822 0.136144392169031 0.136144392169031
+9445 822 3563 0.139511434934294 0.139511434934294
+9447 4757 6547 0.198421257470946 0.198421257470946
+9448 6547 7353 0.203512578195826 0.203512578195826
+9449 7353 7354 0.189733642798723 0.189733642798723
+9450 7354 3791 0.198902472958717 0.198902472958717
+9452 7356 1156 0.139895555737197 0.139895555737197
+9453 1156 877 0.139167763247538 0.139167763247538
+9454 877 4465 0.138362926550376 0.138362926550376
+9455 4465 2785 0.134223449290719 0.134223449290719
+9456 2785 5256 0.132255447080442 0.132255447080442
+10701 7933 7934 0.0165824928197296 0.0165824928197296
+9457 5256 6902 0.213396689593523 0.213396689593523
+9458 6902 7357 0.137952680025601 0.137952680025601
+9460 7358 7359 0.0873817304884455 0.0873817304884455
+9461 7359 5476 0.17425617170475 0.17425617170475
+9462 5476 7360 0.176755476074969 0.176755476074969
+9463 7360 7361 0.179271064370159 0.179271064370159
+9464 7361 670 0.00299320804688776 0.00299320804688776
+9465 670 7362 0.00367138449467953 0.00367138449467953
+9466 7362 7363 0.175413304982356 0.175413304982356
+9467 7363 4602 0.174300257248449 0.174300257248449
+9468 4602 6494 0.14109328269368 0.14109328269368
+9470 6339 3027 0.140999530277673 0.140999530277673
+9471 3027 7364 0.134294188280294 0.134294188280294
+9472 7364 7367 0.00539295394286677 0.00539295394286677
+9473 7367 7368 0.0958510973743428 0.0958510973743428
+9474 7369 7370 0.0190810494123846 0.0190810494123846
+9475 7370 4174 0.200419085556528 0.200419085556528
+9476 4174 4759 0.205255972403598 0.205255972403598
+9478 7371 1504 0.200818042076817 0.200818042076817
+9479 1504 177 0.202381091183512 0.202381091183512
+9481 7048 5860 0.176960295698989 0.176960295698989
+9482 5860 1308 0.177680958846967 0.177680958846967
+9483 1308 7372 0.242287040915104 0.242287040915104
+9485 7373 7374 0.0554606112260645 0.0554606112260645
+9486 7374 6759 0.139083865409791 0.139083865409791
+9487 6759 3983 0.201208667852087 0.201208667852087
+9488 3983 7042 0.200146227687253 0.200146227687253
+9489 7042 3429 0.200588668938452 0.200588668938452
+9491 7375 7376 0.134975501915893 0.134975501915893
+9492 7376 2494 0.132763759551609 0.132763759551609
+9493 2494 2841 0.125447252672452 0.125447252672452
+9495 7377 1766 0.0535653036014808 0.0535653036014808
+9496 1766 7378 0.148946577862237 0.148946577862237
+9497 7378 7379 0.151136159766357 0.151136159766357
+9498 7379 2978 0.0542010510807056 0.0542010510807056
+9500 6210 7380 0.184339220967731 0.184339220967731
+9501 7380 7381 0.177783326711723 0.177783326711723
+9503 7055 4046 0.178402656739544 0.178402656739544
+9504 4046 7382 0.177334708763743 0.177334708763743
+9505 7382 1847 0.175265460280809 0.175265460280809
+9506 1847 2581 0.177411624203835 0.177411624203835
+9508 5179 7383 0.0621659509396009 0.0621659509396009
+9510 7384 5530 0.101603812835917 0.101603812835917
+9511 5530 6476 0.0959541548395336 0.0959541548395336
+9512 6476 7385 0.197309689587966 0.197309689587966
+9514 7386 4578 0.133367493492184 0.133367493492184
+9515 4578 6442 0.135224444657643 0.135224444657643
+9516 6442 5294 0.135202388191056 0.135202388191056
+9517 5294 6971 0.132090452543352 0.132090452543352
+9519 7387 6793 0.0526421759963202 0.0526421759963202
+9520 6793 2426 0.0832334466071371 0.0832334466071371
+9521 2426 7292 0.0515611894823623 0.0515611894823623
+9522 7292 3230 0.0818841223845197 0.0818841223845197
+9523 3230 7388 0.142866769580008 0.142866769580008
+9525 7389 7390 0.203322823967769 0.203322823967769
+9529 7391 7392 0.135325738854945 0.135325738854945
+9530 7392 7393 0.132395815694125 0.132395815694125
+9531 7393 7394 0.135014881681412 0.135014881681412
+9532 7394 7395 0.132077333868835 0.132077333868835
+9535 7397 621 0.0257970801977961 0.0257970801977961
+9537 4075 6060 0.199263565882924 0.199263565882924
+9538 6060 5800 0.199550446273018 0.199550446273018
+9540 7398 3097 0.199450454556748 0.199450454556748
+9541 3097 3207 0.202536688546866 0.202536688546866
+9542 3207 6119 0.201707926741417 0.201707926741417
+9543 6119 1917 0.201109266380341 0.201109266380341
+9544 1917 7243 0.20045244430598 0.20045244430598
+9545 7243 594 0.202390514467061 0.202390514467061
+9547 7399 5843 0.208569621956493 0.208569621956493
+9549 7400 5659 0.10300363118025 0.10300363118025
+9550 5659 7401 0.0544972381418925 0.0544972381418925
+9552 6194 6950 0.191455920710939 0.191455920710939
+9553 6950 7402 0.209004541630565 0.209004541630565
+9555 4943 7403 0.0144437903083984 0.0144437903083984
+9556 7403 3000 0.101061674656442 0.101061674656442
+9558 6639 3962 0.136668682711291 0.136668682711291
+9559 3962 4361 0.121869293781819 0.121869293781819
+20411 9207 10780 0.0112983850763668 0.0112983850763668
+9561 5171 5225 0.145976272368254 0.145976272368254
+9562 5225 1866 0.0654044096593951 0.0654044096593951
+9563 1866 5084 0.0770856255669816 0.0770856255669816
+9564 5084 2809 0.113066726070966 0.113066726070966
+9565 2809 3368 0.152693063908693 0.152693063908693
+9566 3368 7404 0.0530057643448654 0.0530057643448654
+9567 7404 4944 0.0497811011847154 0.0497811011847154
+9568 4944 7405 0.0515530101953733 0.0515530101953733
+9569 7405 7217 0.0502978935844785 0.0502978935844785
+9570 7217 7406 0.0537233169488665 0.0537233169488665
+9571 7406 7407 0.0412354910733997 0.0412354910733997
+9572 6416 4212 0.100784166153009 0.100784166153009
+9573 4212 190 0.175257609965618 0.175257609965618
+9574 190 4532 0.201882877149858 0.201882877149858
+9575 4532 5431 0.198227529862783 0.198227529862783
+9576 5431 5972 0.107244272330712 0.107244272330712
+9577 5972 2255 0.104270609577454 0.104270609577454
+9578 2255 6131 0.104982960169425 0.104982960169425
+9579 6131 3998 0.104249966263654 0.104249966263654
+9580 3998 7048 0.105712541492873 0.105712541492873
+9581 7048 1393 0.105952500116488 0.105952500116488
+9583 7408 7055 0.0530917174300864 0.0530917174300864
+9584 7055 7409 0.0515249594325266 0.0515249594325266
+9585 7409 3389 0.0512512544679775 0.0512512544679775
+9586 3389 7410 0.0515249594325266 0.0515249594325266
+9587 7410 4504 0.051986836558228 0.051986836558228
+9588 4504 3539 0.0507992547126353 0.0507992547126353
+9589 3539 7411 0.0505170014633714 0.0505170014633714
+9590 7411 7412 0.0515690276546841 0.0515690276546841
+9592 5066 6400 0.0525526328752235 0.0525526328752235
+9593 6400 6835 0.0526723733629873 0.0526723733629873
+9594 6835 7413 0.0505686622438464 0.0505686622438464
+9595 7413 1105 0.0506198937481409 0.0506198937481409
+9596 1105 7414 0.0824276303743622 0.0824276303743622
+9598 3863 7415 0.0529481461592885 0.0529481461592885
+9599 7415 6656 0.0485933921065039 0.0485933921065039
+9600 6656 7416 0.0551266417503484 0.0551266417503484
+9601 7416 7417 0.698080046436177 0.698080046436177
+9602 3179 7418 0.0616464790427922 0.0616464790427922
+9603 7418 5002 0.0485639637102659 0.0485639637102659
+9604 5002 7419 0.0540110826611525 0.0540110826611525
+9605 7419 5725 0.0437502401390831 0.0437502401390831
+9606 5725 724 0.0271601591292424 0.0271601591292424
+9607 724 7059 0.100733087825974 0.100733087825974
+9608 7059 7314 0.111000885564944 0.111000885564944
+9610 7421 3610 0.212938945536276 0.212938945536276
+9611 3610 2128 0.151144951480704 0.151144951480704
+10843 154 8006 0.0789597424143419 0.0789597424143419
+9613 5998 2327 0.147931201391184 0.147931201391184
+9614 2327 7422 0.151462381546094 0.151462381546094
+9615 2016 354 0.0832039426217647 0.0832039426217647
+9616 354 2024 0.270665538753682 0.270665538753682
+9620 4944 7424 0.200356357596052 0.200356357596052
+9622 2981 7425 0.200823510551274 0.200823510551274
+9623 7425 7426 0.200629159279387 0.200629159279387
+9624 7426 7427 0.00781704540286186 0.00781704540286186
+9625 7427 7428 0.196215671376464 0.196215671376464
+9626 7428 6876 0.205224182417126 0.205224182417126
+9627 6876 1687 0.205021376956907 0.205021376956907
+9628 1687 7429 0.205696359665547 0.205696359665547
+9629 7429 2432 0.199163881347575 0.199163881347575
+9630 2432 7431 0.20247617593456 0.20247617593456
+9632 6213 7432 0.274944028390563 0.274944028390563
+9633 7432 7433 0.263513794727665 0.263513794727665
+9634 7433 6594 0.262579264502597 0.262579264502597
+9636 7254 1423 0.111990529719831 0.111990529719831
+10866 1577 8015 0.266859669077532 0.266859669077532
+9639 7434 7435 0.184117705049588 0.184117705049588
+9640 7435 7436 0.203503143312405 0.203503143312405
+9642 6593 7437 0.098508708246921 0.098508708246921
+9643 7437 7127 0.0085733378066782 0.0085733378066782
+9645 7411 4051 0.176201016140517 0.176201016140517
+9646 4051 7438 0.186623330561976 0.186623330561976
+9647 7438 1853 0.167040016171723 0.167040016171723
+9648 1853 2591 0.179034976108436 0.179034976108436
+9650 7439 6064 0.193434831975152 0.193434831975152
+9651 6064 2544 0.202007823415783 0.202007823415783
+9652 2544 7440 0.411378882387366 0.411378882387366
+9653 7129 627 0.200330694412442 0.200330694412442
+9655 18 6387 0.132089927812284 0.132089927812284
+9658 7443 7444 0.13397887621517 0.13397887621517
+9659 7444 5539 0.105571329036095 0.105571329036095
+9660 5539 2407 0.0968730605007166 0.0968730605007166
+9661 2407 4292 0.100193275722424 0.100193275722424
+9662 4292 7445 0.0505436928211805 0.0505436928211805
+9663 7445 7446 0.0548363595380854 0.0548363595380854
+9665 7447 7448 0.169947053382904 0.169947053382904
+9667 5852 1336 0.19937663187299 0.19937663187299
+9668 1336 6158 0.0597086585632686 0.0597086585632686
+9669 6158 7449 0.153340690716036 0.153340690716036
+9671 7450 4365 0.199972383812324 0.199972383812324
+9672 4365 1447 0.201108937861992 0.201108937861992
+9673 1447 7451 0.20199467881708 0.20199467881708
+9674 7451 6664 0.0985180993542889 0.0985180993542889
+9675 6664 1757 0.102800794441344 0.102800794441344
+9676 1757 3819 0.106482209599855 0.106482209599855
+9677 3819 5892 0.0976679798408968 0.0976679798408968
+9679 5332 5070 0.101261676099905 0.101261676099905
+9680 5070 6838 0.100657370443561 0.100657370443561
+9681 6838 6967 0.0976725983678986 0.0976725983678986
+9682 6967 7452 0.102800093286128 0.102800093286128
+9683 7452 7453 0.0998547767838799 0.0998547767838799
+9685 5437 7454 0.211535646678045 0.211535646678045
+9686 7454 4416 0.194570832918176 0.194570832918176
+9687 4416 7456 0.224677107455919 0.224677107455919
+9688 7456 4322 0.22100369073056 0.22100369073056
+9692 7458 7459 0.0196177061643605 0.0196177061643605
+9693 7459 7460 0.0200797614980701 0.0200797614980701
+9694 7460 7461 0.0204220717617775 0.0204220717617775
+9695 7461 7462 0.0192753952773127 0.0192753952773127
+9696 7462 7463 0.0197376280100197 0.0197376280100197
+9697 7463 1874 0.0201396312288959 0.0201396312288959
+9698 1874 7464 0.101865928676763 0.101865928676763
+9699 7464 7465 0.0516398712444199 0.0516398712444199
+9700 5894 1589 0.201207684972719 0.201207684972719
+9701 1589 1639 0.202832052664544 0.202832052664544
+9703 7466 7467 0.461510399426298 0.461510399426298
+9704 7468 7469 0.0656477480578156 0.0656477480578156
+9705 7469 7470 0.0202314805703126 0.0202314805703126
+9706 7470 7471 0.0196155905306545 0.0196155905306545
+9707 7471 7472 0.0198466389215673 0.0198466389215673
+9709 7473 7474 0.0193760769839274 0.0193760769839274
+10941 7859 4686 0.105458193161767 0.105458193161767
+16187 5815 7203 0.20368767335866 0.20368767335866
+9710 7474 7475 0.0199577496151493 0.0199577496151493
+9711 7475 1873 0.0221306450398483 0.0221306450398483
+9712 1873 7476 0.0228930859552116 0.0228930859552116
+9713 7476 7477 0.00597945379667752 0.00597945379667752
+9714 7477 7481 0.0633102446327588 0.0633102446327588
+9715 7481 7482 0.00659734634558833 0.00659734634558833
+9716 7482 7483 0.0122662226221965 0.0122662226221965
+9717 7483 7484 0.0357233876730641 0.0357233876730641
+9718 7484 4185 0.0600540815299224 0.0600540815299224
+9721 7485 4417 0.198257535408126 0.198257535408126
+9722 4417 7486 0.220999648574169 0.220999648574169
+9723 7486 4321 0.223933764288424 0.223933764288424
+9725 4364 1446 0.20650017701017 0.20650017701017
+9726 1446 7487 0.199709617072806 0.199709617072806
+9727 7487 6936 0.203411194568703 0.203411194568703
+9728 6936 5891 0.202831423382765 0.202831423382765
+9730 7488 7489 0.219847500079542 0.219847500079542
+9731 7489 7490 0.112284636925509 0.112284636925509
+9733 7491 7492 0.104975617952237 0.104975617952237
+9734 7492 7493 0.133826104897821 0.133826104897821
+9735 7493 7494 0.136182988757468 0.136182988757468
+9737 5544 2414 0.0621561786197408 0.0621561786197408
+9739 5055 4297 0.0642451197659933 0.0642451197659933
+9740 4297 7495 0.104062899405527 0.104062899405527
+9741 7495 7496 0.203687229874764 0.203687229874764
+9742 7496 2987 0.200108037782066 0.200108037782066
+9743 2987 7497 0.201819339453719 0.201819339453719
+9744 7497 7498 0.0489089257680099 0.0489089257680099
+9745 7498 7499 0.151764240821653 0.151764240821653
+9746 7499 7500 0.203024715164671 0.203024715164671
+9747 7500 6882 0.202091910987955 0.202091910987955
+9748 6882 1693 0.203443247701908 0.203443247701908
+9749 1693 7501 0.204709999833149 0.204709999833149
+9750 7501 2441 0.166684898047837 0.166684898047837
+9752 5738 5527 0.157552520143968 0.157552520143968
+9753 5527 6465 0.155770587020073 0.155770587020073
+9754 6465 7502 0.156429247159158 0.156429247159158
+9755 7502 7503 0.187478248770476 0.187478248770476
+9756 7503 7504 0.202724737429487 0.202724737429487
+10985 7367 5402 0.104549154022735 0.104549154022735
+9757 7504 1429 0.207912295088567 0.207912295088567
+9758 1429 7189 0.130843883831593 0.130843883831593
+9760 6219 7505 0.274122910361615 0.274122910361615
+9761 7505 7506 0.19636903427064 0.19636903427064
+9763 2603 5189 0.177622776028071 0.177622776028071
+9764 5189 5657 0.106425186945832 0.106425186945832
+9766 7507 7508 0.0438255563694837 0.0438255563694837
+9767 7508 4058 0.0100861958439265 0.0100861958439265
+9768 4058 7509 0.0353348287032789 0.0353348287032789
+9769 7509 7510 0.141940367411715 0.141940367411715
+9770 7510 1860 0.1765997957518 0.1765997957518
+9771 1860 2604 0.182058234750596 0.182058234750596
+9773 7511 6071 0.194146348690461 0.194146348690461
+9774 6071 2551 0.201763197291639 0.201763197291639
+9776 7513 7514 0.138564330925234 0.138564330925234
+9778 7515 686 0.203088920175274 0.203088920175274
+9779 686 1983 0.159242254447937 0.159242254447937
+9780 1983 1968 0.0374282123082397 0.0374282123082397
+9781 1968 4621 0.107323343903913 0.107323343903913
+9782 4621 6500 0.103085986769995 0.103085986769995
+9783 6500 2474 0.199627678773596 0.199627678773596
+9785 7516 2773 0.203153140061273 0.203153140061273
+9786 2773 6896 0.203229996829736 0.203229996829736
+9788 5346 7517 0.175498987947166 0.175498987947166
+9789 7517 2340 0.175921748142843 0.175921748142843
+9790 2340 7518 0.175670305695009 0.175670305695009
+9791 7518 4783 0.243270382660677 0.243270382660677
+9792 4783 7519 0.239583168661009 0.239583168661009
+9793 7519 7520 0.0339478111046773 0.0339478111046773
+9794 7520 6369 0.269882786903903 0.269882786903903
+9795 6369 7521 0.132466649716692 0.132466649716692
+9797 7522 5952 0.201032381768493 0.201032381768493
+9798 5952 5144 0.0336716082597733 0.0336716082597733
+9799 5144 5156 0.0326057448432317 0.0326057448432317
+9800 5156 2239 0.132989211721542 0.132989211721542
+9801 2239 4912 0.203447012505169 0.203447012505169
+9802 4912 6610 0.203165550596053 0.203165550596053
+18325 7524 7525 0.0423335034846442 0.0423335034846442
+9804 7523 7526 0.205397811211562 0.205397811211562
+9806 2475 5910 0.203278121280476 0.203278121280476
+9807 5910 7527 0.201064010596531 0.201064010596531
+9808 7527 800 0.20177431388955 0.20177431388955
+9809 800 7528 0.202244021720306 0.202244021720306
+9811 7529 7530 0.20077292216439 0.20077292216439
+9813 3064 7531 0.184973544349351 0.184973544349351
+9815 2632 5362 0.0801274749327823 0.0801274749327823
+9816 5362 5209 0.120994383618796 0.120994383618796
+9817 5209 6229 0.174510675248847 0.174510675248847
+9819 7532 7533 0.202574921872807 0.202574921872807
+9820 7533 7534 0.206092993605617 0.206092993605617
+9821 7534 6444 0.205010086254005 0.205010086254005
+9822 6444 5302 0.199728470714505 0.199728470714505
+9824 6656 4061 0.176855547581016 0.176855547581016
+9825 4061 7535 0.242794235361762 0.242794235361762
+9827 7536 6086 0.100844609398613 0.100844609398613
+9828 6086 7537 0.100375721785614 0.100375721785614
+9829 7537 7538 0.0511607864629355 0.0511607864629355
+9830 7538 5244 0.0495951653375039 0.0495951653375039
+9831 5244 7539 0.0519761520574234 0.0519761520574234
+9832 7539 6885 0.0502414304638419 0.0502414304638419
+9833 6885 7540 0.0499615650233233 0.0499615650233233
+9835 7541 7542 0.0351445858107267 0.0351445858107267
+9838 7544 7545 0.105704455648811 0.105704455648811
+9841 2556 7547 0.195916474446361 0.195916474446361
+9842 6224 7548 0.277797708537317 0.277797708537317
+9845 7550 7551 0.196848690524097 0.196848690524097
+9846 7551 5751 0.202697238266629 0.202697238266629
+9847 5751 7552 0.00795047859513932 0.00795047859513932
+9848 7552 7553 0.129731824653906 0.129731824653906
+9849 7553 6474 0.0638707232076661 0.0638707232076661
+9850 6474 7554 0.0334363679568542 0.0334363679568542
+20015 10180 2696 0.367929886679579 0.367929886679579
+9851 7554 7555 0.0146999916602211 0.0146999916602211
+9853 3170 7557 0.145194224111084 0.145194224111084
+9854 7557 7558 0.0835128735178232 0.0835128735178232
+9855 7558 7559 0.0585562750239905 0.0585562750239905
+9856 7559 6713 0.00611903533894709 0.00611903533894709
+9857 6713 7560 0.146921779963022 0.146921779963022
+9858 7560 5786 0.142766734982168 0.142766734982168
+9859 5786 7561 0.147333855208616 0.147333855208616
+11082 6285 2717 0.0986458045481302 0.0986458045481302
+9860 7561 7562 0.151251680669446 0.151251680669446
+9861 7562 7563 0.142846459249546 0.142846459249546
+9863 7564 3303 0.147900845771263 0.147900845771263
+9865 5316 7565 0.0511409811054889 0.0511409811054889
+9866 7565 7566 0.1490174605609 0.1490174605609
+9867 7566 3661 0.0439544289403808 0.0439544289403808
+9868 3661 3171 0.198821466322938 0.198821466322938
+9870 1541 4266 0.201902575581856 0.201902575581856
+9871 4266 280 0.117279281695443 0.117279281695443
+9873 1540 755 0.148174446133403 0.148174446133403
+9874 755 7567 0.109511008516479 0.109511008516479
+9875 7568 7569 0.504435059432168 0.504435059432168
+9876 5172 5629 0.20005288591208 0.20005288591208
+9877 5629 2361 0.11286306962317 0.11286306962317
+9878 2361 4143 0.172420177163863 0.172420177163863
+9879 4143 4747 0.180602807146659 0.180602807146659
+9880 4747 6561 0.177131591078149 0.177131591078149
+9881 6561 7570 0.0829182513004679 0.0829182513004679
+9882 7570 7571 0.0849604902234264 0.0849604902234264
+9883 7571 7572 0.039332803551206 0.039332803551206
+9885 3557 7573 0.0207104909362794 0.0207104909362794
+9886 7573 5510 0.0781175186423301 0.0781175186423301
+9887 5510 2897 0.0422469044547541 0.0422469044547541
+9889 3682 7574 0.193399178760091 0.193399178760091
+9890 7574 7575 0.146546921459533 0.146546921459533
+9891 7575 5359 0.14787210152478 0.14787210152478
+9892 5359 2682 0.147887137976142 0.147887137976142
+9893 2682 7576 0.0606198046830208 0.0606198046830208
+9895 4620 7577 0.120158924963582 0.120158924963582
+9896 7577 6702 0.146317084486212 0.146317084486212
+9897 6702 7578 0.146734472806395 0.146734472806395
+9898 7578 7579 0.145050961623328 0.145050961623328
+9899 7579 7580 0.00770297520415462 0.00770297520415462
+9900 7580 7581 0.13912090851738 0.13912090851738
+9901 7581 7582 0.0411773493232422 0.0411773493232422
+9903 2466 5908 0.205955273119341 0.205955273119341
+9904 5908 7583 0.198595406640257 0.198595406640257
+9905 7583 793 0.198805543342419 0.198805543342419
+9906 793 7584 0.20315326209993 0.20315326209993
+9907 7584 4357 0.202186223769753 0.202186223769753
+9908 4357 7585 0.201775154423619 0.201775154423619
+9910 3060 7586 0.187004558668975 0.187004558668975
+9913 7588 906 0.27600804903505 0.27600804903505
+9914 906 7589 0.12928644320394 0.12928644320394
+9916 6671 7590 0.0565797137930955 0.0565797137930955
+9917 5136 5151 0.022597397933528 0.022597397933528
+9918 5151 4906 0.0926596414619678 0.0926596414619678
+9919 4906 6616 0.200362179375123 0.200362179375123
+9920 6616 7591 0.195770799250889 0.195770799250889
+9921 7591 7592 0.206820957598552 0.206820957598552
+9925 6556 7596 0.107470441058094 0.107470441058094
+9926 7596 7597 0.0323668981715237 0.0323668981715237
+9927 7597 7598 0.201852282407455 0.201852282407455
+9928 7598 7599 0.202247125760461 0.202247125760461
+9930 7600 4778 0.250803140264124 0.250803140264124
+9932 1647 159 0.135282147606574 0.135282147606574
+9933 159 1722 0.249462326524164 0.249462326524164
+9935 6872 7601 0.692595810332122 0.692595810332122
+9938 6136 7603 0.0512178060127243 0.0512178060127243
+9939 7603 4004 0.0522781951051087 0.0522781951051087
+9941 2233 5134 0.145435815612977 0.145435815612977
+9942 5134 5149 0.0255338309274142 0.0255338309274142
+9943 5149 4904 0.0300983323579011 0.0300983323579011
+9944 4904 6618 0.200495686198041 0.200495686198041
+9945 6618 7604 0.20246265981009 0.20246265981009
+9946 7604 7605 0.201805887092512 0.201805887092512
+9948 6554 7606 0.105208061763435 0.105208061763435
+9950 7607 7608 0.199144734139014 0.199144734139014
+9951 7608 7609 0.20258734096308 0.20258734096308
+9953 2463 5906 0.205561292129907 0.205561292129907
+9954 5906 7610 0.199734725303301 0.199734725303301
+9955 7610 791 0.198807553256576 0.198807553256576
+9956 791 7612 0.203565382214395 0.203565382214395
+9957 7612 4355 0.201053666601032 0.201053666601032
+9958 4355 7613 0.202489967264216 0.202489967264216
+9959 7613 3058 0.208369032173912 0.208369032173912
+9960 3058 7614 0.183994647182619 0.183994647182619
+9961 7614 7615 0.026448194348771 0.026448194348771
+9963 1697 7616 0.173745206459615 0.173745206459615
+9964 7616 7617 0.177904510236026 0.177904510236026
+9965 7617 7618 0.1681272184952 0.1681272184952
+9966 7618 4776 0.251475825917774 0.251475825917774
+9970 3746 7622 0.0932397806145687 0.0932397806145687
+9971 7622 4665 0.0961947321638159 0.0961947321638159
+9972 4665 1332 0.102043584181961 0.102043584181961
+9973 1332 1387 0.0976513845787387 0.0976513845787387
+9974 1387 7623 0.104092676384345 0.104092676384345
+9975 7623 6849 0.109393568832939 0.109393568832939
+9976 6849 4705 0.0983852710944781 0.0983852710944781
+9977 4705 7487 0.0961948643858329 0.0961948643858329
+9978 7487 7451 0.0969202901634112 0.0969202901634112
+9979 7451 5688 0.104320933330224 0.104320933330224
+9980 5688 6313 0.0969730195141145 0.0969730195141145
+9981 6313 4962 0.100610954866441 0.100610954866441
+9982 4962 6819 0.104277744196946 0.104277744196946
+9983 6819 762 0.165411660097114 0.165411660097114
+9984 762 786 0.134384238449809 0.134384238449809
+9985 786 6001 0.286482254105535 0.286482254105535
+9986 6001 5764 0.0815255628306487 0.0815255628306487
+11219 8167 8168 0.194203872480123 0.194203872480123
+9989 1491 149 0.200485771831907 0.200485771831907
+9990 149 1737 0.201708050623858 0.201708050623858
+9992 7313 5666 0.0386975210921627 0.0386975210921627
+9993 5666 522 0.0596630213761568 0.0596630213761568
+9994 522 4824 0.183721500047411 0.183721500047411
+9996 2254 7626 0.0984544191189144 0.0984544191189144
+9998 7627 7329 0.0447853238574392 0.0447853238574392
+9999 7329 2089 0.0938827847318007 0.0938827847318007
+10000 2089 2656 0.0939761287497805 0.0939761287497805
+10001 2656 4118 0.0946147674881846 0.0946147674881846
+10002 4118 6678 0.0843387660785722 0.0843387660785722
+10004 7628 7629 0.0982828610797249 0.0982828610797249
+10006 5220 5095 0.120687418213095 0.120687418213095
+10008 7630 6413 0.109655980715331 0.109655980715331
+10009 6413 4650 0.0986378512210248 0.0986378512210248
+10010 4650 7631 0.100237060358401 0.100237060358401
+10011 7631 3646 0.0896866361421679 0.0896866361421679
+10012 3646 4536 0.103452838278423 0.103452838278423
+10013 4536 7635 0.257545536230436 0.257545536230436
+10015 7636 7637 0.0362863399636557 0.0362863399636557
+10016 7637 383 0.0504266976907422 0.0504266976907422
+10017 383 4682 0.05031361216385 0.05031361216385
+10018 4682 295 0.0506583134955018 0.0506583134955018
+10019 295 4954 0.0497648033018035 0.0497648033018035
+10021 7222 7638 0.0496667318298412 0.0496667318298412
+10022 7638 7639 0.0515292350274089 0.0515292350274089
+10023 7639 7640 0.0459421846016502 0.0459421846016502
+10024 7640 6642 0.0415805639651593 0.0415805639651593
+10026 3954 7641 0.0608839417644586 0.0608839417644586
+10027 7641 5604 0.0589168683204242 0.0589168683204242
+18697 6400 5868 0.177478717288294 0.177478717288294
+10029 7642 3727 0.0543818576839699 0.0543818576839699
+10031 1239 4813 0.0888202681133088 0.0888202681133088
+10032 4813 2165 0.138535770033239 0.138535770033239
+10034 4003 7643 0.0510385957556285 0.0510385957556285
+10035 7643 7027 0.0529371470208169 0.0529371470208169
+10036 7027 7644 0.0521180983869426 0.0521180983869426
+10037 7644 7645 0.0537600930137936 0.0537600930137936
+10038 7645 7646 0.0510719245712091 0.0510719245712091
+10039 7646 7380 0.0524231241843369 0.0524231241843369
+10041 7647 3393 0.0461297697153075 0.0461297697153075
+10043 3394 7648 0.0445992136926928 0.0445992136926928
+10044 7648 5709 0.0478831918410465 0.0478831918410465
+10045 5709 7649 0.04548718787965 0.04548718787965
+10046 7649 7432 0.0484717768195407 0.0484717768195407
+10047 7432 7650 0.0437375947901795 0.0437375947901795
+10048 7650 7181 0.0470644094329018 0.0470644094329018
+10049 7181 7651 0.0469937345825467 0.0469937345825467
+10051 7652 7653 0.0459694430265719 0.0459694430265719
+10053 1099 7654 0.0453903142377476 0.0453903142377476
+10054 7654 7505 0.0471008131744324 0.0471008131744324
+10055 7505 7655 0.0439789031058606 0.0439789031058606
+10056 7655 3857 0.0492561227403211 0.0492561227403211
+10057 3857 7656 0.0443253739114241 0.0443253739114241
+10058 7656 5595 0.054031927582118 0.054031927582118
+10059 5595 7657 0.0531350620266369 0.0531350620266369
+10060 7657 7548 0.0548032505549166 0.0548032505549166
+10061 7548 7658 0.0961567115661112 0.0961567115661112
+10063 5169 6864 0.176934896372569 0.176934896372569
+10064 6864 3072 0.175748977102837 0.175748977102837
+10065 3072 7659 0.163990749862373 0.163990749862373
+10067 3292 100 0.415519355639239 0.415519355639239
+10069 5731 3291 0.149792492427265 0.149792492427265
+10071 1152 7660 0.199718823841446 0.199718823841446
+10074 6897 7663 0.241129252553979 0.241129252553979
+13575 2 9131 0.186044551751923 0.186044551751923
+10075 7663 7664 0.101783451026811 0.101783451026811
+10076 7664 7665 0.289306992458348 0.289306992458348
+10078 6814 7666 0.176577592408465 0.176577592408465
+12084 8539 8540 0.241661980997098 0.241661980997098
+10079 7666 2342 0.176188966635474 0.176188966635474
+10080 2342 7667 0.17458351857957 0.17458351857957
+10081 7667 4785 0.245723521469374 0.245723521469374
+10082 4785 7668 0.239480958817199 0.239480958817199
+10084 5159 7669 0.0600603744377636 0.0600603744377636
+10085 7669 5954 0.140826727437097 0.140826727437097
+10086 5954 2241 0.203480008894553 0.203480008894553
+10087 2241 4914 0.201437462212311 0.201437462212311
+10088 4914 6609 0.201231500080185 0.201231500080185
+10089 6609 7670 0.19693744890168 0.19693744890168
+11324 5142 5154 0.0222389853288599 0.0222389853288599
+16191 7205 5817 0.204256012568379 0.204256012568379
+10090 7670 7671 0.205535401167156 0.205535401167156
+10092 690 1979 0.162739101905996 0.162739101905996
+10093 1979 1964 0.0397992509913644 0.0397992509913644
+10094 1964 6501 0.211697424646872 0.211697424646872
+10095 6501 2478 0.193626535181341 0.193626535181341
+10096 2478 5912 0.20926896109112 0.20926896109112
+10097 5912 7672 0.199195490528656 0.199195490528656
+10098 7672 803 0.201999137953248 0.201999137953248
+10099 803 7673 0.202608278725201 0.202608278725201
+10100 7673 7674 0.205563081575912 0.205563081575912
+10101 7674 7675 0.203265447696938 0.203265447696938
+10102 7675 3066 0.200093208772811 0.200093208772811
+10103 3066 7676 0.18728661128175 0.18728661128175
+10105 7677 6370 0.270615231348292 0.270615231348292
+10106 6370 7678 0.131279919418432 0.131279919418432
+10108 6507 7679 0.113730821063582 0.113730821063582
+10109 7679 6937 0.113695193803527 0.113695193803527
+10111 759 6605 0.202732181741343 0.202732181741343
+10113 5167 7680 0.173408491477124 0.173408491477124
+10114 7680 2354 0.177734023432563 0.177734023432563
+11350 4801 4798 0.0316348130565604 0.0316348130565604
+10116 4156 4743 0.17475749351339 0.17475749351339
+10117 4743 6539 0.176484628682033 0.176484628682033
+10118 6539 7681 0.164515462701881 0.164515462701881
+10119 7681 1204 0.1695248683934 0.1695248683934
+10120 1204 7682 0.0218451192643306 0.0218451192643306
+10121 7682 3779 0.199697518421981 0.199697518421981
+10123 7683 953 0.176289634687175 0.176289634687175
+10124 953 7684 0.174800312403385 0.174800312403385
+10125 7684 4892 0.161444055531775 0.161444055531775
+10126 4892 7685 0.184678055138444 0.184678055138444
+10127 7685 5490 0.173583753319791 0.173583753319791
+10128 5490 3022 0.0680856463383254 0.0680856463383254
+18346 1684 7686 0.206269012853702 0.206269012853702
+10129 3022 608 0.0626103319165951 0.0626103319165951
+10130 608 7687 0.0714136208255542 0.0714136208255542
+10132 751 1571 0.141098847639908 0.141098847639908
+10133 1571 7688 0.136160171060933 0.136160171060933
+10134 7688 355 0.0540631216358879 0.0540631216358879
+11381 7 8238 0.233069627316498 0.233069627316498
+10136 3031 7689 0.212052347410258 0.212052347410258
+10139 5644 4349 0.138628444284297 0.138628444284297
+10140 4349 6347 0.140074045976997 0.140074045976997
+10143 7690 7691 0.036360966917709 0.036360966917709
+13576 9131 2186 0.0494030185182178 0.0494030185182178
+10144 7691 7692 0.019090691679145 0.019090691679145
+10145 7692 7629 0.138695116564921 0.138695116564921
+10146 7629 7693 0.131928656438508 0.131928656438508
+10148 7694 7695 0.805329256404935 0.805329256404935
+10149 6359 2392 0.110097282540218 0.110097282540218
+10150 2392 7696 0.139362539585628 0.139362539585628
+10152 7697 698 0.20136290155584 0.20136290155584
+10153 698 7698 0.201586501703314 0.201586501703314
+10155 7699 894 0.281945866493957 0.281945866493957
+10156 894 4477 0.138715715492195 0.138715715492195
+10157 4477 2802 0.13960527461951 0.13960527461951
+10158 2802 5268 0.12511734550188 0.12511734550188
+10161 4794 2158 0.120027593160305 0.120027593160305
+11430 319 412 0.178792036530689 0.178792036530689
+11459 224 8268 0.046644646559722 0.046644646559722
+10165 7703 1119 0.0497953640754775 0.0497953640754775
+10166 1119 7704 0.0511005498462644 0.0511005498462644
+10167 7704 7496 0.0499039643779027 0.0499039643779027
+10168 7496 7705 0.050496479725261 0.050496479725261
+10169 7705 3842 0.0493242373326315 0.0493242373326315
+10170 3842 7706 0.0511368055077475 0.0511368055077475
+10171 7706 5553 0.0516924374908146 0.0516924374908146
+10173 5552 7707 0.497797594406761 0.497797594406761
+10174 7708 6434 0.169523036166009 0.169523036166009
+10175 6434 4659 0.115447272077866 0.115447272077866
+10176 4659 7709 0.0610101187906253 0.0610101187906253
+10177 7709 1282 0.0565434694494923 0.0565434694494923
+10178 1282 4541 0.131357223988847 0.131357223988847
+10179 4541 7710 0.132140893738002 0.132140893738002
+10180 7710 7711 0.0696094980092003 0.0696094980092003
+10181 7711 7712 0.0619159407722012 0.0619159407722012
+10183 4024 7713 0.0484316979076645 0.0484316979076645
+10184 7713 5669 0.0520933568419111 0.0520933568419111
+10185 5669 7714 0.0498366654518003 0.0498366654518003
+10186 7714 7030 0.0492177257934086 0.0492177257934086
+19495 7469 10524 0.0198269485983196 0.0198269485983196
+10188 7715 7378 0.0506230529615687 0.0506230529615687
+10189 7378 1594 0.0506283698630863 0.0506283698630863
+10190 1594 3411 0.0491667634825631 0.0491667634825631
+10191 3411 7717 0.105657808428602 0.105657808428602
+10192 7717 7718 0.0940313147486449 0.0940313147486449
+10193 5546 7719 0.0535907784173066 0.0535907784173066
+10194 7719 7720 0.0530201286004126 0.0530201286004126
+10195 7720 573 0.0448716576991108 0.0448716576991108
+10196 573 4986 0.0479600812575622 0.0479600812575622
+10197 4986 7721 0.0515371092658245 0.0515371092658245
+10198 7721 7722 0.0482855644451139 0.0482855644451139
+10199 7722 7723 0.0490137565654263 0.0490137565654263
+10200 7723 7724 0.0538141529532141 0.0538141529532141
+10201 7724 7725 0.0529684395598169 0.0529684395598169
+10202 7725 7726 0.0518724854854175 0.0518724854854175
+10203 7726 7727 0.04727777135042 0.04727777135042
+10204 7727 3618 0.0472245509762166 0.0472245509762166
+10205 3618 7728 0.0514814686878799 0.0514814686878799
+10206 7728 7729 0.0518724978816832 0.0518724978816832
+10207 7729 7730 0.0486618474944759 0.0486618474944759
+10208 7730 5100 0.0498159875736575 0.0498159875736575
+10209 5100 7731 0.0971611599806991 0.0971611599806991
+10210 7731 7732 0.0537738540349519 0.0537738540349519
+10211 7732 7733 0.048775543246574 0.048775543246574
+10213 7734 1529 0.0486197396153865 0.0486197396153865
+10214 1529 6533 0.0236551874497837 0.0236551874497837
+10216 1748 5658 0.0690555262759062 0.0690555262759062
+10217 5658 6638 0.0663249571304488 0.0663249571304488
+10220 5429 5327 0.0495383987324496 0.0495383987324496
+10221 5327 7400 0.0488963197685218 0.0488963197685218
+10223 3485 7735 0.019269671719438 0.019269671719438
+10224 7735 6080 0.0527262897841316 0.0527262897841316
+10225 6080 7736 0.0518491308674393 0.0518491308674393
+10226 7736 3699 0.0473298672855462 0.0473298672855462
+10227 3699 4573 0.0991704429707509 0.0991704429707509
+10228 4573 7737 0.1025259519958 0.1025259519958
+10229 7737 7738 0.0567267064163172 0.0567267064163172
+10230 7738 6520 0.0485788201580239 0.0485788201580239
+11562 4026 8321 0.0489622731658017 0.0489622731658017
+10232 7739 6163 0.0483379374847878 0.0483379374847878
+10233 6163 7740 0.0487487301271992 0.0487487301271992
+10234 7740 2742 0.0481924761788732 0.0481924761788732
+10236 7741 5233 0.0485076742472366 0.0485076742472366
+10237 5233 7742 0.0501847785254714 0.0501847785254714
+10238 7742 3175 0.0518961094220257 0.0518961094220257
+10239 3175 7743 0.0477088260821206 0.0477088260821206
+10240 7743 5000 0.0480456206813873 0.0480456206813873
+10241 5000 7744 0.0507496702288809 0.0507496702288809
+10242 7744 732 0.0500052182058767 0.0500052182058767
+10243 732 7062 0.0993780460470829 0.0993780460470829
+10244 7062 568 0.179642317491375 0.179642317491375
+10245 568 6375 0.221062471524952 0.221062471524952
+10246 6375 7745 0.0502032533440095 0.0502032533440095
+10247 7745 4829 0.0496813089217868 0.0496813089217868
+10248 4829 7746 0.10134770204508 0.10134770204508
+10249 7746 7747 0.19682163321823 0.19682163321823
+10250 7747 7748 0.0148866727143693 0.0148866727143693
+10251 7748 1062 0.0938295581784946 0.0938295581784946
+10252 1062 1700 0.0910684866897701 0.0910684866897701
+10254 7749 7750 0.088136254722807 0.088136254722807
+10255 7750 7751 0.0102851011578735 0.0102851011578735
+10256 7751 6675 0.0807868256992296 0.0807868256992296
+10258 5566 7541 0.078830239472867 0.078830239472867
+10259 7541 7752 0.71007082854504 0.71007082854504
+10260 7753 7754 0.0555561071332203 0.0555561071332203
+10261 7754 6755 0.141035585683202 0.141035585683202
+10262 6755 3980 0.200595577576722 0.200595577576722
+10263 3980 7039 0.198840384599884 0.198840384599884
+10264 7039 3426 0.202741409948142 0.202741409948142
+10266 6623 1789 0.083407855110509 0.083407855110509
+10267 1789 7208 0.197984235440067 0.197984235440067
+10268 7208 5821 0.204810690510051 0.204810690510051
+10269 5821 7726 0.195060536702397 0.195060536702397
+10270 7726 7755 1.41312394826698 1.41312394826698
+10271 3161 7756 0.200885724863022 0.200885724863022
+10272 7756 3082 0.196495825635974 0.196495825635974
+10273 3082 3194 0.201063950220373 0.201063950220373
+10275 6110 1901 0.201670811128578 0.201670811128578
+10277 441 5814 0.0584483555155252 0.0584483555155252
+10278 5814 5376 0.210901593054405 0.210901593054405
+10282 2638 5211 0.135802363910714 0.135802363910714
+10284 5376 7115 0.169184130655589 0.169184130655589
+10286 6686 7758 0.0966310054355491 0.0966310054355491
+10287 7758 7759 0.103268100856542 0.103268100856542
+10289 7760 7761 0.0931830345887697 0.0931830345887697
+10290 7761 870 0.209204581827195 0.209204581827195
+10292 6165 6785 0.0415827902651337 0.0415827902651337
+10293 6785 7357 0.102001818508737 0.102001818508737
+10294 7357 5405 0.112234858942921 0.112234858942921
+10295 5405 3138 0.103097089620426 0.103097089620426
+10296 3138 7762 0.00572680722694595 0.00572680722694595
+10297 6991 6399 0.078057620939779 0.078057620939779
+10299 3614 2112 0.200468732564122 0.200468732564122
+10300 2112 7766 0.09707938317328 0.09707938317328
+10301 7766 7663 0.107055697326901 0.107055697326901
+10303 869 7100 0.0985676933380822 0.0985676933380822
+11668 7785 8358 0.00862504224759753 0.00862504224759753
+10305 2502 7767 0.133821378293258 0.133821378293258
+10306 7767 4793 0.137187308277769 0.137187308277769
+10307 4793 2155 0.138619015999951 0.138619015999951
+10308 2155 6302 0.131440648996103 0.131440648996103
+10309 6302 6427 0.0971164197766542 0.0971164197766542
+10310 6427 5345 0.100480546860285 0.100480546860285
+10311 5345 4641 0.0997483726431183 0.0997483726431183
+10312 4641 1266 0.0975658909823655 0.0975658909823655
+10313 1266 4540 0.103828265337942 0.103828265337942
+10314 4540 6286 0.102716645609349 0.102716645609349
+10315 6286 2720 0.0979601908800836 0.0979601908800836
+10317 2598 5187 0.177611938217315 0.177611938217315
+10318 5187 5655 0.104799417596727 0.104799417596727
+10319 5655 7768 0.00220165954800827 0.00220165954800827
+10321 7769 6068 0.194290902090962 0.194290902090962
+10322 6068 2548 0.201654782967819 0.201654782967819
+10323 2548 7770 0.410001897212591 0.410001897212591
+10324 6390 7771 0.13140278725488 0.13140278725488
+10325 7771 7772 0.135404012160521 0.135404012160521
+10326 7772 7773 0.135386059531021 0.135386059531021
+10327 7773 5541 0.102606539353157 0.102606539353157
+10328 5541 2410 0.100544408114452 0.100544408114452
+10329 2410 4294 0.100431298726032 0.100431298726032
+10330 4294 7776 0.0501127826077893 0.0501127826077893
+10331 7776 7777 0.0533516278326779 0.0533516278326779
+10332 7777 7778 0.0636719509277386 0.0636719509277386
+10333 7778 7702 0.142867174122929 0.142867174122929
+10334 7702 2984 0.198167346423749 0.198167346423749
+10336 7779 1879 0.0577899859499687 0.0577899859499687
+10337 1879 7780 0.0975763172911078 0.0975763172911078
+10338 7780 7781 0.049615978114649 0.049615978114649
+10339 7781 7782 0.151461070035101 0.151461070035101
+10340 7782 7783 0.00828406172358757 0.00828406172358757
+10341 7783 7784 0.0408643643931965 0.0408643643931965
+10342 7784 7785 0.155195634964959 0.155195634964959
+10343 7785 6879 0.203175602967298 0.203175602967298
+10344 6879 1690 0.204417069906845 0.204417069906845
+10345 1690 7786 0.203521868851454 0.203521868851454
+10346 7786 2437 0.163479024443522 0.163479024443522
+10347 2437 2436 0.0381118302971424 0.0381118302971424
+10348 2436 5735 0.132411428624817 0.132411428624817
+10349 5735 7787 0.0686968769014223 0.0686968769014223
+10350 7787 5524 0.0876693797427073 0.0876693797427073
+10352 6462 6461 0.046218455398192 0.046218455398192
+10353 6461 7788 0.114101346725552 0.114101346725552
+10354 7788 7789 0.186352786707342 0.186352786707342
+10355 7789 7790 0.201819126377908 0.201819126377908
+10356 7790 1426 0.209991688515331 0.209991688515331
+10357 1426 7188 0.131433687737374 0.131433687737374
+10361 7791 7792 0.0221530824058495 0.0221530824058495
+10362 7792 1857 0.178051972210932 0.178051972210932
+10363 1857 2599 0.180197954723075 0.180197954723075
+10365 7793 7794 0.133052671328159 0.133052671328159
+10366 7794 7795 0.00451480555637825 0.00451480555637825
+10368 7796 316 0.0810108111113459 0.0810108111113459
+10369 316 7797 0.0132929754360195 0.0132929754360195
+10371 7798 1715 0.146657336243231 0.146657336243231
+10373 4991 5886 0.0409007612541298 0.0409007612541298
+10374 5886 7799 0.0133509392362763 0.0133509392362763
+10375 7799 6955 0.0302227835880131 0.0302227835880131
+10376 6955 120 0.355050454211798 0.355050454211798
+10378 6998 7800 0.287485052767515 0.287485052767515
+10379 7800 2107 0.0799880901292185 0.0799880901292185
+10381 7801 7330 0.0459693673262965 0.0459693673262965
+10382 7330 2069 0.0513405380116942 0.0513405380116942
+10383 2069 2090 0.0410799126461524 0.0410799126461524
+10384 2090 2665 0.0609107459124439 0.0609107459124439
+10385 2665 2657 0.0344762888596363 0.0344762888596363
+10386 2657 4120 0.0653569613260274 0.0653569613260274
+10387 4120 4119 0.025633469399215 0.025633469399215
+10388 4119 6679 0.0800230712461371 0.0800230712461371
+10389 6679 7803 0.0968450624184265 0.0968450624184265
+10390 7803 7693 0.101842612257672 0.101842612257672
+10392 4983 7804 0.15108225604362 0.15108225604362
+10393 7804 7805 0.125613899900368 0.125613899900368
+10394 7805 7806 0.243703765368195 0.243703765368195
+10395 6511 833 0.205796808568101 0.205796808568101
+10396 833 1752 0.10962713348726 0.10962713348726
+10399 7807 6997 0.603696470077293 0.603696470077293
+10401 6510 7620 0.115341473380206 0.115341473380206
+10403 1004 4224 0.0542745916357659 0.0542745916357659
+10405 7568 7808 0.0520701135747565 0.0520701135747565
+10406 7808 7085 0.0476697019408349 0.0476697019408349
+10407 7085 7087 0.0498741800030606 0.0498741800030606
+10410 7411 5866 0.177233832171644 0.177233832171644
+10411 5866 1317 0.177356465730534 0.177356465730534
+10412 1317 1373 0.176201016352257 0.176201016352257
+20226 10713 10016 0.0211937599266337 0.0211937599266337
+10413 1373 7809 0.0646527574308656 0.0646527574308656
+10414 7809 6841 0.0827327683846137 0.0827327683846137
+18362 7802 7116 0.00767249278335644 0.00767249278335644
+18363 7116 7802 0.00767249278335644 0.00767249278335644
+10416 7810 7811 0.101331501186014 0.101331501186014
+10417 7811 7812 0.10060881119881 0.10060881119881
+10418 7812 7813 0.20266387330204 0.20266387330204
+10419 7813 6245 0.198305641519059 0.198305641519059
+10420 6245 7814 0.197228200241648 0.197228200241648
+10422 1492 181 0.220815542326235 0.220815542326235
+10423 181 1709 0.205644626708499 0.205644626708499
+10424 1709 7815 0.201521495468828 0.201521495468828
+10425 7815 1576 0.244181862134779 0.244181862134779
+11867 8450 529 0.00567706315765741 0.00567706315765741
+10426 1576 7816 0.227813240625087 0.227813240625087
+10428 6320 7817 0.183577601350202 0.183577601350202
+10430 7213 7818 0.101757750903819 0.101757750903819
+10433 962 6868 0.198984557339899 0.198984557339899
+10434 6868 5277 0.0940706344008526 0.0940706344008526
+10435 5277 3079 0.10232261403939 0.10232261403939
+10437 7204 5816 0.204032094058756 0.204032094058756
+10438 5816 7722 0.196359705603447 0.196359705603447
+10439 7722 7819 1.20817529596719 1.20817529596719
+10440 4246 1785 0.204162289925295 0.204162289925295
+10441 1785 7820 0.0718319226119568 0.0718319226119568
+10442 6026 3876 0.103447229282558 0.103447229282558
+10443 3876 7821 0.100516631601798 0.100516631601798
+10444 7322 2073 0.0916901418746821 0.0916901418746821
+10445 2073 2670 0.0954589635577965 0.0954589635577965
+10446 2670 4140 0.0958506641044589 0.0958506641044589
+10447 4140 6687 0.0883798780131798 0.0883798780131798
+10448 6687 7822 0.0995993099363261 0.0995993099363261
+10449 7822 7696 0.0932435604543702 0.0932435604543702
+10450 7696 3474 0.0968263022183935 0.0968263022183935
+10451 3474 7823 0.0468407500328621 0.0468407500328621
+10452 5171 3743 0.0993415474645253 0.0993415474645253
+10454 5856 4668 0.0981986239232037 0.0981986239232037
+10455 4668 1294 0.100268721006653 0.100268721006653
+10456 1294 1367 0.0977359423737142 0.0977359423737142
+10457 1367 3189 0.105552448113217 0.105552448113217
+10458 3189 6851 0.101177318178783 0.101177318178783
+10459 6851 4702 0.101416251034793 0.101416251034793
+10460 4702 7468 0.0970718218675625 0.0970718218675625
+10461 7468 1895 0.103477998735846 0.103477998735846
+10462 1895 7824 0.0967350574153813 0.0967350574153813
+10463 7824 7233 0.101338813079015 0.101338813079015
+10464 7233 3243 0.207470752756408 0.207470752756408
+10465 3243 7282 0.19399363779074 0.19399363779074
+10466 7282 7825 0.149563284680896 0.149563284680896
+10468 2141 7826 0.157978675104427 0.157978675104427
+10469 7826 7827 0.306989543465552 0.306989543465552
+10470 7827 7828 0.364212228682904 0.364212228682904
+16042 9797 9804 0.0714393127860209 0.0714393127860209
+10475 7658 7549 0.158167365995463 0.158167365995463
+10477 5846 7750 0.200199460183562 0.200199460183562
+10479 466 7198 0.196816395654282 0.196816395654282
+10481 7268 7830 0.172430116159174 0.172430116159174
+10483 7217 7831 0.199372618146519 0.199372618146519
+10485 6256 7832 0.202992310919435 0.202992310919435
+10487 7833 4331 0.102741254079324 0.102741254079324
+10488 4331 7834 0.0526098265130649 0.0526098265130649
+10489 7834 5037 0.0501135526518646 0.0501135526518646
+10490 5037 7835 0.0494507564303858 0.0494507564303858
+10491 7835 7836 0.0506565934234891 0.0506565934234891
+10492 7836 7837 0.0500464479643974 0.0500464479643974
+10493 7837 2894 0.0524402316173641 0.0524402316173641
+10494 2894 7838 0.107557027285785 0.107557027285785
+10495 7838 7839 0.103734242634521 0.103734242634521
+10496 7839 4733 0.104796091296626 0.104796091296626
+10498 6800 7352 0.103066456507469 0.103066456507469
+10499 7352 5398 0.104939276238433 0.104939276238433
+10500 5398 7840 0.054043807018549 0.054043807018549
+10501 7840 7841 0.0495084984704332 0.0495084984704332
+10502 7841 3900 0.109926182600774 0.109926182600774
+10503 3900 1036 0.101980966587827 0.101980966587827
+10505 7842 6275 0.0499604206116259 0.0499604206116259
+10506 6275 7843 0.109041406945306 0.109041406945306
+10508 7844 7845 0.0640842858387461 0.0640842858387461
+10509 7845 1756 0.058813700126345 0.058813700126345
+10510 1756 4796 0.0566305502204531 0.0566305502204531
+10511 4796 2162 0.113835660361901 0.113835660361901
+10512 2162 7846 0.116364205137553 0.116364205137553
+10514 6135 4027 0.149896567221218 0.149896567221218
+10515 4027 7032 0.200991141471739 0.200991141471739
+10516 7032 3412 0.200534935685617 0.200534935685617
+10517 3412 7633 0.0497828282990497 0.0497828282990497
+10518 7633 5698 0.0497412906945155 0.0497412906945155
+10519 5698 7847 0.050919685731899 0.050919685731899
+10521 7425 7166 0.104570214872527 0.104570214872527
+10522 7166 7848 0.0473158420873474 0.0473158420873474
+10523 7848 7780 0.0502827033263459 0.0502827033263459
+10524 7780 1123 0.100516868229367 0.100516868229367
+10525 1123 7849 0.0509916038841254 0.0509916038841254
+10526 7849 7497 0.0507179555279218 0.0507179555279218
+10527 7497 7850 0.0492496392928742 0.0492496392928742
+10528 7850 3843 0.0492532755342339 0.0492532755342339
+10529 3843 7851 0.0511792577413519 0.0511792577413519
+10530 7851 5556 0.0504327266312592 0.0504327266312592
+10561 7757 6414 0.14886592682355 0.14886592682355
+10531 5556 7852 0.789293029376444 0.789293029376444
+10532 1618 7136 0.164980324326418 0.164980324326418
+10534 2027 5535 0.0854267701089729 0.0854267701089729
+10535 5535 6450 0.110522246345964 0.110522246345964
+10536 6450 6468 0.0325389081934527 0.0325389081934527
+10537 6468 7853 0.124455504811187 0.124455504811187
+10538 7853 7854 0.192779349126015 0.192779349126015
+10540 3713 7855 0.105701897268654 0.105701897268654
+10543 2614 7857 0.0507605301255621 0.0507605301255621
+10544 7857 5197 0.124727455067454 0.124727455067454
+10545 5197 6238 0.172240941584424 0.172240941584424
+10546 6238 7637 0.187669509666877 0.187669509666877
+10547 7637 7858 0.175500793784226 0.175500793784226
+10548 7858 7859 0.174943439798306 0.174943439798306
+10551 5368 7126 0.152826634682226 0.152826634682226
+10552 7126 614 0.179980225267387 0.179980225267387
+10553 614 7860 0.174053494498076 0.174053494498076
+10554 7860 7861 0.175067683150656 0.175067683150656
+10556 3960 5600 0.12071802041193 0.12071802041193
+10558 6724 4799 0.0913013732116182 0.0913013732116182
+10559 4799 2180 0.0880940650188129 0.0880940650188129
+10560 2180 7757 0.0839974084607818 0.0839974084607818
+10562 6414 4645 0.149015796662155 0.149015796662155
+10563 4645 1271 0.151238114292438 0.151238114292438
+10564 1271 4535 0.201873592117884 0.201873592117884
+10565 4535 7863 0.199199232202906 0.199199232202906
+10567 7864 6740 0.106132792016662 0.106132792016662
+10568 6740 2257 0.103696160263475 0.103696160263475
+10569 2257 6132 0.104845212424081 0.104845212424081
+10570 6132 4000 0.104492371103569 0.104492371103569
+10571 4000 7049 0.105765984719426 0.105765984719426
+10572 7049 1395 0.105619552065538 0.105619552065538
+10573 1395 7865 0.0532676910827188 0.0532676910827188
+12077 2695 8043 0.149120560873017 0.149120560873017
+10574 7865 7382 0.0513518590570076 0.0513518590570076
+10576 7866 3392 0.0498722666723731 0.0498722666723731
+10578 2360 5226 0.147034135602084 0.147034135602084
+10579 5226 5088 0.140218763176125 0.140218763176125
+10580 5088 2812 0.112317158065107 0.112317158065107
+10581 2812 7855 0.0589853238635922 0.0589853238635922
+10582 7855 4676 0.102566908777836 0.102566908777836
+10583 4676 4948 0.0965475772401715 0.0965475772401715
+10584 4948 7867 0.0515742481536382 0.0515742481536382
+10585 7867 7219 0.0513689618533378 0.0513689618533378
+10586 7219 7868 0.0507197202929207 0.0507197202929207
+10587 7868 5673 0.0490781046009859 0.0490781046009859
+10588 5673 7869 0.0456643057832586 0.0456643057832586
+10591 7792 7870 0.049146171652799 0.049146171652799
+10592 7870 1108 0.0521568671722949 0.0521568671722949
+10593 1108 5770 0.0506160748755952 0.0506160748755952
+10594 5770 7510 0.0513174323114612 0.0513174323114612
+10595 7510 7871 0.0508676871173128 0.0508676871173128
+10596 7871 3865 0.0498216783929082 0.0498216783929082
+10598 3866 7535 0.105586605139886 0.105586605139886
+10599 7535 7872 0.748786770151958 0.748786770151958
+10603 741 1561 0.140274508504629 0.140274508504629
+10604 1561 7876 0.139940443617856 0.139940443617856
+10605 7876 7877 0.121382404560649 0.121382404560649
+10607 3572 5640 0.141095915979936 0.141095915979936
+10608 5640 4345 0.139634312621283 0.139634312621283
+10609 4345 6343 0.13679021957376 0.13679021957376
+10610 6343 3046 0.13698802953883 0.13698802953883
+10611 3046 7878 0.138953332142948 0.138953332142948
+10612 7878 7879 0.00536944182123181 0.00536944182123181
+10613 7879 7880 0.11582084881522 0.11582084881522
+10615 7881 7882 0.0939943673024045 0.0939943673024045
+10617 4885 7883 0.18871104587798 0.18871104587798
+10618 7883 5483 0.174801190512252 0.174801190512252
+10619 5483 7884 0.200940942998637 0.200940942998637
+10620 7884 7885 0.0780811261571653 0.0780811261571653
+10621 7885 3341 0.00930901113126469 0.00930901113126469
+10624 1192 7887 0.0222318154701858 0.0222318154701858
+10625 7887 3786 0.199739451308706 0.199739451308706
+10627 7888 5967 0.106945706764055 0.106945706764055
+10628 5967 7889 0.0517538867982505 0.0517538867982505
+10629 7889 3011 0.055433069584998 0.055433069584998
+10630 3011 7890 0.0504905501442438 0.0504905501442438
+10631 7890 4389 0.0518336432467722 0.0518336432467722
+10632 4389 7891 0.106909075712535 0.106909075712535
+10633 7891 7892 0.0447272763477039 0.0447272763477039
+10634 7892 7893 0.0604871538278066 0.0604871538278066
+10635 7893 7894 0.0527248029948841 0.0527248029948841
+10636 7894 7895 0.0510420835040534 0.0510420835040534
+10637 7895 7896 0.0538542282588573 0.0538542282588573
+10638 7896 7897 0.0528352422268061 0.0528352422268061
+10640 7898 7899 0.0483963113823249 0.0483963113823249
+10641 7899 7900 0.00514045868709644 0.00514045868709644
+10642 7900 6183 0.105068526303449 0.105068526303449
+10643 6183 7563 0.106218150970674 0.106218150970674
+10646 7902 7903 0.144865462765669 0.144865462765669
+10647 7903 7904 0.00237466940700901 0.00237466940700901
+10648 7904 6985 0.0721296292058115 0.0721296292058115
+10649 6985 4820 0.0719786596117478 0.0719786596117478
+10650 4820 7905 0.147529402397198 0.147529402397198
+10651 7905 7906 0.144081069806214 0.144081069806214
+10653 3189 1870 0.209495964340019 0.209495964340019
+10654 1870 7907 0.0977397792259224 0.0977397792259224
+10655 7907 4184 0.106328113718199 0.106328113718199
+10656 4184 7908 0.403661295666813 0.403661295666813
+10657 7908 4837 0.108683081676812 0.108683081676812
+10659 7909 7910 0.270199990406442 0.270199990406442
+10660 7911 810 0.0673953106393502 0.0673953106393502
+10661 810 7912 0.0687323400006804 0.0687323400006804
+10662 7912 7913 0.136720833756656 0.136720833756656
+10666 2255 5858 0.174722136683236 0.174722136683236
+10667 5858 1305 0.178402656879188 0.178402656879188
+10668 1305 7915 0.248888691440438 0.248888691440438
+12170 8573 8574 0.0987973765101899 0.0987973765101899
+10670 6847 7916 0.0984178968171368 0.0984178968171368
+10671 7916 7485 0.0976761282305841 0.0976761282305841
+10673 7454 5692 0.103533596199028 0.103533596199028
+10674 5692 7917 0.101331500328489 0.101331500328489
+10675 7917 4966 0.0998668108920524 0.0998668108920524
+10676 4966 7918 0.102812100555259 0.102812100555259
+10677 7918 7919 0.0983963905872725 0.0983963905872725
+10678 7919 7920 0.0991546561543948 0.0991546561543948
+10679 7920 7921 0.0991411977449166 0.0991411977449166
+10680 7921 7922 0.106421383510006 0.106421383510006
+10682 7923 7924 0.106391305814005 0.106391305814005
+10684 7925 629 0.0646550267727614 0.0646550267727614
+10685 629 7926 0.00919464810452742 0.00919464810452742
+10686 7927 7928 0.0412650483746168 0.0412650483746168
+10687 7928 7929 0.155361420508855 0.155361420508855
+10688 7929 6922 0.0195376725753923 0.0195376725753923
+10689 6922 6736 0.174720460074468 0.174720460074468
+10691 7930 7931 0.0129516773904198 0.0129516773904198
+10692 7931 1511 0.391618540945239 0.391618540945239
+10693 1511 7932 0.0409032080648905 0.0409032080648905
+10694 7932 3280 0.112386881702983 0.112386881702983
+10696 4635 6586 0.185505221951206 0.185505221951206
+10698 6668 787 0.109054104365323 0.109054104365323
+10699 787 6002 0.243058044096108 0.243058044096108
+10702 7934 1008 1.1041513689359 1.1041513689359
+10704 4497 7935 0.109080059964542 0.109080059964542
+10705 7935 7936 0.375437621590472 0.375437621590472
+10706 7936 7937 0.0440200903162904 0.0440200903162904
+10708 3966 3963 0.0923048136404676 0.0923048136404676
+10710 6243 7938 0.0544857736456965 0.0544857736456965
+10711 7938 7571 0.0517149905092859 0.0517149905092859
+10712 7571 7939 0.0378829783952266 0.0378829783952266
+10714 7940 5872 0.0757028634173436 0.0757028634173436
+10715 5872 1324 0.177578299705823 0.177578299705823
+10716 1324 1380 0.1760884455939 0.1760884455939
+10717 1380 7941 0.0581557503278793 0.0581557503278793
+10718 7941 6844 0.0845562612846107 0.0845562612846107
+10719 6844 4696 0.11746862405599 0.11746862405599
+10720 4696 7452 0.157863437357233 0.157863437357233
+10722 5690 5337 0.242972143995655 0.242972143995655
+10724 7942 7943 0.14470003055266 0.14470003055266
+10725 7943 1056 0.118222446008981 0.118222446008981
+10726 1056 7944 0.0800381081986229 0.0800381081986229
+10727 7944 6249 0.201854530416454 0.201854530416454
+10728 6249 7945 0.201602089629263 0.201602089629263
+10729 7945 1497 0.20081804408168 0.20081804408168
+10730 1497 186 0.202686112287629 0.202686112287629
+10731 186 7798 0.0846089584800808 0.0846089584800808
+10732 7798 1714 0.126110593452085 0.126110593452085
+10734 7946 1580 0.141640668503246 0.141640668503246
+10735 1580 7947 0.292520501534348 0.292520501534348
+10736 7948 2142 0.372172819192242 0.372172819192242
+10738 7949 7950 0.022809009376778 0.022809009376778
+10739 7950 2916 0.200611278039498 0.200611278039498
+10741 2915 7951 0.200419085698686 0.200419085698686
+10743 7952 7953 0.0110105423016681 0.0110105423016681
+10745 7954 7631 0.201162741792968 0.201162741792968
+16610 5355 7889 0.146740030035641 0.146740030035641
+10746 7631 7955 0.197131063915064 0.197131063915064
+10748 7956 6942 0.115194637181012 0.115194637181012
+12305 8628 8641 0.0276795827309073 0.0276795827309073
+10750 4939 4687 0.409424899618544 0.409424899618544
+10751 4687 7959 0.501489716289273 0.501489716289273
+10752 7959 7960 0.103838798829226 0.103838798829226
+10753 7960 5096 0.0880537297967434 0.0880537297967434
+10754 5096 7961 0.0549628705336601 0.0549628705336601
+10756 7962 7963 0.129400960231747 0.129400960231747
+10757 7963 7964 0.0109989745271633 0.0109989745271633
+10758 7964 7093 0.177295071329975 0.177295071329975
+10759 7093 7965 0.0553949557893182 0.0553949557893182
+10760 7965 3937 0.0117544286846151 0.0117544286846151
+10761 3937 7966 0.0655333417817751 0.0655333417817751
+10762 7966 7967 0.00514903654400709 0.00514903654400709
+10763 7967 7968 0.0154207763703831 0.0154207763703831
+10764 7968 7969 0.120137734300265 0.120137734300265
+10765 7969 7970 0.0235045509998941 0.0235045509998941
+10766 7970 4938 0.199335986652222 0.199335986652222
+10768 6788 4721 0.150986476371322 0.150986476371322
+10769 4721 667 0.112227110724083 0.112227110724083
+10770 667 5130 0.0364809731603039 0.0364809731603039
+10771 5130 7141 0.148468037583607 0.148468037583607
+10772 7141 7973 0.0653535267620459 0.0653535267620459
+10773 7973 2883 0.0864280151657955 0.0864280151657955
+10774 2883 4607 0.164926871665991 0.164926871665991
+10775 4607 5044 0.166914948534143 0.166914948534143
+10776 5044 6491 0.0452504465788914 0.0452504465788914
+10777 6491 7974 0.124696259323388 0.124696259323388
+10778 7974 3674 0.0837503652675649 0.0837503652675649
+10780 7975 7976 0.0210158411356976 0.0210158411356976
+10781 7976 2348 0.132347730703915 0.132347730703915
+10782 2348 4153 0.174709468744017 0.174709468744017
+10783 4153 4740 0.173977137035244 0.173977137035244
+10784 4740 6535 0.176711434597363 0.176711434597363
+10785 6535 7977 0.164237503877208 0.164237503877208
+10787 7978 692 0.202230219594829 0.202230219594829
+10788 692 7979 0.202124611474851 0.202124611474851
+10790 7980 1194 0.168544434179807 0.168544434179807
+10791 1194 7981 0.0214611132807924 0.0214611132807924
+10793 1195 7982 0.0213718360054606 0.0213718360054606
+10794 7982 3783 0.200590566648469 0.200590566648469
+10795 3783 7983 0.155575717720948 0.155575717720948
+10797 947 7986 0.165669448326255 0.165669448326255
+10798 7986 4887 0.171543568824384 0.171543568824384
+10800 104 7987 0.0531910934067007 0.0531910934067007
+10801 7987 7283 0.14149347529597 0.14149347529597
+10803 4249 1782 0.204738067086155 0.204738067086155
+10804 1782 7202 0.196638037803866 0.196638037803866
+10805 7202 5813 0.202462167506831 0.202462167506831
+10806 5813 7720 0.198881694965003 0.198881694965003
+10831 5664 5936 0.10457956834692 0.10457956834692
+10807 7720 7988 2.41654683926542 2.41654683926542
+10808 3557 815 0.15408456375045 0.15408456375045
+10809 815 7836 0.141625491803193 0.141625491803193
+10810 7836 7989 0.137956171688053 0.137956171688053
+10811 7989 7990 0.133814544271225 0.133814544271225
+10812 7990 7991 0.00435891657982006 0.00435891657982006
+10813 7991 7992 0.00504883599617259 0.00504883599617259
+10814 7992 3667 0.218697319390466 0.218697319390466
+10818 4607 7994 0.175458215250442 0.175458215250442
+10819 7994 7995 0.17352002006779 0.17352002006779
+10820 7995 664 0.00413178605963205 0.00413178605963205
+10821 664 7998 0.00436495014442939 0.00436495014442939
+10822 7998 7999 0.17836184127639 0.17836184127639
+10824 6329 4163 0.106458655644295 0.106458655644295
+10825 4163 4772 0.262069785544738 0.262069785544738
+10826 4772 6551 0.176006441608747 0.176006441608747
+10827 6551 8001 0.169733521019883 0.169733521019883
+10828 8001 8002 0.186888519126424 0.186888519126424
+10829 8002 3800 0.199472684499289 0.199472684499289
+10830 3800 5664 0.0496163554354094 0.0496163554354094
+10832 5936 934 0.175672791884477 0.175672791884477
+10833 934 5818 0.103656977616086 0.103656977616086
+10834 5818 2219 0.0798383163598858 0.0798383163598858
+10835 2219 4869 0.163069738486709 0.163069738486709
+10836 4869 8003 0.190225091069506 0.190225091069506
+10837 8003 5468 0.173414227417019 0.173414227417019
+10838 5468 6220 0.124444185392524 0.124444185392524
+10841 5175 8005 0.198062000656316 0.198062000656316
+10844 8006 681 0.244474486801046 0.244474486801046
+10845 681 3340 0.0902358208620103 0.0902358208620103
+10847 7885 682 0.0896800723137281 0.0896800723137281
+10848 682 580 0.244861214317874 0.244861214317874
+10850 5334 6321 0.121951239816061 0.121951239816061
+10851 6321 8007 0.186507250461399 0.186507250461399
+10852 8007 8008 0.042606728375189 0.042606728375189
+10853 8008 8009 0.0463471911266823 0.0463471911266823
+10854 8009 8010 0.0102891732268637 0.0102891732268637
+10855 8010 8011 0.0998884840922572 0.0998884840922572
+10856 8011 8012 0.201197445523876 0.201197445523876
+10857 8012 6246 0.199805617134822 0.199805617134822
+10858 6246 8013 0.200864024373594 0.200864024373594
+10859 8013 2310 0.103900456751802 0.103900456751802
+10860 2310 1494 0.0983991417332815 0.0983991417332815
+10861 1494 183 0.203419998804159 0.203419998804159
+10862 183 1711 0.201968707186781 0.201968707186781
+16611 7889 9327 0.146157951939095 0.146157951939095
+10863 1711 8014 0.204806773712675 0.204806773712675
+10864 8014 6157 0.126319530562447 0.126319530562447
+10865 6157 1577 0.0829958932471693 0.0829958932471693
+10867 7968 8016 0.0140119714836204 0.0140119714836204
+10869 2294 1531 0.46192746891159 0.46192746891159
+10871 8017 1203 0.169906498983342 0.169906498983342
+10872 1203 8018 0.0221945337202718 0.0221945337202718
+10873 8018 3780 0.199572680726093 0.199572680726093
+10874 3780 8019 0.153206883868779 0.153206883868779
+10875 8019 952 0.177861736820837 0.177861736820837
+10876 952 8020 0.175149595226483 0.175149595226483
+10877 8020 4891 0.159178167143814 0.159178167143814
+10878 4891 8021 0.18577336394487 0.18577336394487
+10879 8021 5489 0.173842148316324 0.173842148316324
+10880 5489 8022 0.202303315910377 0.202303315910377
+10882 5166 8023 0.173986701720281 0.173986701720281
+10883 8023 2353 0.177612171175383 0.177612171175383
+10884 2353 4155 0.173655528353614 0.173655528353614
+10885 4155 4742 0.173355871166643 0.173355871166643
+10886 4742 6537 0.176328961502794 0.176328961502794
+10887 6537 8024 0.165303556900913 0.165303556900913
+10889 3030 3025 0.111248274146309 0.111248274146309
+10891 8025 8026 0.0640627296443105 0.0640627296443105
+10893 3576 5643 0.138707185733922 0.138707185733922
+10894 5643 4348 0.139896948951005 0.139896948951005
+10895 4348 6346 0.137784232527167 0.137784232527167
+10897 8027 697 0.20001854589906 0.20001854589906
+10898 697 8028 0.202096920971429 0.202096920971429
+10900 8029 2876 0.123948984730939 0.123948984730939
+10901 2876 7628 0.141637704476922 0.141637704476922
+10902 7628 7803 0.129093895003183 0.129093895003183
+10903 7803 8030 0.203887723487366 0.203887723487366
+10904 750 1568 0.143385969503008 0.143385969503008
+10905 1568 356 0.136646760403047 0.136646760403047
+10907 3449 6863 0.17900718937772 0.17900718937772
+10908 6863 3068 0.174598273817653 0.174598273817653
+10909 3068 8031 0.0302783785251902 0.0302783785251902
+10910 8031 3188 0.14422007961407 0.14422007961407
+10912 3499 8032 0.199010937916898 0.199010937916898
+10913 8032 8033 0.200333001057217 0.200333001057217
+10915 5667 598 0.0644126037668526 0.0644126037668526
+10916 598 58 0.177763601732474 0.177763601732474
+10919 5970 8036 0.0505810885650185 0.0505810885650185
+10920 8036 3015 0.0580577132309736 0.0580577132309736
+10921 3015 8037 0.0464238660315039 0.0464238660315039
+10922 8037 4384 0.0544799142925035 0.0544799142925035
+10923 4384 8038 0.0538947325800234 0.0538947325800234
+10924 8038 8039 0.0466438161180549 0.0466438161180549
+10925 8039 8040 0.00584498801301113 0.00584498801301113
+10926 8040 8041 0.0523763426314988 0.0523763426314988
+10927 8041 8042 0.0530979313391782 0.0530979313391782
+10928 8042 8043 0.107654120371494 0.107654120371494
+10929 8043 8044 0.0544759880197041 0.0544759880197041
+10930 8044 8045 0.0487657640583263 0.0487657640583263
+10931 8045 8046 0.0550233762997563 0.0550233762997563
+10932 8046 8047 0.0497918467778446 0.0497918467778446
+10933 8047 8048 0.0560301584180681 0.0560301584180681
+10934 8048 6177 0.0498105660603093 0.0498105660603093
+10937 8049 8050 0.0514663482815545 0.0514663482815545
+10939 5597 7545 0.109426166768049 0.109426166768049
+10940 7545 8051 0.69043474044403 0.69043474044403
+10943 4956 7224 0.100934524697699 0.100934524697699
+10944 7224 8052 0.0514703494422073 0.0514703494422073
+10945 8052 8053 0.0516967622411713 0.0516967622411713
+10946 8053 8054 0.0428181869535947 0.0428181869535947
+10947 8054 6644 0.0437760044869343 0.0437760044869343
+10948 6644 251 0.0675496864417695 0.0675496864417695
+10949 251 3950 0.064659952202738 0.064659952202738
+10950 3950 8056 0.0623263752149148 0.0623263752149148
+10951 8056 5609 0.0582215030638228 0.0582215030638228
+10952 5609 8057 0.0511983070002347 0.0511983070002347
+10953 8057 3730 0.0552226014136858 0.0552226014136858
+10954 3730 8058 0.106434809873425 0.106434809873425
+10956 5917 8060 0.0615467128621124 0.0615467128621124
+10957 8060 8061 0.0595626505884908 0.0595626505884908
+10958 8061 8062 0.120093210467761 0.120093210467761
+10960 8063 4634 0.154652934390646 0.154652934390646
+10961 4634 4549 0.20934037971115 0.20934037971115
+10962 4549 8064 0.293727880710195 0.293727880710195
+10966 5216 3396 0.0579299126969349 0.0579299126969349
+10967 3396 8065 0.0454362838279539 0.0454362838279539
+10968 8065 5710 0.0481473121637486 0.0481473121637486
+10969 5710 8066 0.0449725321072065 0.0449725321072065
+10970 8066 7433 0.0497100835030792 0.0497100835030792
+10971 7433 8069 0.0438793771122388 0.0438793771122388
+10972 8069 7182 0.0471375837035957 0.0471375837035957
+20567 10854 10857 0.225655121951984 0.225655121951984
+10973 7182 8070 0.0452974861696144 0.0452974861696144
+10974 8070 8071 0.0479228077199932 0.0479228077199932
+10975 8071 8072 0.0470353472529161 0.0470353472529161
+10976 8072 1097 0.0443841816938638 0.0443841816938638
+10978 8073 5318 0.014674630653103 0.014674630653103
+10979 5318 2905 0.0312080465120251 0.0312080465120251
+10980 2905 7145 0.104770590384922 0.104770590384922
+10981 7145 5123 0.105925863098076 0.105925863098076
+10982 5123 4737 0.104660211196924 0.104660211196924
+10983 4737 6783 0.106266768581811 0.106266768581811
+10984 6783 7367 0.10603565613408 0.10603565613408
+12610 8772 8773 0.0502119000696978 0.0502119000696978
+10987 3133 3905 0.108335751010408 0.108335751010408
+10988 3905 1043 0.106035430930181 0.106035430930181
+10989 1043 8074 0.0531930855223622 0.0531930855223622
+10990 8074 6278 0.0525006902367685 0.0525006902367685
+10991 6278 8075 0.105351603899057 0.105351603899057
+10992 8075 5007 0.100650315286722 0.100650315286722
+10993 5007 8076 0.0416106781167173 0.0416106781167173
+10995 8025 7689 0.0805451553909581 0.0805451553909581
+10996 7689 4508 0.0814563900003029 0.0814563900003029
+10997 4508 3466 0.0836603655346893 0.0836603655346893
+10998 3466 6023 0.0805527124085535 0.0805527124085535
+10999 6023 3872 0.0834734840918988 0.0834734840918988
+11000 3872 8080 0.0833038712417768 0.0833038712417768
+11002 3967 8081 0.0785869791186196 0.0785869791186196
+11004 6348 3039 0.0931730621198353 0.0931730621198353
+11005 3039 8080 0.190356710856614 0.190356710856614
+11006 8080 8082 0.0884015044030203 0.0884015044030203
+11008 6424 4647 0.0970252568524678 0.0970252568524678
+11009 4647 8083 0.151040975226462 0.151040975226462
+16204 9846 7728 0.404619504399153 0.404619504399153
+11010 4970 8084 0.141573509395187 0.141573509395187
+11012 6398 7450 0.0587460292912133 0.0587460292912133
+11013 7450 5682 0.0978645396723703 0.0978645396723703
+11014 5682 8085 0.19215729634673 0.19215729634673
+11015 8085 6825 0.00461462117405417 0.00461462117405417
+11016 6825 549 0.386380234242036 0.386380234242036
+11017 549 6259 0.219376470776871 0.219376470776871
+11018 6259 8086 0.305359073933419 0.305359073933419
+11019 8086 1485 0.202208842336051 0.202208842336051
+11023 8088 8089 0.0138986527527033 0.0138986527527033
+11024 8089 8090 0.00683010177656819 0.00683010177656819
+11025 8090 8091 0.110435202693889 0.110435202693889
+11026 7961 8092 0.198854876063874 0.198854876063874
+11028 5855 1340 0.201837936768745 0.201837936768745
+11029 1340 8094 0.205566060887405 0.205566060887405
+11030 8094 4699 0.204173926089909 0.204173926089909
+11031 4699 8095 0.200461574437924 0.200461574437924
+11032 8095 8096 0.201918867294297 0.201918867294297
+11033 8096 6823 0.198988761465987 0.198988761465987
+11034 6823 772 0.204865532850049 0.204865532850049
+11036 6007 6252 0.210749028817316 0.210749028817316
+11037 6252 8097 0.20159640654511 0.20159640654511
+11039 6091 8098 0.0302498178580294 0.0302498178580294
+11040 8098 8099 0.0194131905433523 0.0194131905433523
+11041 8099 6924 0.166900367789548 0.166900367789548
+11042 6924 8100 0.161859559583179 0.161859559583179
+11043 8100 1241 0.0380629815604356 0.0380629815604356
+11045 6980 7942 0.133638145181839 0.133638145181839
+11046 7942 5338 0.0765467348148991 0.0765467348148991
+11048 5442 7919 0.212135491175046 0.212135491175046
+11049 7919 4410 0.19312496970157 0.19312496970157
+11050 4410 8103 0.226886968788061 0.226886968788061
+11051 8103 4283 0.17035467585884 0.17035467585884
+11053 8104 7854 0.0946426330892721 0.0946426330892721
+11054 7854 8105 0.0433309511619061 0.0433309511619061
+11055 8106 6776 0.129541839197132 0.129541839197132
+11056 6776 6152 0.13334664352248 0.13334664352248
+11057 6152 3997 0.133550546612879 0.133550546612879
+11058 3997 7046 0.134234793318191 0.134234793318191
+11059 7046 7376 0.132775137258175 0.132775137258175
+11060 7376 3435 0.135417405491425 0.135417405491425
+11063 7764 5715 0.0517371191288579 0.0517371191288579
+11064 5715 8107 0.0482057757930101 0.0482057757930101
+11065 8107 7435 0.0500858095958938 0.0500858095958938
+11066 7435 8108 0.0493949795014098 0.0493949795014098
+11067 8108 7174 0.049625706970036 0.049625706970036
+11068 7174 6739 0.0493949818685724 0.0493949818685724
+11069 6739 7789 0.0481559013551591 0.0481559013551591
+11070 7789 6645 0.0506327285203027 0.0506327285203027
+11071 6645 1136 0.0491201558695857 0.0491201558695857
+11072 1136 6995 0.0494363433732341 0.0494363433732341
+11073 6995 7503 0.049590164320003 0.049590164320003
+11074 7503 8109 0.100703299932673 0.100703299932673
+11075 8109 7480 0.0534769030186113 0.0534769030186113
+11076 7480 5580 0.0516905707687601 0.0516905707687601
+11077 5580 8110 0.0497706020063474 0.0497706020063474
+11078 8110 8111 0.0487450776836639 0.0487450776836639
+11079 8111 8112 0.694365013204936 0.694365013204936
+11080 1262 4539 0.0997555409236608 0.0997555409236608
+11081 4539 6285 0.098678051142926 0.098678051142926
+11083 2717 8113 0.100251109237605 0.100251109237605
+11085 8114 8115 0.096187670432143 0.096187670432143
+11086 8115 5626 0.201348891867615 0.201348891867615
+11088 2507 8116 0.0493483893872719 0.0493483893872719
+11089 8116 1238 0.100702597753866 0.100702597753866
+11090 1238 4792 0.032813432065695 0.032813432065695
+11091 4792 4812 0.0677278405661894 0.0677278405661894
+11092 4812 2152 0.0672921980026174 0.0672921980026174
+11093 2152 2179 0.0344341477791983 0.0344341477791983
+11094 2179 6304 0.100339028034619 0.100339028034619
+11095 6304 6426 0.101616906343387 0.101616906343387
+11096 6426 5344 0.101029409154815 0.101029409154815
+11097 5344 4640 0.0949596649493475 0.0949596649493475
+11098 4640 1261 0.0990622828589398 0.0990622828589398
+11100 3674 8117 0.125664760723522 0.125664760723522
+11101 8117 8118 0.0959168081132613 0.0959168081132613
+11102 8118 8119 0.126940211454871 0.126940211454871
+11103 8119 8120 0.01117909521949 0.01117909521949
+11104 8120 2680 0.0506435066002237 0.0506435066002237
+11105 2680 7576 0.0851117723335375 0.0851117723335375
+11106 7576 7833 0.0050110745435388 0.0050110745435388
+16206 5823 7210 0.206033080289906 0.206033080289906
+11107 7833 8121 0.0770500763169566 0.0770500763169566
+11108 8121 8035 0.0465513466723509 0.0465513466723509
+11110 807 8122 0.0835494437055617 0.0835494437055617
+11111 8122 8123 0.0673397864842803 0.0673397864842803
+11112 8123 3017 0.0101257363562013 0.0101257363562013
+11114 8124 8125 0.0101518907891953 0.0101518907891953
+11115 8125 2367 0.124673068713839 0.124673068713839
+11116 2367 8126 0.113318754907998 0.113318754907998
+11117 8126 1826 0.2011636326138 0.2011636326138
+11119 8127 8128 0.150025905824831 0.150025905824831
+11121 2887 8129 0.081938792894379 0.081938792894379
+11122 8129 8130 0.106964546123147 0.106964546123147
+11123 8130 4728 0.104978647949955 0.104978647949955
+11124 4728 6795 0.108689532522494 0.108689532522494
+11125 6795 7347 0.102216150252819 0.102216150252819
+11126 7347 5393 0.105889579896167 0.105889579896167
+11127 5393 8131 0.054562518485416 0.054562518485416
+11128 8131 8132 0.0481675689920574 0.0481675689920574
+11129 8132 3895 0.109975096473535 0.109975096473535
+11130 3895 1027 0.10512607647723 0.10512607647723
+11131 1027 8133 0.0540856357592879 0.0540856357592879
+12777 8831 8832 0.188959131880304 0.188959131880304
+11133 6270 8134 0.0524343047299347 0.0524343047299347
+11134 8134 8135 0.0535628703960502 0.0535628703960502
+11136 8136 8137 0.085310565822113 0.085310565822113
+11137 8137 6283 0.0924164471878071 0.0924164471878071
+11138 6283 8138 0.0880043396162394 0.0880043396162394
+11139 8138 8139 0.093883258506383 0.093883258506383
+11140 8139 3142 0.0916816056478044 0.0916816056478044
+11141 3142 5416 0.0909467644852468 0.0909467644852468
+11142 5416 8140 0.0909305385237858 0.0909305385237858
+11144 3154 4972 0.0951253779669951 0.0951253779669951
+11145 4972 8141 0.159341748119657 0.159341748119657
+11147 8142 7088 0.0975513520982515 0.0975513520982515
+11148 7088 971 0.0957796137604222 0.0957796137604222
+11149 971 7402 0.0550171923708008 0.0550171923708008
+11150 7402 5289 0.0484207753056408 0.0484207753056408
+11152 3320 8143 0.077853024278325 0.077853024278325
+11153 8143 5756 0.0805728425443714 0.0805728425443714
+11154 5756 7328 0.0873058149168626 0.0873058149168626
+11155 7328 2087 0.0932446680916279 0.0932446680916279
+12803 4082 3763 0.178907695562899 0.178907695562899
+11158 4115 4117 0.0440125760632801 0.0440125760632801
+11159 4117 6504 0.0374084190760855 0.0374084190760855
+11160 6504 6677 0.044394894025319 0.044394894025319
+11161 6677 8029 0.0937961823239111 0.0937961823239111
+11162 8029 8144 0.0511329046048641 0.0511329046048641
+11163 8144 8145 0.0135266374241744 0.0135266374241744
+11165 4223 1001 0.0531658581374023 0.0531658581374023
+11167 4374 2855 0.170827518580558 0.170827518580558
+11169 8146 4313 0.17183605887504 0.17183605887504
+11171 5444 7921 0.207916650376417 0.207916650376417
+11172 7921 4408 0.197533961318481 0.197533961318481
+11174 8147 644 0.13870723980062 0.13870723980062
+11175 644 7273 0.132830481063153 0.132830481063153
+11176 7273 1992 0.0923486278054484 0.0923486278054484
+11177 1992 1976 0.0346172149199892 0.0346172149199892
+11178 1976 4591 0.135026001443702 0.135026001443702
+11179 4591 6478 0.132622992610531 0.132622992610531
+12836 8855 8856 0.0453127355156614 0.0453127355156614
+11180 6478 2462 0.14279254357733 0.14279254357733
+11182 8148 8149 0.201096301426274 0.201096301426274
+11183 8149 8150 0.201154462707023 0.201154462707023
+11185 2461 5905 0.204782750962282 0.204782750962282
+11186 5905 8151 0.200573430726899 0.200573430726899
+11187 8151 790 0.199941729347635 0.199941729347635
+11188 790 3583 0.202642621733606 0.202642621733606
+11189 3583 4354 0.202475015345548 0.202475015345548
+11190 4354 8152 0.200309115545572 0.200309115545572
+11191 8152 3057 0.206933046688651 0.206933046688651
+11192 3057 8153 0.186611026973769 0.186611026973769
+11194 1060 8154 0.173008298211734 0.173008298211734
+11195 8154 8155 0.177900871903465 0.177900871903465
+11196 8155 8156 0.167407375878646 0.167407375878646
+11197 8156 4775 0.251673348312152 0.251673348312152
+11198 4775 6553 0.132857734263153 0.132857734263153
+11199 6553 8157 0.106438324963657 0.106438324963657
+11201 2232 5133 0.19052148019247 0.19052148019247
+11202 5133 4902 0.0151263568070176 0.0151263568070176
+11203 4902 6619 0.197484990473566 0.197484990473566
+11205 8158 8159 0.20585122765193 0.20585122765193
+11207 8160 8161 0.016887203978 0.016887203978
+11221 106 61 0.00533283632570931 0.00533283632570931
+11222 61 65 0.207145778882675 0.207145778882675
+11224 103 8170 0.0169041191858478 0.0169041191858478
+11225 8170 8171 0.361108877807587 0.361108877807587
+11226 8171 8172 0.190446564346409 0.190446564346409
+11228 8173 8174 0.0754029121625499 0.0754029121625499
+11229 8174 8175 0.417052793540933 0.417052793540933
+11231 8176 8177 0.0299391686417842 0.0299391686417842
+11232 8177 8178 0.202215537578589 0.202215537578589
+11233 8178 8179 0.11808571362223 0.11808571362223
+11234 8179 8163 0.126818785158071 0.126818785158071
+11236 4228 8181 0.209470643186114 0.209470643186114
+11269 4227 8200 0.197818013323833 0.197818013323833
+11237 8181 65 0.190124873120192 0.190124873120192
+11238 65 8172 0.00592368117466438 0.00592368117466438
+11239 8172 8178 0.446545243407564 0.446545243407564
+12886 8876 655 0.00596005420121878 0.00596005420121878
+11242 8183 8184 0.228538005170478 0.228538005170478
+11245 8162 8186 0.154667884886688 0.154667884886688
+11246 8186 8187 0.175562487769928 0.175562487769928
+11249 3633 8188 0.0150923041998694 0.0150923041998694
+11250 8188 8189 0.270579217097142 0.270579217097142
+11251 8189 8176 0.0989590805052705 0.0989590805052705
+11253 8163 3643 0.149826975112258 0.149826975112258
+11255 8190 1804 0.201671276037755 0.201671276037755
+11257 8191 8192 0.0154162495075233 0.0154162495075233
+11258 8192 8193 0.181517364616001 0.181517364616001
+11259 8193 8194 0.180264399151985 0.180264399151985
+11261 8181 3550 0.192378625445026 0.192378625445026
+11264 8186 8197 0.16597516800592 0.16597516800592
+11265 8197 8198 0.19583924016197 0.19583924016197
+11267 8199 8197 0.123986592502342 0.123986592502342
+11271 8194 8171 0.202821007714315 0.202821007714315
+11272 8171 8195 0.195495736534207 0.195495736534207
+11273 8195 8201 0.207035429354564 0.207035429354564
+11275 8202 8174 0.0167300114490718 0.0167300114490718
+11277 8198 8167 0.130702597640292 0.130702597640292
+11278 8167 8203 0.122618976220882 0.122618976220882
+11279 8203 8204 0.327046093817032 0.327046093817032
+11280 4228 4229 0.198835732908948 0.198835732908948
+11281 4229 8205 0.301334691508365 0.301334691508365
+11282 8206 8190 0.113799565910968 0.113799565910968
+11284 8201 4227 0.0154895076655846 0.0154895076655846
+11286 8207 8200 0.0930040479254132 0.0930040479254132
+11288 8193 8184 0.208283527691618 0.208283527691618
+11316 5155 2238 0.0837223321108041 0.0837223321108041
+11289 8184 8189 0.18616179415052 0.18616179415052
+11291 3257 8208 0.321455747501831 0.321455747501831
+11293 443 8209 0.110751336507506 0.110751336507506
+11294 392 8179 0.178734728363983 0.178734728363983
+11296 8162 6291 0.216060929512084 0.216060929512084
+11297 6291 7342 0.196043159951137 0.196043159951137
+11645 8348 6433 0.104796073662296 0.104796073662296
+11299 7342 5274 0.233799434282417 0.233799434282417
+11300 61 3550 0.201334976523304 0.201334976523304
+11301 3550 4229 0.200151526253302 0.200151526253302
+11303 5279 3162 0.0990447395902117 0.0990447395902117
+11304 3162 4979 0.101293558978732 0.101293558978732
+11305 4979 8126 0.0993695918525221 0.0993695918525221
+11306 8126 4335 0.0910331896522206 0.0910331896522206
+11307 4335 8210 0.0476841899874069 0.0476841899874069
+11308 8210 5040 0.0521232799197054 0.0521232799197054
+11309 5040 8005 0.0976580173278249 0.0976580173278249
+11310 8005 4307 0.0466427658725356 0.0466427658725356
+11311 4307 995 0.052631404385892 0.052631404385892
+11313 8211 5951 0.199050744316133 0.199050744316133
+11314 5951 5143 0.0913688712241713 0.0913688712241713
+11315 5143 5155 0.025420878561629 0.025420878561629
+11317 2238 4911 0.203010994943857 0.203010994943857
+11318 4911 6611 0.201886473833407 0.201886473833407
+11319 6611 8212 0.197101479655197 0.197101479655197
+11320 8212 8213 0.206955997470903 0.206955997470903
+11323 5950 5142 0.147533492116586 0.147533492116586
+11326 2237 4910 0.20422309503448 0.20422309503448
+11327 4910 6612 0.200274596012582 0.200274596012582
+11328 6612 8215 0.196974435405611 0.196974435405611
+11329 8215 8216 0.208072957327714 0.208072957327714
+11331 7959 8217 0.0106613346433968 0.0106613346433968
+11337 289 8219 0.0101386145536838 0.0101386145536838
+11338 8219 4483 0.0263974796072716 0.0263974796072716
+11340 8220 289 0.116841869555958 0.116841869555958
+11483 8221 8222 0.0466544327533727 0.0466544327533727
+11342 8223 7906 0.0355112223964134 0.0355112223964134
+11343 7906 4187 0.0959478466054884 0.0959478466054884
+11344 4187 8224 0.108554994700497 0.108554994700497
+11345 8224 2512 0.0267513344361619 0.0267513344361619
+11346 2512 6726 0.134329958691173 0.134329958691173
+11347 6726 8226 0.0541066682112551 0.0541066682112551
+11348 8226 1754 0.0582360854290831 0.0582360854290831
+11352 8227 8228 0.0477813036978224 0.0477813036978224
+11353 8228 2164 0.0100092856224142 0.0100092856224142
+11354 2164 8229 0.117341992338054 0.117341992338054
+11355 8229 6417 0.132790064578642 0.132790064578642
+11356 6417 6925 0.066680142142332 0.066680142142332
+11357 6925 4623 0.0658013116163711 0.0658013116163711
+11358 4623 1242 0.132924383309181 0.132924383309181
+11359 1242 8230 0.117419950970456 0.117419950970456
+11360 8230 2709 0.0877593926636965 0.0877593926636965
+11361 2709 2723 0.0586886121966142 0.0586886121966142
+11362 2723 8231 0.126334352112189 0.126334352112189
+11363 8231 8232 0.00800071585537006 0.00800071585537006
+11364 8232 8233 0.00985605768408299 0.00985605768408299
+11368 8223 8219 0.0801446034429079 0.0801446034429079
+11374 8234 8235 0.161648892640997 0.161648892640997
+11375 8235 8236 0.12616333160407 0.12616333160407
+11379 4843 910 0.143586236704503 0.143586236704503
+16194 9844 7725 1.4119245996206 1.4119245996206
+11388 2064 8243 0.0180732464676321 0.0180732464676321
+11389 8243 8244 0.307196973753055 0.307196973753055
+11392 8246 3316 0.0456634204130967 0.0456634204130967
+11394 6201 6945 0.172713645832468 0.172713645832468
+11395 6945 8138 0.203649557134895 0.203649557134895
+11396 8138 2880 0.164233861501064 0.164233861501064
+11398 6200 6944 0.169916988893137 0.169916988893137
+11399 6944 8139 0.203898136987997 0.203898136987997
+11400 8139 2879 0.160611633174386 0.160611633174386
+11401 2879 6408 0.0322091251783491 0.0322091251783491
+11402 6408 6412 0.266159968303504 0.266159968303504
+11403 6412 8247 0.0505479778201866 0.0505479778201866
+11407 6190 6948 0.200111149085838 0.200111149085838
+11408 6948 8142 0.198760931377031 0.198760931377031
+11409 8142 2864 0.201908008890848 0.201908008890848
+11412 8249 8067 0.737441419701283 0.737441419701283
+11424 8079 8250 0.738983904805809 0.738983904805809
+11431 412 415 0.636538521199656 0.636538521199656
+18912 10390 10391 0.0580503615423655 0.0580503615423655
+11453 8262 8263 0.292162593230546 0.292162593230546
+11468 781 8271 0.782578824666181 0.782578824666181
+11597 8330 8331 0.0435245851176098 0.0435245851176098
+11469 8272 8270 0.782084992370784 0.782084992370784
+11471 1610 1244 0.0543175525667992 0.0543175525667992
+11472 1244 8273 0.0533400242428221 0.0533400242428221
+11473 8273 8274 0.0526029519682926 0.0526029519682926
+11474 8274 8275 0.0534350213865012 0.0534350213865012
+11476 8276 1610 0.0663295545530221 0.0663295545530221
+11478 1610 8277 0.135789656985465 0.135789656985465
+11480 7861 8278 0.0143942343868779 0.0143942343868779
+11481 8278 7581 0.0343415060903181 0.0343415060903181
+11482 7581 8221 0.0532138886249367 0.0532138886249367
+11484 8222 5964 0.00591714471910066 0.00591714471910066
+11485 5964 8279 0.00703516905841087 0.00703516905841087
+11486 8279 3001 0.0966235655424771 0.0966235655424771
+11488 8275 7561 0.103690392766705 0.103690392766705
+11489 7561 8280 0.0558620890554655 0.0558620890554655
+11490 8280 6185 0.0505017539528047 0.0505017539528047
+11493 8282 8283 0.101387037651418 0.101387037651418
+11494 8283 8284 0.102270654549379 0.102270654549379
+11495 8284 8285 0.10797805598011 0.10797805598011
+11496 8285 8286 0.106400672091098 0.106400672091098
+11497 8286 4392 0.102247824152268 0.102247824152268
+11498 4392 8287 0.0166274126542335 0.0166274126542335
+11499 8287 8288 0.0799445865529155 0.0799445865529155
+11500 8288 3008 0.023689428581565 0.023689428581565
+11501 3008 8289 0.0297886059757376 0.0297886059757376
+11505 8290 8291 0.051999610902965 0.051999610902965
+11506 8291 8292 0.0471972516257623 0.0471972516257623
+11507 8292 8293 0.00657484491051097 0.00657484491051097
+11508 8293 6184 0.103933630763566 0.103933630763566
+11509 6184 7562 0.106067817024884 0.106067817024884
+11510 7562 8294 0.105991654619724 0.105991654619724
+11512 8295 8296 0.0523765388441753 0.0523765388441753
+11522 8297 8298 0.429589849820924 0.429589849820924
+11537 6093 8302 0.0171793049902436 0.0171793049902436
+11539 8303 8304 0.00530856583912826 0.00530856583912826
+11541 2195 8305 0.128463648918522 0.128463648918522
+11543 8306 8307 0.0111673306658244 0.0111673306658244
+11545 8308 8306 0.0470759818626725 0.0470759818626725
+11547 8309 8310 0.0336302381688336 0.0336302381688336
+11549 8311 8312 0.0219555493879181 0.0219555493879181
+11550 8312 8313 0.036241706253738 0.036241706253738
+11598 8331 7782 0.0493369824555625 0.0493369824555625
+11551 8313 8314 0.0512913124797426 0.0512913124797426
+11552 8314 8315 0.107868186928524 0.107868186928524
+11553 8315 8316 0.223470506469832 0.223470506469832
+11554 8316 8317 0.211788929267968 0.211788929267968
+11555 8317 6963 0.0143636308232266 0.0143636308232266
+16197 7207 1788 0.198027086450295 0.198027086450295
+11556 6963 2151 0.0672032541987901 0.0672032541987901
+11557 2151 8318 0.127422890827039 0.127422890827039
+11563 8321 5670 0.0510922996821663 0.0510922996821663
+11564 5670 8319 0.0512128921942442 0.0512128921942442
+11565 8319 7031 0.0489988317743493 0.0489988317743493
+13192 2925 5307 0.0991225747078309 0.0991225747078309
+17794 8402 10178 0.0874671474005437 0.0874671474005437
+11583 8323 8324 0.0415122975666244 0.0415122975666244
+11585 8325 8326 0.0105737020216599 0.0105737020216599
+11586 8326 8327 0.0170186899048993 0.0170186899048993
+11587 8327 4030 0.059373245074661 0.059373245074661
+11588 4030 8328 0.00887102858910589 0.00887102858910589
+11589 8328 7033 0.192077028988682 0.192077028988682
+11590 7033 3414 0.20009224997208 0.20009224997208
+11591 3414 7634 0.0490496792565584 0.0490496792565584
+11592 7634 5699 0.0501609282125079 0.0501609282125079
+11593 5699 8329 0.0491062363102631 0.0491062363102631
+11594 8329 7426 0.0512345906571307 0.0512345906571307
+11595 7426 7167 0.100906650593457 0.100906650593457
+11596 7167 8330 0.0074706340310152 0.0074706340310152
+11601 1125 8333 0.0515421912286004 0.0515421912286004
+11602 8333 7499 0.0491232128122514 0.0491232128122514
+11603 7499 6382 0.0528674106807856 0.0528674106807856
+11604 6382 3844 0.0491757077428548 0.0491757077428548
+11605 3844 8336 0.0505763419832581 0.0505763419832581
+11606 8336 5560 0.0511234189065501 0.0511234189065501
+11607 5560 7536 0.078259792036463 0.078259792036463
+17795 10178 10179 0.00714983889336217 0.00714983889336217
+11608 7536 8337 0.710353127144862 0.710353127144862
+11615 8339 8340 0.0545607270452329 0.0545607270452329
+11616 8340 6778 0.0500886204125654 0.0500886204125654
+11617 6778 1543 0.044749974690185 0.044749974690185
+11618 1543 7913 0.0484257128218018 0.0484257128218018
+11619 7913 1232 0.0498960080732329 0.0498960080732329
+11620 1232 6138 0.0513577550981739 0.0513577550981739
+11621 6138 1234 0.0484184731965446 0.0484184731965446
+11622 1234 4025 0.049897443897038 0.049897443897038
+11624 8341 6746 0.131938356933677 0.131938356933677
+11625 6746 6146 0.134278510793599 0.134278510793599
+11626 6146 4020 0.131808341418281 0.131808341418281
+11627 4020 7024 0.13680573147125 0.13680573147125
+11628 7024 7394 0.133543322276702 0.133543322276702
+11629 7394 3403 0.129241253411212 0.129241253411212
+11631 4656 1278 0.11609492718799 0.11609492718799
+11633 4529 8342 0.13081541679387 0.13081541679387
+11634 8342 8343 0.131875462531589 0.131875462531589
+11636 1275 4561 0.135792686790169 0.135792686790169
+11637 4561 8344 0.129597362082905 0.129597362082905
+11638 8344 8345 0.132615292246902 0.132615292246902
+11654 8351 8352 0.00642310935412446 0.00642310935412446
+11656 8354 3585 0.00948998635035479 0.00948998635035479
+11658 8355 7036 0.189514043057238 0.189514043057238
+11661 3420 7662 0.0473953664812579 0.0473953664812579
+11662 7662 5701 0.051310070537927 0.051310070537927
+11663 5701 8356 0.0493288418218244 0.0493288418218244
+11664 8356 7428 0.0514646959507586 0.0514646959507586
+11665 7428 7170 0.101185693406291 0.101185693406291
+11666 7170 8357 0.0511732963069457 0.0511732963069457
+11667 8357 7785 0.0488740378204359 0.0488740378204359
+11669 8358 8359 0.0429199500385996 0.0429199500385996
+11670 8359 1126 0.0542934514543922 0.0542934514543922
+11671 1126 8361 0.0465752610792189 0.0465752610792189
+11672 8361 7500 0.0458657856618734 0.0458657856618734
+11673 7500 6383 0.0540969092476656 0.0540969092476656
+11674 6383 3845 0.0488658545954006 0.0488658545954006
+11675 3845 8362 0.0512974137325796 0.0512974137325796
+11676 8362 5562 0.0492074321979192 0.0492074321979192
+11677 5562 8363 0.0405073414501016 0.0405073414501016
+11678 8363 7537 0.0387636388049137 0.0387636388049137
+11679 7537 8364 0.709659016245144 0.709659016245144
+11680 533 532 0.177767664549368 0.177767664549368
+11681 532 8365 0.019932032746647 0.019932032746647
+11683 8366 2195 0.0764354088651933 0.0764354088651933
+11712 3383 8367 0.106809468593159 0.106809468593159
+11713 8367 8368 0.0971987897456675 0.0971987897456675
+11714 8368 8369 0.0991386674985246 0.0991386674985246
+11717 5295 6973 0.135215470337054 0.135215470337054
+11718 6973 8371 0.00923487504976077 0.00923487504976077
+11719 8371 8372 0.0216052571390285 0.0216052571390285
+11720 8372 16 0.105179593848414 0.105179593848414
+11721 16 6385 0.131720726068438 0.131720726068438
+11722 6385 8373 0.136425162652677 0.136425162652677
+11723 8373 8374 0.133357418298716 0.133357418298716
+11725 8375 5538 0.102551146645578 0.102551146645578
+11726 5538 2406 0.101276420369131 0.101276420369131
+11727 2406 4291 0.0994536245434588 0.0994536245434588
+11728 4291 8376 0.0498495835403536 0.0498495835403536
+11729 8376 8377 0.0555205772000376 0.0555205772000376
+11730 8377 7717 0.202770146499174 0.202770146499174
+11731 7717 2980 0.203558742671124 0.203558742671124
+11733 6381 7626 0.0677965571067337 0.0677965571067337
+11734 7626 8378 0.0657902652889389 0.0657902652889389
+11736 3813 8379 0.0683672879873519 0.0683672879873519
+11737 8379 7491 0.0530440410997852 0.0530440410997852
+11738 7491 3832 0.0868122883126915 0.0868122883126915
+11740 8129 8380 0.134532326319759 0.134532326319759
+11741 8380 8382 0.00458704251135175 0.00458704251135175
+11743 8383 8384 0.136207849444979 0.136207849444979
+11744 8384 7838 0.138328826392976 0.138328826392976
+11746 8385 8386 0.0871147692827014 0.0871147692827014
+11749 8389 8390 0.0947169874364547 0.0947169874364547
+19614 10514 10587 0.0689139357560502 0.0689139357560502
+11751 8391 4386 0.0534420102551264 0.0534420102551264
+11752 4386 8392 0.0520924012173649 0.0520924012173649
+11753 8392 8393 0.0473152332925311 0.0473152332925311
+11754 8393 8394 0.00593400942031918 0.00593400942031918
+11755 8394 8395 0.0526072167549377 0.0526072167549377
+11756 8395 8396 0.0535245842073366 0.0535245842073366
+11757 8396 8397 0.0520127953812383 0.0520127953812383
+11758 8397 8398 0.0525440381176666 0.0525440381176666
+11759 8398 8399 0.105725944401461 0.105725944401461
+11760 8399 8400 0.0963534079842441 0.0963534079842441
+11761 8400 8401 0.00721402202643277 0.00721402202643277
+11762 8401 8402 0.0642819932248178 0.0642819932248178
+11763 8402 6180 0.0440229088580127 0.0440229088580127
+11764 6180 3304 0.105719811244021 0.105719811244021
+11765 3304 8404 0.104473728049028 0.104473728049028
+11776 2683 5360 0.148134497863423 0.148134497863423
+11779 8408 8409 0.0170504242210171 0.0170504242210171
+11780 8409 8410 0.0301331300599118 0.0301331300599118
+11781 8410 8408 0.024630163522097 0.024630163522097
+11786 8411 7068 0.119279864672347 0.119279864672347
+11787 7068 5513 0.148575970390717 0.148575970390717
+11788 5513 4445 0.14563348668729 0.14563348668729
+11795 8413 543 0.028789081158834 0.028789081158834
+11800 8038 2689 0.14574049201504 0.14574049201504
+11801 2689 8392 0.146364813323007 0.146364813323007
+11810 8316 8410 0.0688632882143238 0.0688632882143238
+11818 8318 8421 0.163109524565458 0.163109524565458
+11820 2202 8422 0.0636527332062032 0.0636527332062032
+11827 8425 8426 0.235001983383898 0.235001983383898
+11829 8427 2187 0.0976945121262096 0.0976945121262096
+11830 2187 8428 0.113051166751879 0.113051166751879
+11832 8429 8427 0.106790392513668 0.106790392513668
+11836 8432 8433 0.316135432263608 0.316135432263608
+11838 8434 8435 0.0739062863270344 0.0739062863270344
+16014 9785 9166 0.0737839272607517 0.0737839272607517
+11840 8436 8437 0.305296163280187 0.305296163280187
+11842 8438 8439 0.0899401823641934 0.0899401823641934
+11843 8439 8440 0.0855827793815302 0.0855827793815302
+11845 8441 533 0.0890672230330435 0.0890672230330435
+11847 8325 3752 0.00830034500152871 0.00830034500152871
+11848 3752 8442 0.100105658665385 0.100105658665385
+11849 8442 6773 0.103872958239997 0.103872958239997
+11850 6773 8303 0.0295834023794743 0.0295834023794743
+11851 8303 8443 0.122024126507826 0.122024126507826
+11854 8365 8445 0.12649848699983 0.12649848699983
+11856 8445 8446 0.0774789975708123 0.0774789975708123
+11858 6522 8447 0.124835406842481 0.124835406842481
+11860 8447 4244 0.0110439553261759 0.0110439553261759
+11861 4244 1787 0.20168643392703 0.20168643392703
+11862 1787 7206 0.198352393557477 0.198352393557477
+11863 7206 5819 0.204146640542909 0.204146640542909
+11864 5819 7724 0.196992932786583 0.196992932786583
+11865 7724 8448 0.0469826616672844 0.0469826616672844
+11866 8448 8449 1.1597652413984 1.1597652413984
+15932 1178 9158 0.281206093212011 0.281206093212011
+11868 529 476 0.196533269115043 0.196533269115043
+11869 476 8451 0.00692492598385206 0.00692492598385206
+11871 8452 8450 0.118857471050118 0.118857471050118
+11873 8446 8453 0.0472361723035857 0.0472361723035857
+11875 8453 1808 0.0616092600190724 0.0616092600190724
+11876 1808 8454 0.103675532542851 0.103675532542851
+11878 8455 8452 0.0832501988122618 0.0832501988122618
+11880 8456 8455 0.0488208935536257 0.0488208935536257
+11883 1807 8456 0.0645719953824934 0.0645719953824934
+11885 8454 8460 0.0468848260297017 0.0468848260297017
+11887 8460 8461 0.191542303309411 0.191542303309411
+11888 8461 8462 0.143814933384229 0.143814933384229
+11926 8479 7578 0.0514183930388008 0.0514183930388008
+11889 8462 8312 0.0813843178601785 0.0813843178601785
+11890 8312 8463 0.108687135880293 0.108687135880293
+11891 8463 8464 0.171307568098715 0.171307568098715
+11892 8464 7962 0.138415151415673 0.138415151415673
+11894 8465 8457 0.0468050869550622 0.0468050869550622
+11899 8468 3170 0.018103312819976 0.018103312819976
+11901 8469 8466 0.0123424922846296 0.0123424922846296
+11902 8466 8311 0.0903233113904637 0.0903233113904637
+11904 8470 8469 0.0396717564170432 0.0396717564170432
+11906 8296 8273 0.152532135373756 0.152532135373756
+11907 8273 5789 0.146346014371488 0.146346014371488
+11908 5789 4816 0.144635236179438 0.144635236179438
+11909 4816 8471 0.144945711618013 0.144945711618013
+11910 8471 8472 0.00337499193971306 0.00337499193971306
+13477 9099 9096 0.0859011649600223 0.0859011649600223
+11912 8473 8474 0.141151348464777 0.141151348464777
+11913 8474 8475 0.13279343346844 0.13279343346844
+11915 1346 8475 0.0349627710606267 0.0349627710606267
+11919 8313 8477 0.0691895872331652 0.0691895872331652
+11921 4846 8478 0.326789742990523 0.326789742990523
+11923 5031 6987 0.0623597305249406 0.0623597305249406
+11924 6987 5806 0.105799056021075 0.105799056021075
+11925 5806 8479 0.0532916983351864 0.0532916983351864
+11927 7578 8480 0.0539921866859616 0.0539921866859616
+11928 8480 8481 0.0438686505947476 0.0438686505947476
+11929 8481 5961 0.00656699811047763 0.00656699811047763
+11930 5961 8482 0.00665108194893408 0.00665108194893408
+11931 8482 3003 0.0997303043018087 0.0997303043018087
+11932 3003 4396 0.10605079021574 0.10605079021574
+11933 4396 8483 0.102726296828384 0.102726296828384
+11934 8483 8484 0.00648258609012086 0.00648258609012086
+11935 8484 8485 0.100141708737386 0.100141708737386
+11936 8485 8486 0.0275311475026058 0.0275311475026058
+11937 8486 8487 0.0265062604992808 0.0265062604992808
+11938 8487 8488 0.0523458198440316 0.0523458198440316
+11939 8488 8489 0.104751027795859 0.104751027795859
+11940 8489 8490 0.0990693987095691 0.0990693987095691
+11941 8490 8491 0.00745857832944624 0.00745857832944624
+11942 8491 8492 0.0518088588950486 0.0518088588950486
+11943 8492 6189 0.054888246037165 0.054888246037165
+11945 6632 7733 0.112596009055585 0.112596009055585
+12071 8507 3552 0.071078699522552 0.071078699522552
+11946 7733 8495 2.00712592676004 2.00712592676004
+11954 6568 4449 0.147875161573861 0.147875161573861
+11955 4449 5497 0.144351276811523 0.144351276811523
+11956 5497 7071 0.14871904829256 0.14871904829256
+11958 8501 8502 0.146058647776188 0.146058647776188
+11959 8502 8397 0.148207146508282 0.148207146508282
+11960 8397 2694 0.144837053832231 0.144837053832231
+11966 4737 8503 0.0843423130679838 0.0843423130679838
+11967 8399 5455 0.141833750205801 0.141833750205801
+11968 5455 2697 0.00495891013188563 0.00495891013188563
+11969 2697 8045 0.148003641728593 0.148003641728593
+11970 8045 6573 0.144311748140391 0.144311748140391
+11971 6573 4454 0.147824934616054 0.147824934616054
+11972 4454 5502 0.144725467857806 0.144725467857806
+11973 5502 7076 0.14772137009526 0.14772137009526
+11974 7076 2033 0.146029155751578 0.146029155751578
+11975 2033 5322 0.146208700799923 0.146208700799923
+11976 5322 631 0.145784380568713 0.145784380568713
+11977 631 6404 0.147332884437086 0.147332884437086
+11978 6404 2910 0.0722929712454625 0.0722929712454625
+11980 8504 8505 0.0580359403583064 0.0580359403583064
+11981 8505 6178 0.0499592014591395 0.0499592014591395
+11982 6178 8506 0.0514685264155668 0.0514685264155668
+11983 8506 8508 0.0359450086839816 0.0359450086839816
+11985 8509 8491 0.145477011516465 0.145477011516465
+11986 8491 6711 0.147675146026861 0.147675146026861
+11987 6711 8510 0.0119577509852376 0.0119577509852376
+11999 7079 2035 0.146591134901683 0.146591134901683
+12000 2035 8511 0.144080341921709 0.144080341921709
+12001 8506 6577 0.292638121021149 0.292638121021149
+12013 8514 7905 0.14392744613234 0.14392744613234
+12014 7905 8224 0.144594704272466 0.144594704272466
+12015 8224 2513 0.0408485952047996 0.0408485952047996
+12017 8223 4514 0.129566346086565 0.129566346086565
+12018 4514 5236 0.132336483238921 0.132336483238921
+12019 5236 6888 0.137583446360535 0.137583446360535
+12020 6888 8515 0.134749292102011 0.134749292102011
+18562 2839 2837 0.0398814314105002 0.0398814314105002
+12021 8515 1670 0.131131933535458 0.131131933535458
+12022 1670 8516 0.137025514768393 0.137025514768393
+12023 8516 2451 0.140387467109701 0.140387467109701
+12024 2451 3220 0.132796169496021 0.132796169496021
+12025 3220 3241 0.0110949892633217 0.0110949892633217
+12026 3241 5742 0.122723226676881 0.122723226676881
+12027 5742 5734 0.0121046279679281 0.0121046279679281
+12028 5734 5519 0.122276751203955 0.122276751203955
+12029 5519 5518 0.0183360434030607 0.0183360434030607
+12030 5518 6453 0.115919443239594 0.115919443239594
+12031 6453 8519 0.0186206290164017 0.0186206290164017
+12032 8519 6921 0.113511395757215 0.113511395757215
+12033 6921 6966 0.278590640144845 0.278590640144845
+12034 6966 2480 0.0421290693071181 0.0421290693071181
+12035 2480 2819 0.0832464241503531 0.0832464241503531
+12036 2819 1420 0.203808019181798 0.203808019181798
+12037 1420 1350 0.0610460440330561 0.0610460440330561
+12038 1350 386 0.0313326355302306 0.0313326355302306
+12039 386 8520 0.00828931624769023 0.00828931624769023
+12041 8521 8522 0.0528158272532374 0.0528158272532374
+12042 8522 8461 0.0240744692191342 0.0240744692191342
+12045 8524 8525 0.099226587437181 0.099226587437181
+12056 6652 7968 0.116416731661103 0.116416731661103
+13645 9155 9152 0.125537210877253 0.125537210877253
+12069 3016 8123 0.0144820950034519 0.0144820950034519
+12070 8123 8507 0.0310425416681892 0.0310425416681892
+12072 3552 4443 0.0963694960086714 0.0963694960086714
+12074 8536 8537 0.125429093404429 0.125429093404429
+12075 8537 8398 0.148732331324902 0.148732331324902
+12076 8398 2695 0.143717697009194 0.143717697009194
+12078 8043 6571 0.143486226041694 0.143486226041694
+15271 8458 8538 0.130887342573391 0.130887342573391
+12079 6571 4452 0.149648787475973 0.149648787475973
+12080 4452 5500 0.142780903948531 0.142780903948531
+12081 5500 7074 0.148102852377504 0.148102852377504
+12082 7074 2032 0.145681586591459 0.145681586591459
+12086 2886 7993 0.218441304114497 0.218441304114497
+12088 8130 8541 0.134523622254369 0.134523622254369
+12089 8541 8542 0.00481474032387871 0.00481474032387871
+12090 8542 8543 0.00504824966940074 0.00504824966940074
+12091 8543 8544 0.135980275793844 0.135980275793844
+12092 8544 7839 0.139416199289129 0.139416199289129
+12093 7839 819 0.136947671655105 0.136947671655105
+12094 819 3560 0.140872852825874 0.140872852825874
+12095 3560 5634 0.139405079534224 0.139405079534224
+12096 5634 4338 0.141217557097108 0.141217557097108
+12097 4338 6337 0.135602213042785 0.135602213042785
+12098 6337 3053 0.134723773393479 0.134723773393479
+12100 3691 8545 0.139072808044494 0.139072808044494
+12101 5485 8546 0.200596752868582 0.200596752868582
+12103 4888 8547 0.185876236918155 0.185876236918155
+12104 8547 5486 0.175599681021845 0.175599681021845
+12106 4889 8548 0.187588829795577 0.187588829795577
+12107 8548 5487 0.174192187356096 0.174192187356096
+12109 8549 8550 0.0264199145705686 0.0264199145705686
+12110 8550 5477 0.172910339815493 0.172910339815493
+12111 5477 8551 0.17777655236626 0.17777655236626
+12112 8551 8552 0.179401923989104 0.179401923989104
+12114 672 8553 0.00419226671708486 0.00419226671708486
+12116 8554 4600 0.174009465824247 0.174009465824247
+12117 4600 6497 0.141315269300352 0.141315269300352
+12118 6497 3685 0.0979207012351752 0.0979207012351752
+12119 3685 8132 0.140340825489325 0.140340825489325
+12120 8132 8555 0.134412189177842 0.134412189177842
+12121 8555 8556 0.00412533177852682 0.00412533177852682
+12122 8556 8557 0.00459814794721775 0.00459814794721775
+12123 8557 8558 0.132902025218854 0.132902025218854
+12124 8558 7841 0.138710880861165 0.138710880861165
+12125 7841 825 0.140880437202465 0.140880437202465
+12126 825 3566 0.136859579672601 0.136859579672601
+12127 3566 5637 0.14457832436944 0.14457832436944
+12128 5637 4341 0.139173250387063 0.139173250387063
+12129 4341 6340 0.137021300435373 0.137021300435373
+12130 6340 8560 0.107881318168938 0.107881318168938
+12131 2245 4879 0.176153654685445 0.176153654685445
+12132 4879 7358 0.24873496630677 0.24873496630677
+12133 7358 6786 0.0656034947664249 0.0656034947664249
+12134 6786 4878 0.0544981388589161 0.0544981388589161
+12135 4878 5942 0.524256212186461 0.524256212186461
+12136 5942 8561 0.0631406553785623 0.0631406553785623
+12137 8561 3127 0.0936118840285326 0.0936118840285326
+12138 3127 3131 0.0777309112767711 0.0777309112767711
+12139 3131 5914 0.112365280295693 0.112365280295693
+12140 5914 2245 0.331560162235425 0.331560162235425
+12142 8562 2334 2.72525423343991 2.72525423343991
+12144 7677 5980 0.0954252288299854 0.0954252288299854
+12145 5980 2129 0.0933556137052187 0.0933556137052187
+12146 2129 7520 0.0952025856529876 0.0952025856529876
+12147 7520 8563 0.0935887718802941 0.0935887718802941
+12148 8563 2270 0.0947410402071955 0.0947410402071955
+12149 2270 7011 0.0942715716828769 0.0942715716828769
+12150 7011 2766 0.0940480616870089 0.0940480616870089
+12151 2766 3353 0.0940568781185638 0.0940568781185638
+12152 3353 2010 0.0938087738322925 0.0938087738322925
+12153 2010 2020 0.00116816859457691 0.00116816859457691
+12154 2020 7597 0.0929046375775443 0.0929046375775443
+12155 7597 7260 0.0977180089067193 0.0977180089067193
+12156 7260 7607 0.0981798145414121 0.0981798145414121
+12157 7607 8148 0.0984109366674247 0.0984109366674247
+12158 8148 8566 0.099556755200234 0.099556755200234
+12159 8566 8567 0.0161715318927219 0.0161715318927219
+12165 7560 8570 0.0547324150634264 0.0547324150634264
+12166 8570 6187 0.0510334947129921 0.0510334947129921
+12167 6187 8571 0.106459447476842 0.106459447476842
+12168 8571 8572 0.00500250155273319 0.00500250155273319
+12169 8572 8573 0.102179560181125 0.102179560181125
+12171 8574 8575 0.108491319350075 0.108491319350075
+12172 8575 8576 0.100542104447219 0.100542104447219
+12173 8576 8577 0.00648974428476286 0.00648974428476286
+12174 8577 4394 0.10502201579173 0.10502201579173
+12175 4394 3006 0.104610459063575 0.104610459063575
+12176 3006 5958 0.107806604319072 0.107806604319072
+12177 5958 8578 0.00423483079275732 0.00423483079275732
+12178 8578 7577 0.0996748095395635 0.0996748095395635
+12179 7577 5809 0.11590556985698 0.11590556985698
+12181 5431 4429 0.103577041627779 0.103577041627779
+12182 4429 4040 0.0675516196999984 0.0675516196999984
+12183 4040 8579 0.0337698992215471 0.0337698992215471
+12184 8579 6027 0.102046173899402 0.102046173899402
+12185 6027 7864 0.042576537412 0.042576537412
+12186 7864 7863 0.0569874056816302 0.0569874056816302
+12187 7863 1834 0.10010879574602 0.10010879574602
+12188 1834 1828 0.0220165954761323 0.0220165954761323
+12189 1828 2629 0.0778176858176647 0.0778176858176647
+12190 2629 5364 0.0924919399829741 0.0924919399829741
+12191 5364 8580 0.0666180932686517 0.0666180932686517
+12192 8580 514 0.0427668694783733 0.0427668694783733
+12193 514 8581 0.0733005757458476 0.0733005757458476
+12194 8581 411 0.0548642593724076 0.0548642593724076
+12195 411 8582 0.0193916055385274 0.0193916055385274
+12200 8463 8583 0.030501567860775 0.030501567860775
+12202 8584 8585 0.0144536004398608 0.0144536004398608
+12203 8585 8586 0.0148984012969261 0.0148984012969261
+12204 8586 8587 0.0138457363467684 0.0138457363467684
+12206 7095 8584 0.00198726095451303 0.00198726095451303
+12208 8587 8588 0.0738864008587524 0.0738864008587524
+12209 8588 8088 0.0459979828668163 0.0459979828668163
+12211 8588 8088 0.0459979828668163 0.0459979828668163
+12213 7962 8589 0.0119871256203592 0.0119871256203592
+12219 2290 8595 0.0472264457525012 0.0472264457525012
+12224 8600 6960 0.0627185145557708 0.0627185145557708
+12225 6960 8590 0.111002569075664 0.111002569075664
+12226 8590 8601 0.0399166681864525 0.0399166681864525
+12227 8601 8602 0.0122006420704012 0.0122006420704012
+12229 8602 8601 0.0122006420704012 0.0122006420704012
+12231 8605 8606 0.0364944571667735 0.0364944571667735
+12232 8606 8607 0.0128764646733806 0.0128764646733806
+12233 8607 8608 0.0546695374625623 0.0546695374625623
+12234 8608 8585 0.00588263593176519 0.00588263593176519
+12238 6350 8610 0.0529261007223787 0.0529261007223787
+12276 2459 8630 0.034376801437 0.034376801437
+12278 8630 8631 0.0429012342669158 0.0429012342669158
+12279 8631 8478 0.0881202047420162 0.0881202047420162
+12280 8478 6349 0.0631900183412494 0.0631900183412494
+12281 6349 8610 0.106156240617891 0.106156240617891
+12282 8610 8633 0.00782193502715287 0.00782193502715287
+12283 8633 8235 0.439089917447406 0.439089917447406
+13838 2963 1284 0.0976236721102847 0.0976236721102847
+12291 8488 6708 0.146276219075305 0.146276219075305
+12292 6708 8574 0.146922373978856 0.146922373978856
+12293 8574 5780 0.145168342719135 0.145168342719135
+12294 5780 8284 0.145457218481639 0.145457218481639
+12295 8284 8635 0.147985754967018 0.147985754967018
+12296 8635 7895 0.145231730226047 0.145231730226047
+12297 7895 8636 0.145188764989583 0.145188764989583
+12298 8636 8536 0.0230398310291247 0.0230398310291247
+12300 8637 8638 0.051750923168378 0.051750923168378
+12306 8641 8642 0.0388526899017529 0.0388526899017529
+12322 8647 8648 0.0689932486013888 0.0689932486013888
+12324 8409 8649 0.174821115803257 0.174821115803257
+12330 8652 8653 0.0109021010822668 0.0109021010822668
+12370 127 8676 0.0230804767650593 0.0230804767650593
+13861 1773 4425 0.0478826481852338 0.0478826481852338
+12371 8676 127 0.0230804767650593 0.0230804767650593
+12374 8678 2814 0.00715247655230442 0.00715247655230442
+12375 2814 7853 0.0872240502720576 0.0872240502720576
+12379 552 3283 0.201374804580202 0.201374804580202
+12380 3283 439 0.0140574737901418 0.0140574737901418
+12381 439 440 0.131394781189403 0.131394781189403
+12383 8680 592 0.0279554969032489 0.0279554969032489
+12386 3930 5620 0.102308093785748 0.102308093785748
+12387 5620 3705 0.100376481944534 0.100376481944534
+12388 3705 710 0.100626287480694 0.100626287480694
+12389 710 8681 0.0994362797990831 0.0994362797990831
+12390 8681 8515 0.0993120225558452 0.0993120225558452
+12391 8515 4191 0.136253535658325 0.136253535658325
+12392 4191 2517 0.134250356653895 0.134250356653895
+12393 2517 6728 0.132309702657946 0.132309702657946
+12394 6728 4805 0.136509007433592 0.136509007433592
+12395 4805 8682 0.134957701338679 0.134957701338679
+12397 8683 433 0.845576760689761 0.845576760689761
+12398 433 481 1.45081348243216 1.45081348243216
+12399 481 8684 0.52437215594792 0.52437215594792
+12401 8685 8686 0.010167997865452 0.010167997865452
+12404 4154 4741 0.172602377991032 0.172602377991032
+12405 4741 6536 0.177057900654184 0.177057900654184
+12406 6536 8687 0.165392784618956 0.165392784618956
+12408 5170 6865 0.176928364472993 0.176928364472993
+12409 6865 3073 0.175467136201966 0.175467136201966
+12410 3073 8690 0.1637299437242 0.1637299437242
+12411 8690 8160 0.0198260554201283 0.0198260554201283
+12412 8160 8691 0.0330442022067904 0.0330442022067904
+12414 8692 8693 0.174036627821078 0.174036627821078
+12415 8693 8694 0.176955606262412 0.176955606262412
+12416 8694 8695 0.169605643175659 0.169605643175659
+12417 8695 4774 0.249824848381595 0.249824848381595
+12418 4774 6552 0.130776357701309 0.130776357701309
+12419 6552 8696 0.13038749521243 0.13038749521243
+12420 8696 8566 0.0104649837792038 0.0104649837792038
+12421 8566 8697 0.196337242565984 0.196337242565984
+13908 6946 8137 0.20217075396909 0.20217075396909
+12422 8697 3765 0.201163077899324 0.201163077899324
+12423 3765 5944 0.202700667134599 0.202700667134599
+12424 5944 2231 0.203264325905827 0.203264325905827
+12425 2231 4900 0.203310133896795 0.203310133896795
+12426 4900 8699 0.223846600901437 0.223846600901437
+12427 8699 8700 0.179880034662439 0.179880034662439
+12428 8700 8701 0.204289810782798 0.204289810782798
+12429 8701 643 0.139830079927305 0.139830079927305
+12430 643 7272 0.132835494541237 0.132835494541237
+12431 7272 1993 0.110816863894031 0.110816863894031
+12432 1993 1977 0.01986880052865 0.01986880052865
+12433 1977 4590 0.131129399902762 0.131129399902762
+12434 4590 6477 0.129388315999052 0.129388315999052
+12435 6477 2460 0.143087746743813 0.143087746743813
+12436 2460 5904 0.206205054401277 0.206205054401277
+12437 5904 8702 0.200106396563715 0.200106396563715
+12438 8702 789 0.199795050779324 0.199795050779324
+12439 789 3581 0.193812626433148 0.193812626433148
+12440 3581 4353 0.211337121932246 0.211337121932246
+12441 4353 8703 0.201766897339093 0.201766897339093
+12442 8703 3056 0.204698740459713 0.204698740459713
+12443 3056 8704 0.1838941823989 0.1838941823989
+12446 902 8706 0.131578356152921 0.131578356152921
+12447 8706 2807 0.139128342169529 0.139128342169529
+12448 2807 5273 0.132055095159837 0.132055095159837
+12449 5273 6913 0.122503450982406 0.122503450982406
+12450 6913 6362 0.41302368771275 0.41302368771275
+12452 3076 3191 0.200008210348418 0.200008210348418
+12454 6107 1897 0.202849718138185 0.202849718138185
+12455 1897 7235 0.199081659570441 0.199081659570441
+12456 7235 3245 0.204781971579143 0.204781971579143
+12457 3245 8707 0.0557878826660101 0.0557878826660101
+12458 8707 7285 0.154953879613548 0.154953879613548
+12459 7285 28 0.190200511167853 0.190200511167853
+12461 7212 8708 0.0837159569795295 0.0837159569795295
+12463 8708 6525 0.0119790128871836 0.0119790128871836
+12464 6525 1779 0.0293911622529401 0.0293911622529401
+12465 1779 4372 0.0502766443311638 0.0502766443311638
+12466 4372 8710 0.0490277911002061 0.0490277911002061
+12467 8710 4684 0.0539189737855212 0.0539189737855212
+12468 4684 1527 0.0474102490920647 0.0474102490920647
+12469 1527 5107 0.0489757310519715 0.0489757310519715
+19288 10468 10469 0.0662296445612727 0.0662296445612727
+12470 5107 8711 0.0509607682871969 0.0509607682871969
+12471 8711 5064 0.0518326919728752 0.0518326919728752
+12472 5064 1746 0.0537415293364607 0.0537415293364607
+12473 1746 5607 0.04913949394522 0.04913949394522
+12474 5607 6637 0.0470345659561698 0.0470345659561698
+12475 6637 5450 0.0502526613335692 0.0502526613335692
+12477 5427 5408 0.0488836182047643 0.0488836182047643
+12478 5408 7399 0.051895578159039 0.051895578159039
+12479 7399 8712 0.1038123024378 0.1038123024378
+12481 8713 8714 0.0490473159959526 0.0490473159959526
+12482 8714 7277 0.0483828604327117 0.0483828604327117
+12483 7277 3483 0.0998765627131917 0.0998765627131917
+12484 3483 8715 0.048840271287456 0.048840271287456
+12485 8715 6079 0.0473684752554207 0.0473684752554207
+12486 6079 8716 0.055154161978582 0.055154161978582
+12487 8716 3697 0.0479069878085689 0.0479069878085689
+12488 3697 5685 0.0473941467783467 0.0473941467783467
+12489 5685 4571 0.0495504189878239 0.0495504189878239
+12490 4571 8717 0.0532110753130406 0.0532110753130406
+12495 8720 6626 0.0151124856958777 0.0151124856958777
+12496 6626 7211 0.0534737559078532 0.0534737559078532
+12497 7211 5824 0.205145340397742 0.205145340397742
+12498 5824 7729 0.196126806182622 0.196126806182622
+12499 7729 8721 1.41081273670029 1.41081273670029
+12500 8722 6630 0.00966193494482075 0.00966193494482075
+12501 6630 5826 0.0378008975972725 0.0378008975972725
+12502 5826 7731 0.193712690967488 0.193712690967488
+12503 7731 8723 1.80961969384046 1.80961969384046
+12504 1781 8722 0.107247989428491 0.107247989428491
+12506 7401 6529 0.108235119976502 0.108235119976502
+12508 4596 8724 0.16807497837827 0.16807497837827
+12509 8724 8725 0.178846116420602 0.178846116420602
+12510 8725 678 0.00426139259412424 0.00426139259412424
+12511 678 8726 0.00479379013962442 0.00479379013962442
+12512 8726 8727 0.179790579190484 0.179790579190484
+12513 8727 5480 0.174201148052584 0.174201148052584
+12514 5480 8728 0.175423920421782 0.175423920421782
+12515 8728 4882 0.196140148835561 0.196140148835561
+12516 4882 2250 0.176600887954475 0.176600887954475
+12517 2250 5916 0.3321793201224 0.3321793201224
+12519 3788 8729 0.199339438501115 0.199339438501115
+12521 1189 8730 0.167786544262905 0.167786544262905
+12522 8730 7154 0.107569635985836 0.107569635985836
+12524 8731 8732 0.130443287352145 0.130443287352145
+12526 8732 6531 0.0215721025681021 0.0215721025681021
+12527 6531 8733 0.0174468386055745 0.0174468386055745
+12551 8748 6518 0.0472889047630053 0.0472889047630053
+12552 6518 8749 0.0506856290604236 0.0506856290604236
+12548 4570 8746 0.0496686599585209 0.0496686599585209
+12549 8746 8747 0.0568130428191116 0.0568130428191116
+12528 8733 8734 4.18362578562758 4.18362578562758
+12529 6533 8735 0.0310320915845362 0.0310320915845362
+12530 8735 8733 0.0639013406897381 0.0639013406897381
+12531 8733 8736 0.0575832242503326 0.0575832242503326
+12532 8736 1744 0.0585281295770588 0.0585281295770588
+12533 1744 8737 0.0551795735412136 0.0551795735412136
+12534 8737 6634 0.0667321861738512 0.0667321861738512
+12535 6634 8738 1.14684827666039 1.14684827666039
+12536 8739 8740 0.050189520794265 0.050189520794265
+12537 8740 8741 0.0520205890853532 0.0520205890853532
+12538 8741 8742 0.0975475062746334 0.0975475062746334
+12539 8742 8743 0.0478496643069703 0.0478496643069703
+12540 8743 7276 0.0507419704012955 0.0507419704012955
+12541 7276 3482 0.0993982386954757 0.0993982386954757
+12542 3482 8744 0.05053480573854 0.05053480573854
+12543 8744 6078 0.0468212480872111 0.0468212480872111
+12544 6078 8745 0.052325451958986 0.052325451958986
+12545 8745 3696 0.0475592999209775 0.0475592999209775
+12546 3696 5684 0.0505577280347845 0.0505577280347845
+12547 5684 4570 0.0496336429817659 0.0496336429817659
+12550 8747 8748 0.0555882070947718 0.0555882070947718
+12553 8749 6161 0.0483586179330098 0.0483586179330098
+12554 6161 8750 0.0494030122591725 0.0494030122591725
+12555 8750 2739 0.0483430371417139 0.0483430371417139
+12556 2739 8751 0.0499840332207257 0.0499840332207257
+12557 8751 5230 0.0498899174438866 0.0498899174438866
+12558 5230 8752 0.0487864097624457 0.0487864097624457
+12559 8752 3172 0.0492052393668883 0.0492052393668883
+12560 3172 8753 0.048649307652154 0.048649307652154
+12561 8753 4997 0.0504970791491002 0.0504970791491002
+12562 4997 729 0.0994774482962559 0.0994774482962559
+12564 7060 7316 0.100261995636978 0.100261995636978
+12565 7316 4587 0.101339695102535 0.101339695102535
+12566 4587 8033 0.0978749879893347 0.0978749879893347
+12567 8033 6373 0.096169791555938 0.096169791555938
+12568 6373 8754 0.0556932821262755 0.0556932821262755
+12569 8754 4827 0.0506856253200211 0.0506856253200211
+12570 4827 8755 0.0976778629222165 0.0976778629222165
+12572 8756 8757 0.0483546146560771 0.0483546146560771
+12573 8757 8758 0.00678547758181753 0.00678547758181753
+12574 8758 8759 0.0425788070077018 0.0425788070077018
+12577 2375 8761 0.0800348658330501 0.0800348658330501
+12579 8761 2381 0.0565526295759939 0.0565526295759939
+12580 2381 2378 0.0732152007668199 0.0732152007668199
+12581 2378 2379 0.0407086995566738 0.0407086995566738
+12582 2379 2383 0.00264328007897714 0.00264328007897714
+12583 2383 2571 0.0689488793496812 0.0689488793496812
+12585 8761 2375 0.0800348658330501 0.0800348658330501
+12587 1510 7932 0.0417550445525859 0.0417550445525859
+12589 8764 4921 0.0107315298188712 0.0107315298188712
+12590 4921 8062 0.0635329705608418 0.0635329705608418
+12591 8062 6584 0.176700679215808 0.176700679215808
+12592 6584 5366 0.199428899537142 0.199428899537142
+12593 5366 7124 0.156701102941306 0.156701102941306
+12594 7124 612 0.178308153840751 0.178308153840751
+12595 612 1943 0.177718886558766 0.177718886558766
+12596 1943 8765 0.0553792982616949 0.0553792982616949
+12597 8765 8767 0.0568805264393287 0.0568805264393287
+12625 8778 8779 0.0386703080825578 0.0386703080825578
+12598 8767 8768 0.0596299154046411 0.0596299154046411
+12600 8217 8764 0.0348766827140038 0.0348766827140038
+12602 8769 7960 0.0121246465842421 0.0121246465842421
+12636 8782 8776 0.0415201856091735 0.0415201856091735
+12603 7960 7858 0.191569398536593 0.191569398536593
+12604 7858 384 0.0511824976047815 0.0511824976047815
+12606 4685 296 0.0500706281631231 0.0500706281631231
+12607 296 4955 0.0491810974692235 0.0491810974692235
+12608 4955 7223 0.104958162725722 0.104958162725722
+12611 8773 8774 0.043865298365945 0.043865298365945
+12612 8774 6643 0.0451313849693394 0.0451313849693394
+12613 6643 8218 0.0697309457073312 0.0697309457073312
+12614 8218 3952 0.0651671851260823 0.0651671851260823
+12616 1623 8769 0.0363096662742893 0.0363096662742893
+12618 5097 8775 0.0318529970242771 0.0318529970242771
+12622 8776 8777 0.018725243223035 0.018725243223035
+12623 8777 6243 0.106972614023441 0.106972614023441
+12624 6243 8778 0.0466697025677041 0.0466697025677041
+12626 8779 5192 0.0833353912042221 0.0833353912042221
+12627 5192 8780 0.0302234211776424 0.0302234211776424
+12628 8780 8781 0.0269541929474085 0.0269541929474085
+12629 8781 2610 0.119870657472311 0.119870657472311
+12630 2610 1838 0.176410752987704 0.176410752987704
+12631 1838 2360 0.17767880886817 0.17767880886817
+12633 3710 4430 0.0984187629622127 0.0984187629622127
+12634 4430 5171 0.100485171973402 0.100485171973402
+12638 968 8783 0.0450647850917565 0.0450647850917565
+12640 8783 6332 0.0179790401179982 0.0179790401179982
+12641 6332 8784 0.166916939377104 0.166916939377104
+12642 8784 8785 0.0824631793427953 0.0824631793427953
+12643 8785 8786 0.100743867095121 0.100743867095121
+12644 8786 3809 0.198861011407653 0.198861011407653
+12645 3809 5921 0.152448419282946 0.152448419282946
+12647 920 2206 0.198794444530698 0.198794444530698
+12648 2206 4855 0.161210664735901 0.161210664735901
+12649 4855 8787 0.176180330331867 0.176180330331867
+12650 8787 5459 0.173977209442215 0.173977209442215
+12651 5459 8788 0.179581076943561 0.179581076943561
+12652 8788 653 0.182661218967331 0.182661218967331
+12653 653 8789 0.175533060842227 0.175533060842227
+12654 8789 4615 0.178562453757686 0.178562453757686
+12655 4615 6485 0.147124798702961 0.147124798702961
+12656 6485 3681 0.150536039008347 0.150536039008347
+12658 5282 8790 0.0413354062568629 0.0413354062568629
+12660 8790 6331 0.0121138578035044 0.0121138578035044
+12662 6548 8791 0.16625102712937 0.16625102712937
+12663 8791 8792 0.184061439099574 0.184061439099574
+12664 8792 3808 0.198594245045878 0.198594245045878
+12665 3808 5923 0.153339826215406 0.153339826215406
+12666 5923 922 0.17696116360303 0.17696116360303
+12667 922 2208 0.186196659484346 0.186196659484346
+12668 2208 4857 0.160795645903838 0.160795645903838
+12669 4857 8793 0.191420788288479 0.191420788288479
+12671 5460 8794 0.176401987583553 0.176401987583553
+12672 8794 8795 0.177191749793072 0.177191749793072
+12673 8795 654 0.00549383449703672 0.00549383449703672
+12674 654 8796 0.178534682523657 0.178534682523657
+12675 8796 4614 0.177531607780329 0.177531607780329
+12676 4614 6486 0.147678461213278 0.147678461213278
+12677 6486 3679 0.150313310591357 0.150313310591357
+12681 8798 8799 0.123466110327723 0.123466110327723
+12682 8799 3186 0.00950854696516887 0.00950854696516887
+12683 3186 8800 0.0308360436433676 0.0308360436433676
+12685 8801 8802 0.231947805663281 0.231947805663281
+12686 8802 8803 0.0199646364044365 0.0199646364044365
+12687 8803 5017 0.0091876036672495 0.0091876036672495
+12692 7064 8808 0.0247148912105672 0.0247148912105672
+12693 8808 8685 0.0234885972598816 0.0234885972598816
+20809 8326 10950 0.0125120772932362 0.0125120772932362
+16680 9982 9983 0.0455494891280306 0.0455494891280306
+15872 7130 8879 0.124695897236049 0.124695897236049
+12694 8685 8023 0.100302779247875 0.100302779247875
+12696 8809 8685 0.057365793634115 0.057365793634115
+12699 8810 4109 0.100464246278784 0.100464246278784
+12700 4109 2643 0.0901887127804005 0.0901887127804005
+12702 8805 7976 0.102773783270916 0.102773783270916
+12703 7976 7318 0.104083044705694 0.104083044705694
+12704 7318 8803 0.278830952538266 0.278830952538266
+12706 8811 8812 0.108086464170563 0.108086464170563
+12707 8812 6861 0.0114665228848291 0.0114665228848291
+12709 5165 8809 0.109306863073043 0.109306863073043
+12710 8809 8808 0.0510932247106912 0.0510932247106912
+12712 8798 6379 0.100799788599422 0.100799788599422
+12713 6379 6099 0.0584802680423258 0.0584802680423258
+12714 6099 8202 0.382882462386682 0.382882462386682
+12716 8813 8173 0.0533183303572635 0.0533183303572635
+12718 8814 8815 0.0594781662619651 0.0594781662619651
+12720 8815 3633 0.0139674412080793 0.0139674412080793
+14286 6672 3115 0.0991095918198707 0.0991095918198707
+15288 8812 7065 0.0171061341992079 0.0171061341992079
+12722 3295 8191 0.195769878320479 0.195769878320479
+12723 8191 103 0.207801078913796 0.207801078913796
+12724 103 3505 0.201240848446412 0.201240848446412
+12725 3505 8816 0.20140010471513 0.20140010471513
+12726 8816 8817 0.0467910785706761 0.0467910785706761
+12727 8817 8759 0.155886707244551 0.155886707244551
+12728 8759 8818 0.0209382564173288 0.0209382564173288
+12729 8818 8819 0.0390294530141924 0.0390294530141924
+12730 8819 8820 0.0609459777309488 0.0609459777309488
+12732 7196 5844 0.199996639851393 0.199996639851393
+12733 5844 7747 0.201963345264684 0.201963345264684
+12734 7747 8821 0.660668042362938 0.660668042362938
+12737 6675 8823 0.018377691001392 0.018377691001392
+12738 8823 3121 0.0817086617793047 0.0817086617793047
+12739 3121 3122 0.0189462201356829 0.0189462201356829
+12740 3122 6294 0.0736313115214917 0.0736313115214917
+12741 6294 6295 0.0205616464638412 0.0205616464638412
+12742 6295 6620 0.098958190214706 0.098958190214706
+14308 9323 2191 0.217246414275379 0.217246414275379
+12743 6620 7343 0.0741923893812443 0.0741923893812443
+12744 7343 2845 0.101548527960204 0.101548527960204
+12745 2845 3494 0.101534987318255 0.101534987318255
+12746 3494 5350 0.0785982086314387 0.0785982086314387
+12748 4220 2948 0.0852112039835386 0.0852112039835386
+12749 2948 2949 0.056569943078372 0.056569943078372
+12750 2949 6813 0.0330539311277449 0.0330539311277449
+12751 6813 6810 0.0675878090482117 0.0675878090482117
+12752 6810 1814 0.0227606927419569 0.0227606927419569
+12753 1814 8824 0.984700828985706 0.984700828985706
+12754 8823 8825 0.40169861106651 0.40169861106651
+12779 3798 5937 0.1524274277381 0.1524274277381
+12755 8826 7748 0.668566967249301 0.668566967249301
+12756 7748 5845 0.201518653480334 0.201518653480334
+12757 5845 7197 0.200485803128442 0.200485803128442
+12758 7197 8827 0.180703533412633 0.180703533412633
+12759 8827 8760 0.0207611083367854 0.0207611083367854
+12760 8760 8828 0.203176551906279 0.203176551906279
+12761 8828 3506 0.200871002946695 0.200871002946695
+12763 8170 8192 0.20854015704238 0.20854015704238
+12764 8192 3296 0.195770030101267 0.195770030101267
+12765 3296 8183 0.100143064441761 0.100143064441761
+12766 8183 8188 0.148673984504934 0.148673984504934
+12767 8188 8813 0.0159417159428289 0.0159417159428289
+12769 2918 8829 0.0404869067666165 0.0404869067666165
+12771 8829 6328 0.00908621391699812 0.00908621391699812
+12772 6328 8830 0.0795394987314785 0.0795394987314785
+12774 4166 4751 0.202375182887314 0.202375182887314
+12775 4751 6542 0.197696304569089 0.197696304569089
+12776 6542 8831 0.204678217467742 0.204678217467742
+12778 8832 3798 0.199708223967288 0.199708223967288
+12780 5937 938 0.177624298285183 0.177624298285183
+12781 938 2222 0.185255991502605 0.185255991502605
+12782 2222 4872 0.159853083829866 0.159853083829866
+12783 4872 8834 0.191323978817286 0.191323978817286
+12787 28 8836 0.0411233276076822 0.0411233276076822
+15407 8527 8524 0.00632598868026626 0.00632598868026626
+16685 9986 9987 0.0852803879953952 0.0852803879953952
+12788 8830 4165 0.0810572303723974 0.0810572303723974
+12790 4096 6041 0.191845009601904 0.191845009601904
+12791 6041 8837 0.201496335450174 0.201496335450174
+12792 8837 8838 0.406062586796109 0.406062586796109
+12793 4086 6031 0.181162285735164 0.181162285735164
+12794 6031 6032 0.0171385466290399 0.0171385466290399
+12795 6032 8839 0.201396970557967 0.201396970557967
+12796 8839 2539 0.0036249646793062 0.0036249646793062
+12797 2539 7937 0.222367701142404 0.222367701142404
+12798 7937 8840 0.179081080346528 0.179081080346528
+12799 8520 8841 0.0687184646666591 0.0687184646666591
+12801 8841 298 0.017862044588972 0.017862044588972
+12802 298 4082 0.0176901086131869 0.0176901086131869
+12805 2560 6714 0.0892568890732451 0.0892568890732451
+12806 6714 6633 0.0879831056932755 0.0879831056932755
+12807 6633 8844 0.0442062339102578 0.0442062339102578
+12808 8844 7935 0.0446455487862746 0.0446455487862746
+12809 7935 8845 0.265612509858697 0.265612509858697
+12817 297 299 0.88607517832177 0.88607517832177
+12823 493 589 0.268896577305787 0.268896577305787
+12824 589 8850 0.33804717039653 0.33804717039653
+12826 8589 8851 0.042366080089372 0.042366080089372
+12828 8851 4936 0.0170501490589131 0.0170501490589131
+12829 4936 8509 0.143621366769105 0.143621366769105
+12831 8852 8853 0.0917176896741063 0.0917176896741063
+12832 8853 7564 0.105551904949528 0.105551904949528
+12833 7564 6182 0.105801475446669 0.105801475446669
+12834 6182 8854 0.10583574357693 0.10583574357693
+12835 8854 8855 0.00547189672663909 0.00547189672663909
+18650 1854 2593 0.177389867684494 0.177389867684494
+12837 8856 8857 0.0555847646631402 0.0555847646631402
+12838 8857 8858 0.0519115005666898 0.0519115005666898
+12839 8858 8636 0.0515833043565609 0.0515833043565609
+12840 8636 8859 0.0207966249820583 0.0207966249820583
+12844 8860 1198 0.169110109980516 0.169110109980516
+12845 1198 8861 0.0226617213022113 0.0226617213022113
+12847 8862 1200 0.170240075619945 0.170240075619945
+12848 1200 8863 0.0219879091267488 0.0219879091267488
+12850 8864 7983 0.0505037947042799 0.0505037947042799
+12851 7983 2054 0.099824917404873 0.099824917404873
+12852 2054 2660 0.101497408945607 0.101497408945607
+12853 2660 4133 0.0961563998269834 0.0961563998269834
+12855 6696 8019 0.0939673290333738 0.0939673290333738
+12856 8019 7683 0.0941529054095407 0.0941529054095407
+12857 7683 3457 0.0935091254143676 0.0935091254143676
+12858 3457 8865 0.0461569199164165 0.0461569199164165
+12859 8865 6019 0.0480340625550536 0.0480340625550536
+12860 6019 8866 0.0464697146879775 0.0464697146879775
+12861 8866 8867 0.048094543326443 0.048094543326443
+12862 8867 8868 0.0461790217746061 0.0461790217746061
+12863 8868 856 0.0449646613539359 0.0449646613539359
+12864 856 451 0.0470078764226648 0.0470078764226648
+12865 451 7105 0.0432708485882178 0.0432708485882178
+12866 7105 8869 0.0939007256947679 0.0939007256947679
+12868 8870 1196 0.168829878028139 0.168829878028139
+12869 1196 8871 0.021661446985008 0.021661446985008
+12871 4760 5407 0.0842978699895538 0.0842978699895538
+12873 4755 6546 0.199683159238461 0.199683159238461
+12874 6546 8872 0.20436535055464 0.20436535055464
+12875 8872 8873 0.188956325706579 0.188956325706579
+12876 8873 3792 0.199291485976659 0.199291485976659
+17796 10179 9318 0.114755253361823 0.114755253361823
+12877 3792 8561 0.13059037096191 0.13059037096191
+12879 5926 924 0.178374370928188 0.178374370928188
+12880 924 2210 0.187308783265319 0.187308783265319
+12881 2210 4859 0.159743099068053 0.159743099068053
+12882 4859 8874 0.192629276936053 0.192629276936053
+12883 8874 5461 0.172330101173688 0.172330101173688
+12884 5461 8875 0.177416584260724 0.177416584260724
+12885 8875 8876 0.176433616828762 0.176433616828762
+12887 655 8877 0.00413648661723727 0.00413648661723727
+12888 8877 8878 0.173943602457692 0.173943602457692
+12889 8878 4613 0.177428437243737 0.177428437243737
+12890 4613 6487 0.148280300321704 0.148280300321704
+12891 6487 3678 0.149828166583799 0.149828166583799
+12893 5929 926 0.177267011666895 0.177267011666895
+12894 926 2211 0.187019197552967 0.187019197552967
+12895 2211 4861 0.161667462022208 0.161667462022208
+12896 4861 8880 0.191414125057248 0.191414125057248
+12897 8880 5463 0.170299846109482 0.170299846109482
+12898 5463 8881 0.177990586801656 0.177990586801656
+12899 8881 8885 0.177780189019753 0.177780189019753
+12900 8885 659 0.00646246375156384 0.00646246375156384
+12901 659 8886 0.177011471342036 0.177011471342036
+12902 8886 4612 0.177005843155015 0.177005843155015
+12903 4612 6488 0.148001366258512 0.148001366258512
+12904 6488 3676 0.150380555650091 0.150380555650091
+12906 1621 8061 0.152748999526467 0.152748999526467
+12907 8061 6583 0.177490187745079 0.177490187745079
+12908 6583 5365 0.198863610387104 0.198863610387104
+12909 5365 7123 0.157919035747255 0.157919035747255
+12911 8092 8887 0.220134314041521 0.220134314041521
+12913 8887 8888 0.191841135190913 0.191841135190913
+12914 8888 967 0.0966749413586244 0.0966749413586244
+12916 5281 4980 0.256490434532314 0.256490434532314
+12917 4980 4148 0.0387618071437701 0.0387618071437701
+12918 4148 8125 0.0859291558348279 0.0859291558348279
+12919 8125 2368 0.179404398665568 0.179404398665568
+12920 2368 996 0.270881468937897 0.270881468937897
+12921 996 2914 0.0678890736084051 0.0678890736084051
+12922 2914 2917 0.0548386478267142 0.0548386478267142
+12927 8894 8895 0.135035418511701 0.135035418511701
+12929 8896 3167 0.11730986547504 0.11730986547504
+12932 8898 8899 0.10458723954588 0.10458723954588
+12971 8901 8709 0.120698197647431 0.120698197647431
+12978 8902 8903 0.00973401952734473 0.00973401952734473
+12979 8903 7902 0.144472845078957 0.144472845078957
+12980 7902 1225 0.0118169371778595 0.0118169371778595
+12982 8904 8902 0.0775029978833242 0.0775029978833242
+12984 8905 8906 0.061203121949655 0.061203121949655
+12986 8906 8907 0.00497763084611722 0.00497763084611722
+12987 8907 121 0.154154812192847 0.154154812192847
+12988 121 8904 0.0610449885391548 0.0610449885391548
+12990 8325 8908 0.013157216132198 0.013157216132198
+12992 306 8909 0.108316294946991 0.108316294946991
+12994 8328 8910 0.00899626589788406 0.00899626589788406
+12995 8910 8338 0.040824296618527 0.040824296618527
+12996 8338 6084 0.0494050923488005 0.0494050923488005
+12997 6084 8909 0.0118673496888767 0.0118673496888767
+12998 8909 743 0.0430251864291126 0.0430251864291126
+12999 743 4526 0.0484294102772242 0.0484294102772242
+13000 4526 607 0.0194349740430761 0.0194349740430761
+13001 607 8355 0.0344276469779443 0.0344276469779443
+13002 8355 3974 0.0402278696203799 0.0402278696203799
+13004 8911 2658 0.732133935065161 0.732133935065161
+13012 8915 8916 0.408272009335824 0.408272009335824
+13090 1914 6117 0.200190217467506 0.200190217467506
+13018 8922 8923 0.320042964228513 0.320042964228513
+13022 8265 8926 0.339879399665874 0.339879399665874
+13027 4265 279 0.0652387434169228 0.0652387434169228
+13029 494 8927 0.349190481522976 0.349190481522976
+13040 8104 8678 0.200106495095782 0.200106495095782
+13042 8932 8933 0.108557788789167 0.108557788789167
+13044 8677 8932 0.0500470435519063 0.0500470435519063
+13046 8933 6917 0.0967430583925215 0.0967430583925215
+13050 8936 8937 0.198244621757318 0.198244621757318
+13084 8956 8756 0.203550658006643 0.203550658006643
+13052 8938 8939 0.428260593428089 0.428260593428089
+13053 8939 8425 0.201936465504692 0.201936465504692
+13055 8939 8941 0.203022755730075 0.203022755730075
+13057 8931 8942 0.152950212219782 0.152950212219782
+13059 8943 8931 0.0786273196751871 0.0786273196751871
+19033 256 10159 0.12356745711476 0.12356745711476
+13063 8945 8946 0.104572805049419 0.104572805049419
+13067 8949 432 0.545131832456565 0.545131832456565
+13068 432 8950 0.686001065667251 0.686001065667251
+13070 8951 8949 0.0797207044078447 0.0797207044078447
+13074 8952 8953 0.195031053860659 0.195031053860659
+13076 99 3503 0.199966819322067 0.199966819322067
+13077 3503 8954 0.201518791118212 0.201518791118212
+13078 8954 8755 0.203764704692679 0.203764704692679
+13079 8755 7193 0.202942329745549 0.202942329745549
+13080 7193 7746 0.401362186865274 0.401362186865274
+13081 7746 8955 0.585986287872625 0.585986287872625
+13082 101 3504 0.19989908085758 0.19989908085758
+13083 3504 8956 0.200106829133291 0.200106829133291
+13085 8756 7194 0.202942348322105 0.202942348322105
+13087 1087 8957 0.00893112007684357 0.00893112007684357
+13088 8957 1082 0.038563824899443 0.038563824899443
+13091 6117 3204 0.200871492111254 0.200871492111254
+13092 3204 3094 0.202111971416858 0.202111971416858
+13093 3094 1749 0.143511782143127 0.143511782143127
+13096 8925 8917 0.011822810789309 0.011822810789309
+13098 8959 602 0.0536722144567161 0.0536722144567161
+13099 602 8962 0.0387695912622113 0.0387695912622113
+13100 8962 8948 0.175808350127672 0.175808350127672
+13101 8948 428 0.00954052470619231 0.00954052470619231
+13102 428 7933 0.160696268160677 0.160696268160677
+13104 8918 8924 0.012486102804665 0.012486102804665
+13105 8924 2420 0.0580706601904793 0.0580706601904793
+13108 8964 8965 0.125224497044451 0.125224497044451
+13110 8965 2192 0.356365737888712 0.356365737888712
+13135 4848 1531 0.0955193854848385 0.0955193854848385
+13111 2192 1611 0.254354724276405 0.254354724276405
+13112 1611 8852 0.0391111849621532 0.0391111849621532
+13114 8966 7934 0.183569029359489 0.183569029359489
+13116 2045 8967 0.0657780447895409 0.0657780447895409
+13119 1742 5213 0.229560371023495 0.229560371023495
+13120 5213 640 0.0648517231107158 0.0648517231107158
+14585 9392 2833 0.210508246764738 0.210508246764738
+13122 7933 8963 0.200908071446329 0.200908071446329
+13124 7934 8969 0.0906737639231845 0.0906737639231845
+13125 8969 429 0.0698124130115735 0.0698124130115735
+13126 429 8947 0.0102744112219317 0.0102744112219317
+13127 8947 8970 0.0586653743681201 0.0586653743681201
+13128 8970 601 0.102766368620144 0.102766368620144
+13157 8989 1285 0.118339572755071 0.118339572755071
+13129 601 8973 0.0999362244261846 0.0999362244261846
+13130 8973 8918 0.0326860113699392 0.0326860113699392
+13132 2193 8237 0.11471912407663 0.11471912407663
+13133 8237 8974 0.0761048371438857 0.0761048371438857
+13443 9077 4179 0.169049790102584 0.169049790102584
+13137 8974 4844 0.0408566656014099 0.0408566656014099
+13139 8975 8915 0.161267451240187 0.161267451240187
+13164 8976 8977 0.00802909585520281 0.00802909585520281
+13140 8915 8979 0.511309857046827 0.511309857046827
+13142 8950 8980 0.295444981113679 0.295444981113679
+13144 8981 8982 0.155762064195337 0.155762064195337
+14605 9398 8233 0.0099630690934953 0.0099630690934953
+13146 8983 8984 0.153794064127447 0.153794064127447
+13148 8985 8986 0.0143228031361841 0.0143228031361841
+13149 8986 8496 0.0694983470285585 0.0694983470285585
+13150 8496 398 0.120004619664384 0.120004619664384
+13151 398 8987 0.0577858842103034 0.0577858842103034
+13152 8987 637 0.099744132155093 0.099744132155093
+13153 637 6436 0.0832880379381437 0.0832880379381437
+13154 6436 21 0.0571009168797096 0.0571009168797096
+13155 21 8988 0.0791847444931621 0.0791847444931621
+13158 1285 2962 0.0719310735484076 0.0719310735484076
+13159 2962 8991 0.0186493582069224 0.0186493582069224
+13160 8991 8992 0.187353348628226 0.187353348628226
+13161 8992 8351 0.0990161897507714 0.0990161897507714
+13162 8351 8993 0.00963797122366648 0.00963797122366648
+13163 8993 8976 0.0698946708143702 0.0698946708143702
+13165 8977 8994 0.012930744273385 0.012930744273385
+13167 8451 8985 0.0708838190049254 0.0708838190049254
+13169 2877 7692 0.030123526159425 0.030123526159425
+13173 8996 8143 0.201053290850133 0.201053290850133
+13174 8143 8997 0.150730663136006 0.150730663136006
+13176 2794 5261 0.132082373792006 0.132082373792006
+13178 5853 1338 0.200417735783644 0.200417735783644
+13179 1338 8998 0.206394741682614 0.206394741682614
+13181 8998 4698 0.201909087963534 0.201909087963534
+13182 4698 8999 0.201909088033291 0.201909088033291
+13183 8999 9000 0.201186325895839 0.201186325895839
+13184 9000 6822 0.198983321230549 0.198983321230549
+13185 6822 770 0.132908321867952 0.132908321867952
+13187 1638 8999 0.102808714105755 0.102808714105755
+13188 8999 4216 0.0999229348013983 0.0999229348013983
+13189 4216 8095 0.0991443160837587 0.0991443160837587
+13190 8095 196 0.0991307294664674 0.0991307294664674
+13191 196 2925 0.0983869258474561 0.0983869258474561
+13193 5307 1463 0.0991311193927209 0.0991311193927209
+13194 1463 5437 0.103145293575034 0.103145293575034
+13196 1641 9000 0.10355145810147 0.10355145810147
+13197 9000 4217 0.0998824134603326 0.0998824134603326
+13198 4217 8096 0.0998581597847897 0.0998581597847897
+13199 8096 197 0.0983977211710877 0.0983977211710877
+13200 197 2926 0.0983895151379973 0.0983895151379973
+13201 2926 5308 0.0991337377550934 0.0991337377550934
+13202 5308 1464 0.0991224618714554 0.0991224618714554
+13203 1464 5440 0.103536651588581 0.103536651588581
+13205 201 2928 0.102050045456718 0.102050045456718
+13206 2928 5310 0.0991386153517731 0.0991386153517731
+13207 5310 1466 0.099890094841465 0.099890094841465
+13208 1466 5445 0.102288602469368 0.102288602469368
+13209 5445 9003 0.20221504164542 0.20221504164542
+13210 9003 7922 0.00954769987851559 0.00954769987851559
+13211 7922 4407 0.193513161405962 0.193513161405962
+13212 4407 9004 0.22689488985342 0.22689488985342
+13213 9004 4314 0.17109885981524 0.17109885981524
+13214 4314 4501 0.0954627697803603 0.0954627697803603
+13215 4501 7813 0.103538745444113 0.103538745444113
+13216 7813 5077 0.099141030065187 0.099141030065187
+13217 5077 8012 0.101361319209047 0.101361319209047
+13218 8012 6831 0.0984053279969797 0.0984053279969797
+13219 6831 6983 0.0507122349978986 0.0507122349978986
+13220 6983 6974 0.0492014587539049 0.0492014587539049
+13221 6974 7944 0.0815359432635548 0.0815359432635548
+13222 7944 6363 0.117492028011777 0.117492028011777
+13223 6363 6659 0.128518000967454 0.128518000967454
+13224 6659 5340 0.248378842685992 0.248378842685992
+13225 5340 9007 0.436836188101395 0.436836188101395
+13226 5447 9008 0.0954198714626642 0.0954198714626642
+13227 9008 5974 0.0150605452925665 0.0150605452925665
+13229 5443 7920 0.209496436784339 0.209496436784339
+13230 7920 4409 0.196049081122935 0.196049081122935
+13232 9009 4311 0.174051720567411 0.174051720567411
+13234 5439 7917 0.209760382857472 0.209760382857472
+13235 7917 4414 0.1967831025196 0.1967831025196
+13236 4414 9010 0.224679521512281 0.224679521512281
+13239 5435 9011 0.112718312199178 0.112718312199178
+13240 9011 7916 0.0954502097686848 0.0954502097686848
+13242 4418 9012 0.223944278058007 0.223944278058007
+13243 9012 9013 0.163728342208645 0.163728342208645
+13244 9014 9011 0.193580953488763 0.193580953488763
+13272 5331 5695 0.176288296878523 0.176288296878523
+13246 1844 2578 0.172509377214494 0.172509377214494
+13248 6839 8008 0.0576758204139334 0.0576758204139334
+13250 8009 6981 0.144663680916955 0.144663680916955
+13252 9015 6845 0.0843525238323184 0.0843525238323184
+13253 6845 4689 0.0881118827688874 0.0881118827688874
+13254 4689 4697 0.0264412698588759 0.0264412698588759
+13255 4697 7466 0.0631647371963507 0.0631647371963507
+13256 7466 9016 0.0866600751763154 0.0866600751763154
+13257 9016 7453 0.0117533037462049 0.0117533037462049
+13258 7453 2091 0.0764142388554106 0.0764142388554106
+13259 2091 5691 0.0521281816109867 0.0521281816109867
+13260 5691 5680 0.0375154291161679 0.0375154291161679
+13261 5680 6316 0.0896056080016293 0.0896056080016293
+13262 6316 4963 0.0888719448734625 0.0888719448734625
+13264 6826 5338 0.0370211552910964 0.0370211552910964
+13266 9016 9017 0.044781886028432 0.044781886028432
+13267 6842 4692 0.112329114895897 0.112329114895897
+13268 4692 5332 0.162956489748023 0.162956489748023
+13270 6840 4691 0.113830246405759 0.113830246405759
+13271 4691 5331 0.0755697574983074 0.0755697574983074
+13274 5694 6319 0.174033677833605 0.174033677833605
+13275 6319 9018 0.182109806928741 0.182109806928741
+13277 4310 7811 0.201267372547373 0.201267372547373
+13278 7811 8010 0.202389778156291 0.202389778156291
+13281 7812 5076 0.100599027218817 0.100599027218817
+13282 5076 8011 0.100623102109681 0.100623102109681
+13283 8011 6982 0.147599810375252 0.147599810375252
+13284 6982 7943 0.131458423393202 0.131458423393202
+13285 7943 3300 0.0829788157522616 0.0829788157522616
+13286 3300 5727 0.0905493512456201 0.0905493512456201
+13287 5727 5339 0.0993780908642813 0.0993780908642813
+13289 9019 9020 0.473924441922911 0.473924441922911
+13290 5441 7918 0.212183518066811 0.212183518066811
+13291 7918 4411 0.196063540031297 0.196063540031297
+13292 4411 9021 0.221019052884505 0.221019052884505
+13293 9021 4282 0.176970513595043 0.176970513595043
+13295 4326 9018 0.0881179267079727 0.0881179267079727
+13296 9018 7810 0.0594732573783121 0.0594732573783121
+13297 7810 7817 0.0279069878470498 0.0279069878470498
+13298 7817 5075 0.0895984878523876 0.0895984878523876
+13299 5075 8007 0.082290456587143 0.082290456587143
+13300 8007 6839 0.0433776365307967 0.0433776365307967
+13301 6839 6979 0.105025257907842 0.105025257907842
+14885 9012 7486 0.0983880214663299 0.0983880214663299
+13303 9003 4959 0.128621575011946 0.128621575011946
+13304 4959 9022 0.0561090389096707 0.0561090389096707
+13305 9022 9023 0.219664135455113 0.219664135455113
+13307 9024 1734 0.0339090081692689 0.0339090081692689
+13308 1734 9025 0.199586826055962 0.199586826055962
+13310 162 1723 0.148414326457229 0.148414326457229
+13312 164 1724 0.19589389224901 0.19589389224901
+13313 1724 9026 0.21539258017212 0.21539258017212
+13315 166 1725 0.23958811593923 0.23958811593923
+13316 1725 9027 0.172261015966003 0.172261015966003
+13318 168 1727 0.256304305915683 0.256304305915683
+13319 1727 8081 0.0911159242290505 0.0911159242290505
+13321 9028 9029 0.0459665066705729 0.0459665066705729
+13323 9030 9031 0.204682511562437 0.204682511562437
+13324 9031 6588 0.201464690183835 0.201464690183835
+13325 6588 7109 0.201819605073549 0.201819605073549
+13326 7109 9034 0.0380490136329461 0.0380490136329461
+13327 9035 9036 0.202787954952135 0.202787954952135
+13328 9036 6589 0.200863566889439 0.200863566889439
+13329 6589 7110 0.201074334121883 0.201074334121883
+13331 9037 9031 0.102130234291417 0.102130234291417
+13332 9031 9036 0.101294841162053 0.101294841162053
+13333 9036 6128 0.0961527434944637 0.0961527434944637
+13334 6128 3971 0.0990967592348727 0.0990967592348727
+13336 7017 1406 0.0990967592360877 0.0990967592360877
+13337 1406 7390 0.0982252697684911 0.0982252697684911
+13338 7390 5217 0.100064145492252 0.100064145492252
+13340 5377 9038 0.0981767550682586 0.0981767550682586
+13342 9041 9042 0.107883824327089 0.107883824327089
+13344 9043 9044 0.111762023714712 0.111762023714712
+13346 7805 9045 0.163613143703316 0.163613143703316
+13347 4982 9046 0.151151791011959 0.151151791011959
+13348 9046 4333 0.0931833318260777 0.0931833318260777
+13349 4333 5039 0.084348128639754 0.084348128639754
+13351 2869 9047 0.0643526028257267 0.0643526028257267
+13352 2869 5283 0.189728403936972 0.189728403936972
+13354 9048 6951 0.21054969022045 0.21054969022045
+13355 6951 8084 0.110877740512572 0.110877740512572
+13356 8084 8141 0.0381711926062465 0.0381711926062465
+13357 8141 5971 0.0998550766587588 0.0998550766587588
+13358 5971 9046 0.165019740176851 0.165019740176851
+13359 9046 7804 0.203892252907028 0.203892252907028
+13360 7804 9049 0.488623985679594 0.488623985679594
+13361 577 9048 0.0924966938169246 0.0924966938169246
+13369 9054 1743 0.0233197702600261 0.0233197702600261
+13370 1743 4270 0.277932467642318 0.277932467642318
+13371 4270 310 0.0394728122356983 0.0394728122356983
+13372 310 577 0.0535172942987349 0.0535172942987349
+13374 9055 9056 0.0694449359265994 0.0694449359265994
+13375 9056 2325 0.190938968451781 0.190938968451781
+13376 2325 4279 0.147346976573119 0.147346976573119
+13378 4286 9055 0.0222915391297905 0.0222915391297905
+13380 1349 1615 0.0587612563553368 0.0587612563553368
+13381 1615 7135 0.106001129731548 0.106001129731548
+13383 5260 9057 0.107843300513683 0.107843300513683
+13384 6952 9058 0.0875153511963366 0.0875153511963366
+13386 9058 5767 0.0813716345984657 0.0813716345984657
+13387 5767 312 0.370850163813996 0.370850163813996
+13390 9048 9052 0.36535949731556 0.36535949731556
+13394 9060 8966 0.196473660543131 0.196473660543131
+13396 9061 5080 0.358471972755657 0.358471972755657
+13397 5080 9062 0.674602285535072 0.674602285535072
+13398 9062 3176 0.289568864041751 0.289568864041751
+13399 3176 527 0.133561854308294 0.133561854308294
+18560 10318 10319 0.255397297870644 0.255397297870644
+13400 527 343 0.340886700679976 0.340886700679976
+13401 343 537 0.428322489908352 0.428322489908352
+13402 537 474 0.822980283733396 0.822980283733396
+13403 474 8438 0.152037422281902 0.152037422281902
+13407 4427 9063 0.114941491865609 0.114941491865609
+13409 9063 8912 0.118971180199303 0.118971180199303
+13413 8236 125 0.0903470808346396 0.0903470808346396
+13415 9065 9066 0.0810250214751567 0.0810250214751567
+13417 9066 7279 0.116655009841785 0.116655009841785
+13419 276 9067 0.0692041764264314 0.0692041764264314
+13500 9108 9109 0.0476133357747153 0.0476133357747153
+13421 9067 2189 0.114532021981465 0.114532021981465
+13423 9068 4553 0.327000385366346 0.327000385366346
+13425 8428 9069 0.0507531626876375 0.0507531626876375
+13426 9069 9068 0.00529520129182755 0.00529520129182755
+13428 9070 9071 0.0606488327577038 0.0606488327577038
+13430 9071 9072 0.009176031077042 0.009176031077042
+13431 9072 4642 0.175105976981708 0.175105976981708
+13432 4642 7954 0.0487370399178714 0.0487370399178714
+13433 7954 4547 0.158995972178669 0.158995972178669
+13434 4547 9073 0.292416775735491 0.292416775735491
+13436 9074 9075 0.0675438073285673 0.0675438073285673
+13438 9075 409 0.0146789910973018 0.0146789910973018
+13439 409 9076 0.0166512433271008 0.0166512433271008
+13441 4838 326 0.0588523383992881 0.0588523383992881
+13449 9081 9082 0.443932946896766 0.443932946896766
+13451 1401 9083 0.0611691476045831 0.0611691476045831
+13453 9083 6208 0.0330698135159164 0.0330698135159164
+13454 6208 7645 0.178373846931983 0.178373846931983
+13455 7645 9086 0.177258150455768 0.177258150455768
+13498 9107 3956 0.0601050509878674 0.0601050509878674
+13457 9087 9088 1.73315945419765 1.73315945419765
+13458 9088 410 0.265082533171925 0.265082533171925
+13459 410 9080 0.715047499183354 0.715047499183354
+13460 9080 9089 0.194455760903183 0.194455760903183
+13462 9089 9090 0.0550554662137945 0.0550554662137945
+13464 9091 9092 0.473459458640042 0.473459458640042
+13475 9098 9032 0.307889980671666 0.307889980671666
+13479 9090 9099 0.0142223937707519 0.0142223937707519
+13481 9100 9093 0.193628424072927 0.193628424072927
+13483 9101 9100 0.0626625130905001 0.0626625130905001
+13487 9103 346 0.140681499904037 0.140681499904037
+13522 9037 8064 0.00660497864323473 0.00660497864323473
+13489 3955 9081 0.113309674251049 0.113309674251049
+13491 6240 5091 0.078819968233945 0.078819968233945
+13493 9082 9103 0.0435368095566408 0.0435368095566408
+13494 9103 347 0.193850840943334 0.193850840943334
+13495 347 404 0.026466812116417 0.026466812116417
+13496 404 9106 0.11755875033606 0.11755875033606
+13501 9109 9107 0.387486870322022 0.387486870322022
+13503 6204 9110 0.181291651373991 0.181291651373991
+13505 9111 9112 0.0153902940291749 0.0153902940291749
+13506 9112 9101 0.137209683962048 0.137209683962048
+13508 9113 9111 0.075192531928865 0.075192531928865
+15014 455 860 0.0461629164957839 0.0461629164957839
+13510 9114 9115 0.148585418330877 0.148585418330877
+13514 8582 9116 0.0682625654668292 0.0682625654668292
+13516 9116 237 0.0139438438014188 0.0139438438014188
+13517 237 7635 0.17396601741799 0.17396601741799
+13519 7602 9073 0.102023996019348 0.102023996019348
+13521 117 9037 0.091769841511351 0.091769841511351
+13523 8064 6587 0.198394254239174 0.198394254239174
+13524 6587 5384 0.100320867880051 0.100320867880051
+13525 5384 7108 0.0976180261019357 0.0976180261019357
+13526 7108 2293 0.101160557994969 0.101160557994969
+13527 2293 9117 0.0816968455207608 0.0816968455207608
+13583 9134 9079 0.189350301331036 0.189350301331036
+13533 9118 6217 0.00293554606374767 0.00293554606374767
+13534 6217 7652 0.27452915439238 0.27452915439238
+13535 7652 8071 0.262369838158816 0.262369838158816
+13536 8071 9119 0.0614463164636613 0.0614463164636613
+13538 9118 7768 0.0286215741177868 0.0286215741177868
+13540 9121 9122 0.0549317968438626 0.0549317968438626
+13541 9122 9080 0.148946547669597 0.148946547669597
+13543 9121 4555 0.0367880997749164 0.0367880997749164
+13545 216 9123 0.047880969118268 0.047880969118268
+13547 9123 447 0.333206339887537 0.333206339887537
+13549 2999 9124 0.314861669735557 0.314861669735557
+13554 579 408 0.862576839598051 0.862576839598051
+13568 9128 9129 0.16941277010836 0.16941277010836
+13570 9124 9128 0.0550015048734635 0.0550015048734635
+13578 9132 220 0.766585324287615 0.766585324287615
+13615 7609 7262 0.111890561964914 0.111890561964914
+13579 220 566 0.637748069235424 0.637748069235424
+13587 9136 9137 0.450871833260349 0.450871833260349
+13590 8684 222 0.184496371824925 0.184496371824925
+13591 222 9140 0.487607813488587 0.487607813488587
+13593 9140 9077 0.174302500151122 0.174302500151122
+13594 9077 9141 0.280690469581891 0.280690469581891
+13596 9142 118 0.0916021886608042 0.0916021886608042
+13597 118 6721 0.0966297992771619 0.0966297992771619
+13598 6721 6722 0.0414535753801991 0.0414535753801991
+13599 6722 2311 0.00867549185460531 0.00867549185460531
+13601 6580 6723 0.0197325066377101 0.0197325066377101
+13603 9029 1240 0.0358410792262526 0.0358410792262526
+13604 1240 4790 0.0578956777475445 0.0578956777475445
+13605 4790 4814 0.0309664941935945 0.0309664941935945
+13606 4814 2156 0.0660634330770184 0.0660634330770184
+13607 2156 2166 0.00298513757197415 0.00298513757197415
+13608 2166 2183 0.165657322423627 0.165657322423627
+13609 2183 9070 0.039996230308656 0.039996230308656
+13611 3728 9143 0.0374422730466023 0.0374422730466023
+13613 3765 8150 0.099678431004031 0.099678431004031
+13614 8150 7609 0.0943510009713305 0.0943510009713305
+13616 7262 7595 0.0635463262031531 0.0635463262031531
+13617 7595 7599 0.0220206440979588 0.0220206440979588
+13618 7599 9144 0.0741982381570415 0.0741982381570415
+15078 7589 3366 0.105686563985576 0.105686563985576
+13619 9144 2022 0.0197545563564228 0.0197545563564228
+13620 2022 9147 0.0829434723735258 0.0829434723735258
+13621 9147 3355 0.0108199721778022 0.0108199721778022
+13623 9148 2768 0.0035576669192827 0.0035576669192827
+13624 2768 7013 0.0948918648713715 0.0948918648713715
+13626 2274 8214 0.00623184642483798 0.00623184642483798
+13627 8214 9149 0.0892902468185094 0.0892902468185094
+13628 9149 8211 0.0144047767787734 0.0144047767787734
+13629 8211 7521 0.0807484203861095 0.0807484203861095
+13630 7521 7522 0.0178959760293508 0.0178959760293508
+13631 7522 2132 0.0761585237127413 0.0761585237127413
+13632 2132 2117 0.0261874332320613 0.0261874332320613
+13633 2117 5982 0.0706516490311829 0.0706516490311829
+13634 5982 5987 0.0312102623276897 0.0312102623276897
+13635 5987 5148 0.0542024830967572 0.0542024830967572
+13636 5148 7678 0.00643849229968441 0.00643849229968441
+13637 7678 9150 0.0270552275766841 0.0270552275766841
+13638 9150 5159 0.0130471422397109 0.0130471422397109
+13639 5159 2336 0.0550815403379387 0.0550815403379387
+17797 9318 9592 0.0276370219250994 0.0276370219250994
+15154 9503 7694 0.0985863309924877 0.0985863309924877
+13640 2336 9151 2.70099171821299 2.70099171821299
+15853 9736 5597 0.026161521554181 0.026161521554181
+13642 327 390 0.428713460971309 0.428713460971309
+13643 390 216 1.2612581668138 1.2612581668138
+13647 4841 9156 0.020245918680072 0.020245918680072
+13653 9127 4841 0.714489743272739 0.714489743272739
+13655 9160 9161 0.0611231237623731 0.0611231237623731
+13657 9161 9162 0.0094906074947222 0.0094906074947222
+13658 9162 360 0.119259910634054 0.119259910634054
+13659 360 4441 0.0977181725107 0.0977181725107
+13660 4441 9025 0.101356058092401 0.101356058092401
+13661 9025 361 0.102083424277621 0.102083424277621
+13662 361 6661 0.148732998262686 0.148732998262686
+13663 6661 1457 0.0814814185857237 0.0814814185857237
+13664 1457 6930 0.0803380398809936 0.0803380398809936
+13665 6930 9163 0.0870015008277124 0.0870015008277124
+13666 9163 3826 0.0559780942251715 0.0559780942251715
+13667 3826 5901 0.113837481725673 0.113837481725673
+13668 5901 1650 0.336368580358266 0.336368580358266
+13669 1650 9026 0.0808050552206421 0.0808050552206421
+13670 9026 9027 0.0815322500516298 0.0815322500516298
+13671 9027 3968 0.0749133242052919 0.0749133242052919
+13672 3968 205 0.163780553378706 0.163780553378706
+13673 205 2934 0.0793233966793332 0.0793233966793332
+13674 2934 2932 0.00660572151012338 0.00660572151012338
+13675 2932 5313 0.0749133313668845 0.0749133313668845
+13676 5313 5314 0.039721686292112 0.039721686292112
+13677 5314 1472 0.0396600103919334 0.0396600103919334
+13678 1472 5451 0.159004638765101 0.159004638765101
+13679 5451 7909 0.201247264593271 0.201247264593271
+13680 7909 4403 0.196833842084677 0.196833842084677
+13681 4403 6310 0.199805236650359 0.199805236650359
+13682 6310 6311 0.0399338522027804 0.0399338522027804
+13683 6311 9019 0.0787211142615482 0.0787211142615482
+18919 10398 10391 0.0932116121589892 0.0932116121589892
+13684 9019 4301 0.0803301037321015 0.0803301037321015
+13685 4301 4499 0.100692334161908 0.100692334161908
+13686 4499 7815 0.0988002674680887 0.0988002674680887
+13687 7815 5071 0.0991802868019195 0.0991802868019195
+13688 5071 8014 0.103571412588639 0.103571412588639
+13689 8014 6833 0.0839453108807348 0.0839453108807348
+14657 9411 6735 0.143528351506247 0.143528351506247
+13691 6976 7946 0.0984345173677437 0.0984345173677437
+13692 7946 3301 0.0874467814940938 0.0874467814940938
+13693 3301 6365 0.0895995351805866 0.0895995351805866
+13694 6365 6654 0.083807023997277 0.083807023997277
+13695 6654 9165 0.68755983150845 0.68755983150845
+13696 9166 9167 0.0102840052604526 0.0102840052604526
+13698 7423 7832 0.102961269389569 0.102961269389569
+13699 7832 1182 0.0975615453999259 0.0975615453999259
+13700 1182 1359 0.100609727856237 0.100609727856237
+13701 1359 8086 0.0998738624212929 0.0998738624212929
+13702 8086 4842 0.0999569203615348 0.0999569203615348
+13703 4842 4377 0.103593486995353 0.103593486995353
+13704 4377 2859 0.305366704359361 0.305366704359361
+13705 2859 7625 0.0937028559888649 0.0937028559888649
+13706 7625 6669 0.0349417471907859 0.0349417471907859
+13707 6669 6928 0.181245567189969 0.181245567189969
+13708 6928 6929 0.056563910069816 0.056563910069816
+15200 9526 7443 0.0505254725980933 0.0505254725980933
+13710 3818 5176 0.0844451203946057 0.0844451203946057
+13711 5176 5900 0.0873882937906588 0.0873882937906588
+13712 5900 1602 0.0969475981594534 0.0969475981594534
+13713 1602 1645 0.147610823352004 0.147610823352004
+13714 1645 1658 0.00734081920779586 0.00734081920779586
+13715 1658 6715 0.113834950309784 0.113834950309784
+13717 4211 8097 0.0991353106844716 0.0991353106844716
+13719 9171 203 0.0903750729081993 0.0903750729081993
+13720 203 2931 0.102769081645998 0.102769081645998
+13721 2931 5312 0.098402268229521 0.098402268229521
+13722 5312 1469 0.0726981009727233 0.0726981009727233
+13723 1469 1468 0.023502610730772 0.023502610730772
+13724 1468 5448 0.104140699419407 0.104140699419407
+13726 3761 9166 0.069031653563667 0.069031653563667
+13728 4177 9172 0.109548350633249 0.109548350633249
+13730 9144 5946 0.201030224778112 0.201030224778112
+13731 5946 5137 0.27511296352744 0.27511296352744
+13732 5137 5152 0.0232058578864935 0.0232058578864935
+13733 5152 4907 0.10620133994029 0.10620133994029
+15464 1361 9615 0.0375616902705351 0.0375616902705351
+13734 4907 6615 0.200738818803378 0.200738818803378
+13735 6615 9173 0.1939198547813 0.1939198547813
+13736 9173 9174 0.208269220932895 0.208269220932895
+13738 9147 5947 0.203116974549126 0.203116974549126
+13740 7615 904 0.277200719177449 0.277200719177449
+13741 904 9175 0.127974248210887 0.127974248210887
+13743 7010 7421 0.0949619514323781 0.0949619514323781
+13744 7421 1142 0.0432881849429407 0.0432881849429407
+13745 1142 1147 0.0608947786947552 0.0608947786947552
+13746 1147 909 0.0792487229277921 0.0792487229277921
+13788 1669 9192 0.136278654988626 0.136278654988626
+13747 909 9176 0.125103752996271 0.125103752996271
+13748 9176 2771 0.202343174331141 0.202343174331141
+13749 2771 6895 0.198817638053719 0.198817638053719
+13753 9179 1 0.207517415173182 0.207517415173182
+13755 8437 9180 0.124967984057199 0.124967984057199
+13759 9182 4484 0.465234327006532 0.465234327006532
+13760 4484 4485 0.0326010116755978 0.0326010116755978
+13762 9183 9184 0.0646101092104256 0.0646101092104256
+13764 9185 9186 0.026977202251753 0.026977202251753
+13765 9186 9187 0.0154692834867904 0.0154692834867904
+13766 9187 6713 0.0145607005435147 0.0145607005435147
+13768 232 9188 0.0841812454433435 0.0841812454433435
+13770 9188 2561 0.00954099557633664 0.00954099557633664
+13773 8233 9190 0.00698491885871168 0.00698491885871168
+13774 9190 605 0.212601143616712 0.212601143616712
+13776 394 9191 0.174546619141482 0.174546619141482
+13779 294 4424 0.271505686802405 0.271505686802405
+13783 1892 4513 0.135635571790495 0.135635571790495
+13784 4513 5235 0.13338423256793 0.13338423256793
+13785 5235 6887 0.13498931648718 0.13498931648718
+13786 6887 8681 0.133693861256586 0.133693861256586
+13787 8681 1669 0.132070065253788 0.132070065253788
+13790 8903 8620 0.147899148341854 0.147899148341854
+13791 8620 6984 0.0740139001970076 0.0740139001970076
+13792 6984 4819 0.0711240597778575 0.0711240597778575
+13794 8514 8220 0.0695233221555377 0.0695233221555377
+13796 9193 9141 0.231480473302438 0.231480473302438
+13817 9194 8483 0.144876329810161 0.144876329810161
+13798 9193 9195 0.405940766693276 0.405940766693276
+13800 5081 9196 0.0826803218524669 0.0826803218524669
+13801 9196 7908 0.24773379383735 0.24773379383735
+13802 7908 1383 0.130538600450066 0.130538600450066
+13803 1383 4663 0.14493811446872 0.14493811446872
+13822 8286 9202 0.148093750497898 0.148093750497898
+13804 4663 9197 0.14786450905396 0.14786450905396
+13807 231 1184 0.314149545717651 0.314149545717651
+13808 1184 1364 0.114004540105804 0.114004540105804
+13810 1364 8087 0.130984174828509 0.130984174828509
+14659 939 5938 0.17856727191407 0.17856727191407
+14660 5938 3797 0.152203615831491 0.152203615831491
+13811 8087 9162 0.16050280483824 0.16050280483824
+13812 9162 9198 0.0132941963216631 0.0132941963216631
+18577 10320 10319 0.350878667314418 0.350878667314418
+20839 10930 10948 0.105680421147412 0.105680421147412
+13813 9198 9199 3.17004296851045 3.17004296851045
+17798 9592 10180 0.0765579819092659 0.0765579819092659
+13839 1284 9210 0.120028974895433 0.120028974895433
+13816 4931 9194 0.407318560179548 0.407318560179548
+13819 6705 8577 0.147047679886064 0.147047679886064
+13820 8577 5778 0.145526475675905 0.145526475675905
+13821 5778 8286 0.144657100371242 0.144657100371242
+13823 9202 9203 0.102081942931647 0.102081942931647
+13825 7891 9204 0.145701377036231 0.145701377036231
+13827 8994 9205 0.0106390736530004 0.0106390736530004
+13828 9205 8304 0.117212668938715 0.117212668938715
+13829 8304 6774 0.0328401658585753 0.0328401658585753
+13830 6774 3753 0.196045019335809 0.196045019335809
+13831 3753 8325 0.00916875381027056 0.00916875381027056
+13833 8444 9206 0.0130864665707206 0.0130864665707206
+13834 9206 9207 0.00957370688012094 0.00957370688012094
+13835 9207 9208 0.169933774193856 0.169933774193856
+13836 9208 9209 0.168302394118973 0.168302394118973
+15503 3939 5618 0.12194000294889 0.12194000294889
+13837 9209 2963 0.0205458196072096 0.0205458196072096
+13840 9210 9211 0.00588390321087397 0.00588390321087397
+13841 9211 22 0.0556252544592051 0.0556252544592051
+13842 22 6435 0.0767592442346679 0.0767592442346679
+13843 6435 636 0.0822615503744666 0.0822615503744666
+13844 636 9213 0.103246384420422 0.103246384420422
+13845 9213 535 0.0273108213340879 0.0273108213340879
+13846 535 9214 0.138573391347307 0.138573391347307
+13847 9214 8498 0.0276472257994952 0.0276472257994952
+13848 8498 8441 0.0465142466162739 0.0465142466162739
+13850 9215 8403 0.0487070540067587 0.0487070540067587
+13851 8403 1774 0.0526991311069308 0.0526991311069308
+13853 4412 9216 0.0527074152255093 0.0527074152255093
+13854 9216 4781 0.0501079093501001 0.0501079093501001
+14661 3797 9412 0.199399735185058 0.199399735185058
+13855 4781 1522 0.0511423250179406 0.0511423250179406
+13856 1522 5241 0.0480297777865987 0.0480297777865987
+13857 5241 463 0.0533178386766155 0.0533178386766155
+13859 9217 8420 0.0487543044755043 0.0487543044755043
+13860 8420 1773 0.0502154238610622 0.0502154238610622
+13862 4425 9218 0.050643583977918 0.050643583977918
+13863 9218 4823 0.0514478917449482 0.0514478917449482
+13864 4823 1521 0.0514834990326773 0.0514834990326773
+13865 1521 5262 0.0474439861374267 0.0474439861374267
+13866 5262 9219 0.0530746980864797 0.0530746980864797
+13868 6499 2472 0.199600310338802 0.199600310338802
+13870 7007 2282 0.0992844503488553 0.0992844503488553
+13872 3603 7529 0.0990493561706104 0.0990493561706104
+13873 7529 2137 0.105524175995486 0.105524175995486
+13874 2137 5994 0.104734285723653 0.104734285723653
+13875 5994 7674 0.100897460064117 0.100897460064117
+13996 5841 434 0.0624248318177171 0.0624248318177171
+13876 7674 9221 1.00510923817581 1.00510923817581
+13878 2804 5269 0.128688734978596 0.128688734978596
+13879 5269 6909 0.123348542786119 0.123348542786119
+13881 4480 5270 0.264392216770053 0.264392216770053
+13882 5270 6910 0.123553912188766 0.123553912188766
+13884 7761 6908 0.206924774668396 0.206924774668396
+13886 6907 7760 0.209013911598568 0.209013911598568
+13887 7760 9222 0.202410018751594 0.202410018751594
+13888 6905 7759 0.206351576128965 0.206351576128965
+13889 7759 6359 0.203865759483167 0.203865759483167
+13891 9223 6448 0.190233422734384 0.190233422734384
+13892 6448 6992 0.620734926195411 0.620734926195411
+13893 6992 2116 0.412221337604484 0.412221337604484
+13894 2116 7665 0.206015761732372 0.206015761732372
+13935 9237 254 0.129619446290563 0.129619446290563
+13895 7665 9224 1.85930539190202 1.85930539190202
+13896 9225 2398 0.224331288063009 0.224331288063009
+13897 2398 6361 0.106327129111224 0.106327129111224
+17281 7311 3273 0.201986093156211 0.201986093156211
+13899 6446 9223 0.123505309386589 0.123505309386589
+13901 8984 8975 0.295278766625452 0.295278766625452
+13903 8980 8981 0.155353173279186 0.155353173279186
+13905 9226 8104 0.184150710275748 0.184150710275748
+13907 9227 6946 0.038429344582371 0.038429344582371
+13912 6380 9229 0.104471273298691 0.104471273298691
+14662 9412 9300 0.189453948637121 0.189453948637121
+13916 566 9231 1.43965285379934 1.43965285379934
+13917 9136 9232 0.238873404598648 0.238873404598648
+13920 483 7284 0.0730945677376631 0.0730945677376631
+13928 278 6916 0.0415405366115252 0.0415405366115252
+13930 9235 9236 0.360270886139133 0.360270886139133
+13931 9236 2883 0.0595125074168401 0.0595125074168401
+13936 254 8324 0.235611866233999 0.235611866233999
+13938 8324 8310 0.066787627422688 0.066787627422688
+13940 8310 9241 0.146021189936251 0.146021189936251
+13944 9099 7796 0.300588795121337 0.300588795121337
+13948 9244 9113 0.144188675545464 0.144188675545464
+13950 9106 9244 0.0499156662848634 0.0499156662848634
+13952 9245 9246 0.123118530171941 0.123118530171941
+13954 405 406 0.0103894659763889 0.0103894659763889
+13955 406 9245 0.0664778537431541 0.0664778537431541
+13957 407 9033 0.137547423766831 0.137547423766831
+17289 5839 7744 0.201433070586795 0.201433070586795
+13965 9097 9248 0.39480102328572 0.39480102328572
+13966 9248 9249 0.0955291664142426 0.0955291664142426
+13968 9246 9248 0.157049002786803 0.157049002786803
+13976 3952 9252 0.0592126025244243 0.0592126025244243
+13977 9252 5605 0.0597855652504274 0.0597855652504274
+13978 5605 9253 0.0521408060475983 0.0521408060475983
+13979 9253 3728 0.0545524879363147 0.0545524879363147
+13981 7951 7949 0.019092168905179 0.019092168905179
+13983 7949 3093 0.182702780383174 0.182702780383174
+15893 9254 9255 0.183718623774573 0.183718623774573
+13984 3093 3203 0.200818235908537 0.200818235908537
+13985 3203 6116 0.201635970571119 0.201635970571119
+13986 6116 1913 0.201179241726354 0.201179241726354
+13987 1913 9219 0.201184980777767 0.201184980777767
+13988 9219 463 0.200400773809621 0.200400773809621
+13989 463 7301 0.202731579470961 0.202731579470961
+13990 7301 49 0.204762753950758 0.204762753950758
+13991 49 3548 0.19703986640102 0.19703986640102
+13992 3548 4243 0.201964288701916 0.201964288701916
+13993 4243 1803 0.208102375283595 0.208102375283595
+13994 1803 8711 0.194851559567089 0.194851559567089
+13995 8711 5841 0.20424687376631 0.20424687376631
+17660 586 8936 0.0435552950105704 0.0435552950105704
+13997 434 8731 0.0205731062854678 0.0205731062854678
+13999 3219 3112 0.203925882799295 0.203925882799295
+14000 3112 3641 0.260678130684959 0.260678130684959
+14001 3641 9256 0.0279085029397156 0.0279085029397156
+14003 9257 8801 0.0249979934697134 0.0249979934697134
+14665 4752 4167 0.209025457745472 0.209025457745472
+14005 9256 9257 0.0367111693692818 0.0367111693692818
+14007 9258 3642 0.0274131048639432 0.0274131048639432
+14008 3642 9259 0.086632322467807 0.086632322467807
+14009 9259 3111 0.171051850512145 0.171051850512145
+14010 3111 3219 0.203481486479522 0.203481486479522
+14012 7158 9258 0.038998695665846 0.038998695665846
+14014 3219 6126 0.202012344464496 0.202012344464496
+14015 6126 1929 0.202386985868189 0.202386985868189
+14016 1929 2919 0.0171463622508283 0.0171463622508283
+14017 2919 7250 0.183561589747783 0.183561589747783
+14018 7250 3274 0.20118632596822 0.20118632596822
+14019 3274 7312 0.203193267560765 0.203193267560765
+14021 9260 9157 0.0588873613464273 0.0588873613464273
+14022 9157 6253 0.473629275671798 0.473629275671798
+14023 6253 9167 0.20379925953003 0.20379925953003
+14024 9167 231 0.364607283214556 0.364607283214556
+14026 9171 2308 0.0877328075526686 0.0877328075526686
+14027 2308 167 0.314493617652356 0.314493617652356
+14030 6653 9263 0.598539344332022 0.598539344332022
+14031 5448 5975 0.113227741973857 0.113227741973857
+14032 5975 9023 0.0895901368528646 0.0895901368528646
+14033 9023 4404 0.197536219691709 0.197536219691709
+14034 4404 7371 0.107978748074207 0.107978748074207
+14035 7371 6307 0.0697549406367758 0.0697549406367758
+14036 6307 6308 0.0220857912106748 0.0220857912106748
+14037 6308 4316 0.20668661359579 0.20668661359579
+14038 4316 4503 0.0921482766473363 0.0921482766473363
+14039 4503 7814 0.109821870874264 0.109821870874264
+14040 7814 5079 0.102137328159445 0.102137328159445
+14041 5079 8013 0.0998289131041121 0.0998289131041121
+14042 8013 6832 0.10065041616734 0.10065041616734
+14043 6832 6975 0.0990932842629603 0.0990932842629603
+14044 6975 7945 0.100601003970672 0.100601003970672
+14045 7945 6364 0.097675013601381 0.097675013601381
+14049 9264 9265 0.128352927336665 0.128352927336665
+14051 3219 5061 0.0565378582983479 0.0565378582983479
+14052 5061 4916 0.0521329784642155 0.0521329784642155
+17662 488 10160 0.037999512945138 0.037999512945138
+14053 4916 5228 0.130202288917824 0.130202288917824
+14054 5228 5106 0.0572735085516971 0.0572735085516971
+14055 5106 5229 0.0124802378810982 0.0124802378810982
+14056 5229 4995 0.288542415463076 0.288542415463076
+14057 4995 9266 0.20116472075537 0.20116472075537
+14666 4167 6326 0.178657902009272 0.178657902009272
+14058 9266 7066 0.0118986523075564 0.0118986523075564
+14059 7066 3636 0.140199736242294 0.140199736242294
+14061 9266 6351 0.197550871457279 0.197550871457279
+14063 2574 5103 0.0764020591743967 0.0764020591743967
+14065 7930 1893 0.0520626532677435 0.0520626532677435
+14066 1893 2315 0.115168818798466 0.115168818798466
+14068 7341 6156 0.0983814711715662 0.0983814711715662
+14069 6156 6290 0.0991170792397538 0.0991170792397538
+14070 6290 3116 0.0983982120263374 0.0983982120263374
+14072 6673 8185 0.0325158694936318 0.0325158694936318
+14074 3188 9268 0.0244851420549388 0.0244851420549388
+14075 9268 8800 0.0276968906605859 0.0276968906605859
+14077 6718 9269 0.103071842817105 0.103071842817105
+14078 9269 8160 0.0477581921413061 0.0477581921413061
+14080 7342 3492 0.198422050793999 0.198422050793999
+14081 3492 9270 0.0991145839577047 0.0991145839577047
+17664 10161 6173 0.109897620785603 0.109897620785603
+14082 9270 5386 0.100577308895159 0.100577308895159
+14083 5386 9271 0.100588544879537 0.100588544879537
+14084 9271 6817 0.101321511979085 0.101321511979085
+14160 7023 7393 0.135757251453186 0.135757251453186
+14161 7393 9272 0.0789156635630832 0.0789156635630832
+14166 9278 7444 0.0517309727495982 0.0517309727495982
+14129 9279 9280 0.186364690747119 0.186364690747119
+14085 6817 9273 5.01601743028969 5.01601743028969
+14086 9274 6816 4.59997811614881 4.59997811614881
+14088 2943 5348 0.200890409378397 0.200890409378397
+14089 5348 3491 0.0990328236882064 0.0990328236882064
+14090 3491 2849 0.0998105211493863 0.0998105211493863
+14091 2849 7341 0.0991252344530307 0.0991252344530307
+14093 9271 6103 0.208876201356377 0.208876201356377
+14095 9270 6098 0.16565447863601 0.16565447863601
+14096 6098 9275 0.0444779706577198 0.0444779706577198
+14097 9269 6101 0.238835584318973 0.238835584318973
+17799 10180 8536 0.0726583525558809 0.0726583525558809
+14099 8294 9276 0.192103991232145 0.192103991232145
+14101 4423 9277 0.533016938094048 0.533016938094048
+14138 9282 9283 0.384483999025896 0.384483999025896
+14146 4993 9288 0.0718457938229626 0.0718457938229626
+14148 9288 471 0.0203590276008878 0.0203590276008878
+14149 471 6430 0.0161743745423695 0.0161743745423695
+14150 6430 4655 0.1348214737413 0.1348214737413
+14151 4655 1277 0.119151021074222 0.119151021074222
+14152 1277 4528 0.128606742393323 0.128606742393323
+14153 4528 9289 0.132757697104501 0.132757697104501
+14154 9289 9290 0.133347126872573 0.133347126872573
+14155 9290 9291 0.0102673262572307 0.0102673262572307
+14156 9291 6745 0.131970868855064 0.131970868855064
+14157 6745 6145 0.131356474267846 0.131356474267846
+14158 6145 4019 0.135781040149455 0.135781040149455
+14159 4019 7023 0.135014116939136 0.135014116939136
+14162 9272 3401 0.0502252760733361 0.0502252760733361
+14163 3401 9220 0.0499780107614713 0.0499780107614713
+17968 8778 10231 0.0192769916187002 0.0192769916187002
+14164 9220 8375 0.0494394335916504 0.0494394335916504
+14165 8375 9278 0.0493971533103994 0.0493971533103994
+14167 7444 9292 0.0498509119548639 0.0498509119548639
+14168 9292 7161 0.0504322249542888 0.0504322249542888
+14169 7161 9293 0.049549545616498 0.049549545616498
+14671 5473 9414 0.169600878974653 0.169600878974653
+14170 9293 7773 0.0509361632349417 0.0509361632349417
+14171 7773 9039 0.0499454477956979 0.0499454477956979
+14172 9039 1114 0.0547655871790504 0.0547655871790504
+14173 1114 9294 0.0447798115689078 0.0447798115689078
+14174 9294 7494 0.0527731793085291 0.0527731793085291
+14175 7494 9170 0.0488063990880333 0.0488063990880333
+14176 9170 3836 0.0502683027746479 0.0502683027746479
+14180 7818 2938 0.0876396467302253 0.0876396467302253
+14181 2938 6809 0.0888992165922937 0.0888992165922937
+14182 6809 1960 0.772041478396669 0.772041478396669
+17800 8536 8859 0.0293889142934455 0.0293889142934455
+14183 1960 9295 0.960771522024492 0.960771522024492
+14184 7571 9296 0.161476693063143 0.161476693063143
+14185 9296 8888 0.0634729683022204 0.0634729683022204
+14187 9297 6334 0.0129309336441387 0.0129309336441387
+14188 6334 7083 0.0225608570291498 0.0225608570291498
+14189 7083 8784 0.107920119748436 0.107920119748436
+14190 8784 8791 0.106332666658533 0.106332666658533
+14191 8791 3157 0.106749034536814 0.106749034536814
+14192 3157 4976 0.101195319793441 0.101195319793441
+14193 4976 9298 0.0996902493641346 0.0996902493641346
+14194 9298 9299 0.104226329823663 0.104226329823663
+14195 9299 6538 0.0493134523648135 0.0493134523648135
+14196 6538 5048 0.0489874238643872 0.0489874238643872
+14197 5048 8001 0.0994531494791736 0.0994531494791736
+14198 8001 985 0.0994551795792203 0.0994551795792203
+14199 985 5104 0.0491411684949994 0.0491411684949994
+14201 8831 9300 0.0488242916251385 0.0488242916251385
+14202 9300 7149 0.0497002324101769 0.0497002324101769
+14203 7149 2393 0.0492946529104208 0.0492946529104208
+14204 2393 5115 0.0502354677891233 0.0502354677891233
+14205 5115 9301 0.0497154080261439 0.0497154080261439
+14206 9301 4714 0.049399080188397 0.049399080188397
+14207 4714 8872 0.0991624253785381 0.0991624253785381
+14208 8872 7353 0.0988972303255353 0.0988972303255353
+14209 7353 5412 0.107964313206197 0.107964313206197
+14210 5412 3145 0.0906444248702148 0.0906444248702148
+14211 3145 3919 0.0988223626592478 0.0988223626592478
+18204 6875 8356 0.205977621151269 0.205977621151269
+14212 3919 3918 0.0189862588635382 0.0189862588635382
+14213 3918 1010 0.0826936905404967 0.0826936905404967
+14214 1010 6261 0.0974734196824701 0.0974734196824701
+14215 6261 8730 0.0989075877241795 0.0989075877241795
+14216 8730 7153 0.0605847994240266 0.0605847994240266
+14217 7153 5021 0.0499889577891061 0.0499889577891061
+14218 5021 9302 0.0549823108734392 0.0549823108734392
+14219 9302 3342 0.0335617577180335 0.0335617577180335
+14220 3342 3352 0.0674788037125104 0.0674788037125104
+14221 3352 7886 0.0299418452790484 0.0299418452790484
+14222 7886 7319 0.0732493043433617 0.0732493043433617
+14223 7319 7320 0.0259215863697348 0.0259215863697348
+14224 7320 7977 0.0775267077551995 0.0775267077551995
+14225 7977 7980 0.0233987016260196 0.0233987016260196
+14226 7980 2061 0.0796038188827741 0.0796038188827741
+14227 2061 8870 0.0167451229489977 0.0167451229489977
+14228 8870 2647 0.0876006586657796 0.0876006586657796
+14229 2647 8860 0.0114861984991212 0.0114861984991212
+14231 4113 8862 0.00848374045935965 0.00848374045935965
+14232 8862 8687 0.0949896568056219 0.0949896568056219
+14234 6694 8024 0.0782864986898227 0.0782864986898227
+14235 8024 8017 0.0158816052839578 0.0158816052839578
+18205 8356 10280 0.196081618210442 0.196081618210442
+14236 8017 7681 0.0911745487086236 0.0911745487086236
+14237 7681 3454 0.0980849682512979 0.0980849682512979
+14238 3454 6017 0.0971271293907499 0.0971271293907499
+14239 6017 9303 0.0906101063303862 0.0906101063303862
+14240 9303 3884 0.022021804982538 0.022021804982538
+14241 3884 9304 0.0244079810975188 0.0244079810975188
+14242 9304 852 0.0462417773626911 0.0462417773626911
+14243 852 847 0.0318832988859635 0.0318832988859635
+14244 847 9305 0.0129480432587025 0.0129480432587025
+14245 9305 7103 0.0469858120705144 0.0469858120705144
+14246 7103 7098 0.0440436114993002 0.0440436114993002
+14247 7098 8567 0.0448162532507988 0.0448162532507988
+14248 8567 8696 0.0173715559267549 0.0173715559267549
+14249 8696 8157 0.112872102261494 0.112872102261494
+14251 7606 7263 0.0986452262534628 0.0986452262534628
+14252 7263 7596 0.0935891946661749 0.0935891946661749
+14253 7596 2019 0.0979493336941006 0.0979493336941006
+14254 2019 2009 0.0254598809515577 0.0254598809515577
+14255 2009 9306 0.0651506123907477 0.0651506123907477
+14256 9306 2765 0.0942796454050606 0.0942796454050606
+14257 2765 7004 0.0945020258355606 0.0945020258355606
+14258 7004 2269 0.094510288095609 0.094510288095609
+14259 2269 3597 0.0938178496086605 0.0938178496086605
+14260 3597 7519 0.0940495689740582 0.0940495689740582
+14261 7519 2097 0.0954278502201834 0.0954278502201834
+14262 2097 5979 0.093364277402532 0.093364277402532
+14263 5979 7668 0.0947328877466294 0.0947328877466294
+14264 7668 2333 0.0940581587738673 0.0940581587738673
+14290 7340 2847 0.0976411590956878 0.0976411590956878
+14291 2847 3488 0.099134038329873 0.099134038329873
+14265 2333 9307 2.72967592410639 2.72967592410639
+14266 7939 9297 0.0419487931711618 0.0419487931711618
+14268 9308 8124 0.0322650869587369 0.0322650869587369
+14270 6489 4610 0.147433811602258 0.147433811602258
+14271 4610 9309 0.176778253451623 0.176778253451623
+14272 9309 9310 0.173976128689665 0.173976128689665
+14273 9310 661 0.00410310170227956 0.00410310170227956
+14274 661 9311 0.181937703339546 0.181937703339546
+14275 9311 9312 0.00955167864142152 0.00955167864142152
+14276 9312 5465 0.170285054650927 0.170285054650927
+14277 5465 9313 0.170744821866598 0.170744821866598
+14279 1959 9314 0.0338130460518869 0.0338130460518869
+14280 6865 9315 0.0139507857568572 0.0139507857568572
+14304 3303 9322 0.10510832723533 0.10510832723533
+14282 1952 1061 0.0629715521271105 0.0629715521271105
+14283 1061 1698 0.0954893713474356 0.0954893713474356
+14284 1698 7830 0.0914331784434328 0.0914331784434328
+14285 7830 6672 0.0912502234487567 0.0912502234487567
+14287 3115 6289 0.0998478865183477 0.0998478865183477
+14288 6289 6153 0.0969141122634902 0.0969141122634902
+14289 6153 7340 0.100591515239683 0.100591515239683
+14292 3488 5347 0.102266398355838 0.102266398355838
+14293 5347 5385 0.100999909961237 0.100999909961237
+14294 5385 2941 0.100298515709498 0.100298515709498
+14295 2941 6815 0.100200854484763 0.100200854484763
+14296 6815 9316 0.597950743493465 0.597950743493465
+14299 9318 9319 0.0328706223087289 0.0328706223087289
+14300 9319 9320 0.0460951861554719 0.0460951861554719
+14332 8959 603 0.0768028618845699 0.0768028618845699
+14301 9320 9321 0.0066600520489618 0.0066600520489618
+14302 9321 6181 0.104280480431139 0.104280480431139
+14303 6181 3303 0.107915728386056 0.107915728386056
+14305 9322 7829 0.125883411444605 0.125883411444605
+14306 7829 9323 0.0108681676592021 0.0108681676592021
+14339 5536 6469 0.142307267119589 0.142307267119589
+14309 2191 9060 0.337657954437192 0.337657954437192
+14312 8501 9324 0.0507516559976904 0.0507516559976904
+14313 9324 8418 0.0529402152835436 0.0529402152835436
+14314 8418 9204 0.0536170041098827 0.0536170041098827
+16428 9891 9892 0.0636662665142278 0.0636662665142278
+14316 9204 8416 0.0537868101405785 0.0537868101405785
+14317 8416 4388 0.0529171329453403 0.0529171329453403
+14318 4388 9325 0.0509479826022637 0.0509479826022637
+14319 9325 3012 0.0488022545854277 0.0488022545854277
+14320 3012 9326 0.0106897373905654 0.0106897373905654
+14321 9326 9327 0.0465239604768105 0.0465239604768105
+14322 9327 5968 0.0526629141875595 0.0526629141875595
+14323 5968 7574 0.106363762970419 0.106363762970419
+14324 7574 3677 0.190331060201359 0.190331060201359
+14326 604 9328 0.0383191315904674 0.0383191315904674
+14327 9328 8962 0.0878512488922689 0.0878512488922689
+14336 2420 3233 0.140764271648617 0.140764271648617
+14337 3233 5753 0.137661630591373 0.137661630591373
+14338 5753 5536 0.137436976875483 0.137436976875483
+14340 6469 8679 0.121371092902246 0.121371092902246
+14341 8679 9329 0.0309595800848719 0.0309595800848719
+20573 10860 10861 0.0279030600601915 0.0279030600601915
+14342 6914 8116 0.133600464645887 0.133600464645887
+14343 8116 2483 0.133445859176034 0.133445859176034
+14344 2483 2482 0.047686047945258 0.047686047945258
+14345 2482 2821 0.0880230568241511 0.0880230568241511
+14346 2821 1413 0.131238509050086 0.131238509050086
+14347 1413 1353 0.132733599584258 0.132733599584258
+14348 1353 7767 0.0733149237137966 0.0733149237137966
+14350 6729 2454 0.137919009046371 0.137919009046371
+14351 2454 3222 0.134234515444875 0.134234515444875
+14352 3222 5743 0.134597141931663 0.134597141931663
+14353 5743 5520 0.133175062767026 0.133175062767026
+14355 6454 6914 0.135018185869381 0.135018185869381
+14358 9331 5721 0.0487615183925519 0.0487615183925519
+14359 5721 7455 0.0500566721474228 0.0500566721474228
+14360 7455 7439 0.0502188861539984 0.0502188861539984
+14361 7439 9332 0.0497229240568787 0.0497229240568787
+14362 9332 7179 0.0495263907597367 0.0495263907597367
+14363 7179 6514 0.0494836674166392 0.0494836674166392
+14364 6514 7769 0.0494751212766029 0.0494751212766029
+14365 7769 8353 0.0493044680149371 0.0493044680149371
+14366 8353 1088 0.0496035740367965 0.0496035740367965
+14367 1088 9333 0.0494070055394434 0.0494070055394434
+18206 10280 8329 0.00812836711491393 0.00812836711491393
+14368 9333 7511 0.0493300687211978 0.0493300687211978
+14369 7511 9334 0.0505963663421883 0.0505963663421883
+14370 9334 3859 0.0512115816031079 0.0512115816031079
+14371 3859 7593 0.0500990561172611 0.0500990561172611
+14372 7593 5584 0.0522011302499861 0.0522011302499861
+14376 6393 4066 0.134479200667361 0.134479200667361
+17290 7744 10084 0.402391291558362 0.402391291558362
+14377 4066 8345 0.135023999423797 0.135023999423797
+14378 8345 9290 0.135014881750995 0.135014881750995
+14380 9290 8343 0.132811220384574 0.132811220384574
+14381 8343 4290 0.133533987407519 0.133533987407519
+14382 4290 9335 0.135902936474728 0.135902936474728
+14383 9335 3489 0.0587665939642116 0.0587665939642116
+14384 3489 7712 0.0755904198902593 0.0755904198902593
+14385 7712 27 0.134715758792357 0.134715758792357
+14386 27 2969 0.137103389587981 0.137103389587981
+14387 2969 9336 0.0109860620784292 0.0109860620784292
+14388 9336 9337 0.167759812178903 0.167759812178903
+14389 9337 9206 0.00926254133366712 0.00926254133366712
+14390 9206 8977 0.0113535458246787 0.0113535458246787
+14391 8977 8972 0.0088289433819593 0.0088289433819593
+14392 8972 3592 0.0571990081351957 0.0571990081351957
+14393 3592 9338 0.0469245704560806 0.0469245704560806
+14394 9338 9339 0.0729443531618577 0.0729443531618577
+14395 9339 8232 0.00668286428887123 0.00668286428887123
+14396 8232 9340 0.00979627303730314 0.00979627303730314
+14397 9340 9341 0.118389238398527 0.118389238398527
+14398 9341 4525 0.00524840053732967 0.00524840053732967
+14399 4525 9342 0.013599142214923 0.013599142214923
+17917 5630 5173 0.1998812615077 0.1998812615077
+14400 9342 5242 0.122003116630053 0.122003116630053
+14401 5242 6892 0.132288650893496 0.132288650893496
+14402 6892 9343 0.135024052446379 0.135024052446379
+14403 9343 1682 0.135717283468362 0.135717283468362
+14404 1682 9344 0.13652220484586 0.13652220484586
+14405 9344 9345 0.105458278319657 0.105458278319657
+14406 9345 2418 0.102009831688775 0.102009831688775
+14407 2418 3242 0.101232559655988 0.101232559655988
+14408 3242 5748 0.0982858511104491 0.0982858511104491
+14409 5748 374 0.0623624460797668 0.0623624460797668
+14410 374 5523 0.0701701821949803 0.0701701821949803
+14411 5523 6457 0.135950108709595 0.135950108709595
+14412 6457 6915 0.143043041710545 0.143043041710545
+14413 6915 8113 0.201708935806819 0.201708935806819
+14414 8113 2832 0.20096393469179 0.20096393469179
+14415 2832 9346 0.204633312594591 0.204633312594591
+14416 9346 414 0.202451705011007 0.202451705011007
+14417 414 9347 0.0102632917291373 0.0102632917291373
+14419 9348 9349 0.0562572963351917 0.0562572963351917
+14420 9349 8300 0.00966827703924115 0.00966827703924115
+14421 8300 6777 0.0385409578619094 0.0385409578619094
+14422 6777 1544 0.0462211024255861 0.0462211024255861
+14423 1544 7912 0.0490573153021717 0.0490573153021717
+14424 7912 1233 0.049290008691593 0.049290008691593
+14426 6137 1235 0.0484278864865507 0.0484278864865507
+14427 1235 4023 0.0513600630217092 0.0513600630217092
+14429 9350 6747 0.132068580931606 0.132068580931606
+14430 6747 6147 0.133962898476652 0.133962898476652
+14431 6147 4021 0.132523387247295 0.132523387247295
+14432 4021 7025 0.136778977327424 0.136778977327424
+14433 7025 7395 0.133533581691074 0.133533581691074
+14434 7395 3404 0.129273092410981 0.129273092410981
+14437 6743 6143 0.132668974575322 0.132668974575322
+14439 4017 7021 0.135416440349126 0.135416440349126
+15949 9764 9765 0.0507119344408952 0.0507119344408952
+14440 7021 2253 0.0670945211351968 0.0670945211351968
+14441 2253 7391 0.0705505249778064 0.0705505249778064
+14442 7391 8378 0.0284601613193826 0.0284601613193826
+14443 8378 9352 0.0168078916798857 0.0168078916798857
+14444 9352 9164 0.0309569561418734 0.0309569561418734
+14445 9164 3399 0.0498252251835071 0.0498252251835071
+14446 3399 9201 0.0503897904067021 0.0503897904067021
+14447 9201 8373 0.0497143012199282 0.0497143012199282
+14448 8373 9353 0.0509790068650631 0.0509790068650631
+14449 9353 7441 0.0496189650212473 0.0496189650212473
+14450 7441 7159 0.100702050774509 0.100702050774509
+14451 7159 9354 0.0494661713985568 0.0494661713985568
+14452 9354 7771 0.0505861336269105 0.0505861336269105
+14453 7771 9120 0.0493839312690347 0.0493839312690347
+14454 9120 1112 0.0512647827333792 0.0512647827333792
+14455 1112 9355 0.0498795134320378 0.0498795134320378
+14456 9355 7492 0.0488194630548967 0.0488194630548967
+14457 7492 9168 0.0520827219058429 0.0520827219058429
+14460 9356 8961 0.0504011792295747 0.0504011792295747
+14461 8961 3748 0.0493839208030821 0.0493839208030821
+14462 3748 6769 0.0968984775923487 0.0968984775923487
+14463 6769 6149 0.102435146849327 0.102435146849327
+14465 3994 7051 0.102115193238577 0.102115193238577
+14466 7051 1408 0.0946641824527164 0.0946641824527164
+14467 1408 7388 0.085462530975882 0.085462530975882
+14468 7388 7384 0.0170925061959903 0.0170925061959903
+18773 9634 9642 0.177090825598433 0.177090825598433
+14469 7384 3431 0.0989346539047275 0.0989346539047275
+14470 3431 7700 0.0518438186201772 0.0518438186201772
+14471 7700 5704 0.048946112444104 0.048946112444104
+14472 5704 9357 0.0519385112225497 0.0519385112225497
+14473 9357 7431 0.0487842422429383 0.0487842422429383
+14474 7431 9358 0.0504551193593522 0.0504551193593522
+14475 9358 7172 0.0479047859915454 0.0479047859915454
+14476 7172 6792 0.0511502123352556 0.0511502123352556
+14477 6792 7632 0.00188047440472113 0.00188047440472113
+14478 7632 7787 0.0496192518214323 0.0496192518214323
+14480 9359 8535 0.0508077855400009 0.0508077855400009
+14481 8535 6765 0.145782759028854 0.145782759028854
+14482 6765 3990 0.201170058672575 0.201170058672575
+14484 1252 9360 0.0508116162596578 0.0508116162596578
+14485 9360 2713 0.151002345273532 0.151002345273532
+14486 2713 9361 0.150151679268698 0.150151679268698
+14487 9361 9345 0.0467087251829664 0.0467087251829664
+14489 604 9362 0.304555126012675 0.304555126012675
+19303 10466 10464 0.0570509910756543 0.0570509910756543
+14490 9362 3931 0.0491525010465484 0.0491525010465484
+14491 3931 5621 0.101973762448865 0.101973762448865
+14492 5621 3706 0.101962569966911 0.101962569966911
+14493 3706 712 0.103443032392629 0.103443032392629
+14494 712 9192 0.0968373320357312 0.0968373320357312
+14495 9192 9363 0.0080975223718546 0.0080975223718546
+14496 9363 8516 0.0893732443225825 0.0893732443225825
+14497 8516 4192 0.13424362136155 0.13424362136155
+14498 4192 2518 0.136440133151325 0.136440133151325
+14499 2518 6729 0.134978640871206 0.134978640871206
+14500 6729 1227 0.0997687727623418 0.0997687727623418
+14501 1227 4806 0.0366740513167213 0.0366740513167213
+14502 4806 4807 0.0623613194343192 0.0623613194343192
+14503 4807 9364 0.0735708513932139 0.0735708513932139
+14505 2172 9365 0.10218559205586 0.10218559205586
+14506 9365 6421 0.131466128237451 0.131466128237451
+14507 6421 4627 0.133072729014262 0.133072729014262
+14508 4627 1251 0.132619751836754 0.132619751836754
+14509 1251 9366 0.0509582244384895 0.0509582244384895
+14510 9366 4559 0.0827794726054668 0.0827794726054668
+14511 4559 2712 0.0689589814233185 0.0689589814233185
+14512 2712 2728 0.0619836012735683 0.0619836012735683
+14513 2728 9367 0.087518882590742 0.087518882590742
+14514 9367 9344 0.0476225838725891 0.0476225838725891
+14515 9344 9368 0.00985438954363147 0.00985438954363147
+14516 9368 9369 0.0491094576501381 0.0491094576501381
+18778 10124 10345 0.0125614259192805 0.0125614259192805
+14517 9369 7774 0.00626697755243391 0.00626697755243391
+14518 7774 6761 0.141378168804538 0.141378168804538
+14519 6761 3985 0.199192140414955 0.199192140414955
+14521 7053 7044 0.0653254811284965 0.0653254811284965
+14522 7044 7387 0.0682830004024069 0.0682830004024069
+14523 7387 3430 0.133588924605445 0.133588924605445
+14524 3430 7686 0.0503796411863715 0.0503796411863715
+14525 7686 5703 0.0508582113883613 0.0508582113883613
+14526 5703 9370 0.0488667197641872 0.0488667197641872
+14527 9370 7429 0.0516445969542144 0.0516445969542144
+14528 7429 9371 0.0490112318671292 0.0490112318671292
+14529 9371 7171 0.0508482971319457 0.0508482971319457
+14530 7171 7624 0.0496771306838175 0.0496771306838175
+14531 7624 7786 0.0493747865229187 0.0493747865229187
+14532 7786 6545 0.0503324450079726 0.0503324450079726
+14533 6545 1130 0.0509050056370777 0.0509050056370777
+14534 1130 9372 0.0485943238040251 0.0485943238040251
+14535 9372 7501 0.0507738202300539 0.0507738202300539
+14536 7501 3847 0.101870167526128 0.101870167526128
+14537 3847 9373 0.0504389434046066 0.0504389434046066
+14538 9373 5568 0.0510557052627446 0.0510557052627446
+14539 5568 7550 0.0950790701641584 0.0950790701641584
+18779 10345 10346 0.00436025817920743 0.00436025817920743
+14540 7550 9374 0.691166878065482 0.691166878065482
+14542 9375 3750 0.0991970412293978 0.0991970412293978
+14543 3750 6775 0.030090245676364 0.030090245676364
+14544 6775 6770 0.06895159402243 0.06895159402243
+14545 6770 6151 0.0638158634824408 0.0638158634824408
+14546 6151 6150 0.0359509846886602 0.0359509846886602
+14547 6150 3996 0.0963309366011696 0.0963309366011696
+14548 3996 7052 0.102479688313932 0.102479688313932
+14549 7052 7045 0.0330120960596164 0.0330120960596164
+14550 7045 1410 0.0660204937565387 0.0660204937565387
+14551 1410 7375 0.0682166301368544 0.0682166301368544
+14552 7375 7385 0.0295959064634691 0.0295959064634691
+14553 7385 3434 0.103723384358152 0.103723384358152
+14554 3434 7763 0.0498679267683769 0.0498679267683769
+14555 7763 5714 0.0489397855227354 0.0489397855227354
+14556 5714 9376 0.0504544990745908 0.0504544990745908
+14557 9376 7434 0.0512120959316622 0.0512120959316622
+14558 7434 9377 0.0478236988076173 0.0478236988076173
+14559 9377 7173 0.0504644501870281 0.0504644501870281
+14560 7173 6757 0.0487932478126772 0.0487932478126772
+14561 6757 7788 0.0524425771479912 0.0524425771479912
+14562 7788 6629 0.0465854765801166 0.0465854765801166
+14563 6629 1135 0.050756073904441 0.050756073904441
+14564 1135 6996 0.0489590899927541 0.0489590899927541
+14565 6996 7502 0.0500614988346772 0.0500614988346772
+14566 7502 9378 0.0592142721743878 0.0592142721743878
+14567 9378 9379 0.0408406813526211 0.0408406813526211
+14568 9379 7525 0.051644217383113 0.051644217383113
+14569 7525 9380 0.00488834581127681 0.00488834581127681
+14570 9380 9381 0.0137184453378057 0.0137184453378057
+14571 9381 5577 0.0352923239739852 0.0352923239739852
+14572 5577 9382 0.0499195542635391 0.0499195542635391
+14573 9382 9383 0.00207675636441744 0.00207675636441744
+14574 9383 9384 0.047500863548095 0.047500863548095
+14575 9384 9385 0.692939297157353 0.692939297157353
+14576 9347 9386 0.0638147684012153 0.0638147684012153
+14578 9386 7985 0.00659385915044033 0.00659385915044033
+14579 7985 9389 0.0876122732807676 0.0876122732807676
+14581 9390 9391 0.0645406329993705 0.0645406329993705
+14583 9391 413 0.0102638039419597 0.0102638039419597
+14584 413 9392 0.19657163498794 0.19657163498794
+14586 2833 2489 0.134959283423391 0.134959283423391
+14587 2489 8106 0.133489509437131 0.133489509437131
+14588 8106 9375 0.13422540798818 0.13422540798818
+14589 9375 5534 0.213451017222507 0.213451017222507
+14590 5534 9356 0.201724072155003 0.201724072155003
+14591 9356 9393 0.10196574773319 0.10196574773319
+14592 9393 9359 0.100498646625457 0.100498646625457
+14593 9359 9394 0.0995312761976722 0.0995312761976722
+14594 9394 9368 0.101332513335273 0.101332513335273
+14595 9368 9395 0.0524188937894899 0.0524188937894899
+14597 7373 1659 0.103861210410172 0.103861210410172
+14598 1659 7753 0.101665764300136 0.101665764300136
+14599 7753 6893 0.102477314257262 0.102477314257262
+14600 6893 5249 0.10178809746081 0.10178809746081
+14601 5249 9396 0.145009648698155 0.145009648698155
+14602 9396 5880 0.0121536325330439 0.0121536325330439
+14603 5880 9397 0.00548191654733534 0.00548191654733534
+14606 8233 9399 0.00646043089308406 0.00646043089308406
+14607 9399 3593 0.11814466181621 0.11814466181621
+14608 3593 8990 0.0502713142680652 0.0502713142680652
+14610 8994 8444 0.0112418070839832 0.0112418070839832
+14611 8444 9400 0.0106637167987107 0.0106637167987107
+14612 9400 9401 0.175022698409133 0.175022698409133
+14613 9401 2970 0.0101077489563562 0.0101077489563562
+15358 9566 9564 0.0244609132808449 0.0244609132808449
+15359 9564 9567 0.0131773798008107 0.0131773798008107
+18780 10346 10347 0.0407216504299826 0.0407216504299826
+14614 2970 8339 0.136426769448966 0.136426769448966
+14615 8339 9348 0.135169766224191 0.135169766224191
+17064 4880 9474 0.196578675384766 0.196578675384766
+14616 9348 9402 0.134813162708373 0.134813162708373
+14618 9350 8341 0.135569890655856 0.135569890655856
+14619 8341 9291 0.132813255317002 0.132813255317002
+14620 9291 9403 0.135124075128598 0.135124075128598
+14621 9403 9351 0.135070525267418 0.135070525267418
+14622 9351 6393 0.134155373542404 0.134155373542404
+14624 9393 8920 0.0508713694865286 0.0508713694865286
+14625 8920 6767 0.14583235659915 0.14583235659915
+14626 6767 3992 0.20138079206452 0.20138079206452
+14628 9389 6049 0.0198174454501223 0.0198174454501223
+14629 6049 5790 0.202409458864074 0.202409458864074
+14630 5790 9404 0.390889741592557 0.390889741592557
+14631 9389 8000 0.0874325326194809 0.0874325326194809
+14632 8000 9390 0.00587109212749533 0.00587109212749533
+14634 9405 9387 0.104292734331338 0.104292734331338
+14643 6926 912 0.0399977157837286 0.0399977157837286
+14645 3853 9379 0.0160272455480019 0.0160272455480019
+14646 9379 8109 0.188409381404142 0.188409381404142
+14647 8109 9407 0.202174997774683 0.202174997774683
+18781 10347 10348 0.0132995316754344 0.0132995316754344
+14649 5569 7551 0.0943021955909244 0.0943021955909244
+14650 7551 9408 0.692224615113747 0.692224615113747
+14651 7543 9409 0.0534301345278006 0.0534301345278006
+14652 6725 4821 0.0796194906426482 0.0796194906426482
+14653 4821 2511 0.108135424106199 0.108135424106199
+14654 2511 8224 0.0376491716837282 0.0376491716837282
+14787 9415 9416 0.31094582672675 0.31094582672675
+14791 2891 8923 0.457832400708685 0.457832400708685
+14793 5024 3335 0.0983906046596767 0.0983906046596767
+14795 7882 7337 0.102026433082927 0.102026433082927
+14796 7337 7986 0.092185977990205 0.092185977990205
+14797 7986 2055 0.0946262859427162 0.0946262859427162
+14798 2055 2661 0.105023750774947 0.105023750774947
+14799 2661 4134 0.100547305543173 0.100547305543173
+14800 4134 6697 0.0891067622100312 0.0891067622100312
+14801 6697 8020 0.0955965901798936 0.0955965901798936
+14802 8020 7684 0.0959578997394599 0.0959578997394599
+14803 7684 3458 0.0944062286409825 0.0944062286409825
+14804 3458 9418 0.046227752797198 0.046227752797198
+14805 9418 6020 0.0461318959590008 0.0461318959590008
+14806 6020 9419 0.0476773807861996 0.0476773807861996
+19851 10660 10659 0.00933491084100046 0.00933491084100046
+14807 9419 9420 0.0464971294902911 0.0464971294902911
+14808 9420 9421 0.0470997921907546 0.0470997921907546
+14809 9421 858 0.0457230540386264 0.0457230540386264
+14810 858 453 0.0467078777528092 0.0467078777528092
+14811 453 7106 0.0457758284617094 0.0457758284617094
+14812 7106 457 0.0455135048722811 0.0455135048722811
+14813 457 9422 0.0463689143813771 0.0463689143813771
+14815 9423 9424 0.00582356405087118 0.00582356405087118
+14817 9425 6432 0.0926350815349589 0.0926350815349589
+14818 6432 4657 0.117278685803448 0.117278685803448
+14819 4657 1280 0.116593491044555 0.116593491044555
+14820 1280 4531 0.132186730302242 0.132186730302242
+14951 7670 9457 3.41600373692151 3.41600373692151
+14952 3583 7612 0.0941905477613176 0.0941905477613176
+14953 7612 7265 0.0936588343585109 0.0936588343585109
+14955 7584 2001 0.0944700456489753 0.0944700456489753
+14956 2001 3361 0.0949233780276755 0.0949233780276755
+14957 3361 2755 0.0936752171867012 0.0936752171867012
+14958 2755 7006 0.0959502415519421 0.0959502415519421
+14959 7006 2281 0.099513679348955 0.099513679348955
+14960 2281 3582 0.100891029071921 0.100891029071921
+14961 3582 7528 0.100887947066067 0.100887947066067
+14962 7528 2136 0.103412071247308 0.103412071247308
+14963 2136 5993 0.100671897064821 0.100671897064821
+14964 5993 7673 0.0999667195935639 0.0999667195935639
+14986 8886 7162 0.0452381047162121 0.0452381047162121
+14985 8878 8886 0.104437941202429 0.104437941202429
+14987 7162 9309 0.0512658726512666 0.0512658726512666
+15109 7996 6927 0.0217805821755954 0.0217805821755954
+15110 6927 5675 0.030815905152866 0.030815905152866
+14965 7673 9461 2.89733038736532 2.89733038736532
+14966 8151 7610 0.094248596661074 0.094248596661074
+15088 2328 9485 2.88346551451846 2.88346551451846
+15089 9486 3468 0.447301506508283 0.447301506508283
+15090 3468 3445 0.0309512876225537 0.0309512876225537
+15091 3445 7699 0.105014135175069 0.105014135175069
+15092 7699 9487 0.105691765273947 0.105691765273947
+15093 9487 6684 0.102061996358298 0.102061996358298
+15094 6684 4128 0.108739719526669 0.108739719526669
+15095 4128 9488 0.104836941153267 0.104836941153267
+15096 9488 2082 0.105803010632854 0.105803010632854
+15097 2082 7334 0.1052078044876 0.1052078044876
+15101 9489 2994 0.0812267643509346 0.0812267643509346
+15105 2996 4851 0.0525302115232072 0.0525302115232072
+15106 4851 7227 0.0344830493164063 0.0344830493164063
+15107 7227 2369 0.0550241369558443 0.0550241369558443
+15108 2369 7996 0.056554238974086 0.056554238974086
+16370 9877 8705 0.102117755919592 0.102117755919592
+16371 8705 9486 0.014467692878557 0.014467692878557
+16373 8076 3329 0.0677844820507112 0.0677844820507112
+16374 3329 7880 0.139626392785753 0.139626392785753
+16375 7880 7333 0.105584363104376 0.105584363104376
+16376 7333 2081 0.10500807653965 0.10500807653965
+16377 2081 2678 0.105119136499329 0.105119136499329
+16491 6692 8028 0.103532298857838 0.103532298857838
+16379 4127 6683 0.108621189217377 0.108621189217377
+16385 9881 9882 0.0163548118473388 0.0163548118473388
+16386 9882 9458 0.0203986664758761 0.0203986664758761
+16394 3281 9883 0.00468216635493236 0.00468216635493236
+16396 9884 9458 0.0218243339760988 0.0218243339760988
+16398 9883 9884 0.00648970201006769 0.00648970201006769
+16400 9885 9886 0.267423928903385 0.267423928903385
+16401 9886 9880 0.296075289776302 0.296075289776302
+16403 9878 9881 0.0274154521009071 0.0274154521009071
+16404 9881 9887 0.0188694353495207 0.0188694353495207
+16405 9887 9888 0.0187489585891175 0.0187489585891175
+19509 10534 10535 0.00388440521802765 0.00388440521802765
+16425 3407 9890 0.502103946549802 0.502103946549802
+16426 9890 3331 0.0251683632208894 0.0251683632208894
+16481 7888 3680 0.0532502584498927 0.0532502584498927
+16483 4595 8006 0.101626087251738 0.101626087251738
+16484 8006 580 0.022127419381672 0.022127419381672
+16485 580 7979 0.165894151722243 0.165894151722243
+16486 7979 9923 0.0456395565118553 0.0456395565118553
+16487 9923 2066 0.0539845223115493 0.0539845223115493
+16488 2066 2641 0.100182277305196 0.100182277305196
+16489 2641 4107 0.0977431302735631 0.0977431302735631
+16490 4107 6692 0.10418977795868 0.10418977795868
+16492 8028 7698 0.0982299872130606 0.0982299872130606
+16493 7698 3443 0.0993337912559461 0.0993337912559461
+16494 3443 6011 0.101499429536563 0.101499429536563
+16495 6011 3878 0.0977083732706848 0.0977083732706848
+16496 3878 9924 0.0991972529095445 0.0991972529095445
+16497 9924 420 0.100553893040038 0.100553893040038
+16504 8592 9925 0.120377099914021 0.120377099914021
+16505 9925 9926 0.107491921110891 0.107491921110891
+16506 9926 9927 0.123107053114174 0.123107053114174
+16517 8288 3009 0.0410924117477314 0.0410924117477314
+16519 9451 4779 0.246284579163 0.246284579163
+16520 4779 6557 0.132912762129515 0.132912762129515
+16521 6557 9306 0.107414375743234 0.107414375743234
+16523 5147 9150 0.0526798805531595 0.0526798805531595
+16527 862 703 0.202686588734239 0.202686588734239
+16528 703 9924 0.202942846886287 0.202942846886287
+16533 9141 9155 0.0471076181125112 0.0471076181125112
+16549 9936 8118 0.163748197039451 0.163748197039451
+16550 8118 4329 0.102460572786022 0.102460572786022
+16551 4329 9932 0.0509040459853039 0.0509040459853039
+16552 9932 5034 0.0506801147751554 0.0506801147751554
+16553 5034 9935 0.0507841642169636 0.0507841642169636
+16554 9935 7991 0.0519996695117493 0.0519996695117493
+16555 7991 9939 0.0501954054420559 0.0501954054420559
+16557 2889 8382 0.106173445564903 0.106173445564903
+16558 8382 8542 0.105198351895408 0.105198351895408
+16559 8542 4730 0.104923019039301 0.104923019039301
+16560 4730 6797 0.109090547930583 0.109090547930583
+16561 6797 7349 0.101581569748298 0.101581569748298
+16562 7349 5395 0.107089477151985 0.107089477151985
+16563 5395 8556 0.104796077599276 0.104796077599276
+17270 82 7309 0.202171029293651 0.202171029293651
+16564 8556 3897 0.106860413590027 0.106860413590027
+16565 3897 1030 0.106538064092827 0.106538064092827
+16566 1030 6272 0.104663636918357 0.104663636918357
+16567 6272 9940 0.0522044777389819 0.0522044777389819
+16568 9940 9941 0.0539741744852114 0.0539741744852114
+16570 5969 9942 0.0525274850765404 0.0525274850765404
+16571 9942 9943 0.0464624768491459 0.0464624768491459
+16572 9943 3013 0.00948387351005329 0.00948387351005329
+16573 3013 9944 0.0499659888588949 0.0499659888588949
+16574 9944 4387 0.0525459349585223 0.0525459349585223
+16575 4387 8415 0.053989635677053 0.053989635677053
+16576 8415 9945 0.0518942546071768 0.0518942546071768
+16577 9945 8419 0.054710567315966 0.054710567315966
+16578 8419 9946 0.0495941326709913 0.0495941326709913
+16579 9946 8502 0.0543577768356107 0.0543577768356107
+16580 8502 8537 0.0523876514778538 0.0523876514778538
+16581 8537 9591 0.106159293603162 0.106159293603162
+16582 9591 9318 0.0186755424929809 0.0186755424929809
+16584 3674 9947 0.0925100597395306 0.0925100597395306
+16585 9947 9936 0.0741653442201567 0.0741653442201567
+16586 9936 5811 0.0698256524972049 0.0698256524972049
+16587 5811 7575 0.109874082628797 0.109874082628797
+16588 7575 8407 0.0534887493842637 0.0534887493842637
+16589 8407 5969 0.0514820185730379 0.0514820185730379
+16615 5811 5357 0.148515460139762 0.148515460139762
+16616 5357 8119 0.104815937410374 0.104815937410374
+16621 9938 9956 0.0146143299800706 0.0146143299800706
+16622 9956 9957 0.0128596804561102 0.0128596804561102
+16624 9958 9959 0.0111717692412778 0.0111717692412778
+16625 9959 9960 0.00928483420505699 0.00928483420505699
+16626 9960 9938 0.0070355984277229 0.0070355984277229
+16628 9961 9962 0.526903283655783 0.526903283655783
+16630 9963 9312 1.46582798607179 1.46582798607179
+16633 9965 9966 0.00412165910041822 0.00412165910041822
+16634 9966 9967 0.0757681110838303 0.0757681110838303
+16638 9965 9957 0.0717225435233069 0.0717225435233069
+16640 9964 9958 0.0807216833328343 0.0807216833328343
+16642 9967 9956 0.0290555152245672 0.0290555152245672
+16645 565 7092 0.0721739648747923 0.0721739648747923
+16646 7092 9969 0.0060839008927764 0.0060839008927764
+16658 651 9973 0.109528403212781 0.109528403212781
+16660 3165 8089 0.106908291090671 0.106908291090671
+16662 9927 8897 0.00902355166325831 0.00902355166325831
+16663 8897 8899 0.00817755039331079 0.00817755039331079
+16665 8896 8898 0.0955954321276197 0.0955954321276197
+16666 8898 3166 0.0120380596695599 0.0120380596695599
+16726 3074 5275 0.102580698126288 0.102580698126288
+16727 5275 6866 0.0979724094285353 0.0979724094285353
+17386 5920 919 0.177782086780631 0.177782086780631
+16728 6866 5172 0.198907590330119 0.198907590330119
+16730 8563 6368 0.270917565484422 0.270917565484422
+16731 6368 9149 0.131210826087923 0.131210826087923
+16779 73 3512 0.203753724402901 0.203753724402901
+16780 3512 4254 0.201507995491671 0.201507995491671
+16781 4254 8742 0.199898657335298 0.199898657335298
+16782 8742 8713 0.201418841949 0.201418841949
+16784 3511 4252 0.198740800817733 0.198740800817733
+16785 4252 8741 0.201811596521788 0.201811596521788
+16786 8741 8712 0.201811329628688 0.201811329628688
+16794 4264 8747 0.202686112287629 0.202686112287629
+16795 8747 8718 0.200629598901607 0.200629598901607
+16797 4264 9864 0.0549036584382557 0.0549036584382557
+16798 9864 6516 0.0494449113838383 0.0494449113838383
+16799 6516 9855 0.048981731510525 0.048981731510525
+16800 9855 6160 0.0501282016561891 0.0501282016561891
+16801 6160 9852 0.0487763612951203 0.0487763612951203
+16802 9852 2738 0.0474245519497852 0.0474245519497852
+16803 2738 9267 0.050437767682916 0.050437767682916
+16804 9267 4512 0.0485383641713966 0.0485383641713966
+16805 4512 9858 0.0494525517955229 0.0494525517955229
+16807 3171 9861 0.047855446066228 0.047855446066228
+16808 9861 4996 0.0491871460939442 0.0491871460939442
+16810 728 3665 0.0984709387661759 0.0984709387661759
+16811 3665 7315 0.0976596112157836 0.0976596112157836
+16812 7315 4586 0.099898936211385 0.099898936211385
+16813 4586 8032 0.100609280081376 0.100609280081376
+16814 8032 6372 0.100607138332673 0.100607138332673
+16815 6372 10015 0.0481181392934118 0.0481181392934118
+16816 10015 4826 0.0474935217651045 0.0474935217651045
+16817 4826 8954 0.102669069502609 0.102669069502609
+16818 8954 8956 0.0962963283421786 0.0962963283421786
+16819 8956 10016 0.0513191391251647 0.0513191391251647
+16820 10016 8816 0.0499640269903021 0.0499640269903021
+16821 8816 8828 0.0154260311566384 0.0154260311566384
+16822 8828 8206 0.163758839265649 0.163758839265649
+16824 7312 87 0.200996583193063 0.200996583193063
+16825 87 3523 0.203555810471145 0.203555810471145
+16826 3523 4264 0.199602301480838 0.199602301480838
+16828 7312 3648 0.154169800390109 0.154169800390109
+16832 10017 593 0.487939330962151 0.487939330962151
+16851 8718 9866 0.0548710295017979 0.0548710295017979
+16854 9854 6162 0.0501051333475743 0.0501051333475743
+16855 6162 9851 0.0483439490024107 0.0483439490024107
+16856 9851 2740 0.0471290060929331 0.0471290060929331
+16857 2740 9863 0.0493697108471136 0.0493697108471136
+16858 9863 5231 0.0496606668462506 0.0496606668462506
+16859 5231 9857 0.0497084193128251 0.0497084193128251
+16860 9857 3173 0.0501789646371779 0.0501789646371779
+16861 3173 9860 0.0494391268160734 0.0494391268160734
+16862 9860 4998 0.0489685461673918 0.0489685461673918
+16863 4998 10023 0.0484162493280967 0.0484162493280967
+16864 10023 730 0.0507353905968115 0.0507353905968115
+16865 730 7061 0.101358904320696 0.101358904320696
+16867 8718 5830 0.204166330856198 0.204166330856198
+16868 5830 7737 0.202033972193846 0.202033972193846
+16869 7737 10024 0.307945705057077 0.307945705057077
+16870 594 7303 0.202197872623945 0.202197872623945
+16871 7303 66 0.20266387330283 0.20266387330283
+16872 66 3507 0.204877942956717 0.204877942956717
+16873 3507 233 0.199133503403233 0.199133503403233
+16874 233 8739 0.200473333247617 0.200473333247617
+16876 9203 4390 0.147691017735613 0.147691017735613
+16878 1943 10025 0.122583563426404 0.122583563426404
+16879 10025 7860 0.110082433757866 0.110082433757866
+16880 7860 4679 0.101138191051348 0.101138191051348
+16881 4679 4942 0.0999327202014087 0.0999327202014087
+16882 4942 7214 0.0998696563081419 0.0998696563081419
+16883 7214 4928 0.0376169687692631 0.0376169687692631
+16884 4928 9636 0.014060573587084 0.014060573587084
+16886 9870 1167 0.138451400347842 0.138451400347842
+16887 1167 887 0.138706454254422 0.138706454254422
+16888 887 4471 0.139683302205089 0.139683302205089
+16890 9488 1170 0.13939401140641 0.13939401140641
+16891 1170 890 0.137058995578611 0.137058995578611
+16892 890 4474 0.140851028519895 0.140851028519895
+16893 4474 2796 0.132878137732711 0.132878137732711
+16894 2796 5265 0.13228574865076 0.13228574865076
+16895 5265 10026 0.123565762779561 0.123565762779561
+16896 5633 7143 0.082551113540924 0.082551113540924
+16899 8743 4255 0.199339176026767 0.199339176026767
+16905 6305 6456 0.135927811837651 0.135927811837651
+16906 6456 5521 0.134557743068365 0.134557743068365
+16907 5521 5744 0.134669392965434 0.134669392965434
+16908 5744 3224 0.133413468985769 0.133413468985769
+16909 3224 2456 0.134335811293817 0.134335811293817
+16910 2456 9365 0.137895860915298 0.137895860915298
+16911 9365 1677 0.134681074434199 0.134681074434199
+16912 1677 10027 0.135027096454707 0.135027096454707
+16913 10027 6891 0.134223449290887 0.134223449290887
+16914 6891 5239 0.133857055503606 0.133857055503606
+16915 5239 4520 0.134947645289316 0.134947645289316
+16916 4520 8229 0.133768415422039 0.133768415422039
+16917 8229 6091 0.136267738734572 0.136267738734572
+16918 6091 7927 0.0726325260844626 0.0726325260844626
+16919 7927 7846 0.0557691009082279 0.0557691009082279
+16920 7846 9410 0.0110872018563396 0.0110872018563396
+16921 9410 6730 0.0681749492551086 0.0681749492551086
+16922 6730 10028 0.0472579211328822 0.0472579211328822
+16923 10028 2954 0.0113307920442751 0.0113307920442751
+16924 2954 10029 0.0100409346238736 0.0100409346238736
+16925 10029 6168 0.125005736653953 0.125005736653953
+16926 6168 7701 0.0662611499745025 0.0662611499745025
+16927 7701 8987 0.0202942911891754 0.0202942911891754
+16928 8987 9213 0.01474166778393 0.01474166778393
+16929 9213 7708 0.0256851882115953 0.0256851882115953
+16930 7708 10030 0.0413405317485577 0.0413405317485577
+16931 10030 10031 0.036234422910969 0.036234422910969
+16932 10031 9423 0.0490701245377313 0.0490701245377313
+16934 10027 6419 0.132846643372958 0.132846643372958
+16935 6419 4626 0.132395451164353 0.132395451164353
+16936 4626 1249 0.132966501814055 0.132966501814055
+16937 1249 4558 0.132618380312988 0.132618380312988
+16938 4558 2727 0.131821083937229 0.131821083937229
+16939 2727 9343 0.133429127887654 0.133429127887654
+16941 8228 10032 0.0522172382940556 0.0522172382940556
+16942 10032 4519 0.0809723084454978 0.0809723084454978
+16943 4519 5238 0.135835767836828 0.135835767836828
+16944 5238 6890 0.133656501060031 0.133656501060031
+16945 6890 8682 0.133080513446367 0.133080513446367
+16946 8682 10033 0.014533820296874 0.014533820296874
+16947 10033 10034 0.045058130648326 0.045058130648326
+16948 10034 10035 0.0185816236497386 0.0185816236497386
+16949 10035 1675 0.0576680457580287 0.0576680457580287
+16950 1675 9364 0.135024432224183 0.135024432224183
+16955 10039 10040 0.0721995210382621 0.0721995210382621
+16958 10037 10041 0.0717852961267022 0.0717852961267022
+16966 10043 10031 0.025182886777608 0.025182886777608
+16969 10045 10039 0.0209823477511839 0.0209823477511839
+16971 8478 9438 0.0521271400869927 0.0521271400869927
+16972 9438 8905 0.0558565070780073 0.0558565070780073
+16974 8478 4846 0.326789742990523 0.326789742990523
+17070 9465 4599 0.173875508685798 0.173875508685798
+16976 8474 1065 0.0530498075975429 0.0530498075975429
+16977 1065 1604 0.0517738709202157 0.0517738709202157
+16978 1604 2199 0.109121538786623 0.109121538786623
+16979 2199 4846 0.101668961251418 0.101668961251418
+16981 8583 10046 0.0456665785984412 0.0456665785984412
+16982 10046 8467 0.0226345136731024 0.0226345136731024
+16983 8467 9624 0.0229241644266869 0.0229241644266869
+16985 2321 10047 0.097235186001144 0.097235186001144
+16987 4279 6406 0.146870704035985 0.146870704035985
+16988 6406 635 0.144187230253749 0.144187230253749
+16989 635 5325 0.14662773102424 0.14662773102424
+16990 5325 2031 0.146219173461136 0.146219173461136
+19672 10610 10608 0.149537813443153 0.149537813443153
+16991 2031 7082 0.144853503450252 0.144853503450252
+16992 7082 5509 0.146165117461088 0.146165117461088
+16993 5509 4460 0.146698487596664 0.146698487596664
+16994 4460 6579 0.146306787683811 0.146306787683811
+16995 6579 8050 0.147127627497255 0.147127627497255
+16996 8050 998 0.0663040704360148 0.0663040704360148
+16997 998 8404 0.225438240771773 0.225438240771773
+16998 8404 9322 0.147049060577026 0.147049060577026
+16999 9322 8853 0.146215405021224 0.146215405021224
+17000 8853 7901 0.148314641191611 0.148314641191611
+17001 7901 8294 0.139664345335099 0.139664345335099
+17002 8294 8275 0.153027219017765 0.153027219017765
+17003 8275 5787 0.145945595293254 0.145945595293254
+17004 5787 4818 0.144804477618788 0.144804477618788
+17005 4818 10048 0.148574277364319 0.148574277364319
+17006 10048 10049 0.141579838501947 0.141579838501947
+17007 10049 10050 0.0340492732837983 0.0340492732837983
+17012 10052 2402 0.196242393649725 0.196242393649725
+17032 8989 10060 0.00622693936167768 0.00622693936167768
+17033 10060 10061 0.0756461423573197 0.0756461423573197
+17034 10061 2960 0.00915137839377932 0.00915137839377932
+17036 9211 23 0.0239583762029722 0.0239583762029722
+17042 1225 7845 0.140995210775646 0.140995210775646
+17043 7845 6089 0.129051193087075 0.129051193087075
+17044 6089 8226 0.135326560563343 0.135326560563343
+17107 6692 328 0.0434519039634918 0.0434519039634918
+17046 1226 8903 0.113651762618459 0.113651762618459
+17048 10065 6628 1.29415946940766 1.29415946940766
+17050 10066 4340 0.062140618563636 0.062140618563636
+17051 4340 5636 0.138107358521106 0.138107358521106
+17052 5636 3565 0.143998480732308 0.143998480732308
+17053 3565 824 0.136450026224328 0.136450026224328
+17054 824 7840 0.139827641423356 0.139827641423356
+17055 7840 10067 0.139718785770158 0.139718785770158
+17056 10067 8131 0.276864248380317 0.276864248380317
+17058 2251 4883 0.177313835055438 0.177313835055438
+17059 4883 9473 0.195033286388948 0.195033286388948
+17060 9473 5482 0.176110607852179 0.176110607852179
+17187 10072 4065 0.107057267328692 0.107057267328692
+17188 4065 8344 0.135746766447532 0.135746766447532
+17189 8344 9289 0.134278993416053 0.134278993416053
+17190 9289 8342 0.133553201715071 0.133553201715071
+17191 8342 4289 0.132478531756059 0.132478531756059
+17192 4289 8346 0.0683305663670944 0.0683305663670944
+17193 8346 9426 0.0684183152680821 0.0684183152680821
+17194 9426 3584 0.0602567059919197 0.0602567059919197
+17195 3584 7710 0.0737335540738928 0.0737335540738928
+17196 7710 26 0.134781615428443 0.134781615428443
+17197 26 2966 0.136258381357618 0.136258381357618
+17256 4853 9479 0.17362135223772 0.17362135223772
+17257 9479 5456 0.178335939458279 0.178335939458279
+17258 5456 10081 0.171904914212928 0.171904914212928
+17259 10081 9468 0.0143846440391869 0.0143846440391869
+17260 9468 651 0.173171640777506 0.173171640777506
+17261 651 9463 0.177611656329381 0.177611656329381
+17262 9463 4619 0.178590206270819 0.178590206270819
+17263 4619 6483 0.145677633501431 0.145677633501431
+17264 6483 5356 0.195804224423801 0.195804224423801
+17272 3269 7248 0.202454633754466 0.202454633754466
+17273 7248 1925 0.201278474909205 0.201278474909205
+17274 1925 6124 0.199550873736161 0.199550873736161
+17275 6124 3214 0.201694321030812 0.201694321030812
+17277 8746 4263 0.201096167532594 0.201096167532594
+17278 4263 3522 0.200484985070532 0.200484985070532
+17279 3522 86 0.203786942061633 0.203786942061633
+17280 86 7311 0.202274691239897 0.202274691239897
+17313 8120 4330 0.101819432050732 0.101819432050732
+17314 4330 9933 0.0499862309964707 0.0499862309964707
+17315 9933 5036 0.0532026214375408 0.0532026214375408
+17316 5036 9934 0.0508858224299175 0.0508858224299175
+17317 9934 7989 0.0496485523816978 0.0496485523816978
+17318 7989 10087 0.0512786229284607 0.0512786229284607
+17319 10087 2893 0.052637962933787 0.052637962933787
+17320 2893 8384 0.104983198266762 0.104983198266762
+17321 8384 8544 0.106333933974543 0.106333933974543
+17322 8544 4732 0.104863197448763 0.104863197448763
+17323 4732 6799 0.109607467159477 0.109607467159477
+17325 7351 5397 0.105666168592591 0.105666168592591
+17326 5397 10067 0.0531956914071383 0.0531956914071383
+17327 10067 8558 0.0516135381916136 0.0516135381916136
+17328 8558 3899 0.109335032698536 0.109335032698536
+17329 3899 1035 0.101631825737619 0.101631825737619
+17330 1035 10070 0.0547697896222192 0.0547697896222192
+17331 10070 6274 0.051631982755097 0.051631982755097
+17332 6274 10071 0.0521047224845183 0.0521047224845183
+17333 10071 10088 0.0548081026494783 0.0548081026494783
+17334 10088 581 0.115692672611639 0.115692672611639
+17335 581 3544 1.0812915383048 1.0812915383048
+17336 3544 10089 0.426746641833072 0.426746641833072
+17337 10089 8702 0.015131733429425 0.015131733429425
+17338 8702 8151 0.097451189179214 0.097451189179214
+17340 1827 3084 0.201158270757163 0.201158270757163
+17341 3084 3196 0.201063388532037 0.201063388532037
+17342 3196 6111 0.203191571447184 0.203191571447184
+17343 6111 1904 0.198857964292004 0.198857964292004
+17344 1904 7240 0.195269710490606 0.195269710490606
+17345 7240 3253 0.196518038239943 0.196518038239943
+17347 10090 3086 0.200629327787617 0.200629327787617
+17348 3086 3198 0.202620201680719 0.202620201680719
+17349 3198 6113 0.202237159025195 0.202237159025195
+17350 6113 1907 0.200888583811516 0.200888583811516
+17351 1907 7242 0.194884252844044 0.194884252844044
+17352 7242 9217 0.00483789456398776 0.00483789456398776
+17353 9217 3256 0.188566052149982 0.188566052149982
+17354 3256 9215 0.0119202066492219 0.0119202066492219
+17355 9215 7298 0.204144558375252 0.204144558375252
+17356 7298 41 0.19415380637197 0.19415380637197
+17357 41 3541 0.205611824864656 0.205611824864656
+17358 3541 4237 0.201941106279095 0.201941106279095
+17359 4237 1797 0.206450634390855 0.206450634390855
+17360 1797 6524 0.103413068253841 0.103413068253841
+17377 9185 10092 0.0314361336881962 0.0314361336881962
+17384 10093 10094 0.234828178944131 0.234828178944131
+17401 4251 8740 0.200540582414647 0.200540582414647
+17403 10096 4253 0.402448073126268 0.402448073126268
+17404 4253 71 0.405085488859101 0.405085488859101
+17409 7246 3265 0.200993245572831 0.200993245572831
+17410 3265 7307 0.200743622516842 0.200743622516842
+17411 7307 77 0.204688793990349 0.204688793990349
+17413 10097 10082 0.0500367848211035 0.0500367848211035
+17415 10098 10099 0.0500389645311151 0.0500389645311151
+17416 10099 10082 0.0162280043989145 0.0162280043989145
+17418 10100 10101 0.0207018118679025 0.0207018118679025
+17430 10092 10048 0.0309885486655971 0.0309885486655971
+17431 10048 8614 0.0518778938210734 0.0518778938210734
+17432 8614 8472 0.0531907688732488 0.0531907688732488
+17433 8472 1066 0.0523689032311119 0.0523689032311119
+17434 1066 1606 0.051557001219416 0.051557001219416
+17435 1606 8366 0.139200065042292 0.139200065042292
+17437 6713 10092 0.0743345743256074 0.0743345743256074
+17441 3193 3081 0.201349842824614 0.201349842824614
+17442 3081 10108 0.178416289777232 0.178416289777232
+17444 3193 6109 0.202397968765167 0.202397968765167
+17445 6109 1899 0.201875824929032 0.201875824929032
+17446 1899 7237 0.199007784951822 0.199007784951822
+17447 7237 3247 0.203972993087409 0.203972993087409
+17449 10109 7288 0.156689817874906 0.156689817874906
+17450 7288 33 0.190916174685026 0.190916174685026
+17451 33 3532 0.205910894729705 0.205910894729705
+17452 3532 6522 0.0640042155752525 0.0640042155752525
+17454 3078 3192 0.201894846275699 0.201894846275699
+17455 3192 6108 0.201673919779454 0.201673919779454
+17456 6108 1898 0.20260827746412 0.20260827746412
+17457 1898 7236 0.20276033286578 0.20276033286578
+17458 7236 3246 0.202520180127379 0.202520180127379
+17459 3246 10110 0.0550544054800148 0.0550544054800148
+17460 10110 7286 0.154666066923182 0.154666066923182
+17461 7286 29 0.190176683040096 0.190176683040096
+17463 1900 7238 0.196467409698081 0.196467409698081
+17464 7238 3249 0.197271278467775 0.197271278467775
+17465 3249 7293 0.215893772854934 0.215893772854934
+17466 7293 35 0.191661158901488 0.191661158901488
+17467 35 3534 0.208592623812739 0.208592623812739
+17468 3534 6523 0.163291338158479 0.163291338158479
+17470 10108 5278 0.0774622106782589 0.0774622106782589
+17471 5278 3080 0.101220750760019 0.101220750760019
+17472 3080 3193 0.201400503113628 0.201400503113628
+17474 5940 471 0.312751802930415 0.312751802930415
+18580 7765 5716 0.0511772806374418 0.0511772806374418
+17491 10112 10093 0.359402757134602 0.359402757134602
+17492 10093 10113 0.194903624807864 0.194903624807864
+17493 10113 2201 0.0582804268216835 0.0582804268216835
+17494 2201 10114 0.186967502007765 0.186967502007765
+17495 10114 8390 0.0733141120559894 0.0733141120559894
+17496 8390 10115 0.462273198293161 0.462273198293161
+17498 9631 400 0.267469433354519 0.267469433354519
+17531 10127 4931 0.0143150280274793 0.0143150280274793
+17499 400 10116 0.288854082427149 0.288854082427149
+17500 10116 10117 0.226779392941661 0.226779392941661
+17539 8982 8937 0.19614593492264 0.19614593492264
+17501 10117 10118 0.252256323985904 0.252256323985904
+17502 10118 8413 0.301706026949727 0.301706026949727
+17504 10094 9835 0.207906613588927 0.207906613588927
+17542 10131 10132 0.234004969584105 0.234004969584105
+17547 8426 8983 0.15801309875704 0.15801309875704
+17550 10130 10134 0.614829488291655 0.614829488291655
+17551 7135 4849 0.106906878995063 0.106906878995063
+17552 4849 915 0.103932392061615 0.103932392061615
+17553 915 2299 0.103080430089244 0.103080430089244
+17554 2299 10137 0.014910815675823 0.014910815675823
+17556 10137 9054 0.0810396295718394 0.0810396295718394
+17558 10138 6943 0.064892686762443 0.064892686762443
+17559 6943 8140 0.201702874937987 0.201702874937987
+17560 8140 10139 0.469612869716675 0.469612869716675
+17562 7137 211 0.0939410437080962 0.0939410437080962
+17563 211 480 0.0535285680999835 0.0535285680999835
+17598 6899 5259 0.128421696790864 0.128421696790864
+17566 8539 10140 0.135369629803794 0.135369629803794
+17568 10141 10142 0.0931846548427409 0.0931846548427409
+17575 10147 10148 0.0907607828573939 0.0907607828573939
+17576 10148 9823 0.350917184183612 0.350917184183612
+17577 9823 9805 0.0148959688810153 0.0148959688810153
+17578 9805 10149 0.0247571116201832 0.0247571116201832
+17579 10149 8243 0.229215025506836 0.229215025506836
+17580 8243 9502 0.0511227471188157 0.0511227471188157
+17581 9502 7326 0.0563854594047154 0.0563854594047154
+17582 7326 5762 0.0999481200631645 0.0999481200631645
+17583 5762 7873 0.0518041802099649 0.0518041802099649
+17584 7873 10150 0.102000136506063 0.102000136506063
+17585 10150 5014 0.098101103191891 0.098101103191891
+17586 5014 5058 0.089850875454823 0.089850875454823
+18718 7866 4048 0.178217561946718 0.178217561946718
+17587 5058 10151 0.211959888507267 0.211959888507267
+17589 215 9282 0.125167866609679 0.125167866609679
+17591 213 9816 0.299047510838406 0.299047510838406
+17593 9229 9826 0.176982927136907 0.176982927136907
+17595 6940 10152 0.0583015149781026 0.0583015149781026
+18120 6030 10257 0.0455676937571294 0.0455676937571294
+17597 5060 6899 0.402535335538281 0.402535335538281
+17599 5259 2791 0.130368767280199 0.130368767280199
+17600 2791 4469 0.135446736738612 0.135446736738612
+17601 4469 884 0.138505584507757 0.138505584507757
+17602 884 1164 0.139078051750381 0.139078051750381
+17603 1164 9871 0.139057579408235 0.139057579408235
+17604 9871 8075 0.138249096495162 0.138249096495162
+17605 8075 10153 0.00462704346608534 0.00462704346608534
+17606 10153 3043 0.14110788802663 0.14110788802663
+17607 3043 6341 0.135895639019006 0.135895639019006
+17608 6341 4343 0.137400774019599 0.137400774019599
+17609 4343 5639 0.138956387861239 0.138956387861239
+17610 5639 3570 0.141821620771527 0.141821620771527
+17611 3570 830 0.137661147763222 0.137661147763222
+17612 830 7843 0.140550687821679 0.140550687821679
+17613 7843 10088 0.137593188904098 0.137593188904098
+17614 10088 9941 0.137660243266343 0.137660243266343
+17615 9941 8135 0.139584464123887 0.139584464123887
+17616 8135 3690 0.141707714550209 0.141707714550209
+17617 3690 4596 0.241404416022683 0.241404416022683
+17619 5016 3319 0.0948083090873271 0.0948083090873271
+17620 3319 8996 0.0798486506362173 0.0798486506362173
+17621 8996 7874 0.0190759275307072 0.0190759275307072
+17622 7874 5755 0.0623471034770475 0.0623471034770475
+17623 5755 5758 0.0361266791563275 0.0361266791563275
+17624 5758 7327 0.0520708883616353 0.0520708883616353
+17626 5016 10154 0.164101634929309 0.164101634929309
+17627 10155 2882 0.710681950052773 0.710681950052773
+17629 8136 6947 0.130119100803365 0.130119100803365
+17630 6947 10156 0.0163542378359644 0.0163542378359644
+17631 10156 10157 0.00955659663824098 0.00955659663824098
+17632 10157 10158 0.00677541465471327 0.00677541465471327
+17633 10158 10152 0.00293705056146173 0.00293705056146173
+17634 10152 6939 0.0371287028604903 0.0371287028604903
+17636 3318 10150 0.0438638328395073 0.0438638328395073
+17714 9945 8394 0.147641485758692 0.147641485758692
+17659 10160 586 0.405583280940818 0.405583280940818
+17672 10163 8930 0.930392444069162 0.930392444069162
+17675 9053 10164 0.0371557833436508 0.0371557833436508
+17693 2913 2780 0.0748123840669465 0.0748123840669465
+17694 2780 7147 0.116677483921202 0.116677483921202
+17696 9056 10047 0.141134759881648 0.141134759881648
+17698 7147 5254 0.0284105210258417 0.0284105210258417
+17699 5254 10166 0.132906284217118 0.132906284217118
+17701 6403 10167 0.108541157226703 0.108541157226703
+17703 6403 6401 0.049228330409525 0.049228330409525
+17705 10168 10169 0.0501555453420122 0.0501555453420122
+17707 10047 10169 0.0474349977604191 0.0474349977604191
+17708 10169 9056 0.0939811582148226 0.0939811582148226
+17710 9947 3675 0.0669754214474556 0.0669754214474556
+17712 9204 9945 0.144775125391256 0.144775125391256
+17715 8394 2691 0.147869553829969 0.147869553829969
+17716 2691 8040 0.145836065451416 0.145836065451416
+17717 8040 6567 0.144877875233717 0.144877875233717
+17718 6567 4448 0.14778294563884 0.14778294563884
+17719 4448 8414 0.0749502518363333 0.0749502518363333
+17720 8414 5496 0.069451420913351 0.069451420913351
+17721 5496 7070 0.148876703091943 0.148876703091943
+17722 7070 2040 0.14567151330703 0.14567151330703
+17723 2040 8073 0.130264739930752 0.130264739930752
+17725 8076 3328 0.0639927694114461 0.0639927694114461
+17728 7879 7332 0.105697567981392 0.105697567981392
+17730 2080 2677 0.104069678874741 0.104069678874741
+17731 2677 4126 0.107112553379611 0.107112553379611
+17732 4126 6682 0.108353172096875 0.108353172096875
+17734 7925 5320 0.0826824039230849 0.0826824039230849
+17735 5320 2041 0.146468953410165 0.146468953410165
+17736 2041 7072 0.146479190259677 0.146479190259677
+17737 7072 5498 0.148482454254276 0.148482454254276
+17738 5498 4450 0.145207190897223 0.145207190897223
+17739 4450 6569 0.147094399400618 0.147094399400618
+17740 6569 8042 0.145385409804858 0.145385409804858
+17741 8042 2693 0.146247210391541 0.146247210391541
+17742 2693 8396 0.145676314519276 0.145676314519276
+17743 8396 9946 0.148129197746433 0.148129197746433
+17744 9946 9324 0.145860656071838 0.145860656071838
+17745 9324 10171 0.0856023563285992 0.0856023563285992
+17746 10171 7893 0.060719319188507 0.060719319188507
+17747 7893 10172 0.145992330998255 0.145992330998255
+17749 8285 5779 0.146744468691812 0.146744468691812
+17750 5779 8575 0.145685998707777 0.145685998707777
+17752 6706 10173 0.0983542102154105 0.0983542102154105
+17754 8485 10174 0.145917669946454 0.145917669946454
+17755 10174 4934 0.364858401137942 0.364858401137942
+17757 8073 5319 0.0151134525874084 0.0151134525874084
+17758 5319 2906 0.0542680076543073 0.0542680076543073
+17760 9487 1173 0.143948575233632 0.143948575233632
+17761 1173 893 0.138648954033686 0.138648954033686
+17762 893 4476 0.138420042799995 0.138420042799995
+17763 4476 2799 0.139158608638433 0.139158608638433
+17764 2799 5267 0.125667753140422 0.125667753140422
+17765 5267 6904 0.122725840536987 0.122725840536987
+17766 6904 7758 0.206944002479267 0.206944002479267
+17767 7758 6358 0.203735904589123 0.203735904589123
+17768 6358 2391 0.110758482838084 0.110758482838084
+17769 2391 7822 0.137036631860385 0.137036631860385
+17771 9877 903 0.274330614761652 0.274330614761652
+17772 903 9481 0.129817379023696 0.129817379023696
+17775 5984 2102 0.100487934544075 0.100487934544075
+17776 2102 6508 0.243143603771944 0.243143603771944
+17778 6993 399 0.279873647693424 0.279873647693424
+17779 399 10175 0.059173942672277 0.059173942672277
+17780 10175 6196 0.0719242777998184 0.0719242777998184
+17782 6196 10175 0.0719242777998184 0.0719242777998184
+17784 10175 10177 0.187235722056553 0.187235722056553
+17789 998 8512 0.0641582208600105 0.0641582208600105
+17790 8512 3305 0.0698159988608895 0.0698159988608895
+17802 9953 10171 0.0758245915635617 0.0758245915635617
+17803 10171 8417 0.0691188092256886 0.0691188092256886
+17804 8417 7892 0.0154287387029138 0.0154287387029138
+17805 7892 9203 0.0639309073349984 0.0639309073349984
+17844 5741 5515 0.1393794725611 0.1393794725611
+17807 998 2698 0.471311768879255 0.471311768879255
+17809 2563 997 0.102700798846865 0.102700798846865
+17811 9490 10181 0.787839518624737 0.787839518624737
+17813 10182 10183 0.017972037737444 0.017972037737444
+17814 8277 10182 0.0269375538426571 0.0269375538426571
+17824 10189 9815 0.381548994115635 0.381548994115635
+17826 10190 2445 0.108497544218855 0.108497544218855
+17827 2445 3235 0.140113229632804 0.140113229632804
+17828 3235 5740 0.13721905173768 0.13721905173768
+17829 5740 5514 0.142685575827079 0.142685575827079
+17830 5514 6451 0.135469883258712 0.135469883258712
+17831 6451 6918 0.118104639956123 0.118104639956123
+17832 6918 8114 0.200145379388081 0.200145379388081
+17841 10191 2446 0.12170288352426 0.12170288352426
+17842 2446 3236 0.138990302772576 0.138990302772576
+17843 3236 5741 0.138828799197264 0.138828799197264
+17845 5515 6452 0.137212079229824 0.137212079229824
+17846 6452 6919 0.118102418388258 0.118102418388258
+17847 6919 8115 0.204539971673672 0.204539971673672
+17848 8115 2817 0.195950897476267 0.195950897476267
+17850 1418 10192 0.0403415193863986 0.0403415193863986
+17854 10196 10197 0.298773764193864 0.298773764193864
+17858 10197 10201 0.0878537760845695 0.0878537760845695
+17859 10202 292 0.12590153135235 0.12590153135235
+17860 292 10203 0.0920635687067585 0.0920635687067585
+17862 8296 912 0.421752257927472 0.421752257927472
+17863 912 7280 0.346969669094077 0.346969669094077
+17865 7279 911 0.343598202777143 0.343598202777143
+17866 911 8296 0.421457000722742 0.421457000722742
+17899 10211 10209 0.112127267328736 0.112127267328736
+17868 10204 293 0.122668884457017 0.122668884457017
+17870 7280 10204 0.11154380602626 0.11154380602626
+17872 7280 10202 0.113468069847095 0.113468069847095
+17874 10203 305 0.0245172766294025 0.0245172766294025
+17876 10205 9191 0.0917966102805814 0.0917966102805814
+17877 9191 9065 0.0437309955207218 0.0437309955207218
+17879 305 7972 0.0096955565592884 0.0096955565592884
+17880 7972 289 0.0364664216753188 0.0364664216753188
+17882 291 10205 0.0247656280633611 0.0247656280633611
+17884 5356 3010 0.0411976507153233 0.0411976507153233
+17885 3010 9955 0.055133452370554 0.055133452370554
+17887 4390 9202 0.103596100254428 0.103596100254428
+17888 9202 10172 0.106228487315193 0.106228487315193
+17889 10172 8635 0.104885206719794 0.104885206719794
+17890 8635 10207 0.0526738998782486 0.0526738998782486
+17891 10207 8290 0.0540408904782361 0.0540408904782361
+17893 10181 10208 0.34674805442663 0.34674805442663
+17895 9277 9062 0.54179107306149 0.54179107306149
+17897 10209 10210 0.15255018083046 0.15255018083046
+17901 9277 10208 0.265946775924501 0.265946775924501
+17902 10208 10211 0.215451375996435 0.215451375996435
+17904 4431 5085 0.143171262303537 0.143171262303537
+17905 5085 2810 0.11012443165944 0.11012443165944
+17906 2810 4675 0.158582360684903 0.158582360684903
+17908 10212 9184 0.112885017008347 0.112885017008347
+17909 9184 10213 0.167377068446941 0.167377068446941
+18960 10410 7220 0.0501782415904674 0.0501782415904674
+17922 6563 8888 0.042430320182906 0.042430320182906
+18662 7647 10214 0.0701815380438801 0.0701815380438801
+17924 6563 9296 0.044068382651895 0.044068382651895
+17926 10215 7090 0.0147548324313622 0.0147548324313622
+17928 10216 4749 0.0152354550229313 0.0152354550229313
+17930 7570 10217 0.020843135953545 0.020843135953545
+17931 10217 10218 0.00309719141124637 0.00309719141124637
+17932 10218 10219 0.0172058483004327 0.0172058483004327
+17933 10219 10220 0.0101474090092483 0.0101474090092483
+17934 10220 10221 0.0360135260366549 0.0360135260366549
+17972 4922 2816 0.0400924263132539 0.0400924263132539
+17974 2816 6585 0.00731734573972315 0.00731734573972315
+17975 6585 5367 0.200230086509337 0.200230086509337
+17976 5367 7125 0.155428268463703 0.155428268463703
+17977 7125 613 0.178580861083004 0.178580861083004
+17978 613 10025 0.175711834233665 0.175711834233665
+17979 10025 5802 0.173776139007193 0.173776139007193
+17981 10240 4687 0.0705066389488715 0.0705066389488715
+17983 4687 4687 0.000550727458732684 0.000550727458732684
+17984 4687 4687 0.000550727458732684 0.000550727458732684
+18009 8002 984 0.100041012213977 0.100041012213977
+17985 4687 10240 0.0700034048729296 0.0700034048729296
+18666 5656 5188 0.106406434125344 0.106406434125344
+17988 7225 10241 0.0510702903225008 0.0510702903225008
+17989 10241 10242 0.042886354540747 0.042886354540747
+17990 10242 10243 0.00251406456949564 0.00251406456949564
+17991 10243 10244 0.0456685462506317 0.0456685462506317
+17992 10244 6646 0.0418628731234282 0.0418628731234282
+17993 6646 10245 0.0664019508555837 0.0664019508555837
+17994 10245 3947 0.060646848519195 0.060646848519195
+17995 3947 5379 0.0623892176423501 0.0623892176423501
+17997 1213 10080 0.0402726084737909 0.0402726084737909
+17998 10080 10246 0.108362052771117 0.108362052771117
+17999 10246 10095 0.0546330327153493 0.0546330327153493
+18000 10095 8786 0.0549646837479 0.0549646837479
+18001 8786 8792 0.105830391023483 0.105830391023483
+18002 8792 3158 0.105240490373796 0.105240490373796
+18159 4090 6035 0.19402761072914 0.19402761072914
+18003 3158 4977 0.10185576028858 0.10185576028858
+18004 4977 10247 0.0996051433548501 0.0996051433548501
+18005 10247 9657 0.103966153648075 0.103966153648075
+18006 9657 6607 0.0489689324196462 0.0489689324196462
+18007 6607 5049 0.0497044916016373 0.0497044916016373
+18008 5049 8002 0.0987213073079673 0.0987213073079673
+18010 984 5105 0.0497125648622764 0.0497125648622764
+18011 5105 8832 0.0485496698653307 0.0485496698653307
+18012 8832 9412 0.0501680163419149 0.0501680163419149
+18013 9412 7150 0.0490112280018507 0.0490112280018507
+18014 7150 2798 0.0490643527188194 0.0490643527188194
+18015 2798 5116 0.0499797709026575 0.0499797709026575
+18016 5116 9330 0.049524695482998 0.049524695482998
+18017 9330 4715 0.0504823610322626 0.0504823610322626
+18018 4715 8873 0.0985202776506121 0.0985202776506121
+18019 8873 7354 0.0991107696717597 0.0991107696717597
+18020 7354 5413 0.108951695628557 0.108951695628557
+18022 8149 8697 0.098981334337126 0.098981334337126
+18023 8697 10248 0.0156545770448285 0.0156545770448285
+18025 10248 7104 0.0902072497093339 0.0902072497093339
+18026 7104 449 0.046531670732617 0.046531670732617
+18027 449 854 0.0445732430501775 0.0445732430501775
+18028 854 10249 0.0446596776858281 0.0446596776858281
+18029 10249 9698 0.0482515561513205 0.0482515561513205
+18030 9698 10250 0.0474036186605965 0.0474036186605965
+18031 10250 6018 0.047797038051314 0.047797038051314
+18032 6018 10251 0.0473952539943275 0.0473952539943275
+18033 10251 3455 0.0464887102201997 0.0464887102201997
+18034 3455 7682 0.0950045363584629 0.0950045363584629
+19711 10628 10629 0.0313669947000456 0.0313669947000456
+18035 7682 8018 0.0938092255843609 0.0938092255843609
+18036 8018 6695 0.0944228486315978 0.0944228486315978
+18037 6695 4132 0.0905761672491303 0.0905761672491303
+18727 7644 9832 0.176300161007389 0.176300161007389
+18729 6212 7649 0.275730709453964 0.275730709453964
+18038 4132 8863 0.0309494848264702 0.0309494848264702
+18039 8863 2633 0.0676202306028496 0.0676202306028496
+18040 2633 8861 0.0311034897002001 0.0311034897002001
+18041 8861 2052 0.0676910103216562 0.0676910103216562
+18042 2052 8871 0.0313177900642343 0.0313177900642343
+18043 8871 7982 0.067271802615166 0.067271802615166
+18044 7982 7981 0.0326778162339826 0.0326778162339826
+18045 7981 7321 0.0976461329299173 0.0976461329299173
+18046 7321 7887 0.0987923725207189 0.0987923725207189
+18047 7887 3343 0.0990941084892765 0.0990941084892765
+18048 3343 5022 0.0986991080291596 0.0986991080291596
+18049 5022 8729 0.0995709770506032 0.0995709770506032
+18050 8729 6262 0.0984844587143486 0.0984844587143486
+18051 6262 1012 0.100435040495632 0.100435040495632
+18052 1012 3920 0.0983845018704443 0.0983845018704443
+18053 3920 3146 0.0986126436689597 0.0986126436689597
+18054 3146 5413 0.0895267655685447 0.0895267655685447
+18056 7083 10246 0.183851267240735 0.183851267240735
+19713 10624 10625 0.048946191319968 0.048946191319968
+18057 10246 3811 0.198873820859187 0.198873820859187
+18058 3811 5919 0.153816946395634 0.153816946395634
+18059 5919 918 0.176756350909337 0.176756350909337
+18060 918 2205 0.200653782293274 0.200653782293274
+18061 2205 4854 0.158832380963048 0.158832380963048
+18062 4854 9478 0.174098421618631 0.174098421618631
+18063 9478 5457 0.176480352381434 0.176480352381434
+18065 10252 9243 0.056682383190515 0.056682383190515
+18067 9110 10252 0.0330932350677699 0.0330932350677699
+18069 10253 6203 0.215345161639468 0.215345161639468
+18071 9115 10254 0.0491155354462148 0.0491155354462148
+18075 10254 10255 0.0642041289943666 0.0642041289943666
+18076 10255 10253 0.0461489416178021 0.0461489416178021
+18077 10253 9108 0.280904320228077 0.280904320228077
+18106 4661 10263 0.0487469518611321 0.0487469518611321
+18107 10263 1291 0.0497384845482417 0.0497384845482417
+18108 1291 10264 0.0496989025904687 0.0496989025904687
+18109 10264 4563 0.0505706606603651 0.0505706606603651
+18110 4563 10265 0.0486836289638941 0.0486836289638941
+18111 10265 6287 0.0497296125808977 0.0497296125808977
+18112 6287 10135 0.0504212055729903 0.0504212055729903
+18113 10135 2731 0.0489350482169507 0.0489350482169507
+18114 2731 6420 0.048465461986869 0.048465461986869
+18115 6420 5790 0.0578817224647719 0.0578817224647719
+18117 8844 10266 0.374943168729483 0.374943168729483
+18166 2719 9346 0.101115603929332 0.101115603929332
+18167 9346 9392 0.0111914858812043 0.0111914858812043
+18168 9392 3751 0.0968414516342271 0.0968414516342271
+18169 3751 10278 0.0782538471461698 0.0782538471461698
+18175 4073 6058 0.198316836648763 0.198316836648763
+18176 6058 5798 0.200796475018558 0.200796475018558
+18197 6750 5252 0.185979531851002 0.185979531851002
+18198 5252 3974 0.035323188020151 0.035323188020151
+18200 9357 2431 0.202519432604137 0.202519432604137
+18201 2431 9370 0.199383622965617 0.199383622965617
+18202 9370 1686 0.206118508992277 0.206118508992277
+18203 1686 6875 0.204292305654176 0.204292305654176
+18588 6666 1137 0.0495387040987843 0.0495387040987843
+18589 1137 6968 0.0501615414722825 0.0501615414722825
+18590 6968 7504 0.0501273333828588 0.0501273333828588
+18591 7504 9407 0.0988444534637431 0.0988444534637431
+18592 9407 7479 0.0538727285881741 0.0538727285881741
+18593 7479 5581 0.0510099428615072 0.0510099428615072
+18594 5581 10328 0.0992130715738959 0.0992130715738959
+18595 10328 10329 0.693578278671619 0.693578278671619
+18597 1845 2579 0.175048810960168 0.175048810960168
+18598 2579 5177 0.17911429796522 0.17911429796522
+18599 5177 10332 0.0225943601934419 0.0225943601934419
+18604 6211 7648 0.275618961394926 0.275618961394926
+18605 7648 8065 0.262676196305861 0.262676196305861
+18711 2590 5183 0.178568260386205 0.178568260386205
+18712 5183 5651 0.104244503206479 0.104244503206479
+18747 6210 10338 0.0125158344567017 0.0125158344567017
+18748 10338 10206 0.0559739547988456 0.0559739547988456
+18749 10206 10338 0.0559739547988456 0.0559739547988456
+18751 2596 5186 0.177768815603995 0.177768815603995
+18758 2588 5182 0.176322049262719 0.176322049262719
+18759 5182 5650 0.106248688527315 0.106248688527315
+18765 10339 10341 0.0322810460432902 0.0322810460432902
+18767 4492 10342 0.0173161946805903 0.0173161946805903
+18768 10342 10341 0.00848220864637094 0.00848220864637094
+18770 5616 10343 0.00845077111169589 0.00845077111169589
+18771 10343 10344 0.0509950035054565 0.0509950035054565
+18772 10344 9634 0.100553817919852 0.100553817919852
+18950 6234 7639 0.179364622734642 0.179364622734642
+18789 10350 10131 1.72659496196287 1.72659496196287
+18791 10210 10350 0.0784105528331039 0.0784105528331039
+18793 9064 10351 0.108141289805084 0.108141289805084
+18795 10351 8944 0.165792281012932 0.165792281012932
+18797 8946 8970 0.101566925839608 0.101566925839608
+18805 431 8911 0.368100622266312 0.368100622266312
+18807 8935 10353 0.0653020622045421 0.0653020622045421
+18865 217 6354 0.250152442533131 0.250152442533131
+18867 10372 10373 0.00433033984408308 0.00433033984408308
+18809 2956 8964 0.839971785186466 0.839971785186466
+18811 10353 8914 0.0131507104865587 0.0131507104865587
+18813 10354 8436 0.0634565167907247 0.0634565167907247
+18815 8440 10354 0.130317184994069 0.130317184994069
+18818 8431 4422 0.07184295360215 0.07184295360215
+18820 8435 10355 0.137076541565926 0.137076541565926
+18825 9181 10356 0.159461421615407 0.159461421615407
+18827 10357 10358 0.20146281055654 0.20146281055654
+18829 9180 10359 0.028613707454695 0.028613707454695
+18833 10360 10361 0.0535066603860974 0.0535066603860974
+18835 10361 10362 0.0845690343766548 0.0845690343766548
+18836 10362 9179 0.0218653086870073 0.0218653086870073
+19605 10512 10584 0.0688213399515618 0.0688213399515618
+20576 10864 10865 0.0279630258161778 0.0279630258161778
+18838 10363 8434 0.438288246661524 0.438288246661524
+18840 8433 10364 0.0515496120111284 0.0515496120111284
+18842 10365 10363 0.0256601639624377 0.0256601639624377
+18844 10364 10365 0.0354783965202197 0.0354783965202197
+18848 10367 8387 0.416611762681733 0.416611762681733
+18850 10366 10367 0.0267687636085769 0.0267687636085769
+18852 10368 10369 0.0527715034881913 0.0527715034881913
+18854 10370 10368 0.0348446889076446 0.0348446889076446
+18856 10371 10370 0.031482834490968 0.031482834490968
+18858 9836 10370 0.0328670117804623 0.0328670117804623
+18921 10399 10400 0.0895277934361984 0.0895277934361984
+18922 10400 10401 0.16717380860502 0.16717380860502
+18923 10402 10383 0.0291115464827756 0.0291115464827756
+18924 10383 10403 0.0309778660865677 0.0309778660865677
+18925 10403 10390 0.0429604527526701 0.0429604527526701
+18927 10404 10405 0.0626862314087788 0.0626862314087788
+18930 10406 10405 0.108269005965165 0.108269005965165
+18932 1241 6737 0.0570520014832054 0.0570520014832054
+18934 8100 6923 0.164900679548878 0.164900679548878
+18936 6923 8099 0.163064822440362 0.163064822440362
+18938 7928 8098 0.0730856765280865 0.0730856765280865
+18940 4039 4644 0.0827836448037734 0.0827836448037734
+18943 10407 7448 0.103189406011465 0.103189406011465
+19852 10659 3379 0.102335766847439 0.102335766847439
+18945 4142 10108 0.0206474020512083 0.0206474020512083
+18947 5674 2620 0.178145491343884 0.178145491343884
+18948 2620 5201 0.177501253416424 0.177501253416424
+18949 5201 6234 0.174487220572856 0.174487220572856
+18951 7639 8773 0.176238488140281 0.176238488140281
+18952 8773 8053 0.178917033730472 0.178917033730472
+18953 8053 6598 0.176988972177145 0.176988972177145
+18954 6598 10243 0.175681180141988 0.175681180141988
+18956 1841 7856 0.0582284853716934 0.0582284853716934
+18957 7856 4669 0.101085168807405 0.101085168807405
+18979 1764 4509 0.0491583937075752 0.0491583937075752
+18980 4509 4971 0.0991296803100638 0.0991296803100638
+18981 4971 1516 0.0482432726972035 0.0482432726972035
+18982 1516 5304 0.0536166306041211 0.0536166306041211
+18983 5304 7951 0.0505628420768163 0.0505628420768163
+18984 7951 7950 0.0124795676036534 0.0124795676036534
+18985 7950 1083 0.0132964314605761 0.0132964314605761
+18986 1083 8958 0.019091432638578 0.019091432638578
+18987 8958 1750 0.0565301426139895 0.0565301426139895
+18988 1750 6636 0.100698502633469 0.100698502633469
+18989 6636 5425 0.0992142460676437 0.0992142460676437
+18990 5425 7398 0.100582854167636 0.100582854167636
+18992 5674 10413 0.0446816032988726 0.0446816032988726
+18993 10413 6641 0.0419959523464037 0.0419959523464037
+18994 6641 3958 0.140215488391596 0.140215488391596
+18997 9265 10213 0.108979878639585 0.108979878639585
+19957 10683 10676 0.203409384148671 0.203409384148671
+18998 10213 9182 0.221716360786737 0.221716360786737
+18999 9182 4360 0.00485021965067944 0.00485021965067944
+19000 4360 6082 0.123504109096694 0.123504109096694
+19240 10459 8221 0.147319836582293 0.147319836582293
+19002 1269 4533 0.203350040591983 0.203350040591983
+19003 4533 8579 0.198512187124204 0.198512187124204
+19005 1841 2613 0.177111353706323 0.177111353706323
+19006 2613 10414 0.0530626159965885 0.0530626159965885
+19007 10414 5196 0.124494794308613 0.124494794308613
+19008 5196 6239 0.171651899926933 0.171651899926933
+19010 4186 4182 0.0154308679587021 0.0154308679587021
+19011 4182 3367 0.101326829934178 0.101326829934178
+19012 3367 3370 0.0389167828857067 0.0389167828857067
+19013 3370 10415 0.0493793417329401 0.0493793417329401
+19014 10415 7424 0.0519282840216647 0.0519282840216647
+19015 7424 10416 0.0508505433229276 0.0508505433229276
+19016 10416 7831 0.0497300351350067 0.0497300351350067
+19017 7831 9197 0.188452322853961 0.188452322853961
+19019 5549 10417 0.0198343104325793 0.0198343104325793
+19020 10417 2562 0.366597076665755 0.366597076665755
+19021 2562 9783 0.236171353579108 0.236171353579108
+19022 9783 9781 0.00643634199106272 0.00643634199106272
+19958 10676 10668 0.135367639799285 0.135367639799285
+19023 9781 9160 0.00367738923970995 0.00367738923970995
+19025 9156 9260 0.0939135311905937 0.0939135311905937
+19040 10419 435 0.0296899237003876 0.0296899237003876
+19042 6361 6912 0.413025051484806 0.413025051484806
+19043 6912 5272 0.122458972713872 0.122458972713872
+19044 5272 2806 0.132101617817113 0.132101617817113
+19045 2806 9480 0.135002111088791 0.135002111088791
+19046 9480 901 0.134968752710231 0.134968752710231
+19048 9486 9873 0.018915562611857 0.018915562611857
+19049 9873 3055 0.182137362251337 0.182137362251337
+19050 3055 9669 0.205422822851571 0.205422822851571
+19051 9669 4352 0.202508200405289 0.202508200405289
+19052 4352 7924 0.0557579828978423 0.0557579828978423
+19053 7924 7923 0.106391305814005 0.106391305814005
+19054 7923 3580 0.0580075342624614 0.0580075342624614
+19055 3580 788 0.184224770380015 0.184224770380015
+19056 788 10089 0.199795465587569 0.199795465587569
+19057 10089 491 0.20084069572648 0.20084069572648
+19058 491 489 0.205477824650125 0.205477824650125
+19059 489 4589 0.272976340428597 0.272976340428597
+19060 4589 1978 0.12991989572877 0.12991989572877
+19061 1978 1994 0.0147512164813181 0.0147512164813181
+19062 1994 705 0.187141061542779 0.187141061542779
+19063 705 642 0.0623803538473296 0.0623803538473296
+19064 642 10422 0.140896965982946 0.140896965982946
+19067 9469 4898 0.180547202392339 0.180547202392339
+19068 4898 4899 0.0469687370152221 0.0469687370152221
+19069 4899 9422 0.11449972298661 0.11449972298661
+19070 9422 2230 0.0888113879114828 0.0888113879114828
+19071 2230 961 0.0851419553312056 0.0851419553312056
+19072 961 5943 0.118166848545009 0.118166848545009
+19073 5943 8869 0.0594604755013997 0.0594604755013997
+19074 8869 3766 0.149125823202066 0.149125823202066
+19075 3766 10248 0.200641473563849 0.200641473563849
+19076 10248 1211 0.0471365210908597 0.0471365210908597
+19077 1211 8567 0.147435833594552 0.147435833594552
+19078 8567 6541 0.161851618274563 0.161851618274563
+19079 6541 4746 0.176177241775495 0.176177241775495
+19081 4159 2359 0.17021782028236 0.17021782028236
+19082 2359 9694 0.178145500592375 0.178145500592375
+19083 9694 5170 0.174004040417809 0.174004040417809
+19085 6362 6447 0.0914589915157797 0.0914589915157797
+19086 6447 2399 0.0149004167256546 0.0149004167256546
+19087 2399 9454 0.2205749898237 0.2205749898237
+19089 519 831 0.121986604363099 0.121986604363099
+19090 831 10147 0.141772461765667 0.141772461765667
+19091 10147 10428 0.0119979325853114 0.0119979325853114
+19093 8145 9501 0.0198122134799104 0.0198122134799104
+19094 9501 1751 0.0440125388452957 0.0440125388452957
+19095 1751 6012 0.168131959250809 0.168131959250809
+19096 6012 832 0.205336624614562 0.205336624614562
+19097 832 518 0.168135736431663 0.168135736431663
+19098 518 6513 0.0279910233322091 0.0279910233322091
+19099 6513 10419 0.0139795197071191 0.0139795197071191
+19102 10049 8612 0.0522928783615643 0.0522928783615643
+19103 8612 8474 0.0521996072275175 0.0521996072275175
+19142 5220 8777 0.146640601075408 0.146640601075408
+19105 10430 10358 0.245136281681027 0.245136281681027
+19108 5628 9568 0.110078124608504 0.110078124608504
+19110 8421 10357 0.296407311680596 0.296407311680596
+19114 2386 9558 0.0348995825647377 0.0348995825647377
+19115 9558 8798 0.125658984531748 0.125658984531748
+19120 8185 9450 0.339524971346509 0.339524971346509
+19121 9450 8690 0.0176125961717604 0.0176125961717604
+19122 8690 7659 0.0477249226862614 0.0477249226862614
+19123 7659 6718 0.103225505465316 0.103225505465316
+19125 2190 8128 0.151455687504874 0.151455687504874
+19126 8128 7827 0.106341251390527 0.106341251390527
+19127 7827 10432 0.221434541654845 0.221434541654845
+19128 10432 6961 0.0131395719721806 0.0131395719721806
+19129 6961 10433 0.0134328380462519 0.0134328380462519
+19130 10433 10434 0.0869062764565781 0.0869062764565781
+19131 10434 8597 0.00983583049657532 0.00983583049657532
+19132 8597 10435 0.0222534876112211 0.0222534876112211
+19134 10050 3168 0.0821216282435351 0.0821216282435351
+19141 7961 5220 0.0901667996290929 0.0901667996290929
+19144 8388 10437 0.320984694668417 0.320984694668417
+19146 10437 6962 0.186002986440568 0.186002986440568
+19147 6962 10438 0.0184374963317956 0.0184374963317956
+19148 10438 1881 0.209774050468257 0.209774050468257
+19149 1881 8569 0.224745848084877 0.224745848084877
+19150 8569 9988 0.0831717180377924 0.0831717180377924
+19151 9988 8477 0.0648356679758423 0.0648356679758423
+19152 8477 8463 0.0835421546655635 0.0835421546655635
+19960 9517 10684 0.210192276965542 0.210192276965542
+19154 8800 8811 0.31904932389546 0.31904932389546
+19162 10428 3871 0.0534454265709194 0.0534454265709194
+19163 3871 840 0.0992542187222657 0.0992542187222657
+19164 840 4272 0.128018795895479 0.128018795895479
+19166 9283 10439 0.0445989165425857 0.0445989165425857
+19168 10440 9282 0.395349042842448 0.395349042842448
+19170 7136 2300 0.0954980884416659 0.0954980884416659
+19171 2300 6804 0.197911548357853 0.197911548357853
+19173 7956 8539 0.0718200140953678 0.0718200140953678
+19174 8539 9282 0.0117697082839477 0.0117697082839477
+19176 10442 1349 0.0573473302810492 0.0573473302810492
+19178 10443 8521 0.0309849382045455 0.0309849382045455
+19180 10151 10440 0.0401979143660666 0.0401979143660666
+19182 10439 5059 0.220890379574485 0.220890379574485
+19183 5059 5013 0.0908635547178716 0.0908635547178716
+19184 5013 3349 0.0925982666666752 0.0925982666666752
+19185 3349 7877 0.0609717199349519 0.0609717199349519
+19186 7877 5761 0.0981025803398981 0.0981025803398981
+19187 5761 7325 0.0996396951750833 0.0996396951750833
+19961 10684 10674 0.204298559687633 0.204298559687633
+19188 7325 2064 0.0938077886809335 0.0938077886809335
+20575 10863 10864 0.0111548544892698 0.0111548544892698
+19189 2064 2650 0.094440127839499 0.094440127839499
+19801 7638 6235 0.180302575380181 0.180302575380181
+19190 2650 10444 0.141197448312795 0.141197448312795
+19191 10444 9821 0.0323105619062287 0.0323105619062287
+19192 9821 9822 0.0144436267959073 0.0144436267959073
+19193 9822 3476 0.28088366035949 0.28088366035949
+19194 3476 10445 0.0704996285836985 0.0704996285836985
+19195 10445 10428 0.0905303391563005 0.0905303391563005
+19197 10167 10442 0.0431387292722099 0.0431387292722099
+19199 8408 8568 0.191490020507546 0.191490020507546
+19200 8568 10012 0.119004756390235 0.119004756390235
+19335 8631 10474 0.189944426919074 0.189944426919074
+19201 10012 8461 0.097400081996938 0.097400081996938
+19203 4275 3348 0.0888431357806069 0.0888431357806069
+19204 3348 7876 0.0640319779657538 0.0640319779657538
+19205 7876 5760 0.0967358830871852 0.0967358830871852
+19206 5760 7324 0.101239369924108 0.101239369924108
+19207 7324 2063 0.0946165731852714 0.0946165731852714
+19208 2063 2649 0.0935569331707932 0.0935569331707932
+19209 2649 4105 0.0971375052394303 0.0971375052394303
+19210 4105 6689 0.0855494277301445 0.0855494277301445
+19211 6689 356 0.101026474697068 0.101026474697068
+19212 356 7688 0.0921469063041614 0.0921469063041614
+19213 7688 3475 0.0946165920204556 0.0946165920204556
+19215 6939 9228 0.0827641347919428 0.0827641347919428
+19216 9228 6380 0.0767643689707359 0.0767643689707359
+19217 6380 5058 0.0447215279971903 0.0447215279971903
+19219 5015 3318 0.0976390934138488 0.0976390934138488
+19221 7829 10449 0.170073568021036 0.170073568021036
+19222 9276 9490 0.227893235973284 0.227893235973284
+19224 5808 10450 0.0444182254226453 0.0444182254226453
+19228 10452 10453 0.00899294746602318 0.00899294746602318
+19262 561 8788 0.108355823884287 0.108355823884287
+19264 10465 10081 0.106367191723871 0.106367191723871
+19265 10081 9467 0.08060964495203 0.08060964495203
+19376 8634 10174 0.107642527980188 0.107642527980188
+19283 1943 10467 0.139113140483037 0.139113140483037
+19284 10467 1941 0.145058671955531 0.145058671955531
+19309 10472 10450 0.0244300101434338 0.0244300101434338
+19310 10450 6986 0.0907684588887198 0.0907684588887198
+19311 6986 649 0.0550434251335652 0.0550434251335652
+19312 649 9973 0.0116984093357102 0.0116984093357102
+19313 9973 6700 0.0127993614182147 0.0127993614182147
+20578 10796 10801 0.065843170036926 0.065843170036926
+19315 5030 10465 0.0131766099040461 0.0131766099040461
+19316 10465 339 0.0452586039857602 0.0452586039857602
+19317 339 10468 0.0402192785877108 0.0402192785877108
+19318 10468 1941 0.0852977829408983 0.0852977829408983
+19319 1941 610 0.177606555639393 0.177606555639393
+19320 610 4852 0.177691892562915 0.177691892562915
+19321 4852 2203 0.156985921773534 0.156985921773534
+19324 5917 1620 0.152034755665853 0.152034755665853
+19325 1620 1212 0.201729915857126 0.201729915857126
+19326 1212 8782 0.0140233440789759 0.0140233440789759
+19336 4837 9074 0.0183273901669081 0.0183273901669081
+19338 9315 9317 0.0726807266351068 0.0726807266351068
+19339 9317 8692 0.104147766047402 0.104147766047402
+19341 9315 1952 0.0315809029571794 0.0315809029571794
+19343 10140 10142 0.0644750868788433 0.0644750868788433
+19344 10142 10475 0.0151531719907858 0.0151531719907858
+19345 10475 7137 0.053510410167183 0.053510410167183
+19347 480 9282 0.132450958735296 0.132450958735296
+19348 9282 10138 0.0564427245863012 0.0564427245863012
+19350 8464 10476 0.175984833399768 0.175984833399768
+19352 10047 5253 0.112186249238367 0.112186249238367
+19353 5253 2320 0.0249537355545513 0.0249537355545513
+19355 10166 6401 0.0992919669903468 0.0992919669903468
+19359 10479 9948 0.0516511853374245 0.0516511853374245
+19360 9948 8509 0.0517093587612889 0.0517093587612889
+19362 6189 10479 0.146782090008868 0.146782090008868
+19387 10455 5805 0.0524139320350963 0.0524139320350963
+19364 10047 10168 0.0607581388382602 0.0607581388382602
+19365 10168 10480 0.0679196955639713 0.0679196955639713
+19366 10480 6401 0.0390713513194924 0.0390713513194924
+19367 6401 10481 0.052200136280437 0.052200136280437
+19368 10481 6166 0.221487121294822 0.221487121294822
+19369 6166 4284 0.1514940030025 0.1514940030025
+19371 2320 2779 0.107781391844326 0.107781391844326
+20580 10867 10868 0.0137448223074376 0.0137448223074376
+20581 10868 10869 0.0278742902489333 0.0278742902489333
+19372 2779 2913 0.05305189541044 0.05305189541044
+19374 8509 9595 0.106794270102757 0.106794270102757
+19375 9595 8634 0.102427753876907 0.102427753876907
+19377 10174 10482 0.096139738297761 0.096139738297761
+19378 10482 9194 0.00978224253563326 0.00978224253563326
+19380 4397 3002 0.108243017625134 0.108243017625134
+19381 3002 10484 0.0989194559777293 0.0989194559777293
+19382 10484 5962 0.00617092845740214 0.00617092845740214
+19383 5962 10485 0.00542857584263607 0.00542857584263607
+19384 10485 10459 0.0472755549262459 0.0472755549262459
+19385 10459 7579 0.0528643874539915 0.0528643874539915
+19429 7287 32 0.190572580502828 0.190572580502828
+19386 7579 10455 0.0523778989124976 0.0523778989124976
+19423 10488 7294 0.0690612889349745 0.0690612889349745
+19424 7294 36 0.192538942320683 0.192538942320683
+19388 5805 10462 0.081956103355699 0.081956103355699
+19389 10462 8768 0.0169741195442503 0.0169741195442503
+19391 6189 9950 0.0503550239981861 0.0503550239981861
+19392 9950 7557 0.0535053183585621 0.0535053183585621
+19393 7557 9952 0.0524048074288428 0.0524048074288428
+19394 9952 10429 0.0135095901515659 0.0135095901515659
+19396 10479 9627 0.0675900234291702 0.0675900234291702
+19400 3201 6115 0.203275445399412 0.203275445399412
+19401 6115 1910 0.199619230795837 0.199619230795837
+19402 1910 9218 0.202850123370343 0.202850123370343
+19403 9218 9216 0.20345414072247 0.20345414072247
+19404 9216 7300 0.200631055524996 0.200631055524996
+19405 7300 45 0.202263602143448 0.202263602143448
+19406 45 3545 0.200651259904661 0.200651259904661
+19407 3545 4239 0.201942446714699 0.201942446714699
+19408 4239 1800 0.2054130837632 0.2054130837632
+19409 1800 8710 0.197537787183869 0.197537787183869
+19410 8710 6527 0.132676718293593 0.132676718293593
+19695 8145 9492 0.255789380087541 0.255789380087541
+19697 10419 10619 0.294868097569216 0.294868097569216
+19806 10411 7868 0.176421872480467 0.176421872480467
+19698 10619 10620 0.511264415982815 0.511264415982815
+19699 6199 496 0.110329672635447 0.110329672635447
+19700 496 10419 0.128549351195957 0.128549351195957
+19704 10623 10624 0.299844457035978 0.299844457035978
+19705 10624 10625 0.048946191319968 0.048946191319968
+19706 10625 10626 0.0564187161790662 0.0564187161790662
+19707 10626 10627 0.261222980592435 0.261222980592435
+19717 10626 10634 0.247667737296111 0.247667737296111
+19925 10679 9511 0.20648099094332 0.20648099094332
+19926 9511 4579 0.132833459370163 0.132833459370163
+19930 10680 10673 0.208792718350027 0.208792718350027
+19931 10673 7131 0.201766496696079 0.201766496696079
+19933 626 10681 0.1702021482017 0.1702021482017
+19934 5672 10665 0.0500710082270115 0.0500710082270115
+19935 10665 7218 0.0509007134728753 0.0509007134728753
+19937 252 10245 0.178490785331426 0.178490785331426
+19938 10245 7120 0.17638987203806 0.17638987203806
+19939 7120 9641 0.177259535907282 0.177259535907282
+19944 10675 10682 0.203454780542957 0.203454780542957
+19945 10682 9518 0.211007495388792 0.211007495388792
+19946 9518 4583 0.129742461291969 0.129742461291969
+19948 10646 7221 0.050795229275335 0.050795229275335
+19949 7221 10672 0.0490058421037179 0.0490058421037179
+19950 10672 4950 0.0520761745786515 0.0520761745786515
+19954 10414 5089 0.112638269786332 0.112638269786332
+19956 9520 10683 0.208034746403896 0.208034746403896
+19992 10649 10664 0.050141841785608 0.050141841785608
+19993 10664 10683 0.0505455538112256 0.0505455538112256
+19994 10683 5590 0.0494937724947863 0.0494937724947863
+19995 5590 10661 0.0507309659863408 0.0507309659863408
+19996 10661 7533 0.0505856564507496 0.0505856564507496
+19997 7533 10689 0.686347942133366 0.686347942133366
+19998 8645 2200 0.0278160442123186 0.0278160442123186
+20003 2200 10693 0.020138493184414 0.020138493184414
+20004 10693 10443 0.00475150856262823 0.00475150856262823
+20006 8461 9621 0.0222962026291256 0.0222962026291256
+20007 9621 10690 0.0515741214544805 0.0515741214544805
+20026 9466 8724 0.0514719719174867 0.0514719719174867
+20027 8724 5029 0.0566937822140094 0.0566937822140094
+20028 5029 4595 0.0969267875718062 0.0969267875718062
+20030 5321 630 0.142142547339574 0.142142547339574
+20031 630 2908 0.116052443784823 0.116052443784823
+20039 10696 5549 0.959761090863438 0.959761090863438
+20040 5549 9172 0.201153438061066 0.201153438061066
+20042 140 1484 0.198676673012775 0.198676673012775
+20043 1484 3760 0.212665318664513 0.212665318664513
+20044 3760 4181 0.394425022611864 0.394425022611864
+20045 4181 7302 0.250045496408828 0.250045496408828
+20046 7302 9078 0.0121023798774685 0.0121023798774685
+419 418 419 0.0843359701726921 0.0843359701726921
+20049 9127 9931 0.188027723664679 0.188027723664679
+20051 9189 10417 0.27289630775387 0.27289630775387
+20052 10417 10698 0.903351534370563 0.903351534370563
+20055 5803 10456 0.063915425232113 0.063915425232113
+20056 10456 8278 0.0463525975312068 0.0463525975312068
+20057 8278 7582 0.0531670184257572 0.0531670184257572
+20586 10860 10865 0.0197306093936785 0.0197306093936785
+20058 7582 10460 0.0605194201118807 0.0605194201118807
+20059 10460 5965 0.08096413889014 0.08096413889014
+20060 5965 7403 0.00793698029885246 0.00793698029885246
+20061 7403 7216 0.100604138655543 0.100604138655543
+20062 7216 2998 0.041051117053356 0.041051117053356
+20064 4930 9632 0.0194691711485179 0.0194691711485179
+20066 8788 8794 0.107030125953622 0.107030125953622
+20067 8794 8875 0.105785558321332 0.105785558321332
+20068 8875 7355 0.0541942506273543 0.0541942506273543
+20069 7355 8881 0.0482515848497253 0.0482515848497253
+20070 8881 7128 0.0482774346717123 0.0482774346717123
+20071 7128 9311 0.0491067830497851 0.0491067830497851
+20072 9311 9658 0.100701059147573 0.100701059147573
+20073 9658 5054 0.0949533068688616 0.0949533068688616
+20074 5054 5041 0.0261633102483298 0.0261633102483298
+20075 5041 6318 0.0238469793810048 0.0238469793810048
+20077 8004 7999 0.0412811844037432 0.0412811844037432
+20078 7999 5161 0.00972594837361757 0.00972594837361757
+20079 5161 976 0.0450966381773304 0.0450966381773304
+20080 976 9235 0.0690703393173828 0.0690703393173828
+20081 9235 8835 0.0284556853366966 0.0284556853366966
+20082 8835 7138 0.0744435936983682 0.0744435936983682
+20083 7138 7152 0.0242079619729824 0.0242079619729824
+20084 7152 5018 0.0530487604133438 0.0530487604133438
+20085 5018 5127 0.027179522018167 0.027179522018167
+20086 5127 5120 0.017329383802427 0.017329383802427
+20087 5120 9413 0.051025645765313 0.051025645765313
+20088 9413 4720 0.0442143222009164 0.0442143222009164
+20089 4720 6788 0.103544897956421 0.103544897956421
+20090 6788 7360 0.101885712989061 0.101885712989061
+20091 7360 5420 0.104686903511504 0.104686903511504
+20092 5420 8551 0.104297582912284 0.104297582912284
+20093 8551 3891 0.113854917229397 0.113854917229397
+20094 3891 1021 0.10275177677768 0.10275177677768
+20095 1021 10069 0.0524825810706004 0.0524825810706004
+20096 10069 6266 0.0519011168646154 0.0519011168646154
+20097 6266 8727 0.107637396904871 0.107637396904871
+20098 8727 5027 0.0851589615138914 0.0851589615138914
+20099 5027 3339 0.11913667157964 0.11913667157964
+20100 3339 7884 0.0947347804724537 0.0947347804724537
+20101 7884 7339 0.0992406279882494 0.0992406279882494
+20588 10840 3589 0.00659451799404467 0.00659451799404467
+20102 7339 7978 0.0297388680985265 0.0297388680985265
+20103 7978 8546 0.0509861753484279 0.0509861753484279
+20105 2065 2068 0.0539613780445048 0.0539613780445048
+20106 2068 2651 0.0458462130492323 0.0458462130492323
+20107 2651 2668 0.0527824371940605 0.0527824371940605
+20108 2668 4106 0.0471315276476818 0.0471315276476818
+20109 4106 4138 0.0531150768123695 0.0531150768123695
+20110 4138 6691 0.0513109258939151 0.0513109258939151
+20111 6691 6699 0.049849518680298 0.049849518680298
+20112 6699 8027 0.0540642003294053 0.0540642003294053
+20113 8027 8022 0.0351680439773276 0.0351680439773276
+20114 8022 7697 0.0642576699742132 0.0642576699742132
+20116 7687 3442 0.0653852338257918 0.0653852338257918
+20117 3442 3465 0.0302046503739114 0.0302046503739114
+20118 3465 10643 0.044572996690839 0.044572996690839
+20119 10643 6010 0.0210253210935206 0.0210253210935206
+20120 6010 6022 0.0302819861909932 0.0302819861909932
+20121 6022 3877 0.0720170103408001 0.0720170103408001
+20122 3877 9699 0.0188604413742797 0.0188604413742797
+20123 9699 862 0.0931148831029757 0.0931148831029757
+20124 862 7102 0.0867114852734781 0.0867114852734781
+20125 7102 10422 0.0971484542236891 0.0971484542236891
+20126 10422 8701 0.0148135271633134 0.0148135271633134
+20127 8701 8159 0.0903601598115808 0.0903601598115808
+20128 8159 8147 0.0485272097981868 0.0485272097981868
+20129 8147 7605 0.046972846594418 0.046972846594418
+20130 7605 7256 0.0980906813073136 0.0980906813073136
+20131 7256 7592 0.0949493294075893 0.0949493294075893
+20132 7592 2011 0.0535765472330524 0.0535765472330524
+20133 2011 9174 0.0440404642371946 0.0440404642371946
+20134 9174 10644 0.101018897202585 0.101018897202585
+20135 10644 2752 0.0964161425505398 0.0964161425505398
+12318 2500 2501 0.00534847597168918 0.00534847597168918
+20137 6988 7015 0.0469900401605619 0.0469900401605619
+20138 7015 2275 0.0506564830109395 0.0506564830109395
+20139 2275 8216 0.0480971521401402 0.0480971521401402
+20140 8216 3600 0.0492447661071067 0.0492447661071067
+20141 3600 8213 0.0494471155350359 0.0494471155350359
+20142 8213 7515 0.0477024371424333 0.0477024371424333
+20143 7515 7526 0.0508405166895622 0.0508405166895622
+20144 7526 4566 0.0460266764289813 0.0460266764289813
+20145 4566 2124 0.0528615774272691 0.0528615774272691
+20146 2124 5990 0.094672374588883 0.094672374588883
+20147 5990 7671 0.0990838490707958 0.0990838490707958
+20179 10247 9298 0.182738392624498 0.182738392624498
+20180 9298 6549 0.169619845811395 0.169619845811395
+20182 4768 6330 0.178054483343927 0.178054483343927
+20183 6330 9308 0.0134883336553362 0.0134883336553362
+20148 7671 10702 3.41813541281698 3.41813541281698
+20149 425 10112 0.0131850564749253 0.0131850564749253
+20186 8247 10155 0.516700602330837 0.516700602330837
+20187 10155 3322 0.265485774934506 0.265485774934506
+20188 3322 10706 0.131436234594263 0.131436234594263
+20189 10139 10705 0.06021736831636 0.06021736831636
+20195 8510 10708 0.0176825351734809 0.0176825351734809
+20197 10708 8571 0.116072750239478 0.116072750239478
+20199 5783 8281 0.147480988666932 0.147480988666932
+20200 8281 8293 0.145093730312322 0.145093730312322
+20201 8293 7900 0.146177040292133 0.146177040292133
+20202 7900 8854 0.145687210047232 0.145687210047232
+20203 8854 9321 0.148905174298523 0.148905174298523
+20206 8401 5454 0.142235461954992 0.142235461954992
+20207 5454 8504 0.00556744232684514 0.00556744232684514
+20208 8504 8047 0.149428079475645 0.149428079475645
+20209 8047 6575 0.142472133135735 0.142472133135735
+20210 6575 4456 0.146389787991077 0.146389787991077
+20211 4456 5504 0.146266130363807 0.146266130363807
+20264 10722 5574 0.00764881869126048 0.00764881869126048
+20317 10737 10730 0.156440332314784 0.156440332314784
+20319 10738 10739 0.00846222116823016 0.00846222116823016
+20570 10858 10856 0.341000703608857 0.341000703608857
+20572 10859 10860 0.0100014874858022 0.0100014874858022
+20784 10945 10292 0.00633905697400916 0.00633905697400916
+321 153 154 0.039197729386179 0.039197729386179
+18675 1570 2751 0.10523982327052 0.10523982327052
+20591 10795 10802 0.0763744143850755 0.0763744143850755
+20216 632 6405 0.146056665643101 0.146056665643101
+20217 6405 4277 0.144766275996567 0.144766275996567
+20218 4277 2913 0.0337236702585465 0.0337236702585465
+20250 9384 8111 0.200921327710714 0.200921327710714
+20251 8111 10328 0.204798818746646 0.204798818746646
+\.
diff --git a/src/bdDijkstra/test/pgtap/bdDijkstra-compare-dijkstra.sql b/src/bdDijkstra/test/pgtap/bdDijkstra-compare-dijkstra.sql
new file mode 100644
index 0000000..6ed3d87
--- /dev/null
+++ b/src/bdDijkstra/test/pgtap/bdDijkstra-compare-dijkstra.sql
@@ -0,0 +1,73 @@
+\i setup.sql
+
+SET client_min_messages TO ERROR;
+
+SELECT plan(544);
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION bddijkstra_compare_dijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+bddijkstra_sql TEXT;
+BEGIN
+
+ FOR i IN 1.. cant LOOP
+ FOR j IN 2.. cant BY 2 LOOP
+
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+
+ bddijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+ inner_sql := 'SELECT id, source, target, cost FROM edge_table';
+ dijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+
+ bddijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+ -- UNDIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+
+ bddijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+ inner_sql := 'SELECT id, source, target, cost FROM edge_table';
+ dijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+
+ bddijkstra_sql := 'SELECT seq,node,edge,cost::text,agg_cost::text FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+ END LOOP;
+ END LOOP;
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+
+SELECT * from bddijkstra_compare_dijkstra();
+
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/src/bdDijkstra/test/pgtap/bdDijkstra-innerQuery.sql b/src/bdDijkstra/test/pgtap/bdDijkstra-innerQuery.sql
new file mode 100644
index 0000000..d4af4b4
--- /dev/null
+++ b/src/bdDijkstra/test/pgtap/bdDijkstra-innerQuery.sql
@@ -0,0 +1,116 @@
+\i setup.sql
+
+SELECT plan(47);
+SET client_min_messages TO ERROR;
+
+
+SELECT has_function('pgr_bddijkstra',
+ ARRAY['text', 'bigint', 'bigint', 'boolean']);
+
+SELECT function_returns('pgr_bddijkstra',
+ ARRAY['text', 'bigint', 'bigint', 'boolean'],
+ 'setof record');
+
+CREATE OR REPLACE FUNCTION test_anyInteger(fn TEXT, params TEXT[], parameter TEXT)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+start_sql TEXT;
+end_sql TEXT;
+query TEXT;
+p TEXT;
+BEGIN
+ start_sql = 'select * from ' || fn || '($$ SELECT ';
+ FOREACH p IN ARRAY params LOOP
+ IF p = parameter THEN CONTINUE;
+ END IF;
+ start_sql = start_sql || p || ', ';
+ END LOOP;
+ end_sql = ' FROM edge_table $$, 2, 3, true)';
+
+ query := start_sql || parameter || '::SMALLINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::INTEGER ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::BIGINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::REAL ' || end_sql;
+ RETURN query SELECT throws_ok(query);
+
+ query := start_sql || parameter || '::FLOAT8 ' || end_sql;
+ RETURN query SELECT throws_ok(query);
+END;
+$BODY$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION test_anyNumerical(fn TEXT, params TEXT[], parameter TEXT)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+start_sql TEXT;
+end_sql TEXT;
+query TEXT;
+p TEXT;
+BEGIN
+ start_sql = 'select * from ' || fn || '($$ SELECT ';
+ FOREACH p IN ARRAY params LOOP
+ IF p = parameter THEN CONTINUE;
+ END IF;
+ start_sql = start_sql || p || ', ';
+ END LOOP;
+ end_sql = ' FROM edge_table $$, 2, 3, true)';
+
+ query := start_sql || parameter || '::SMALLINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::INTEGER ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::BIGINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::REAL ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::FLOAT8 ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+END;
+$BODY$ LANGUAGE plpgsql;
+
+--with reverse cost
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'id');
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'source');
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'target');
+SELECT test_anyNumerical('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'cost');
+SELECT test_anyNumerical('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'reverse_cost');
+
+
+--without reverse cost
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'id');
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'source');
+SELECT test_anyInteger('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'target');
+SELECT test_anyNumerical('pgr_bddijkstra',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'cost');
+
+
+SELECT finish();
+ROLLBACK;
diff --git a/src/bdDijkstra/test/pgtap/bdDijkstra-types-check.sql b/src/bdDijkstra/test/pgtap/bdDijkstra-types-check.sql
new file mode 100644
index 0000000..9cb9836
--- /dev/null
+++ b/src/bdDijkstra/test/pgtap/bdDijkstra-types-check.sql
@@ -0,0 +1,54 @@
+\i setup.sql
+
+
+SELECT plan(6);
+
+SELECT can(ARRAY['pgr_bddijkstra']);
+
+
+--V2.4+
+SELECT has_function('pgr_bddijkstra',
+ ARRAY['text','bigint','bigint','boolean']);
+SELECT function_returns('pgr_bddijkstra',
+ ARRAY['text','bigint','bigint','boolean'],
+ 'setof record');
+
+-- testing for the signature that they return the correct names & columns
+
+PREPARE v21q00 AS
+SELECT pg_typeof(seq)::text AS t1, pg_typeof(path_seq)::text AS t2,
+ pg_typeof(node)::text AS t5, pg_typeof(edge)::text AS t6,
+ pg_typeof(cost)::text AS t7, pg_typeof(agg_cost)::TEXT AS t8
+ FROM (
+ SELECT * FROM pgr_bddijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3, true) ) AS a
+ limit 1
+;
+
+PREPARE v21q01 AS
+SELECT 'integer'::text AS t1,'integer'::text AS t2,
+ 'bigint'::text AS t5, 'bigint'::text AS t6,
+ 'double precision'::text AS t7, 'double precision'::text AS t8;
+
+SELECT set_eq('v21q00', 'v21q01','Expected columns names & types in version 2.4');
+
+
+-- CHECKING WORKS WITH & WITOUT REVERSE COST
+
+PREPARE v20q1 AS
+SELECT * FROM pgr_bddijkstra(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3, true);
+
+PREPARE v20q3 AS
+SELECT * FROM pgr_bddijkstra(
+ 'SELECT id, source, target, cost FROM edge_table',
+ 2, 3, false);
+
+SELECT lives_ok('v20q1','with reverse cost');
+SELECT lives_ok('v20q3','with NO reverse cost');
+
+
+SELECT finish();
+ROLLBACK;
diff --git a/src/bdDijkstra/test/test.conf b/src/bdDijkstra/test/test.conf
new file mode 100644
index 0000000..eece83e
--- /dev/null
+++ b/src/bdDijkstra/test/test.conf
@@ -0,0 +1,17 @@
+#!/usr/bin/perl -w
+
+%main::tests = (
+ 'any' => {
+ 'comment' => 'pgr_pdDijkstra (new signature) old large test',
+ 'data' => ["large.data" ],
+ 'tests' => [qw(
+ bdDijkstra-large
+ doc-pgr_bdDijkstra
+ )],
+ 'documentation' => [qw(
+ doc-pgr_bdDijkstra
+ )]
+ },
+);
+
+1;
diff --git a/src/bd_astar/doc/doc-bdAstar.queries b/src/bd_astar/doc/doc-bdAstar.queries
index ff55d9b..7c3f360 100644
--- a/src/bd_astar/doc/doc-bdAstar.queries
+++ b/src/bd_astar/doc/doc-bdAstar.queries
@@ -1,5 +1,7 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_bdAStar(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, x1, y1, x2, y2
diff --git a/src/bd_astar/doc/pgr_bdAstar.rst b/src/bd_astar/doc/pgr_bdAstar.rst
index 5c4fa9b..c4bdd05 100644
--- a/src/bd_astar/doc/pgr_bdAstar.rst
+++ b/src/bd_astar/doc/pgr_bdAstar.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -12,7 +12,7 @@
pgr_bdAstar - Bi-directional A* Shortest Path
===============================================================================
-.. index::
+.. index::
single: bdAstar(Complete Signaature)
Name
@@ -97,6 +97,6 @@ See Also
-------------------------------------------------------------------------------
* :ref:`type_cost_result`
-* :ref:`bd_dijkstra`
+* :ref:`pgr_bddijkstra`
* http://en.wikipedia.org/wiki/Bidirectional_search
* http://en.wikipedia.org/wiki/A*_search_algorithm
diff --git a/src/bd_astar/src/BiDirAStar.cpp b/src/bd_astar/src/BiDirAStar.cpp
index d71f61e..af6f634 100644
--- a/src/bd_astar/src/BiDirAStar.cpp
+++ b/src/bd_astar/src/BiDirAStar.cpp
@@ -32,14 +32,11 @@ THE SOFTWARE.
********************************************************************PGR-MIT*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./BiDirAStar.h"
#include <math.h>
-#include "./BiDirAStar.h"
+
+#include "./../../common/src/pgr_alloc.hpp"
BiDirAStar::BiDirAStar(void) {
}
@@ -88,10 +85,10 @@ void BiDirAStar::initall(int maxNode) {
void BiDirAStar::deleteall() {
// DBG("Calling BiDirAStar::deleteall\n");
- delete [] m_pFParent;
- delete [] m_pRParent;
- delete [] m_pFCost;
- delete [] m_pRCost;
+ delete m_pFParent;
+ delete m_pRParent;
+ delete m_pFCost;
+ delete m_pRCost;
// DBG("Leaving BiDirAStar::deleteall\n");
}
@@ -359,7 +356,7 @@ int BiDirAStar:: bidir_astar(edge_astar_t *edges, size_t edge_count, int maxNode
m_vecPath.push_back(pelement);
// Transfer data path to path_element_t format and allocate memory and populate the pointer
- *path = (path_element_t *) malloc(sizeof(path_element_t) * (m_vecPath.size() + 1));
+ *path = pgr_alloc(m_vecPath.size(), *path);
*path_count = m_vecPath.size();
for (size_t i = 0; i < *path_count; i++) {
diff --git a/src/bd_astar/src/bdastar.c b/src/bd_astar/src/bdastar.c
index 205e4be..4d64e05 100644
--- a/src/bd_astar/src/bdastar.c
+++ b/src/bd_astar/src/bdastar.c
@@ -23,20 +23,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include "../../common/src/pgr_types.h"
-#include "../../common/src/postgres_connection.h"
#include "./bdastar_driver.h"
@@ -68,6 +62,7 @@ static int
fetch_edge_astar_columns(SPITupleTable *tuptable,
edge_astar_columns_t *edge_columns,
bool has_reverse_cost) {
+ if (tuptable) {}
edge_columns->id = SPI_fnumber(SPI_tuptable->tupdesc, "id");
edge_columns->source = SPI_fnumber(SPI_tuptable->tupdesc, "source");
edge_columns->target = SPI_fnumber(SPI_tuptable->tupdesc, "target");
@@ -208,7 +203,7 @@ static int compute_shortest_path_astar(char* sql, int source_vertex_id,
#endif // _MSC_VER
char *err_msg;
int ret = -1;
- register int z;
+ size_t z;
int s_count = 0;
int t_count = 0;
@@ -327,6 +322,7 @@ static int compute_shortest_path_astar(char* sql, int source_vertex_id,
(*path)[z].vertex_id += v_min_id;
}
if (ret < 0) {
+ pfree(path);
elog(ERROR, "Error computing path: %s", err_msg);
}
pgr_SPI_finish();
@@ -338,10 +334,9 @@ PG_FUNCTION_INFO_V1(bidir_astar_shortest_path);
PGDLLEXPORT Datum
bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
path_element_t *path;
+ path = NULL;
/* stuff done only on the first call of the function */
if (SRF_IS_FIRSTCALL()) {
@@ -361,7 +356,7 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
#ifdef DEBUG
ret =
#endif
- compute_shortest_path_astar(pgr_text2char(PG_GETARG_TEXT_P(0)),
+ compute_shortest_path_astar(text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT32(1),
PG_GETARG_INT32(2),
PG_GETARG_BOOL(3),
@@ -371,10 +366,10 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
#ifdef DEBUG
PGR_DBG("Ret is %i", ret);
if (ret >= 0) {
- int i;
+ size_t i;
for (i = 0; i < path_count; i++) {
- PGR_DBG("Step # %i vertex_id %i ", i, path[i].vertex_id);
- PGR_DBG(" edge_id %i ", path[i].edge_id);
+ PGR_DBG("Step # %ld vertex_id %ld ", i, path[i].vertex_id);
+ PGR_DBG(" edge_id %ld ", path[i].edge_id);
PGR_DBG(" cost %f ", path[i].cost);
}
}
@@ -382,7 +377,11 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
/* total number of tuples to be returned */
PGR_DBG("Conting tuples number\n");
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = path_count;
+#else
funcctx->max_calls = (uint32_t)path_count;
+#endif
funcctx->user_fctx = path;
PGR_DBG("Path count %lu", path_count);
@@ -398,14 +397,11 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
path = (path_element_t*) funcctx->user_fctx;
- PGR_DBG("Trying to allocate some memory\n");
- if (call_cntr < max_calls) { /* do when there is more left to send */
+ if (funcctx->call_cntr < funcctx->max_calls) { /* do when there is more left to send */
HeapTuple tuple;
Datum result;
Datum *values;
@@ -414,13 +410,13 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
values = palloc(4 * sizeof(Datum));
nulls = palloc(4 * sizeof(bool));
- values[0] = Int32GetDatum(call_cntr);
+ values[0] = Int32GetDatum(funcctx->call_cntr);
nulls[0] = false;
- values[1] = Int32GetDatum(path[call_cntr].vertex_id);
+ values[1] = Int32GetDatum(path[funcctx->call_cntr].vertex_id);
nulls[1] = false;
- values[2] = Int32GetDatum(path[call_cntr].edge_id);
+ values[2] = Int32GetDatum(path[funcctx->call_cntr].edge_id);
nulls[2] = false;
- values[3] = Float8GetDatum(path[call_cntr].cost);
+ values[3] = Float8GetDatum(path[funcctx->call_cntr].cost);
nulls[3] = false;
PGR_DBG("Heap making\n");
@@ -441,8 +437,6 @@ bidir_astar_shortest_path(PG_FUNCTION_ARGS) {
SRF_RETURN_NEXT(funcctx, result);
} else { /* do when there is no more left */
- PGR_DBG("Freeing path");
- if (path) free(path);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/bd_astar/src/bdastar_driver.cpp b/src/bd_astar/src/bdastar_driver.cpp
index 79c8e3a..c8dcac3 100644
--- a/src/bd_astar/src/bdastar_driver.cpp
+++ b/src/bd_astar/src/bdastar_driver.cpp
@@ -32,15 +32,11 @@ THE SOFTWARE.
********************************************************************PGR-MIT*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./bdastar_driver.h"
#include <exception>
#include "./BiDirAStar.h"
-#include "./bdastar_driver.h"
int bdastar_wrapper(edge_astar_t *edges, size_t edge_count, int maxnode,
int source_vertex_id, int target_vertex_id,
diff --git a/src/bd_astar/test/CMakeLists.txt b/src/bd_astar/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/bd_astar/test/bd_astar-any-01.result b/src/bd_astar/test/bd_astar-any-01.result
index 4e51168..f3dfc90 100644
--- a/src/bd_astar/test/bd_astar-any-01.result
+++ b/src/bd_astar/test/bd_astar-any-01.result
@@ -1,101 +1,101 @@
-0|5700|20787|0.006774
-1|10932|20756|0.040876
-2|10931|20797|0.002564
-3|7661|20796|0.002581
-4|10943|20776|0.040800
-5|10941|20772|0.005720
-6|3415|20771|0.007463
-7|10940|20841|0.187594
-8|10952|20812|0.005045
-9|7034|20811|0.004532
-10|10951|20833|0.177477
-11|10944|20779|0.008539
-12|8910|20778|0.006447
-13|10929|20835|0.071114
-14|10948|20794|0.013276
-15|8908|12990|0.013157
-16|8325|13831|0.009169
-17|3753|13830|0.196045
-18|6774|13829|0.032840
-19|8304|13828|0.117213
-20|9205|13827|0.010639
-21|8994|13165|0.012931
-22|8977|13164|0.008029
-23|8976|13163|0.069895
-24|8993|13162|0.009638
-25|8351|13161|0.099016
-26|8992|13160|0.187353
-27|8991|13159|0.018649
-28|2962|13158|0.071931
-29|1285|13157|0.118340
-30|8989|13156|0.006317
-31|8988|13155|0.079185
-32|21|13154|0.057101
-33|6436|13153|0.083288
-34|637|13152|0.099744
-35|8987|13151|0.057786
-36|398|13150|0.120005
-37|8496|13149|0.069498
-38|8986|13148|0.014323
-39|8985|13167|0.070884
-40|8451|11869|0.006925
-41|476|11868|0.196533
-42|529|11867|0.005677
-43|8450|11871|0.118857
-44|8452|11878|0.083250
-45|8455|11880|0.048821
-46|8456|11883|0.064572
-47|1807|11882|0.101185
-48|8457|11894|0.046805
-49|8465|15481|0.180992
-50|8522|15480|0.016198
-51|9621|15479|0.209882
-52|2808|15478|0.019312
-53|8311|15477|0.113487
-54|8583|16981|0.045667
-55|10046|16982|0.022635
-56|8467|16983|0.022924
-57|9624|15487|0.034042
-58|8468|11899|0.018103
-59|3170|19357|0.047698
-60|9949|19358|0.059093
-61|10479|19359|0.051651
-62|9948|19360|0.051709
-63|8509|19374|0.106794
-64|9595|19375|0.102428
-65|8634|19376|0.107643
-66|10174|19377|0.096140
-67|10482|19378|0.009782
-68|9194|19379|0.102702
-69|4397|19380|0.108243
-70|3002|19381|0.098919
-71|10484|19382|0.006171
-72|5962|19383|0.005429
-73|10485|19384|0.047276
-74|10459|19385|0.052864
-75|7579|19386|0.052378
-76|10455|19387|0.052414
-77|5805|19388|0.081956
-78|10462|19389|0.016974
-79|8768|12598|0.059630
-80|8767|19290|0.117748
-81|10470|19289|0.065769
-82|10469|19288|0.066230
-83|10468|19287|0.111281
-84|9967|16642|0.029056
-85|9956|16621|0.014614
-86|9938|16626|0.007036
-87|9960|16649|0.081206
-88|9968|16650|0.012230
-89|9969|16647|0.012368
-90|5457|6266|0.055134
-91|5458|6267|0.053860
-92|5459|6268|0.109859
-93|5460|6269|0.104952
-94|5461|6270|0.053766
-95|5462|6271|0.046800
-96|5463|12897|0.170300
-97|8880|15060|0.049014
-98|7101|15059|0.047811
-99|9313|15058|0.044674
-100|6733|-1|0.000000
+0|5700|20787|0.006774
+1|10932|20756|0.040876
+2|10931|20797|0.002564
+3|7661|20796|0.002581
+4|10943|20776|0.040800
+5|10941|20772|0.005720
+6|3415|20771|0.007463
+7|10940|20841|0.187594
+8|10952|20812|0.005045
+9|7034|20811|0.004532
+10|10951|20833|0.177477
+11|10944|20779|0.008539
+12|8910|20778|0.006447
+13|10929|20835|0.071114
+14|10948|20794|0.013276
+15|8908|12990|0.013157
+16|8325|13831|0.009169
+17|3753|13830|0.196045
+18|6774|13829|0.032840
+19|8304|13828|0.117213
+20|9205|13827|0.010639
+21|8994|13165|0.012931
+22|8977|13164|0.008029
+23|8976|13163|0.069895
+24|8993|13162|0.009638
+25|8351|13161|0.099016
+26|8992|13160|0.187353
+27|8991|13159|0.018649
+28|2962|13158|0.071931
+29|1285|13157|0.118340
+30|8989|13156|0.006317
+31|8988|13155|0.079185
+32|21|13154|0.057101
+33|6436|13153|0.083288
+34|637|13152|0.099744
+35|8987|13151|0.057786
+36|398|13150|0.120005
+37|8496|13149|0.069498
+38|8986|13148|0.014323
+39|8985|13167|0.070884
+40|8451|11869|0.006925
+41|476|11868|0.196533
+42|529|11867|0.005677
+43|8450|11871|0.118857
+44|8452|11878|0.083250
+45|8455|11880|0.048821
+46|8456|11883|0.064572
+47|1807|11882|0.101185
+48|8457|11894|0.046805
+49|8465|15481|0.180992
+50|8522|15480|0.016198
+51|9621|15479|0.209882
+52|2808|15478|0.019312
+53|8311|15477|0.113487
+54|8583|16981|0.045667
+55|10046|16982|0.022635
+56|8467|16983|0.022924
+57|9624|15487|0.034042
+58|8468|11899|0.018103
+59|3170|19357|0.047698
+60|9949|19358|0.059093
+61|10479|19359|0.051651
+62|9948|19360|0.051709
+63|8509|19374|0.106794
+64|9595|19375|0.102428
+65|8634|19376|0.107643
+66|10174|19377|0.096140
+67|10482|19378|0.009782
+68|9194|19379|0.102702
+69|4397|19380|0.108243
+70|3002|19381|0.098919
+71|10484|19382|0.006171
+72|5962|19383|0.005429
+73|10485|19384|0.047276
+74|10459|19385|0.052864
+75|7579|19386|0.052378
+76|10455|19387|0.052414
+77|5805|19388|0.081956
+78|10462|19389|0.016974
+79|8768|12598|0.059630
+80|8767|19290|0.117748
+81|10470|19289|0.065769
+82|10469|19288|0.066230
+83|10468|19287|0.111281
+84|9967|16642|0.029056
+85|9956|16621|0.014614
+86|9938|16626|0.007036
+87|9960|16649|0.081206
+88|9968|16650|0.012230
+89|9969|16647|0.012368
+90|5457|6266|0.055134
+91|5458|6267|0.053860
+92|5459|6268|0.109859
+93|5460|6269|0.104952
+94|5461|6270|0.053766
+95|5462|6271|0.046800
+96|5463|12897|0.170300
+97|8880|15060|0.049014
+98|7101|15059|0.047811
+99|9313|15058|0.044674
+100|6733|-1|0.000000
diff --git a/src/bd_astar/test/bd_astar-any-02.result b/src/bd_astar/test/bd_astar-any-02.result
index ae93722..16cfcae 100644
--- a/src/bd_astar/test/bd_astar-any-02.result
+++ b/src/bd_astar/test/bd_astar-any-02.result
@@ -1,60 +1,60 @@
-0|6585|17975|0.200230
-1|5367|17976|0.155428
-2|7125|17977|0.178581
-3|613|17978|0.175712
-4|10025|17979|0.173776
-5|5802|6758|0.013489
-6|5803|6759|0.065176
-7|5804|6760|0.008679
-8|5805|6761|0.145097
-9|5806|6762|0.146807
-10|5807|6763|0.097186
-11|5808|6764|0.050569
-12|5809|20663|0.169650
-13|4620|20662|0.023243
-14|5774|20661|0.120390
-15|6482|20660|0.002769
-16|5957|20659|0.087952
-17|8289|20658|0.048701
-18|10884|20657|0.009212
-19|10883|20656|0.080500
-20|9954|20655|0.075280
-21|4390|16876|0.147691
-22|9203|17805|0.063931
-23|7892|17804|0.015429
-24|8417|17803|0.069119
-25|10171|17802|0.075825
-26|9953|17801|0.045079
-27|8859|17800|0.029389
-28|8536|17799|0.072658
-29|10180|17798|0.076558
-30|9592|17797|0.027637
-31|9318|17796|0.114755
-32|10179|17795|0.007150
-33|10178|17794|0.087467
-34|8402|17793|0.062258
-35|6179|17792|0.109483
-36|8508|17791|0.036248
-37|3305|17790|0.069816
-38|8512|17789|0.064158
-39|998|17807|0.471312
-40|2698|2743|0.102019
-41|2563|9039|0.341756
-42|2043|9040|0.587619
-43|4280|9041|0.145996
-44|2317|9042|0.268754
-45|7135|9043|0.121251
-46|4276|9044|0.145396
-47|6167|9045|0.583394
-48|7136|9046|0.043099
-49|7137|19345|0.053510
-50|10475|19344|0.015153
-51|10142|19343|0.064475
-52|10140|17566|0.135370
-53|8539|17565|0.057338
-54|10138|17558|0.064893
-55|6943|17559|0.201703
-56|8140|17560|0.469613
-57|10139|20189|0.060217
-58|10705|20185|0.055053
-59|8247|-1|0.000000
+0|6585|17975|0.200230
+1|5367|17976|0.155428
+2|7125|17977|0.178581
+3|613|17978|0.175712
+4|10025|17979|0.173776
+5|5802|6758|0.013489
+6|5803|6759|0.065176
+7|5804|6760|0.008679
+8|5805|6761|0.145097
+9|5806|6762|0.146807
+10|5807|6763|0.097186
+11|5808|6764|0.050569
+12|5809|20663|0.169650
+13|4620|20662|0.023243
+14|5774|20661|0.120390
+15|6482|20660|0.002769
+16|5957|20659|0.087952
+17|8289|20658|0.048701
+18|10884|20657|0.009212
+19|10883|20656|0.080500
+20|9954|20655|0.075280
+21|4390|16876|0.147691
+22|9203|17805|0.063931
+23|7892|17804|0.015429
+24|8417|17803|0.069119
+25|10171|17802|0.075825
+26|9953|17801|0.045079
+27|8859|17800|0.029389
+28|8536|17799|0.072658
+29|10180|17798|0.076558
+30|9592|17797|0.027637
+31|9318|17796|0.114755
+32|10179|17795|0.007150
+33|10178|17794|0.087467
+34|8402|17793|0.062258
+35|6179|17792|0.109483
+36|8508|17791|0.036248
+37|3305|17790|0.069816
+38|8512|17789|0.064158
+39|998|17807|0.471312
+40|2698|2743|0.102019
+41|2563|9039|0.341756
+42|2043|9040|0.587619
+43|4280|9041|0.145996
+44|2317|9042|0.268754
+45|7135|9043|0.121251
+46|4276|9044|0.145396
+47|6167|9045|0.583394
+48|7136|9046|0.043099
+49|7137|19345|0.053510
+50|10475|19344|0.015153
+51|10142|19343|0.064475
+52|10140|17566|0.135370
+53|8539|17565|0.057338
+54|10138|17558|0.064893
+55|6943|17559|0.201703
+56|8140|17560|0.469613
+57|10139|20189|0.060217
+58|10705|20185|0.055053
+59|8247|-1|0.000000
diff --git a/src/bd_astar/test/bd_astar-any-03.result b/src/bd_astar/test/bd_astar-any-03.result
index cbd1bc5..e8ee6ec 100644
--- a/src/bd_astar/test/bd_astar-any-03.result
+++ b/src/bd_astar/test/bd_astar-any-03.result
@@ -1,2 +1,2 @@
-0|9426|14822|0.060319
-1|3606|-1|0.000000
+0|9426|14822|0.060319
+1|3606|-1|0.000000
diff --git a/src/bd_astar/test/bd_astar-any-04.result b/src/bd_astar/test/bd_astar-any-04.result
index 5988b27..a0cf228 100644
--- a/src/bd_astar/test/bd_astar-any-04.result
+++ b/src/bd_astar/test/bd_astar-any-04.result
@@ -1,2 +1,2 @@
-0|3606|14822|0.060319
-1|9426|-1|0.000000
+0|3606|14822|0.060319
+1|9426|-1|0.000000
diff --git a/src/bd_astar/test/bd_astar-any-05.result b/src/bd_astar/test/bd_astar-any-05.result
index 73c2014..63d314b 100644
--- a/src/bd_astar/test/bd_astar-any-05.result
+++ b/src/bd_astar/test/bd_astar-any-05.result
@@ -1,101 +1,101 @@
-0|6733|15058|0.044674
-1|9313|15059|0.047811
-2|7101|15060|0.049014
-3|8880|12897|0.170300
-4|5463|6271|0.046800
-5|5462|6270|0.053766
-6|5461|6269|0.104952
-7|5460|6268|0.109859
-8|5459|6267|0.053860
-9|5458|6266|0.055134
-10|5457|16647|0.012368
-11|9969|16650|0.012230
-12|9968|16649|0.081206
-13|9960|16626|0.007036
-14|9938|16621|0.014614
-15|9956|16642|0.029056
-16|9967|19287|0.111281
-17|10468|19288|0.066230
-18|10469|19289|0.065769
-19|10470|19290|0.117748
-20|8767|12598|0.059630
-21|8768|19389|0.016974
-22|10462|19388|0.081956
-23|5805|19387|0.052414
-24|10455|19386|0.052378
-25|7579|19385|0.052864
-26|10459|19384|0.047276
-27|10485|19383|0.005429
-28|5962|19382|0.006171
-29|10484|19381|0.098919
-30|3002|19380|0.108243
-31|4397|19379|0.102702
-32|9194|19378|0.009782
-33|10482|19377|0.096140
-34|10174|19376|0.107643
-35|8634|19375|0.102428
-36|9595|19374|0.106794
-37|8509|19360|0.051709
-38|9948|19359|0.051651
-39|10479|19358|0.059093
-40|9949|19357|0.047698
-41|3170|11899|0.018103
-42|8468|15487|0.034042
-43|9624|16983|0.022924
-44|8467|16982|0.022635
-45|10046|16981|0.045667
-46|8583|15477|0.113487
-47|8311|15478|0.019312
-48|2808|15479|0.209882
-49|9621|15480|0.016198
-50|8522|15481|0.180992
-51|8465|11894|0.046805
-52|8457|11882|0.101185
-53|1807|11883|0.064572
-54|8456|11880|0.048821
-55|8455|11878|0.083250
-56|8452|11871|0.118857
-57|8450|11867|0.005677
-58|529|11868|0.196533
-59|476|11869|0.006925
-60|8451|13167|0.070884
-61|8985|13148|0.014323
-62|8986|13149|0.069498
-63|8496|13150|0.120005
-64|398|13151|0.057786
-65|8987|13152|0.099744
-66|637|13153|0.083288
-67|6436|13154|0.057101
-68|21|13155|0.079185
-69|8988|13156|0.006317
-70|8989|13157|0.118340
-71|1285|13158|0.071931
-72|2962|13159|0.018649
-73|8991|13160|0.187353
-74|8992|13161|0.099016
-75|8351|13162|0.009638
-76|8993|13163|0.069895
-77|8976|13164|0.008029
-78|8977|13165|0.012931
-79|8994|13827|0.010639
-80|9205|13828|0.117213
-81|8304|13829|0.032840
-82|6774|13830|0.196045
-83|3753|13831|0.009169
-84|8325|12990|0.013157
-85|8908|20794|0.013276
-86|10948|20835|0.071114
-87|10929|20778|0.006447
-88|8910|20779|0.008539
-89|10944|20833|0.177477
-90|10951|20811|0.004532
-91|7034|20812|0.005045
-92|10952|20841|0.187594
-93|10940|20771|0.007463
-94|3415|20772|0.005720
-95|10941|20776|0.040800
-96|10943|20796|0.002581
-97|7661|20797|0.002564
-98|10931|20756|0.040876
-99|10932|20787|0.006774
-100|5700|-1|0.000000
+0|6733|15058|0.044674
+1|9313|15059|0.047811
+2|7101|15060|0.049014
+3|8880|12897|0.170300
+4|5463|6271|0.046800
+5|5462|6270|0.053766
+6|5461|6269|0.104952
+7|5460|6268|0.109859
+8|5459|6267|0.053860
+9|5458|6266|0.055134
+10|5457|16647|0.012368
+11|9969|16650|0.012230
+12|9968|16649|0.081206
+13|9960|16626|0.007036
+14|9938|16621|0.014614
+15|9956|16642|0.029056
+16|9967|19287|0.111281
+17|10468|19288|0.066230
+18|10469|19289|0.065769
+19|10470|19290|0.117748
+20|8767|12598|0.059630
+21|8768|19389|0.016974
+22|10462|19388|0.081956
+23|5805|19387|0.052414
+24|10455|19386|0.052378
+25|7579|19385|0.052864
+26|10459|19384|0.047276
+27|10485|19383|0.005429
+28|5962|19382|0.006171
+29|10484|19381|0.098919
+30|3002|19380|0.108243
+31|4397|19379|0.102702
+32|9194|19378|0.009782
+33|10482|19377|0.096140
+34|10174|19376|0.107643
+35|8634|19375|0.102428
+36|9595|19374|0.106794
+37|8509|19360|0.051709
+38|9948|19359|0.051651
+39|10479|19358|0.059093
+40|9949|19357|0.047698
+41|3170|11899|0.018103
+42|8468|15487|0.034042
+43|9624|16983|0.022924
+44|8467|16982|0.022635
+45|10046|16981|0.045667
+46|8583|15477|0.113487
+47|8311|15478|0.019312
+48|2808|15479|0.209882
+49|9621|15480|0.016198
+50|8522|15481|0.180992
+51|8465|11894|0.046805
+52|8457|11882|0.101185
+53|1807|11883|0.064572
+54|8456|11880|0.048821
+55|8455|11878|0.083250
+56|8452|11871|0.118857
+57|8450|11867|0.005677
+58|529|11868|0.196533
+59|476|11869|0.006925
+60|8451|13167|0.070884
+61|8985|13148|0.014323
+62|8986|13149|0.069498
+63|8496|13150|0.120005
+64|398|13151|0.057786
+65|8987|13152|0.099744
+66|637|13153|0.083288
+67|6436|13154|0.057101
+68|21|13155|0.079185
+69|8988|13156|0.006317
+70|8989|13157|0.118340
+71|1285|13158|0.071931
+72|2962|13159|0.018649
+73|8991|13160|0.187353
+74|8992|13161|0.099016
+75|8351|13162|0.009638
+76|8993|13163|0.069895
+77|8976|13164|0.008029
+78|8977|13165|0.012931
+79|8994|13827|0.010639
+80|9205|13828|0.117213
+81|8304|13829|0.032840
+82|6774|13830|0.196045
+83|3753|13831|0.009169
+84|8325|12990|0.013157
+85|8908|20794|0.013276
+86|10948|20835|0.071114
+87|10929|20778|0.006447
+88|8910|20779|0.008539
+89|10944|20833|0.177477
+90|10951|20811|0.004532
+91|7034|20812|0.005045
+92|10952|20841|0.187594
+93|10940|20771|0.007463
+94|3415|20772|0.005720
+95|10941|20776|0.040800
+96|10943|20796|0.002581
+97|7661|20797|0.002564
+98|10931|20756|0.040876
+99|10932|20787|0.006774
+100|5700|-1|0.000000
diff --git a/src/bd_astar/test/bd_astar-any-06.result b/src/bd_astar/test/bd_astar-any-06.result
index 134a8f5..6585a35 100644
--- a/src/bd_astar/test/bd_astar-any-06.result
+++ b/src/bd_astar/test/bd_astar-any-06.result
@@ -1,60 +1,60 @@
-0|8247|20185|0.055053
-1|10705|20189|0.060217
-2|10139|17560|0.469613
-3|8140|17559|0.201703
-4|6943|17558|0.064893
-5|10138|17565|0.057338
-6|8539|17566|0.135370
-7|10140|19343|0.064475
-8|10142|19344|0.015153
-9|10475|19345|0.053510
-10|7137|9046|0.043099
-11|7136|9045|0.583394
-12|6167|9044|0.145396
-13|4276|9043|0.121251
-14|7135|9042|0.268754
-15|2317|9041|0.145996
-16|4280|9040|0.587619
-17|2043|9039|0.341756
-18|2563|2743|0.102019
-19|2698|17807|0.471312
-20|998|17789|0.064158
-21|8512|17790|0.069816
-22|3305|17791|0.036248
-23|8508|17792|0.109483
-24|6179|17793|0.062258
-25|8402|17794|0.087467
-26|10178|17795|0.007150
-27|10179|17796|0.114755
-28|9318|17797|0.027637
-29|9592|17798|0.076558
-30|10180|17799|0.072658
-31|8536|17800|0.029389
-32|8859|17801|0.045079
-33|9953|17802|0.075825
-34|10171|17803|0.069119
-35|8417|17804|0.015429
-36|7892|17805|0.063931
-37|9203|16876|0.147691
-38|4390|20655|0.075280
-39|9954|20656|0.080500
-40|10883|20657|0.009212
-41|10884|20658|0.048701
-42|8289|20659|0.087952
-43|5957|20660|0.002769
-44|6482|20661|0.120390
-45|5774|20662|0.023243
-46|4620|20663|0.169650
-47|5809|6764|0.050569
-48|5808|6763|0.097186
-49|5807|6762|0.146807
-50|5806|6761|0.145097
-51|5805|6760|0.008679
-52|5804|6759|0.065176
-53|5803|6758|0.013489
-54|5802|17979|0.173776
-55|10025|17978|0.175712
-56|613|17977|0.178581
-57|7125|17976|0.155428
-58|5367|17975|0.200230
-59|6585|-1|0.000000
+0|8247|20185|0.055053
+1|10705|20189|0.060217
+2|10139|17560|0.469613
+3|8140|17559|0.201703
+4|6943|17558|0.064893
+5|10138|17565|0.057338
+6|8539|17566|0.135370
+7|10140|19343|0.064475
+8|10142|19344|0.015153
+9|10475|19345|0.053510
+10|7137|9046|0.043099
+11|7136|9045|0.583394
+12|6167|9044|0.145396
+13|4276|9043|0.121251
+14|7135|9042|0.268754
+15|2317|9041|0.145996
+16|4280|9040|0.587619
+17|2043|9039|0.341756
+18|2563|2743|0.102019
+19|2698|17807|0.471312
+20|998|17789|0.064158
+21|8512|17790|0.069816
+22|3305|17791|0.036248
+23|8508|17792|0.109483
+24|6179|17793|0.062258
+25|8402|17794|0.087467
+26|10178|17795|0.007150
+27|10179|17796|0.114755
+28|9318|17797|0.027637
+29|9592|17798|0.076558
+30|10180|17799|0.072658
+31|8536|17800|0.029389
+32|8859|17801|0.045079
+33|9953|17802|0.075825
+34|10171|17803|0.069119
+35|8417|17804|0.015429
+36|7892|17805|0.063931
+37|9203|16876|0.147691
+38|4390|20655|0.075280
+39|9954|20656|0.080500
+40|10883|20657|0.009212
+41|10884|20658|0.048701
+42|8289|20659|0.087952
+43|5957|20660|0.002769
+44|6482|20661|0.120390
+45|5774|20662|0.023243
+46|4620|20663|0.169650
+47|5809|6764|0.050569
+48|5808|6763|0.097186
+49|5807|6762|0.146807
+50|5806|6761|0.145097
+51|5805|6760|0.008679
+52|5804|6759|0.065176
+53|5803|6758|0.013489
+54|5802|17979|0.173776
+55|10025|17978|0.175712
+56|613|17977|0.178581
+57|7125|17976|0.155428
+58|5367|17975|0.200230
+59|6585|-1|0.000000
diff --git a/src/bd_astar/test/doc-bdAstar.test.sql b/src/bd_astar/test/doc-bdAstar.test.sql
index 7bba7de..639cf40 100644
--- a/src/bd_astar/test/doc-bdAstar.test.sql
+++ b/src/bd_astar/test/doc-bdAstar.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-- PGR_pgr_bdAStar
@@ -15,4 +14,3 @@ SELECT * FROM pgr_bdAStar(
FROM edge_table ',
4, 10, true, true);
\echo --q3
-ROLLBACK;
diff --git a/src/bd_astar/tester/ans1.txt b/src/bd_astar/tester/ans1.txt
index e914abb..0434fd7 100644
--- a/src/bd_astar/tester/ans1.txt
+++ b/src/bd_astar/tester/ans1.txt
@@ -1,101 +1,101 @@
-5700 |20787 |0.006774
-10932 |20756 |0.040876
-10931 |20797 |0.002564
-7661 |20796 |0.002581
-10943 |20776 |0.040800
-10941 |20772 |0.005720
-3415 |20771 |0.007463
-10940 |20841 |0.187594
-10952 |20812 |0.005045
-7034 |20811 |0.004532
-10951 |20833 |0.177477
-10944 |20779 |0.008539
-8910 |20778 |0.006447
-10929 |20835 |0.071114
-10948 |20794 |0.013276
-8908 |12990 |0.013157
-8325 |13831 |0.009169
-3753 |13830 |0.196045
-6774 |13829 |0.032840
-8304 |13828 |0.117213
-9205 |13827 |0.010639
-8994 |13165 |0.012931
-8977 |13164 |0.008029
-8976 |13163 |0.069895
-8993 |13162 |0.009638
-8351 |13161 |0.099016
-8992 |13160 |0.187353
-8991 |13159 |0.018649
-2962 |13158 |0.071931
-1285 |13157 |0.118340
-8989 |13156 |0.006317
-8988 |13155 |0.079185
-21 |13154 |0.057101
-6436 |13153 |0.083288
-637 |13152 |0.099744
-8987 |13151 |0.057786
-398 |13150 |0.120005
-8496 |13149 |0.069498
-8986 |13148 |0.014323
-8985 |13167 |0.070884
-8451 |11869 |0.006925
-476 |11868 |0.196533
-529 |11867 |0.005677
-8450 |11871 |0.118857
-8452 |11878 |0.083250
-8455 |11880 |0.048821
-8456 |11883 |0.064572
-1807 |11882 |0.101185
-8457 |11894 |0.046805
-8465 |15481 |0.180992
-8522 |15480 |0.016198
-9621 |15479 |0.209882
-2808 |15478 |0.019312
-8311 |15477 |0.113487
-8583 |16981 |0.045667
-10046 |16982 |0.022635
-8467 |16983 |0.022924
-9624 |15487 |0.034042
-8468 |11899 |0.018103
-3170 |19357 |0.047698
-9949 |19358 |0.059093
-10479 |19359 |0.051651
-9948 |19360 |0.051709
-8509 |19374 |0.106794
-9595 |19375 |0.102428
-8634 |19376 |0.107643
-10174 |19377 |0.096140
-10482 |19378 |0.009782
-9194 |19379 |0.102702
-4397 |19380 |0.108243
-3002 |19381 |0.098919
-10484 |19382 |0.006171
-5962 |19383 |0.005429
-10485 |19384 |0.047276
-10459 |19385 |0.052864
-7579 |19386 |0.052378
-10455 |19387 |0.052414
-5805 |19388 |0.081956
-10462 |19389 |0.016974
-8768 |12598 |0.059630
-8767 |19290 |0.117748
-10470 |19289 |0.065769
-10469 |19288 |0.066230
-10468 |19287 |0.111281
-9967 |16642 |0.029056
-9956 |16621 |0.014614
-9938 |16626 |0.007036
-9960 |16649 |0.081206
-9968 |16650 |0.012230
-9969 |16647 |0.012368
-5457 |6266 |0.055134
-5458 |6267 |0.053860
-5459 |6268 |0.109859
-5460 |6269 |0.104952
-5461 |6270 |0.053766
-5462 |6271 |0.046800
-5463 |12897 |0.170300
-8880 |15060 |0.049014
-7101 |15059 |0.047811
-9313 |15058 |0.044674
-6733 |-1 |0.000000
+5700 |20787 |0.006774
+10932 |20756 |0.040876
+10931 |20797 |0.002564
+7661 |20796 |0.002581
+10943 |20776 |0.040800
+10941 |20772 |0.005720
+3415 |20771 |0.007463
+10940 |20841 |0.187594
+10952 |20812 |0.005045
+7034 |20811 |0.004532
+10951 |20833 |0.177477
+10944 |20779 |0.008539
+8910 |20778 |0.006447
+10929 |20835 |0.071114
+10948 |20794 |0.013276
+8908 |12990 |0.013157
+8325 |13831 |0.009169
+3753 |13830 |0.196045
+6774 |13829 |0.032840
+8304 |13828 |0.117213
+9205 |13827 |0.010639
+8994 |13165 |0.012931
+8977 |13164 |0.008029
+8976 |13163 |0.069895
+8993 |13162 |0.009638
+8351 |13161 |0.099016
+8992 |13160 |0.187353
+8991 |13159 |0.018649
+2962 |13158 |0.071931
+1285 |13157 |0.118340
+8989 |13156 |0.006317
+8988 |13155 |0.079185
+21 |13154 |0.057101
+6436 |13153 |0.083288
+637 |13152 |0.099744
+8987 |13151 |0.057786
+398 |13150 |0.120005
+8496 |13149 |0.069498
+8986 |13148 |0.014323
+8985 |13167 |0.070884
+8451 |11869 |0.006925
+476 |11868 |0.196533
+529 |11867 |0.005677
+8450 |11871 |0.118857
+8452 |11878 |0.083250
+8455 |11880 |0.048821
+8456 |11883 |0.064572
+1807 |11882 |0.101185
+8457 |11894 |0.046805
+8465 |15481 |0.180992
+8522 |15480 |0.016198
+9621 |15479 |0.209882
+2808 |15478 |0.019312
+8311 |15477 |0.113487
+8583 |16981 |0.045667
+10046 |16982 |0.022635
+8467 |16983 |0.022924
+9624 |15487 |0.034042
+8468 |11899 |0.018103
+3170 |19357 |0.047698
+9949 |19358 |0.059093
+10479 |19359 |0.051651
+9948 |19360 |0.051709
+8509 |19374 |0.106794
+9595 |19375 |0.102428
+8634 |19376 |0.107643
+10174 |19377 |0.096140
+10482 |19378 |0.009782
+9194 |19379 |0.102702
+4397 |19380 |0.108243
+3002 |19381 |0.098919
+10484 |19382 |0.006171
+5962 |19383 |0.005429
+10485 |19384 |0.047276
+10459 |19385 |0.052864
+7579 |19386 |0.052378
+10455 |19387 |0.052414
+5805 |19388 |0.081956
+10462 |19389 |0.016974
+8768 |12598 |0.059630
+8767 |19290 |0.117748
+10470 |19289 |0.065769
+10469 |19288 |0.066230
+10468 |19287 |0.111281
+9967 |16642 |0.029056
+9956 |16621 |0.014614
+9938 |16626 |0.007036
+9960 |16649 |0.081206
+9968 |16650 |0.012230
+9969 |16647 |0.012368
+5457 |6266 |0.055134
+5458 |6267 |0.053860
+5459 |6268 |0.109859
+5460 |6269 |0.104952
+5461 |6270 |0.053766
+5462 |6271 |0.046800
+5463 |12897 |0.170300
+8880 |15060 |0.049014
+7101 |15059 |0.047811
+9313 |15058 |0.044674
+6733 |-1 |0.000000
diff --git a/src/bd_astar/tester/ans2.txt b/src/bd_astar/tester/ans2.txt
index 69839e0..60579c7 100644
--- a/src/bd_astar/tester/ans2.txt
+++ b/src/bd_astar/tester/ans2.txt
@@ -1,60 +1,60 @@
-6585 |17975 |0.200230
-5367 |17976 |0.155428
-7125 |17977 |0.178581
-613 |17978 |0.175712
-10025 |17979 |0.173776
-5802 |6758 |0.013489
-5803 |6759 |0.065176
-5804 |6760 |0.008679
-5805 |6761 |0.145097
-5806 |6762 |0.146807
-5807 |6763 |0.097186
-5808 |6764 |0.050569
-5809 |20663 |0.169650
-4620 |20662 |0.023243
-5774 |20661 |0.120390
-6482 |20660 |0.002769
-5957 |20659 |0.087952
-8289 |20658 |0.048701
-10884 |20657 |0.009212
-10883 |20656 |0.080500
-9954 |20655 |0.075280
-4390 |16876 |0.147691
-9203 |17805 |0.063931
-7892 |17804 |0.015429
-8417 |17803 |0.069119
-10171 |17802 |0.075825
-9953 |17801 |0.045079
-8859 |17800 |0.029389
-8536 |17799 |0.072658
-10180 |17798 |0.076558
-9592 |17797 |0.027637
-9318 |17796 |0.114755
-10179 |17795 |0.007150
-10178 |17794 |0.087467
-8402 |17793 |0.062258
-6179 |17792 |0.109483
-8508 |17791 |0.036248
-3305 |17790 |0.069816
-8512 |17789 |0.064158
-998 |17807 |0.471312
-2698 |2743 |0.102019
-2563 |9039 |0.341756
-2043 |9040 |0.587619
-4280 |9041 |0.145996
-2317 |9042 |0.268754
-7135 |9043 |0.121251
-4276 |9044 |0.145396
-6167 |9045 |0.583394
-7136 |9046 |0.043099
-7137 |19345 |0.053510
-10475 |19344 |0.015153
-10142 |19343 |0.064475
-10140 |17566 |0.135370
-8539 |17565 |0.057338
-10138 |17558 |0.064893
-6943 |17559 |0.201703
-8140 |17560 |0.469613
-10139 |20189 |0.060217
-10705 |20185 |0.055053
-8247 |-1 |0.000000
+6585 |17975 |0.200230
+5367 |17976 |0.155428
+7125 |17977 |0.178581
+613 |17978 |0.175712
+10025 |17979 |0.173776
+5802 |6758 |0.013489
+5803 |6759 |0.065176
+5804 |6760 |0.008679
+5805 |6761 |0.145097
+5806 |6762 |0.146807
+5807 |6763 |0.097186
+5808 |6764 |0.050569
+5809 |20663 |0.169650
+4620 |20662 |0.023243
+5774 |20661 |0.120390
+6482 |20660 |0.002769
+5957 |20659 |0.087952
+8289 |20658 |0.048701
+10884 |20657 |0.009212
+10883 |20656 |0.080500
+9954 |20655 |0.075280
+4390 |16876 |0.147691
+9203 |17805 |0.063931
+7892 |17804 |0.015429
+8417 |17803 |0.069119
+10171 |17802 |0.075825
+9953 |17801 |0.045079
+8859 |17800 |0.029389
+8536 |17799 |0.072658
+10180 |17798 |0.076558
+9592 |17797 |0.027637
+9318 |17796 |0.114755
+10179 |17795 |0.007150
+10178 |17794 |0.087467
+8402 |17793 |0.062258
+6179 |17792 |0.109483
+8508 |17791 |0.036248
+3305 |17790 |0.069816
+8512 |17789 |0.064158
+998 |17807 |0.471312
+2698 |2743 |0.102019
+2563 |9039 |0.341756
+2043 |9040 |0.587619
+4280 |9041 |0.145996
+2317 |9042 |0.268754
+7135 |9043 |0.121251
+4276 |9044 |0.145396
+6167 |9045 |0.583394
+7136 |9046 |0.043099
+7137 |19345 |0.053510
+10475 |19344 |0.015153
+10142 |19343 |0.064475
+10140 |17566 |0.135370
+8539 |17565 |0.057338
+10138 |17558 |0.064893
+6943 |17559 |0.201703
+8140 |17560 |0.469613
+10139 |20189 |0.060217
+10705 |20185 |0.055053
+8247 |-1 |0.000000
diff --git a/src/bd_astar/tester/ans3.txt b/src/bd_astar/tester/ans3.txt
index 0412f67..c7bfec2 100644
--- a/src/bd_astar/tester/ans3.txt
+++ b/src/bd_astar/tester/ans3.txt
@@ -1,2 +1,2 @@
-9426 |14822 |0.060319
-3606 |-1 |0.000000
+9426 |14822 |0.060319
+3606 |-1 |0.000000
diff --git a/src/bd_astar/tester/ans4.txt b/src/bd_astar/tester/ans4.txt
index d499d34..94026f5 100644
--- a/src/bd_astar/tester/ans4.txt
+++ b/src/bd_astar/tester/ans4.txt
@@ -1,2 +1,2 @@
-3606 |14822 |0.060319
-9426 |-1 |0.000000
+3606 |14822 |0.060319
+9426 |-1 |0.000000
diff --git a/src/bd_astar/tester/ans5.txt b/src/bd_astar/tester/ans5.txt
index 2ce61fa..a5cdc1d 100644
--- a/src/bd_astar/tester/ans5.txt
+++ b/src/bd_astar/tester/ans5.txt
@@ -1,101 +1,101 @@
-6733 |15058 |0.044674
-9313 |15059 |0.047811
-7101 |15060 |0.049014
-8880 |12897 |0.170300
-5463 |6271 |0.046800
-5462 |6270 |0.053766
-5461 |6269 |0.104952
-5460 |6268 |0.109859
-5459 |6267 |0.053860
-5458 |6266 |0.055134
-5457 |16647 |0.012368
-9969 |16650 |0.012230
-9968 |16649 |0.081206
-9960 |16626 |0.007036
-9938 |16621 |0.014614
-9956 |16642 |0.029056
-9967 |19287 |0.111281
-10468 |19288 |0.066230
-10469 |19289 |0.065769
-10470 |19290 |0.117748
-8767 |12598 |0.059630
-8768 |19389 |0.016974
-10462 |19388 |0.081956
-5805 |19387 |0.052414
-10455 |19386 |0.052378
-7579 |19385 |0.052864
-10459 |19384 |0.047276
-10485 |19383 |0.005429
-5962 |19382 |0.006171
-10484 |19381 |0.098919
-3002 |19380 |0.108243
-4397 |19379 |0.102702
-9194 |19378 |0.009782
-10482 |19377 |0.096140
-10174 |19376 |0.107643
-8634 |19375 |0.102428
-9595 |19374 |0.106794
-8509 |19360 |0.051709
-9948 |19359 |0.051651
-10479 |19358 |0.059093
-9949 |19357 |0.047698
-3170 |11899 |0.018103
-8468 |15487 |0.034042
-9624 |16983 |0.022924
-8467 |16982 |0.022635
-10046 |16981 |0.045667
-8583 |15477 |0.113487
-8311 |15478 |0.019312
-2808 |15479 |0.209882
-9621 |15480 |0.016198
-8522 |15481 |0.180992
-8465 |11894 |0.046805
-8457 |11882 |0.101185
-1807 |11883 |0.064572
-8456 |11880 |0.048821
-8455 |11878 |0.083250
-8452 |11871 |0.118857
-8450 |11867 |0.005677
-529 |11868 |0.196533
-476 |11869 |0.006925
-8451 |13167 |0.070884
-8985 |13148 |0.014323
-8986 |13149 |0.069498
-8496 |13150 |0.120005
-398 |13151 |0.057786
-8987 |13152 |0.099744
-637 |13153 |0.083288
-6436 |13154 |0.057101
-21 |13155 |0.079185
-8988 |13156 |0.006317
-8989 |13157 |0.118340
-1285 |13158 |0.071931
-2962 |13159 |0.018649
-8991 |13160 |0.187353
-8992 |13161 |0.099016
-8351 |13162 |0.009638
-8993 |13163 |0.069895
-8976 |13164 |0.008029
-8977 |13165 |0.012931
-8994 |13827 |0.010639
-9205 |13828 |0.117213
-8304 |13829 |0.032840
-6774 |13830 |0.196045
-3753 |13831 |0.009169
-8325 |12990 |0.013157
-8908 |20794 |0.013276
-10948 |20835 |0.071114
-10929 |20778 |0.006447
-8910 |20779 |0.008539
-10944 |20833 |0.177477
-10951 |20811 |0.004532
-7034 |20812 |0.005045
-10952 |20841 |0.187594
-10940 |20771 |0.007463
-3415 |20772 |0.005720
-10941 |20776 |0.040800
-10943 |20796 |0.002581
-7661 |20797 |0.002564
-10931 |20756 |0.040876
-10932 |20787 |0.006774
-5700 |-1 |0.000000
+6733 |15058 |0.044674
+9313 |15059 |0.047811
+7101 |15060 |0.049014
+8880 |12897 |0.170300
+5463 |6271 |0.046800
+5462 |6270 |0.053766
+5461 |6269 |0.104952
+5460 |6268 |0.109859
+5459 |6267 |0.053860
+5458 |6266 |0.055134
+5457 |16647 |0.012368
+9969 |16650 |0.012230
+9968 |16649 |0.081206
+9960 |16626 |0.007036
+9938 |16621 |0.014614
+9956 |16642 |0.029056
+9967 |19287 |0.111281
+10468 |19288 |0.066230
+10469 |19289 |0.065769
+10470 |19290 |0.117748
+8767 |12598 |0.059630
+8768 |19389 |0.016974
+10462 |19388 |0.081956
+5805 |19387 |0.052414
+10455 |19386 |0.052378
+7579 |19385 |0.052864
+10459 |19384 |0.047276
+10485 |19383 |0.005429
+5962 |19382 |0.006171
+10484 |19381 |0.098919
+3002 |19380 |0.108243
+4397 |19379 |0.102702
+9194 |19378 |0.009782
+10482 |19377 |0.096140
+10174 |19376 |0.107643
+8634 |19375 |0.102428
+9595 |19374 |0.106794
+8509 |19360 |0.051709
+9948 |19359 |0.051651
+10479 |19358 |0.059093
+9949 |19357 |0.047698
+3170 |11899 |0.018103
+8468 |15487 |0.034042
+9624 |16983 |0.022924
+8467 |16982 |0.022635
+10046 |16981 |0.045667
+8583 |15477 |0.113487
+8311 |15478 |0.019312
+2808 |15479 |0.209882
+9621 |15480 |0.016198
+8522 |15481 |0.180992
+8465 |11894 |0.046805
+8457 |11882 |0.101185
+1807 |11883 |0.064572
+8456 |11880 |0.048821
+8455 |11878 |0.083250
+8452 |11871 |0.118857
+8450 |11867 |0.005677
+529 |11868 |0.196533
+476 |11869 |0.006925
+8451 |13167 |0.070884
+8985 |13148 |0.014323
+8986 |13149 |0.069498
+8496 |13150 |0.120005
+398 |13151 |0.057786
+8987 |13152 |0.099744
+637 |13153 |0.083288
+6436 |13154 |0.057101
+21 |13155 |0.079185
+8988 |13156 |0.006317
+8989 |13157 |0.118340
+1285 |13158 |0.071931
+2962 |13159 |0.018649
+8991 |13160 |0.187353
+8992 |13161 |0.099016
+8351 |13162 |0.009638
+8993 |13163 |0.069895
+8976 |13164 |0.008029
+8977 |13165 |0.012931
+8994 |13827 |0.010639
+9205 |13828 |0.117213
+8304 |13829 |0.032840
+6774 |13830 |0.196045
+3753 |13831 |0.009169
+8325 |12990 |0.013157
+8908 |20794 |0.013276
+10948 |20835 |0.071114
+10929 |20778 |0.006447
+8910 |20779 |0.008539
+10944 |20833 |0.177477
+10951 |20811 |0.004532
+7034 |20812 |0.005045
+10952 |20841 |0.187594
+10940 |20771 |0.007463
+3415 |20772 |0.005720
+10941 |20776 |0.040800
+10943 |20796 |0.002581
+7661 |20797 |0.002564
+10931 |20756 |0.040876
+10932 |20787 |0.006774
+5700 |-1 |0.000000
diff --git a/src/bd_astar/tester/ans6.txt b/src/bd_astar/tester/ans6.txt
index 8f220c6..046e7bc 100644
--- a/src/bd_astar/tester/ans6.txt
+++ b/src/bd_astar/tester/ans6.txt
@@ -1,60 +1,60 @@
-8247 |20185 |0.055053
-10705 |20189 |0.060217
-10139 |17560 |0.469613
-8140 |17559 |0.201703
-6943 |17558 |0.064893
-10138 |17565 |0.057338
-8539 |17566 |0.135370
-10140 |19343 |0.064475
-10142 |19344 |0.015153
-10475 |19345 |0.053510
-7137 |9046 |0.043099
-7136 |9045 |0.583394
-6167 |9044 |0.145396
-4276 |9043 |0.121251
-7135 |9042 |0.268754
-2317 |9041 |0.145996
-4280 |9040 |0.587619
-2043 |9039 |0.341756
-2563 |2743 |0.102019
-2698 |17807 |0.471312
-998 |17789 |0.064158
-8512 |17790 |0.069816
-3305 |17791 |0.036248
-8508 |17792 |0.109483
-6179 |17793 |0.062258
-8402 |17794 |0.087467
-10178 |17795 |0.007150
-10179 |17796 |0.114755
-9318 |17797 |0.027637
-9592 |17798 |0.076558
-10180 |17799 |0.072658
-8536 |17800 |0.029389
-8859 |17801 |0.045079
-9953 |17802 |0.075825
-10171 |17803 |0.069119
-8417 |17804 |0.015429
-7892 |17805 |0.063931
-9203 |16876 |0.147691
-4390 |20655 |0.075280
-9954 |20656 |0.080500
-10883 |20657 |0.009212
-10884 |20658 |0.048701
-8289 |20659 |0.087952
-5957 |20660 |0.002769
-6482 |20661 |0.120390
-5774 |20662 |0.023243
-4620 |20663 |0.169650
-5809 |6764 |0.050569
-5808 |6763 |0.097186
-5807 |6762 |0.146807
-5806 |6761 |0.145097
-5805 |6760 |0.008679
-5804 |6759 |0.065176
-5803 |6758 |0.013489
-5802 |17979 |0.173776
-10025 |17978 |0.175712
-613 |17977 |0.178581
-7125 |17976 |0.155428
-5367 |17975 |0.200230
-6585 |-1 |0.000000
+8247 |20185 |0.055053
+10705 |20189 |0.060217
+10139 |17560 |0.469613
+8140 |17559 |0.201703
+6943 |17558 |0.064893
+10138 |17565 |0.057338
+8539 |17566 |0.135370
+10140 |19343 |0.064475
+10142 |19344 |0.015153
+10475 |19345 |0.053510
+7137 |9046 |0.043099
+7136 |9045 |0.583394
+6167 |9044 |0.145396
+4276 |9043 |0.121251
+7135 |9042 |0.268754
+2317 |9041 |0.145996
+4280 |9040 |0.587619
+2043 |9039 |0.341756
+2563 |2743 |0.102019
+2698 |17807 |0.471312
+998 |17789 |0.064158
+8512 |17790 |0.069816
+3305 |17791 |0.036248
+8508 |17792 |0.109483
+6179 |17793 |0.062258
+8402 |17794 |0.087467
+10178 |17795 |0.007150
+10179 |17796 |0.114755
+9318 |17797 |0.027637
+9592 |17798 |0.076558
+10180 |17799 |0.072658
+8536 |17800 |0.029389
+8859 |17801 |0.045079
+9953 |17802 |0.075825
+10171 |17803 |0.069119
+8417 |17804 |0.015429
+7892 |17805 |0.063931
+9203 |16876 |0.147691
+4390 |20655 |0.075280
+9954 |20656 |0.080500
+10883 |20657 |0.009212
+10884 |20658 |0.048701
+8289 |20659 |0.087952
+5957 |20660 |0.002769
+6482 |20661 |0.120390
+5774 |20662 |0.023243
+4620 |20663 |0.169650
+5809 |6764 |0.050569
+5808 |6763 |0.097186
+5807 |6762 |0.146807
+5806 |6761 |0.145097
+5805 |6760 |0.008679
+5804 |6759 |0.065176
+5803 |6758 |0.013489
+5802 |17979 |0.173776
+10025 |17978 |0.175712
+613 |17977 |0.178581
+7125 |17976 |0.155428
+5367 |17975 |0.200230
+6585 |-1 |0.000000
diff --git a/src/bd_astar/tester/input.txt b/src/bd_astar/tester/input.txt
index 6541bf2..35fb2f3 100644
--- a/src/bd_astar/tester/input.txt
+++ b/src/bd_astar/tester/input.txt
@@ -1,7 +1,7 @@
-ways.txt 5700 6733 bdd1.txt ans1.txt
-ways.txt 6585 8247 bdd2.txt ans2.txt
-ways.txt 9426 3606 bdd3.txt ans3.txt
-ways.txt 3606 9426 bdd4.txt ans4.txt
-ways.txt 6733 5700 bdd5.txt ans5.txt
-ways.txt 8247 6585 bdd6.txt ans6.txt
-
+ways.txt 5700 6733 bdd1.txt ans1.txt
+ways.txt 6585 8247 bdd2.txt ans2.txt
+ways.txt 9426 3606 bdd3.txt ans3.txt
+ways.txt 3606 9426 bdd4.txt ans4.txt
+ways.txt 6733 5700 bdd5.txt ans5.txt
+ways.txt 8247 6585 bdd6.txt ans6.txt
+
diff --git a/src/bd_dijkstra/doc/doc-bdDijkstra.queries b/src/bd_dijkstra/doc/doc-bdDijkstra.queries
index f6ba4fc..c37c49a 100644
--- a/src/bd_dijkstra/doc/doc-bdDijkstra.queries
+++ b/src/bd_dijkstra/doc/doc-bdDijkstra.queries
@@ -1,30 +1,34 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_bdDijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
- 4, 10, false, false);
+ 2, 3, false, false);
+NOTICE: Deprecated Signature of pgr_bdDijkstra
seq | id1 | id2 | cost
-----+-----+-----+------
- 0 | 4 | | 0
- 1 | 3 | | 0
- 2 | 2 | | 1
- 3 | 5 | | 1
- 4 | 10 | | 0
-(5 rows)
+ 0 | 2 | 4 | 1
+ 1 | 5 | 8 | 1
+ 2 | 6 | 5 | 1
+ 3 | 3 | -1 | 0
+(4 rows)
--q2
SELECT * FROM pgr_bdDijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
- 4, 10, true, true);
+ 2, 3, true, true);
+NOTICE: Deprecated Signature of pgr_bdDijkstra
seq | id1 | id2 | cost
-----+-----+-----+------
- 0 | 4 | | 1
- 1 | 3 | | 1
- 2 | 2 | | 1
- 3 | 5 | | 1
- 4 | 10 | | 0
-(5 rows)
+ 0 | 2 | 4 | 1
+ 1 | 5 | 8 | 1
+ 2 | 6 | 9 | 1
+ 3 | 9 | 16 | 1
+ 4 | 4 | 3 | 1
+ 5 | 3 | -1 | 0
+(6 rows)
--q3
ROLLBACK;
diff --git a/src/bd_dijkstra/doc/pgr_bdDijkstra.rst b/src/bd_dijkstra/doc/pgr_bdDijkstra.rst
deleted file mode 100644
index ced7ae3..0000000
--- a/src/bd_dijkstra/doc/pgr_bdDijkstra.rst
+++ /dev/null
@@ -1,95 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _bd_dijkstra:
-
-pgr_bdDijkstra - Bi-directional Dijkstra Shortest Path
-===============================================================================
-
-.. index::
- single: bdDijkstra(Complete Signature)
-
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_bdDijkstra`` - Returns the shortest path using Bidirectional Dijkstra algorithm.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-This is a bi-directional Dijkstra search algorithm. It searches from the source toward the distination and at the same time from the destination to the source and terminates whe these to searches meet in the middle. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows, that make up a path.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_bdDijkstra(sql text, source integer, target integer,
- directed boolean, has_rcost boolean);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :reverse_cost: (optional) the cost for the reverse traversal of the edge. This is only used when the ``directed`` and ``has_rcost`` parameters are ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:target: ``int4`` id of the end point
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: node ID
-:id2: edge ID (``-1`` for the last row)
-:cost: cost to traverse from ``id1`` using ``id2``
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-
-.. literalinclude:: doc-bdDijkstra.queries
- :start-after: --q1
- :end-before: --q2
-
-* With ``reverse_cost``
-
-.. literalinclude:: doc-bdDijkstra.queries
- :start-after: --q2
- :end-before: --q3
-
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`type_cost_result`
-* :ref:`bd_astar`
-* http://en.wikipedia.org/wiki/Bidirectional_search
-* http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
-
diff --git a/src/bd_dijkstra/sql/CMakeLists.txt b/src/bd_dijkstra/sql/CMakeLists.txt
index 71444c4..b49de6f 100644
--- a/src/bd_dijkstra/sql/CMakeLists.txt
+++ b/src/bd_dijkstra/sql/CMakeLists.txt
@@ -1,6 +1,7 @@
# Append in local scope
list(APPEND PACKAGE_SQL_FILES
- ${CMAKE_CURRENT_SOURCE_DIR}/routing_bd_dijkstra.sql)
+ ${CMAKE_CURRENT_SOURCE_DIR}/bdDijkstra-v2.sql
+ )
# set in parent scope
set(PACKAGE_SQL_FILES "${PACKAGE_SQL_FILES}" PARENT_SCOPE)
diff --git a/src/astar/sql/astarV2.0.sql b/src/bd_dijkstra/sql/bdDijkstra-v2.sql
similarity index 66%
copy from src/astar/sql/astarV2.0.sql
copy to src/bd_dijkstra/sql/bdDijkstra-v2.sql
index b83075d..2a66df3 100644
--- a/src/astar/sql/astarV2.0.sql
+++ b/src/bd_dijkstra/sql/bdDijkstra-v2.sql
@@ -1,8 +1,11 @@
/*PGR-GNU*****************************************************************
-Copyright (c) 2015 pgRouting developers
+Copyright (c) 2016 pgRouting developers
Mail: project at pgrouting.org
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
------
This program is free software; you can redistribute it and/or modify
@@ -23,27 +26,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-- V2 signature
-CREATE OR REPLACE FUNCTION pgr_astar(edges_sql TEXT, source_id INTEGER, target_id INTEGER, directed BOOLEAN, has_rcost BOOLEAN)
+CREATE OR REPLACE FUNCTION pgr_bdDijkstra(edges_sql TEXT, start_vid INTEGER, end_vid INTEGER, directed BOOLEAN, has_rcost BOOLEAN)
RETURNS SETOF pgr_costresult AS
$BODY$
DECLARE
has_reverse BOOLEAN;
sql TEXT;
BEGIN
- RAISE NOTICE 'Deprecated signature of function pgr_astar';
- has_reverse =_pgr_parameter_check('astar', edges_sql, false);
+ RAISE NOTICE 'Deprecated Signature of pgr_bdDijkstra';
+ has_reverse =_pgr_parameter_check('dijkstra', edges_sql, false);
sql = edges_sql;
IF (has_reverse != has_rcost) THEN
IF (has_reverse) THEN
- sql = 'SELECT id, source, target, cost, x1,y1, x2, y2 FROM (' || edges_sql || ') a';
+ sql = 'SELECT id, source, target, cost FROM (' || edges_sql || ') a';
ELSE
raise EXCEPTION 'has_rcost set to true but reverse_cost not found';
END IF;
END IF;
- RETURN query SELECT seq - 1 AS seq, node::INTEGER AS id1, edge::INTEGER AS id2, cost
- FROM pgr_astar(sql, source_id, target_id, directed);
-END
+ RETURN query SELECT seq-1 AS seq, node::integer AS id1, edge::integer AS id2, cost
+ FROM _pgr_bdDijkstra(sql, start_vid, end_vid, directed, false);
+ END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
diff --git a/src/bd_dijkstra/sql/routing_bd_dijkstra.sql b/src/bd_dijkstra/sql/routing_bd_dijkstra.sql
deleted file mode 100644
index f6d62ac..0000000
--- a/src/bd_dijkstra/sql/routing_bd_dijkstra.sql
+++ /dev/null
@@ -1,39 +0,0 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
------------------------------------------------------------------------
--- Core function for bi_directional_dijkstra_shortest_path computation
--- See README for description
------------------------------------------------------------------------
---
---
-
-CREATE OR REPLACE FUNCTION pgr_bdDijkstra(
- sql text,
- source_vid integer,
- target_vid integer,
- directed boolean,
- has_reverse_cost boolean)
- RETURNS SETOF pgr_costResult
- AS '$libdir/${PGROUTING_LIBRARY_NAME}', 'bidir_dijkstra_shortest_path'
- LANGUAGE c IMMUTABLE STRICT;
-
diff --git a/src/bd_dijkstra/src/BiDirDijkstra.cpp b/src/bd_dijkstra/src/BiDirDijkstra.cpp
deleted file mode 100644
index e9fa103..0000000
--- a/src/bd_dijkstra/src/BiDirDijkstra.cpp
+++ /dev/null
@@ -1,460 +0,0 @@
-/*PGR-MIT*****************************************************************
-
-* $Id$
-*
-* Project: pgRouting bdsp and bdastar algorithms
-* Purpose:
-* Author: Razequl Islam <ziboncsedu at gmail.com>
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-MIT*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <queue>
-#include <vector>
-#include <functional>
-
-#include "BiDirDijkstra.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-
-
-BiDirDijkstra::BiDirDijkstra(void) {
-}
-
-BiDirDijkstra::~BiDirDijkstra(void) {
-}
-
-void BiDirDijkstra::init() {
- // max_edge_id = 0;
- // max_node_id = 0;
-}
-
-/*
- Initialization and allocation of memories.
-*/
-void BiDirDijkstra::initall(int maxNode) {
- int i;
- m_vecPath.clear();
- // DBG("BiDirDijkstra::initall: allocating m_pFParent, m_pRParent maxNode: %d\n", maxNode+1);
- m_pFParent = new PARENT_PATH[maxNode + 1];
- m_pRParent = new PARENT_PATH[maxNode + 1];
- // DBG("BiDirDijkstra::initall: allocated m_pFParent, m_pRParent\n");
-
- // DBG("BiDirDijkstra::initall: allocating m_pFCost, m_pRCost maxNode: %d\n", maxNode+1);
- m_pFCost = new double[maxNode + 1];
- m_pRCost = new double[maxNode + 1];
- // DBG("BiDirDijkstra::initall: allocated m_pFCost, m_pRCost\n");
-
- for (i = 0; i <= maxNode; i++) {
- m_pFParent[i].par_Node = -2;
- m_pRParent[i].par_Node = -2;
- m_pFCost[i] = INF;
- m_pRCost[i] = INF;
- }
- m_MinCost = INF;
- m_MidNode = -1;
-
- // DBG("BiDirDijkstra::initall: m_vecNodeVector.reserve(%d)\n", maxNode + 1);
- // reserve space for nodes
- m_vecNodeVector.reserve(maxNode + 1);
- // DBG(" space reserved!\n");
-}
-
-/*
- Delete the allocated memories to avoid memory leak.
-*/
-void BiDirDijkstra::deleteall() {
- std::vector<GraphNodeInfo*>::iterator itNode;
- for (itNode = m_vecNodeVector.begin(); itNode != m_vecNodeVector.end(); itNode++) {
- delete *itNode;
- }
- m_vecNodeVector.clear();
- std::vector<GraphEdgeInfo*>::iterator itEdge;
- for (itEdge = m_vecEdgeVector.begin(); itEdge != m_vecEdgeVector.end(); itEdge++) {
- delete *itEdge;
- }
- m_vecEdgeVector.clear();
- delete [] m_pFParent;
- delete [] m_pRParent;
- delete [] m_pFCost;
- delete [] m_pRCost;
-}
-
-/*
- Get the current cost from source to the current node if direction is 1 else the cost to reach target from the current node.
-*/
-double BiDirDijkstra::getcost(int node_id, int dir) {
- if (dir == 1) {
- return(m_pFCost[node_id]);
- } else {
- return(m_pRCost[node_id]);
- }
-}
-/*
- Set the forward or reverse cost list depending on dir (1 for forward search and -1 for reverse search.
-*/
-void BiDirDijkstra::setcost(int node_id, int dir, double c) {
- if (dir == 1) {
- m_pFCost[node_id] = c;
- } else {
- m_pRCost[node_id] = c;
- }
-}
-
-void BiDirDijkstra::setparent(int node_id, int dir, int parnode, int paredge) {
- if (dir == 1) {
- m_pFParent[node_id].par_Node = parnode;
- m_pFParent[node_id].par_Edge = paredge;
- } else {
- m_pRParent[node_id].par_Node = parnode;
- m_pRParent[node_id].par_Edge = paredge;
- }
-}
-
-/*
- Reconstruct path for forward search. It is like normal dijkstra. The parent array contains the parent of the current node and there is a -1 in the source.
- So one need to recurse up to the source and then add the current node and edge to the list.
-*/
-void BiDirDijkstra::fconstruct_path(int node_id) {
- if (m_pFParent[node_id].par_Node == -1)
- return;
- fconstruct_path(m_pFParent[node_id].par_Node);
- path_element_t pt;
- pt.vertex_id = m_pFParent[node_id].par_Node;
- pt.edge_id = m_pFParent[node_id].par_Edge;
- pt.cost = m_pFCost[node_id] - m_pFCost[m_pFParent[node_id].par_Node];
- m_vecPath.push_back(pt);
-}
-
-/*
- Reconstruct path for the reverse search. In this case the subsequent node is stored in the parent and the target contains a -1. So one need to add the node
- and edge to the list and then recurse through the parent up to hitting a -1.
-*/
-
-void BiDirDijkstra::rconstruct_path(int node_id) {
- path_element_t pt;
- if (m_pRParent[node_id].par_Node == -1) {
- pt.vertex_id = node_id;
- pt.edge_id = -1;
- pt.cost = 0.0;
- return;
- }
- pt.vertex_id = node_id;
- pt.cost = m_pRCost[node_id] - m_pRCost[m_pRParent[node_id].par_Node];
- pt.edge_id = m_pRParent[node_id].par_Edge;
- m_vecPath.push_back(pt);
- rconstruct_path(m_pRParent[node_id].par_Node);
-}
-
-/*
- This is the main exploration module. The parameter dir indicates whether the exploration will be in forward or reverser direction. The reference to the corresponding
- que is also passed as parameter que. The current node and the current costs are also available as parameter.
-*/
-
-void BiDirDijkstra::explore(int cur_node, double cur_cost, int dir, std::priority_queue<PDI, std::vector<PDI>, std::greater<PDI> > &que) {
- int i;
- // Number of connected edges
- int con_edge = static_cast<int>(m_vecNodeVector[cur_node]->Connected_Edges_Index.size());
- double edge_cost;
-
- for (i = 0; i < con_edge; i++) {
- int edge_index = m_vecNodeVector[cur_node]->Connected_Edges_Index[i];
- // Get the edge from the edge list.
- GraphEdgeInfo edge = *m_vecEdgeVector[edge_index];
- // Get the connected node
- int new_node = m_vecNodeVector[cur_node]->Connected_Nodes[i];
-
- if (cur_node == edge.StartNode) {
- // Current node is the startnode of the edge. For forward search it should use forward cost, otherwise it should use the reverse cost,
- // i.e. if the reverse direction is valid then this node may be visited from the end node.
- if (dir > 0)
- edge_cost = edge.Cost;
- else
- edge_cost = edge.ReverseCost;
-
- // Check if the direction is valid for exploration
- if (edge.Direction == 0 || edge_cost >= 0.0) {
- // Check if the current edge gives better result
- if (cur_cost + edge_cost < getcost(new_node, dir)) {
- // explore the node, and push it in the queue
- setcost(new_node, dir, cur_cost + edge_cost);
- setparent(new_node, dir, cur_node, edge.EdgeID);
- que.push(std::make_pair(cur_cost + edge_cost, new_node));
-
- // Update the minimum cost found so far.
- if (getcost(new_node, dir) + getcost(new_node, dir * -1) < m_MinCost) {
- m_MinCost = getcost(new_node, dir) + getcost(new_node, dir * -1);
- m_MidNode = new_node;
- }
- }
- }
- } else {
- // Current node is the endnode of the edge. For forward search it should use reverse cost, otherwise it should use the forward cost,
- // i.e. if the forward direction is valid then this node may be visited from the start node.
- if (dir > 0)
- edge_cost = edge.ReverseCost;
- else
- edge_cost = edge.Cost;
-
- // Check if the direction is valid for exploration
- if (edge.Direction == 0 || edge_cost >= 0.0) {
- // Check if the current edge gives better result
- if (cur_cost + edge_cost < getcost(new_node, dir)) {
- setcost(new_node, dir, cur_cost + edge_cost);
- setparent(new_node, dir, cur_node, edge.EdgeID);
- que.push(std::make_pair(cur_cost + edge_cost, new_node));
-
- // Update the minimum cost found so far.
- if (getcost(new_node, dir) + getcost(new_node, dir * -1) < m_MinCost) {
- m_MinCost = getcost(new_node, dir) + getcost(new_node, dir * -1);
- m_MidNode = new_node;
- }
- }
- }
- }
- }
-}
-
-/*
- This is the entry function that the wrappers should call. Most of the parameters are trivial. maxNode refers to Maximum
- node id. As we run node based exploration cost, parent etc will be based on maximam node id.
-*/
-
-
-int BiDirDijkstra::bidir_dijkstra(edge_t *edges, unsigned int edge_count, int maxNode, int start_vertex, int end_vertex,
- path_element_t **path, int *path_count, char **err_msg) {
- max_node_id = maxNode;
- max_edge_id = -1;
-
- // Allocate memory for local storage like cost and parent holder
- // DBG("calling initall(maxNode = %d)\n", maxNode);
- initall(maxNode);
-
- // construct the graph from the edge list, i.e. populate node and edge data structures
- // DBG("Calling construct_graph\n");
- construct_graph(edges, edge_count, maxNode);
-
-
- // int nodeCount = m_vecNodeVector.size();
- // DBG("Setting up std::priority_queue\n");
- std::priority_queue<PDI, std::vector<PDI>, std::greater<PDI> > fque;
- std::priority_queue<PDI, std::vector<PDI>, std::greater<PDI> > rque;
-
- // DBG("calling m_vecPath.clear()\n");
- m_vecPath.clear();
-
- // Initialize the forward search
- m_pFParent[start_vertex].par_Node = -1;
- m_pFParent[start_vertex].par_Edge = -1;
- m_pFCost[start_vertex] = 0.0;
- fque.push(std::make_pair(0.0, start_vertex));
-
- // Initialize the reverse search
- m_pRParent[end_vertex].par_Node = -1;
- m_pRParent[end_vertex].par_Edge = -1;
- m_pRCost[end_vertex] = 0.0;
- rque.push(std::make_pair(0.0, end_vertex));
-
- int i;
- // int new_node;
- int cur_node;
- // int dir;
-
-/*
- The main loop. The algorithm is as follows:
- 1. IF the sum of the current minimum of both heap is greater than so far found path, we cannot get any better, so break the loop.
- 2. IF the reverse heap minimum is lower than the forward heap minimum, explore from reverse direction.
- 3. ELSE explore from the forward directtion.
-*/
-
- while (!fque.empty() && !rque.empty()) {
- PDI fTop = fque.top();
- PDI rTop = rque.top();
- if (fTop.first + rTop.first > m_MinCost) // We are done, there is no path with lower cost
- break;
-
- if (rTop.first < fTop.first) {
- // Explore from reverse queue
- cur_node = rTop.second;
- int dir = -1;
- rque.pop();
- explore(cur_node, rTop.first, dir, rque);
- } else {
- // Explore from forward queue
- cur_node = fTop.second;
- int dir = 1;
- fque.pop();
- explore(cur_node, fTop.first, dir, fque);
- }
- }
-
-/*
- Path reconstruction part. m_MidNode is the joining point where two searches meet to make a shortest path. It is updated in explore.
- If it contains -1, then no path is found. Other wise we have a shortest path and that is reconstructed in the m_vecPath.
-*/
- if (m_MidNode == -1) {
- *err_msg = (char *)"Path Not Found";
- deleteall();
- return -1;
- } else {
- // reconstruct path from forward search
- fconstruct_path(m_MidNode);
- // reconstruct path from backward search
- rconstruct_path(m_MidNode);
-
- // insert the last row in the path trace (having edge_id = -1 and cost = 0.0)
- path_element_t pelement;
- pelement.vertex_id = end_vertex;
- pelement.edge_id = -1;
- pelement.cost = 0.0;
- m_vecPath.push_back(pelement);
-
- // Transfer data path to path_element_t format and allocate memory and populate the pointer
-
- // DBG("BiDirDijkstra::bidir_dijkstra: allocating path m_vecPath.size = %d\n", m_vecPath.size() + 1);
- // *path = (path_element_t *) malloc(sizeof(path_element_t) * (m_vecPath.size() + 1));
- *path = NULL;
- *path = pgr_alloc(m_vecPath.size(), (*path));
- *path_count = static_cast<int>(m_vecPath.size());
- // DBG("BiDirDijkstra::bidir_dijkstra: allocated path\n");
-
- for (i = 0; i < *path_count; i++) {
- (*path)[i].vertex_id = m_vecPath[i].vertex_id;
- (*path)[i].edge_id = m_vecPath[i].edge_id;
- (*path)[i].cost = m_vecPath[i].cost;
- }
- }
- // DBG("calling deleteall\n");
- deleteall();
- // DBG("back from deleteall\n");
- return 0;
-}
-
-/*
- Populate the member variables of the class using the edge list. Basically there is a node list and an edge list. Each node contains the list of adjacent nodes and
- corresponding edge indices from edge list that connect this node with the adjacent nodes.
-*/
-
-bool BiDirDijkstra::construct_graph(edge_t* edges, int edge_count, int maxNode) {
- int i;
-
- /*
- // Create a dummy node
- DBG("Create a dummy node\n");
- GraphNodeInfo nodeInfo;
- DBG("calling nodeInfo.Connected_Edges_Index.clear\n");
- nodeInfo.Connected_Edges_Index.clear();
- DBG("calling nodeInfo.Connected_Nodes.clear\n");
- nodeInfo.Connected_Nodes.clear();
- */
-
- // Insert the dummy node into the node list. This acts as place holder. Also change the nodeId so that nodeId and node index in the vector are same.
- // There may be some nodes here that does not appear in the edge list. The size of the list is up to maxNode which is equal to maximum node id.
- // DBG("m_vecNodeVector.push_back for 0 - %d\n", maxNode);
- for (i = 0; i <= maxNode; i++) {
- // Create a dummy node
- GraphNodeInfo* nodeInfo = new GraphNodeInfo();
- nodeInfo->Connected_Edges_Index.clear();
- nodeInfo->Connected_Nodes.clear();
-
- nodeInfo->NodeID = i;
- m_vecNodeVector.push_back(nodeInfo);
- }
-
- // Process each edge from the edge list and update the member data structures accordingly.
- // DBG("reserving space for m_vecEdgeVector.reserve(%d)\n", edge_count);
- m_vecEdgeVector.reserve(edge_count);
- // DBG("calling addEdge in a loop\n");
- for (i = 0; i < edge_count; i++) {
- addEdge(edges[i]);
- }
-
- return true;
-}
-
-/*
- Process the edge and populate the member nodelist and edgelist. The nodelist already contains up to maxNode dummy entries with nodeId same as index. Now the
- connectivity information needs to be updated.
-*/
-
-bool BiDirDijkstra::addEdge(edge_t edgeIn) {
- // long lTest;
-
- // Check if the edge is already processed.
- Long2LongMap::iterator itMap = m_mapEdgeId2Index.find(edgeIn.id);
- if (itMap != m_mapEdgeId2Index.end())
- return false;
-
-
- // Create a GraphEdgeInfo using the information of the current edge
- GraphEdgeInfo *newEdge = new GraphEdgeInfo();
- newEdge->EdgeID = static_cast<int>(edgeIn.id);
- newEdge->EdgeIndex = static_cast<int>(m_vecEdgeVector.size());
- newEdge->StartNode = static_cast<int>(edgeIn.source);
- newEdge->EndNode = static_cast<int>(edgeIn.target);
- newEdge->Cost = edgeIn.cost;
- newEdge->ReverseCost = edgeIn.reverse_cost;
-
- // Set the direction. If both cost and reverse cost has positive value the edge is bidirectional and direction field is 0. If cost is positive and reverse cost
- // negative then the edge is unidirectional with direction = 1 (goes from source to target) otherwise it is unidirectional with direction = -1 (goes from target
- // to source). Another way of creating unidirectional edge is assigning big values in cost or reverse_cost. In that case the direction is still zero and this case
- // is handled in the algorithm automatically.
- if (newEdge->Cost >= 0.0 && newEdge->ReverseCost >= 0) {
- newEdge->Direction = 0;
- } else if (newEdge->Cost >= 0.0) {
- newEdge->Direction = 1;
- } else {
- newEdge->Direction = -1;
- }
-
- // Update max_edge_id
- if (edgeIn.id > max_edge_id) {
- max_edge_id = static_cast<int>(edgeIn.id);
- }
-
- // Update max_node_id
- if (newEdge->StartNode > max_node_id) {
- return false; // max_node_id = newEdge.StartNode;
- }
- if (newEdge->EndNode > max_node_id) {
- return false; // max_node_id = newEdge.EdgeIndex;
- }
-
- // update connectivity information for the start node.
- m_vecNodeVector[newEdge->StartNode]->Connected_Nodes.push_back(newEdge->EndNode);
- m_vecNodeVector[newEdge->StartNode]->Connected_Edges_Index.push_back(newEdge->EdgeIndex);
-
- // update connectivity information for the start node.
- m_vecNodeVector[newEdge->EndNode]->Connected_Nodes.push_back(newEdge->StartNode);
- m_vecNodeVector[newEdge->EndNode]->Connected_Edges_Index.push_back(newEdge->EdgeIndex);
-
-
-
- // Adding edge to the list
- m_mapEdgeId2Index.insert(std::make_pair(newEdge->EdgeID, m_vecEdgeVector.size()));
- m_vecEdgeVector.push_back(newEdge);
-
- return true;
-}
diff --git a/src/bd_dijkstra/src/BiDirDijkstra.h b/src/bd_dijkstra/src/BiDirDijkstra.h
deleted file mode 100644
index c4ae4a3..0000000
--- a/src/bd_dijkstra/src/BiDirDijkstra.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/*PGR-MIT*****************************************************************
-
-* $Id$
-*
-* Project: pgRouting bdsp and bdastar algorithms
-* Purpose:
-* Author: Razequl Islam <ziboncsedu at gmail.com>
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-MIT*/
-
-#ifndef SRC_BD_DIJKSTRA_SRC_BIDIRDIJKSTRA_H_
-#define SRC_BD_DIJKSTRA_SRC_BIDIRDIJKSTRA_H_
-#pragma once
-
-#include <vector>
-#include <map>
-#include <queue>
-#include <utility>
-#include <functional>
-
-#include "../../common/src/pgr_types.h"
-#include "./bdsp_driver.h"
-
-#define INF 1e15
-
-
-
-typedef std::vector<int64_t> LongVector;
-typedef std::vector<LongVector> VectorOfLongVector;
-typedef std::pair<double, int> PDI;
-
-typedef struct {
- int par_Node;
- int par_Edge;
-} PARENT_PATH;
-
-typedef struct {
- int NodeID;
- std::vector<int> Connected_Nodes;
- std::vector<int> Connected_Edges_Index;
-} GraphNodeInfo;
-
-struct GraphEdgeInfo {
- public:
- int EdgeID;
- int EdgeIndex;
- int Direction;
- double Cost;
- double ReverseCost;
- int StartNode;
- int EndNode;
-};
-
-typedef std::vector<GraphEdgeInfo*> GraphEdgeVector;
-typedef std::map<int64_t, LongVector> Long2LongVectorMap;
-typedef std::map<int64_t, int64_t> Long2LongMap;
-typedef std::vector<GraphNodeInfo*> GraphNodeVector;
-
-
-class BiDirDijkstra {
- public:
- BiDirDijkstra(void);
- ~BiDirDijkstra(void);
-
- int bidir_dijkstra(edge_t *edges, unsigned int edge_count, int maxNode, int start_vertex, int end_vertex,
- path_element_t **path, int *path_count, char **err_msg);
-
-
- private:
- bool construct_graph(edge_t *edges, int edge_count, int maxNode);
- void fconstruct_path(int node_id);
- void rconstruct_path(int node_id);
- bool addEdge(edge_t edgeIn);
- bool connectEdge(GraphEdgeInfo& firstEdge, GraphEdgeInfo& secondEdge, bool bIsStartNodeSame);
- void init();
- void initall(int maxNode);
- void deleteall();
- void explore(int cur_node, double cur_cost, int dir, std::priority_queue<PDI, std::vector<PDI>, std::greater<PDI> > &que);
- double getcost(int node_id, int dir);
- void setcost(int node_id, int dir, double c);
- void setparent(int node_id, int dir, int parnode, int paredge);
-
- private:
- GraphEdgeVector m_vecEdgeVector;
- Long2LongMap m_mapEdgeId2Index;
- Long2LongVectorMap m_mapNodeId2Edge;
- GraphNodeVector m_vecNodeVector;
- int max_node_id;
- int max_edge_id;
- int m_lStartNodeId;
- int m_lEndNodeId;
-
- double m_MinCost;
- int m_MidNode;
- std::vector <path_element_t> m_vecPath;
- PARENT_PATH *m_pFParent;
- PARENT_PATH *m_pRParent;
- double *m_pFCost;
- double *m_pRCost;
-};
-
-#endif // SRC_BD_DIJKSTRA_SRC_BIDIRDIJKSTRA_H_
diff --git a/src/bd_dijkstra/src/CMakeLists.txt b/src/bd_dijkstra/src/CMakeLists.txt
deleted file mode 100644
index 161833f..0000000
--- a/src/bd_dijkstra/src/CMakeLists.txt
+++ /dev/null
@@ -1,5 +0,0 @@
-ADD_LIBRARY(bd_dijkstra OBJECT
- bdsp.c
- bdsp_driver.cpp
- BiDirDijkstra.cpp)
-
diff --git a/src/bd_dijkstra/src/bdsp.c b/src/bd_dijkstra/src/bdsp.c
deleted file mode 100644
index f09e6f6..0000000
--- a/src/bd_dijkstra/src/bdsp.c
+++ /dev/null
@@ -1,408 +0,0 @@
-/*PGR-MIT*****************************************************************
-
-* $Id$
-*
-* Project: pgRouting bdsp and bdastar algorithms
-* Purpose:
-* Author: Razequl Islam <ziboncsedu at gmail.com>
-Copyright (c) 2015 pgRouting developers
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-MIT*/
-
-
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
-
-
-
-#include "bdsp_driver.h"
-
-
-#undef DEBUG
-#include "../../common/src/debug_macro.h"
-#include "../../common/src/pgr_types.h"
-#include "../../common/src/postgres_connection.h"
-
-// The number of tuples to fetch from the SPI cursor at each iteration
-#define TUPLIMIT 1000
-
-PGDLLEXPORT Datum bidir_dijkstra_shortest_path(PG_FUNCTION_ARGS);
-
-typedef struct edge_columns {
- int id;
- int source;
- int target;
- int cost;
- int reverse_cost;
-} edge_columns_t;
-
-
-
-/*
- * This function fetches the edge columns from the SPITupleTable.
- *
-*/
-static int
-fetch_edge_columns(SPITupleTable *tuptable, edge_columns_t *edge_columns,
- bool has_reverse_cost) {
- edge_columns->id = SPI_fnumber(SPI_tuptable->tupdesc, "id");
- edge_columns->source = SPI_fnumber(SPI_tuptable->tupdesc, "source");
- edge_columns->target = SPI_fnumber(SPI_tuptable->tupdesc, "target");
- edge_columns->cost = SPI_fnumber(SPI_tuptable->tupdesc, "cost");
-
- if (edge_columns->id == SPI_ERROR_NOATTRIBUTE ||
- edge_columns->source == SPI_ERROR_NOATTRIBUTE ||
- edge_columns->target == SPI_ERROR_NOATTRIBUTE ||
- edge_columns->cost == SPI_ERROR_NOATTRIBUTE) {
- elog(ERROR, "Error, query must return columns "
- "'id', 'source', 'target' and 'cost'");
- return -1;
- }
-
- if (SPI_gettypeid(SPI_tuptable->tupdesc, edge_columns->source) != INT4OID ||
- SPI_gettypeid(SPI_tuptable->tupdesc, edge_columns->target) != INT4OID ||
- SPI_gettypeid(SPI_tuptable->tupdesc, edge_columns->cost) != FLOAT8OID) {
- elog(ERROR, "Error, columns 'source', 'target' must be of type int4, 'cost' must be of type float8");
- return -1;
- }
-
- PGR_DBG("columns: id %i source %i target %i cost %i",
- edge_columns->id, edge_columns->source,
- edge_columns->target, edge_columns->cost);
-
- if (has_reverse_cost) {
- edge_columns->reverse_cost = SPI_fnumber(SPI_tuptable->tupdesc,
- "reverse_cost");
-
- if (edge_columns->reverse_cost == SPI_ERROR_NOATTRIBUTE) {
- elog(ERROR, "Error, reverse_cost is used, but query did't return "
- "'reverse_cost' column");
- return -1;
- }
-
- if (SPI_gettypeid(SPI_tuptable->tupdesc, edge_columns->reverse_cost)
- != FLOAT8OID) {
- elog(ERROR, "Error, columns 'reverse_cost' must be of type float8");
- return -1;
- }
-
- PGR_DBG("columns: reverse_cost cost %i", edge_columns->reverse_cost);
- }
-
- return 0;
-}
-
-/*
- * To fetch a edge from Tuple.
- *
- */
-
-static void
-fetch_edge(HeapTuple *tuple, TupleDesc *tupdesc,
- edge_columns_t *edge_columns, edge_t *target_edge) {
- Datum binval;
- bool isnull;
-
- binval = SPI_getbinval(*tuple, *tupdesc, edge_columns->id, &isnull);
- if (isnull) elog(ERROR, "id contains a null value");
- target_edge->id = DatumGetInt32(binval);
-
- binval = SPI_getbinval(*tuple, *tupdesc, edge_columns->source, &isnull);
- if (isnull) elog(ERROR, "source contains a null value");
- target_edge->source = DatumGetInt32(binval);
-
- binval = SPI_getbinval(*tuple, *tupdesc, edge_columns->target, &isnull);
- if (isnull) elog(ERROR, "target contains a null value");
- target_edge->target = DatumGetInt32(binval);
-
- binval = SPI_getbinval(*tuple, *tupdesc, edge_columns->cost, &isnull);
- if (isnull) elog(ERROR, "cost contains a null value");
- target_edge->cost = DatumGetFloat8(binval);
-
- if (edge_columns->reverse_cost != -1) {
- binval = SPI_getbinval(*tuple, *tupdesc, edge_columns->reverse_cost,
- &isnull);
- if (isnull) elog(ERROR, "reverse_cost contains a null value");
- target_edge->reverse_cost = DatumGetFloat8(binval);
- }
-}
-
-static int compute_bidirsp(char* sql, int64_t start_vertex,
- int64_t end_vertex, bool directed,
- bool has_reverse_cost,
- path_element_t **path, int *path_count) {
- void *SPIplan;
- Portal SPIportal;
- bool moredata = TRUE;
- size_t ntuples;
- edge_t *edges = NULL;
- size_t total_tuples = 0;
-#ifndef _MSC_VER
- edge_columns_t edge_columns = {.id = -1, .source = -1, .target = -1,
- .cost = -1, .reverse_cost = -1};
-#else // _MSC_VER
- edge_columns_t edge_columns = {-1, -1, -1, -1, -1};
-#endif // _MSC_VER
- int64_t v_max_id = 0;
- int64_t v_min_id = INT_MAX;
-
- int s_count = 0;
- int t_count = 0;
-
- char *err_msg;
- int ret = -1;
- int64_t z;
-
- PGR_DBG("start shortest_path\n");
-
- pgr_SPI_connect();
- SPIplan = pgr_SPI_prepare(sql);
- SPIportal = pgr_SPI_cursor_open(SPIplan);
-
- while (moredata == TRUE) {
- SPI_cursor_fetch(SPIportal, TRUE, TUPLIMIT);
-
- if (edge_columns.id == -1) {
- if (fetch_edge_columns(SPI_tuptable, &edge_columns,
- has_reverse_cost) == -1) {
- pgr_SPI_finish();
- return -1;
- }
- }
-
- ntuples = SPI_processed;
- total_tuples += ntuples;
- if (!edges)
- edges = palloc(total_tuples * sizeof(edge_t));
- else
- edges = repalloc(edges, total_tuples * sizeof(edge_t));
-
- if (edges == NULL) {
- elog(ERROR, "Out of memory");
- pgr_SPI_finish();
- return -1;
- }
-
- if (ntuples > 0) {
- uint64_t t;
- SPITupleTable *tuptable = SPI_tuptable;
- TupleDesc tupdesc = SPI_tuptable->tupdesc;
-
- for (t = 0; t < ntuples; t++) {
- HeapTuple tuple = tuptable->vals[t];
- fetch_edge(&tuple, &tupdesc, &edge_columns,
- &edges[total_tuples - ntuples + t]);
- }
- SPI_freetuptable(tuptable);
- } else {
- moredata = FALSE;
- }
- }
-
- // defining min and max vertex id
-
- PGR_DBG("Total %ld tuples", total_tuples);
-
- for (z = 0; z < (int64_t)total_tuples; z++) {
- if (edges[z].source < v_min_id) v_min_id = edges[z].source;
- if (edges[z].source > v_max_id) v_max_id = edges[z].source;
- if (edges[z].target < v_min_id) v_min_id = edges[z].target;
- if (edges[z].target > v_max_id) v_max_id = edges[z].target;
- // PGR_DBG("%i <-> %i", v_min_id, v_max_id);
- }
-
- //::::::::::::::::::::::::::::::::::::
- //:: reducing vertex id (renumbering)
- //::::::::::::::::::::::::::::::::::::
- for (z = 0; z < (int64_t)total_tuples; z++) {
- // check if edges[] contains source and target
- if (edges[z].source == start_vertex || edges[z].target == start_vertex)
- ++s_count;
- if (edges[z].source == end_vertex || edges[z].target == end_vertex)
- ++t_count;
-
- edges[z].source -= v_min_id;
- edges[z].target -= v_min_id;
- // PGR_DBG("%i - %i", edges[z].source, edges[z].target);
- }
-
- PGR_DBG("Total %ld tuples", total_tuples);
-
- if (s_count == 0) {
- elog(ERROR, "Start vertex was not found.");
- return -1;
- }
-
- if (t_count == 0) {
- elog(ERROR, "Target vertex was not found.");
- return -1;
- }
-
- start_vertex -= v_min_id;
- end_vertex -= v_min_id;
-
- // v_max_id -= v_min_id;
-
- PGR_DBG("Calling bidirsp_wrapper(edges, %ld, %ld, %ld, %ld, %d, %d, ...)\n",
- total_tuples, v_max_id + 2, start_vertex, end_vertex,
- directed, has_reverse_cost);
-
- ret = bidirsp_wrapper(edges, (unsigned int)total_tuples, (int)v_max_id + 2, (int)start_vertex, (int)end_vertex,
- directed, has_reverse_cost,
- path, path_count, &err_msg);
-
- PGR_DBG("Back from bidirsp_wrapper() ret: %d", ret);
- if (ret < 0) {
- elog(ERROR, "Error computing path: %s", err_msg);
- }
-
- PGR_DBG("*path_count = %i\n", *path_count);
-
- //::::::::::::::::::::::::::::::::
- //:: restoring original vertex id
- //::::::::::::::::::::::::::::::::
- for (z = 0; z < *path_count; z++) {
- // PGR_DBG("vetex %i\n", (*path)[z].vertex_id);
- (*path)[z].vertex_id+= v_min_id;
- }
-
- PGR_DBG("ret = %i\n", ret);
-
- pgr_SPI_finish();
- return 0;
-}
-
-
-PG_FUNCTION_INFO_V1(bidir_dijkstra_shortest_path);
-PGDLLEXPORT Datum
-bidir_dijkstra_shortest_path(PG_FUNCTION_ARGS) {
- FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
- TupleDesc tuple_desc;
- path_element_t *path;
- // char * sql;
-
-
- // stuff done only on the first call of the function
- if (SRF_IS_FIRSTCALL()) {
- MemoryContext oldcontext;
- int path_count = 0;
-#ifdef DEBUG
- int ret = -1;
-#endif
- int i;
-
- // create a function context for cross-call persistence
- funcctx = SRF_FIRSTCALL_INIT();
-
- // switch to memory context appropriate for multiple function calls
- oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
- // verify that the first 5 args are not NULL
- for (i = 0; i < 5; i++)
- if (PG_ARGISNULL(i)) {
- elog(ERROR, "bidir_dijkstra_shortest_path(): Argument %i may not be NULL", i+1);
- }
-
- PGR_DBG("Calling compute_bidirsp");
-
-#ifdef DEBUG
- ret =
-#endif
- compute_bidirsp(pgr_text2char(PG_GETARG_TEXT_P(0)),
- (int64_t)PG_GETARG_INT32(1),
- (int64_t)PG_GETARG_INT32(2),
- PG_GETARG_BOOL(3),
- PG_GETARG_BOOL(4),
- &path, &path_count);
-#ifdef DEBUG
- double total_cost = 0;
- PGR_DBG("Ret is %i", ret);
- if (ret >= 0) {
- int i;
- for (i = 0; i < path_count; i++) {
- // PGR_DBG("Step %i vertex_id %i ", i, path[i].vertex_id);
- // PGR_DBG(" edge_id %i ", path[i].edge_id);
- // PGR_DBG(" cost %f ", path[i].cost);
- total_cost+= path[i].cost;
- }
- }
- PGR_DBG("Total cost is: %f", total_cost);
-#endif
-
- // total number of tuples to be returned
- funcctx->max_calls = (uint32_t)path_count;
- funcctx->user_fctx = path;
-
- funcctx->tuple_desc =
- BlessTupleDesc(RelationNameGetTupleDesc("pgr_costResult"));
-
- MemoryContextSwitchTo(oldcontext);
- }
-
- // stuff done on every call of the function
- funcctx = SRF_PERCALL_SETUP();
-
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
- tuple_desc = funcctx->tuple_desc;
- path = (path_element_t*) funcctx->user_fctx;
-
- if (call_cntr < max_calls) { // do when there is more left to send
- HeapTuple tuple;
- Datum result;
- Datum *values;
- bool* nulls;
-
- values = palloc(4 * sizeof(Datum));
- nulls = palloc(4 * sizeof(bool));
-
- values[0] = Int32GetDatum(call_cntr);
- nulls[0] = false;
- values[1] = Int32GetDatum(path[call_cntr].vertex_id);
- nulls[1] = false;
- values[2] = Int32GetDatum(path[call_cntr].edge_id);
- nulls[3] = false;
- values[3] = Float8GetDatum(path[call_cntr].cost);
- nulls[3] = false;
-
- tuple = heap_form_tuple(tuple_desc, values, nulls);
-
- // make the tuple into a datum
- result = HeapTupleGetDatum(tuple);
-
- // clean up (this is not really necessary)
- pfree(values);
- pfree(nulls);
-
- SRF_RETURN_NEXT(funcctx, result);
- } else { // do when there is no more left
- PGR_DBG("Going to free path");
- if (path) free(path);
- SRF_RETURN_DONE(funcctx);
- }
-}
diff --git a/src/bd_dijkstra/src/bdsp_driver.cpp b/src/bd_dijkstra/src/bdsp_driver.cpp
deleted file mode 100644
index a7c7d45..0000000
--- a/src/bd_dijkstra/src/bdsp_driver.cpp
+++ /dev/null
@@ -1,79 +0,0 @@
-/*PGR-MIT*****************************************************************
-
-* $Id$
-*
-* Project: pgRouting bdsp and bdastar algorithms
-* Purpose:
-* Author: Razequl Islam <ziboncsedu at gmail.com>
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-MIT*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include "./bdsp_driver.h"
-
-#include <exception>
-#include "./BiDirDijkstra.h"
-
-
-
-int bidirsp_wrapper(
- edge_t *edges,
- unsigned int edge_count,
- int maxNode,
- int start_vertex,
- int end_vertex,
- bool directed,
- bool has_reverse_cost,
- path_element_t **path,
- int *path_count,
- char **err_msg
- ) {
- int res;
-
- try {
- // DBG("Calling BiDirDijkstra initializer.\n");
- BiDirDijkstra bddijkstra;
- // DBG("BiDirDijkstra initialized\n");
- res = bddijkstra.bidir_dijkstra(edges, edge_count, maxNode, start_vertex, end_vertex, path, path_count, err_msg);
- // TODO(someone) this are an unused parameters have to be used
- if (has_reverse_cost) {}
- if (directed) {}
- }
- catch(std::exception& e) {
- // DBG("catch(std::exception e.what: %s\n", e.what());
- *err_msg = (char *) e.what();
- return -1;
- }
- catch(...) {
- // DBG("catch(...\n");
- *err_msg = (char *) "Caught unknown exception!";
- return -1;
- }
-
- // DBG("Back from bddijkstra.bidir_dijkstra()\n");
- if (res < 0)
- return res;
- return 0;
-}
diff --git a/src/bd_dijkstra/src/bdsp_driver.h b/src/bd_dijkstra/src/bdsp_driver.h
deleted file mode 100644
index 1320763..0000000
--- a/src/bd_dijkstra/src/bdsp_driver.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*PGR-GNU*****************************************************************
-
- * Bi Directional Shortest path algorithm for PostgreSQL
- *
- * Copyright (c) 2005 Sylvain Pasche
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-#ifndef SRC_BD_DIJKSTRA_SRC_BDSP_DRIVER_H_
-#define SRC_BD_DIJKSTRA_SRC_BDSP_DRIVER_H_
-
-#if defined(_MSC_VER) && _MSC_VER < 1600
-#define ELOG_H
-#endif
-#include "../../common/src/pgr_types.h"
-
-typedef pgr_edge_t edge_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int bidirsp_wrapper(edge_t *edges,
- unsigned int edge_count,
- int maxNode,
- int start_vertex,
- int end_vertex,
- bool directed,
- bool has_reverse_cost,
- path_element_t **path,
- int *path_count,
- char **err_msg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_BD_DIJKSTRA_SRC_BDSP_DRIVER_H_
diff --git a/src/bd_dijkstra/test/CMakeLists.txt b/src/bd_dijkstra/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-01.result b/src/bd_dijkstra/test/bd_dijkstra-any-01.result
index 4e51168..a83377b 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-01.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-01.result
@@ -1,101 +1,102 @@
-0|5700|20787|0.006774
-1|10932|20756|0.040876
-2|10931|20797|0.002564
-3|7661|20796|0.002581
-4|10943|20776|0.040800
-5|10941|20772|0.005720
-6|3415|20771|0.007463
-7|10940|20841|0.187594
-8|10952|20812|0.005045
-9|7034|20811|0.004532
-10|10951|20833|0.177477
-11|10944|20779|0.008539
-12|8910|20778|0.006447
-13|10929|20835|0.071114
-14|10948|20794|0.013276
-15|8908|12990|0.013157
-16|8325|13831|0.009169
-17|3753|13830|0.196045
-18|6774|13829|0.032840
-19|8304|13828|0.117213
-20|9205|13827|0.010639
-21|8994|13165|0.012931
-22|8977|13164|0.008029
-23|8976|13163|0.069895
-24|8993|13162|0.009638
-25|8351|13161|0.099016
-26|8992|13160|0.187353
-27|8991|13159|0.018649
-28|2962|13158|0.071931
-29|1285|13157|0.118340
-30|8989|13156|0.006317
-31|8988|13155|0.079185
-32|21|13154|0.057101
-33|6436|13153|0.083288
-34|637|13152|0.099744
-35|8987|13151|0.057786
-36|398|13150|0.120005
-37|8496|13149|0.069498
-38|8986|13148|0.014323
-39|8985|13167|0.070884
-40|8451|11869|0.006925
-41|476|11868|0.196533
-42|529|11867|0.005677
-43|8450|11871|0.118857
-44|8452|11878|0.083250
-45|8455|11880|0.048821
-46|8456|11883|0.064572
-47|1807|11882|0.101185
-48|8457|11894|0.046805
-49|8465|15481|0.180992
-50|8522|15480|0.016198
-51|9621|15479|0.209882
-52|2808|15478|0.019312
-53|8311|15477|0.113487
-54|8583|16981|0.045667
-55|10046|16982|0.022635
-56|8467|16983|0.022924
-57|9624|15487|0.034042
-58|8468|11899|0.018103
-59|3170|19357|0.047698
-60|9949|19358|0.059093
-61|10479|19359|0.051651
-62|9948|19360|0.051709
-63|8509|19374|0.106794
-64|9595|19375|0.102428
-65|8634|19376|0.107643
-66|10174|19377|0.096140
-67|10482|19378|0.009782
-68|9194|19379|0.102702
-69|4397|19380|0.108243
-70|3002|19381|0.098919
-71|10484|19382|0.006171
-72|5962|19383|0.005429
-73|10485|19384|0.047276
-74|10459|19385|0.052864
-75|7579|19386|0.052378
-76|10455|19387|0.052414
-77|5805|19388|0.081956
-78|10462|19389|0.016974
-79|8768|12598|0.059630
-80|8767|19290|0.117748
-81|10470|19289|0.065769
-82|10469|19288|0.066230
-83|10468|19287|0.111281
-84|9967|16642|0.029056
-85|9956|16621|0.014614
-86|9938|16626|0.007036
-87|9960|16649|0.081206
-88|9968|16650|0.012230
-89|9969|16647|0.012368
-90|5457|6266|0.055134
-91|5458|6267|0.053860
-92|5459|6268|0.109859
-93|5460|6269|0.104952
-94|5461|6270|0.053766
-95|5462|6271|0.046800
-96|5463|12897|0.170300
-97|8880|15060|0.049014
-98|7101|15059|0.047811
-99|9313|15058|0.044674
-100|6733|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|5700|20787|0.006774
+1|10932|20756|0.040876
+2|10931|20797|0.002564
+3|7661|20796|0.002581
+4|10943|20776|0.040800
+5|10941|20772|0.005720
+6|3415|20771|0.007463
+7|10940|20841|0.187594
+8|10952|20812|0.005045
+9|7034|20811|0.004532
+10|10951|20833|0.177477
+11|10944|20779|0.008539
+12|8910|20778|0.006447
+13|10929|20835|0.071114
+14|10948|20794|0.013276
+15|8908|12990|0.013157
+16|8325|13831|0.009169
+17|3753|13830|0.196045
+18|6774|13829|0.032840
+19|8304|13828|0.117213
+20|9205|13827|0.010639
+21|8994|13165|0.012931
+22|8977|13164|0.008029
+23|8976|13163|0.069895
+24|8993|13162|0.009638
+25|8351|13161|0.099016
+26|8992|13160|0.187353
+27|8991|13159|0.018649
+28|2962|13158|0.071931
+29|1285|13157|0.118340
+30|8989|13156|0.006317
+31|8988|13155|0.079185
+32|21|13154|0.057101
+33|6436|13153|0.083288
+34|637|13152|0.099744
+35|8987|13151|0.057786
+36|398|13150|0.120005
+37|8496|13149|0.069498
+38|8986|13148|0.014323
+39|8985|13167|0.070884
+40|8451|11869|0.006925
+41|476|11868|0.196533
+42|529|11867|0.005677
+43|8450|11871|0.118857
+44|8452|11878|0.083250
+45|8455|11880|0.048821
+46|8456|11883|0.064572
+47|1807|11882|0.101185
+48|8457|11894|0.046805
+49|8465|15481|0.180992
+50|8522|15480|0.016198
+51|9621|15479|0.209882
+52|2808|15478|0.019312
+53|8311|15477|0.113487
+54|8583|16981|0.045667
+55|10046|16982|0.022635
+56|8467|16983|0.022924
+57|9624|15487|0.034042
+58|8468|11899|0.018103
+59|3170|19357|0.047698
+60|9949|19358|0.059093
+61|10479|19359|0.051651
+62|9948|19360|0.051709
+63|8509|19374|0.106794
+64|9595|19375|0.102428
+65|8634|19376|0.107643
+66|10174|19377|0.096140
+67|10482|19378|0.009782
+68|9194|19379|0.102702
+69|4397|19380|0.108243
+70|3002|19381|0.098919
+71|10484|19382|0.006171
+72|5962|19383|0.005429
+73|10485|19384|0.047276
+74|10459|19385|0.052864
+75|7579|19386|0.052378
+76|10455|19387|0.052414
+77|5805|19388|0.081956
+78|10462|19389|0.016974
+79|8768|12598|0.059630
+80|8767|19290|0.117748
+81|10470|19289|0.065769
+82|10469|19288|0.066230
+83|10468|19287|0.111281
+84|9967|16642|0.029056
+85|9956|16621|0.014614
+86|9938|16626|0.007036
+87|9960|16649|0.081206
+88|9968|16650|0.012230
+89|9969|16647|0.012368
+90|5457|6266|0.055134
+91|5458|6267|0.053860
+92|5459|6268|0.109859
+93|5460|6269|0.104952
+94|5461|6270|0.053766
+95|5462|6271|0.046800
+96|5463|12897|0.170300
+97|8880|15060|0.049014
+98|7101|15059|0.047811
+99|9313|15058|0.044674
+100|6733|-1|0.000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-02.result b/src/bd_dijkstra/test/bd_dijkstra-any-02.result
index ae93722..a2bfe1d 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-02.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-02.result
@@ -1,60 +1,61 @@
-0|6585|17975|0.200230
-1|5367|17976|0.155428
-2|7125|17977|0.178581
-3|613|17978|0.175712
-4|10025|17979|0.173776
-5|5802|6758|0.013489
-6|5803|6759|0.065176
-7|5804|6760|0.008679
-8|5805|6761|0.145097
-9|5806|6762|0.146807
-10|5807|6763|0.097186
-11|5808|6764|0.050569
-12|5809|20663|0.169650
-13|4620|20662|0.023243
-14|5774|20661|0.120390
-15|6482|20660|0.002769
-16|5957|20659|0.087952
-17|8289|20658|0.048701
-18|10884|20657|0.009212
-19|10883|20656|0.080500
-20|9954|20655|0.075280
-21|4390|16876|0.147691
-22|9203|17805|0.063931
-23|7892|17804|0.015429
-24|8417|17803|0.069119
-25|10171|17802|0.075825
-26|9953|17801|0.045079
-27|8859|17800|0.029389
-28|8536|17799|0.072658
-29|10180|17798|0.076558
-30|9592|17797|0.027637
-31|9318|17796|0.114755
-32|10179|17795|0.007150
-33|10178|17794|0.087467
-34|8402|17793|0.062258
-35|6179|17792|0.109483
-36|8508|17791|0.036248
-37|3305|17790|0.069816
-38|8512|17789|0.064158
-39|998|17807|0.471312
-40|2698|2743|0.102019
-41|2563|9039|0.341756
-42|2043|9040|0.587619
-43|4280|9041|0.145996
-44|2317|9042|0.268754
-45|7135|9043|0.121251
-46|4276|9044|0.145396
-47|6167|9045|0.583394
-48|7136|9046|0.043099
-49|7137|19345|0.053510
-50|10475|19344|0.015153
-51|10142|19343|0.064475
-52|10140|17566|0.135370
-53|8539|17565|0.057338
-54|10138|17558|0.064893
-55|6943|17559|0.201703
-56|8140|17560|0.469613
-57|10139|20189|0.060217
-58|10705|20185|0.055053
-59|8247|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|6585|17975|0.200230
+1|5367|17976|0.155428
+2|7125|17977|0.178581
+3|613|17978|0.175712
+4|10025|17979|0.173776
+5|5802|6758|0.013489
+6|5803|6759|0.065176
+7|5804|6760|0.008679
+8|5805|6761|0.145097
+9|5806|6762|0.146807
+10|5807|6763|0.097186
+11|5808|6764|0.050569
+12|5809|20663|0.169650
+13|4620|20662|0.023243
+14|5774|20661|0.120390
+15|6482|20660|0.002769
+16|5957|20659|0.087952
+17|8289|20658|0.048701
+18|10884|20657|0.009212
+19|10883|20656|0.080500
+20|9954|20655|0.075280
+21|4390|16876|0.147691
+22|9203|17805|0.063931
+23|7892|17804|0.015429
+24|8417|17803|0.069119
+25|10171|17802|0.075825
+26|9953|17801|0.045079
+27|8859|17800|0.029389
+28|8536|17799|0.072658
+29|10180|17798|0.076558
+30|9592|17797|0.027637
+31|9318|17796|0.114755
+32|10179|17795|0.007150
+33|10178|17794|0.087467
+34|8402|17793|0.062258
+35|6179|17792|0.109483
+36|8508|17791|0.036248
+37|3305|17790|0.069816
+38|8512|17789|0.064158
+39|998|17807|0.471312
+40|2698|2743|0.102019
+41|2563|9039|0.341756
+42|2043|9040|0.587619
+43|4280|9041|0.145996
+44|2317|9042|0.268754
+45|7135|9043|0.121251
+46|4276|9044|0.145396
+47|6167|9045|0.583394
+48|7136|9046|0.043099
+49|7137|19345|0.053510
+50|10475|19344|0.015153
+51|10142|19343|0.064475
+52|10140|17566|0.135370
+53|8539|17565|0.057338
+54|10138|17558|0.064893
+55|6943|17559|0.201703
+56|8140|17560|0.469613
+57|10139|20189|0.060217
+58|10705|20185|0.055053
+59|8247|-1|0.000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-03.result b/src/bd_dijkstra/test/bd_dijkstra-any-03.result
index 2a83d54..1da08ed 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-03.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-03.result
@@ -1,2 +1,3 @@
-0|14822|14822|0.060319
-1|-1|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|14822|14822|0.060319
+1|-1|-1|0.000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-04.result b/src/bd_dijkstra/test/bd_dijkstra-any-04.result
index 5988b27..59b94cc 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-04.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-04.result
@@ -1,2 +1,3 @@
-0|3606|14822|0.060319
-1|9426|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|3606|14822|0.060319
+1|9426|-1|0.000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-05.result b/src/bd_dijkstra/test/bd_dijkstra-any-05.result
index 73c2014..c092c44 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-05.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-05.result
@@ -1,101 +1,102 @@
-0|6733|15058|0.044674
-1|9313|15059|0.047811
-2|7101|15060|0.049014
-3|8880|12897|0.170300
-4|5463|6271|0.046800
-5|5462|6270|0.053766
-6|5461|6269|0.104952
-7|5460|6268|0.109859
-8|5459|6267|0.053860
-9|5458|6266|0.055134
-10|5457|16647|0.012368
-11|9969|16650|0.012230
-12|9968|16649|0.081206
-13|9960|16626|0.007036
-14|9938|16621|0.014614
-15|9956|16642|0.029056
-16|9967|19287|0.111281
-17|10468|19288|0.066230
-18|10469|19289|0.065769
-19|10470|19290|0.117748
-20|8767|12598|0.059630
-21|8768|19389|0.016974
-22|10462|19388|0.081956
-23|5805|19387|0.052414
-24|10455|19386|0.052378
-25|7579|19385|0.052864
-26|10459|19384|0.047276
-27|10485|19383|0.005429
-28|5962|19382|0.006171
-29|10484|19381|0.098919
-30|3002|19380|0.108243
-31|4397|19379|0.102702
-32|9194|19378|0.009782
-33|10482|19377|0.096140
-34|10174|19376|0.107643
-35|8634|19375|0.102428
-36|9595|19374|0.106794
-37|8509|19360|0.051709
-38|9948|19359|0.051651
-39|10479|19358|0.059093
-40|9949|19357|0.047698
-41|3170|11899|0.018103
-42|8468|15487|0.034042
-43|9624|16983|0.022924
-44|8467|16982|0.022635
-45|10046|16981|0.045667
-46|8583|15477|0.113487
-47|8311|15478|0.019312
-48|2808|15479|0.209882
-49|9621|15480|0.016198
-50|8522|15481|0.180992
-51|8465|11894|0.046805
-52|8457|11882|0.101185
-53|1807|11883|0.064572
-54|8456|11880|0.048821
-55|8455|11878|0.083250
-56|8452|11871|0.118857
-57|8450|11867|0.005677
-58|529|11868|0.196533
-59|476|11869|0.006925
-60|8451|13167|0.070884
-61|8985|13148|0.014323
-62|8986|13149|0.069498
-63|8496|13150|0.120005
-64|398|13151|0.057786
-65|8987|13152|0.099744
-66|637|13153|0.083288
-67|6436|13154|0.057101
-68|21|13155|0.079185
-69|8988|13156|0.006317
-70|8989|13157|0.118340
-71|1285|13158|0.071931
-72|2962|13159|0.018649
-73|8991|13160|0.187353
-74|8992|13161|0.099016
-75|8351|13162|0.009638
-76|8993|13163|0.069895
-77|8976|13164|0.008029
-78|8977|13165|0.012931
-79|8994|13827|0.010639
-80|9205|13828|0.117213
-81|8304|13829|0.032840
-82|6774|13830|0.196045
-83|3753|13831|0.009169
-84|8325|12990|0.013157
-85|8908|20794|0.013276
-86|10948|20835|0.071114
-87|10929|20778|0.006447
-88|8910|20779|0.008539
-89|10944|20833|0.177477
-90|10951|20811|0.004532
-91|7034|20812|0.005045
-92|10952|20841|0.187594
-93|10940|20771|0.007463
-94|3415|20772|0.005720
-95|10941|20776|0.040800
-96|10943|20796|0.002581
-97|7661|20797|0.002564
-98|10931|20756|0.040876
-99|10932|20787|0.006774
-100|5700|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|6733|15058|0.044674
+1|9313|15059|0.047811
+2|7101|15060|0.049014
+3|8880|12897|0.170300
+4|5463|6271|0.046800
+5|5462|6270|0.053766
+6|5461|6269|0.104952
+7|5460|6268|0.109859
+8|5459|6267|0.053860
+9|5458|6266|0.055134
+10|5457|16647|0.012368
+11|9969|16650|0.012230
+12|9968|16649|0.081206
+13|9960|16626|0.007036
+14|9938|16621|0.014614
+15|9956|16642|0.029056
+16|9967|19287|0.111281
+17|10468|19288|0.066230
+18|10469|19289|0.065769
+19|10470|19290|0.117748
+20|8767|12598|0.059630
+21|8768|19389|0.016974
+22|10462|19388|0.081956
+23|5805|19387|0.052414
+24|10455|19386|0.052378
+25|7579|19385|0.052864
+26|10459|19384|0.047276
+27|10485|19383|0.005429
+28|5962|19382|0.006171
+29|10484|19381|0.098919
+30|3002|19380|0.108243
+31|4397|19379|0.102702
+32|9194|19378|0.009782
+33|10482|19377|0.096140
+34|10174|19376|0.107643
+35|8634|19375|0.102428
+36|9595|19374|0.106794
+37|8509|19360|0.051709
+38|9948|19359|0.051651
+39|10479|19358|0.059093
+40|9949|19357|0.047698
+41|3170|11899|0.018103
+42|8468|15487|0.034042
+43|9624|16983|0.022924
+44|8467|16982|0.022635
+45|10046|16981|0.045667
+46|8583|15477|0.113487
+47|8311|15478|0.019312
+48|2808|15479|0.209882
+49|9621|15480|0.016198
+50|8522|15481|0.180992
+51|8465|11894|0.046805
+52|8457|11882|0.101185
+53|1807|11883|0.064572
+54|8456|11880|0.048821
+55|8455|11878|0.083250
+56|8452|11871|0.118857
+57|8450|11867|0.005677
+58|529|11868|0.196533
+59|476|11869|0.006925
+60|8451|13167|0.070884
+61|8985|13148|0.014323
+62|8986|13149|0.069498
+63|8496|13150|0.120005
+64|398|13151|0.057786
+65|8987|13152|0.099744
+66|637|13153|0.083288
+67|6436|13154|0.057101
+68|21|13155|0.079185
+69|8988|13156|0.006317
+70|8989|13157|0.118340
+71|1285|13158|0.071931
+72|2962|13159|0.018649
+73|8991|13160|0.187353
+74|8992|13161|0.099016
+75|8351|13162|0.009638
+76|8993|13163|0.069895
+77|8976|13164|0.008029
+78|8977|13165|0.012931
+79|8994|13827|0.010639
+80|9205|13828|0.117213
+81|8304|13829|0.032840
+82|6774|13830|0.196045
+83|3753|13831|0.009169
+84|8325|12990|0.013157
+85|8908|20794|0.013276
+86|10948|20835|0.071114
+87|10929|20778|0.006447
+88|8910|20779|0.008539
+89|10944|20833|0.177477
+90|10951|20811|0.004532
+91|7034|20812|0.005045
+92|10952|20841|0.187594
+93|10940|20771|0.007463
+94|3415|20772|0.005720
+95|10941|20776|0.040800
+96|10943|20796|0.002581
+97|7661|20797|0.002564
+98|10931|20756|0.040876
+99|10932|20787|0.006774
+100|5700|-1|0.000000
diff --git a/src/bd_dijkstra/test/bd_dijkstra-any-06.result b/src/bd_dijkstra/test/bd_dijkstra-any-06.result
index 134a8f5..771d25b 100644
--- a/src/bd_dijkstra/test/bd_dijkstra-any-06.result
+++ b/src/bd_dijkstra/test/bd_dijkstra-any-06.result
@@ -1,60 +1,61 @@
-0|8247|20185|0.055053
-1|10705|20189|0.060217
-2|10139|17560|0.469613
-3|8140|17559|0.201703
-4|6943|17558|0.064893
-5|10138|17565|0.057338
-6|8539|17566|0.135370
-7|10140|19343|0.064475
-8|10142|19344|0.015153
-9|10475|19345|0.053510
-10|7137|9046|0.043099
-11|7136|9045|0.583394
-12|6167|9044|0.145396
-13|4276|9043|0.121251
-14|7135|9042|0.268754
-15|2317|9041|0.145996
-16|4280|9040|0.587619
-17|2043|9039|0.341756
-18|2563|2743|0.102019
-19|2698|17807|0.471312
-20|998|17789|0.064158
-21|8512|17790|0.069816
-22|3305|17791|0.036248
-23|8508|17792|0.109483
-24|6179|17793|0.062258
-25|8402|17794|0.087467
-26|10178|17795|0.007150
-27|10179|17796|0.114755
-28|9318|17797|0.027637
-29|9592|17798|0.076558
-30|10180|17799|0.072658
-31|8536|17800|0.029389
-32|8859|17801|0.045079
-33|9953|17802|0.075825
-34|10171|17803|0.069119
-35|8417|17804|0.015429
-36|7892|17805|0.063931
-37|9203|16876|0.147691
-38|4390|20655|0.075280
-39|9954|20656|0.080500
-40|10883|20657|0.009212
-41|10884|20658|0.048701
-42|8289|20659|0.087952
-43|5957|20660|0.002769
-44|6482|20661|0.120390
-45|5774|20662|0.023243
-46|4620|20663|0.169650
-47|5809|6764|0.050569
-48|5808|6763|0.097186
-49|5807|6762|0.146807
-50|5806|6761|0.145097
-51|5805|6760|0.008679
-52|5804|6759|0.065176
-53|5803|6758|0.013489
-54|5802|17979|0.173776
-55|10025|17978|0.175712
-56|613|17977|0.178581
-57|7125|17976|0.155428
-58|5367|17975|0.200230
-59|6585|-1|0.000000
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|8247|20185|0.055053
+1|10705|20189|0.060217
+2|10139|17560|0.469613
+3|8140|17559|0.201703
+4|6943|17558|0.064893
+5|10138|17565|0.057338
+6|8539|17566|0.135370
+7|10140|19343|0.064475
+8|10142|19344|0.015153
+9|10475|19345|0.053510
+10|7137|9046|0.043099
+11|7136|9045|0.583394
+12|6167|9044|0.145396
+13|4276|9043|0.121251
+14|7135|9042|0.268754
+15|2317|9041|0.145996
+16|4280|9040|0.587619
+17|2043|9039|0.341756
+18|2563|2743|0.102019
+19|2698|17807|0.471312
+20|998|17789|0.064158
+21|8512|17790|0.069816
+22|3305|17791|0.036248
+23|8508|17792|0.109483
+24|6179|17793|0.062258
+25|8402|17794|0.087467
+26|10178|17795|0.007150
+27|10179|17796|0.114755
+28|9318|17797|0.027637
+29|9592|17798|0.076558
+30|10180|17799|0.072658
+31|8536|17800|0.029389
+32|8859|17801|0.045079
+33|9953|17802|0.075825
+34|10171|17803|0.069119
+35|8417|17804|0.015429
+36|7892|17805|0.063931
+37|9203|16876|0.147691
+38|4390|20655|0.075280
+39|9954|20656|0.080500
+40|10883|20657|0.009212
+41|10884|20658|0.048701
+42|8289|20659|0.087952
+43|5957|20660|0.002769
+44|6482|20661|0.120390
+45|5774|20662|0.023243
+46|4620|20663|0.169650
+47|5809|6764|0.050569
+48|5808|6763|0.097186
+49|5807|6762|0.146807
+50|5806|6761|0.145097
+51|5805|6760|0.008679
+52|5804|6759|0.065176
+53|5803|6758|0.013489
+54|5802|17979|0.173776
+55|10025|17978|0.175712
+56|613|17977|0.178581
+57|7125|17976|0.155428
+58|5367|17975|0.200230
+59|6585|-1|0.000000
diff --git a/src/bd_dijkstra/test/doc-bdDijkstra.result b/src/bd_dijkstra/test/doc-bdDijkstra.result
index c43ef68..fbfb422 100644
--- a/src/bd_dijkstra/test/doc-bdDijkstra.result
+++ b/src/bd_dijkstra/test/doc-bdDijkstra.result
@@ -1,13 +1,15 @@
--q1
-0|4||0
-1|3||0
-2|2||1
-3|5||1
-4|10||0
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|2|4|1
+1|5|8|1
+2|6|5|1
+3|3|-1|0
--q2
-0|4||1
-1|3||1
-2|2||1
-3|5||1
-4|10||0
+NOTICE: Deprecated Signature of pgr_bdDijkstra
+0|2|4|1
+1|5|8|1
+2|6|9|1
+3|9|16|1
+4|4|3|1
+5|3|-1|0
--q3
diff --git a/src/bd_dijkstra/test/doc-bdDijkstra.test.sql b/src/bd_dijkstra/test/doc-bdDijkstra.test.sql
index ca6abb5..150a83f 100644
--- a/src/bd_dijkstra/test/doc-bdDijkstra.test.sql
+++ b/src/bd_dijkstra/test/doc-bdDijkstra.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-- PGR_bdDijkstra
@@ -8,10 +7,9 @@ BEGIN;
\echo --q1
SELECT * FROM pgr_bdDijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
- 4, 10, false, false);
+ 2, 3, false, false);
\echo --q2
SELECT * FROM pgr_bdDijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
- 4, 10, true, true);
+ 2, 3, true, true);
\echo --q3
-ROLLBACK;
diff --git a/src/bd_dijkstra/test/pgtap/bdDijkstra-types-check.sql b/src/bd_dijkstra/test/pgtap/bdDijkstra-types-check.sql
index cab18ba..0190f57 100644
--- a/src/bd_dijkstra/test/pgtap/bdDijkstra-types-check.sql
+++ b/src/bd_dijkstra/test/pgtap/bdDijkstra-types-check.sql
@@ -2,12 +2,23 @@
\i setup.sql
-- TESTING DOCUMNETATIONS INFORMATION
-SELECT plan(17);
+SELECT plan(29);
+
+--SET client_min_messages TO WARNING;
-- RECEIVES 5 PARAMETERS
+SELECT todo_start('remove on version 3.0');
+SELECT hasnt_function('pgr_bddijkstra',
+ ARRAY['text','integer','integer','boolean','boolean'],
+ 'Remove old signature on version 3.0');
+SELECT todo_end();
-SELECT has_function('pgr_bddijkstra',ARRAY['text', 'integer', 'integer', 'boolean', 'boolean']);
-SELECT function_returns('pgr_bddijkstra', 'setof pgr_costresult','Returns set of costResult[]');
+
+SELECT has_function('pgr_bddijkstra',
+ ARRAY['text', 'integer', 'integer', 'boolean', 'boolean']);
+SELECT function_returns('pgr_bddijkstra',
+ ARRAY['text', 'integer', 'integer', 'boolean', 'boolean'],
+ 'setof pgr_costresult','Returns set of costResult[]');
-- CHECKING THE INNER QUERY
@@ -22,86 +33,118 @@ SELECT lives_ok('q1', 'edges query accepts INTEGER & FLOAT');
-SELECT todo_start('issue #140 must accept ANY-INTEGER and ANY-NUMERICAL');
--- some test pass because the code is not checking
+-- id
SELECT lives_ok(
'SELECT * FROM pgr_bddijkstra(
- ''SELECT id::BIGINT, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'id accepts BIGINT');
-SELECT lives_ok(
+ ''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::BIGINT, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::SMALLINT, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'id accepts SMALLINT');
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::REAL, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::FLOAT, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+
+-- source
SELECT lives_ok(
'SELECT * FROM pgr_bddijkstra(
- ''SELECT id::INTEGER, source::BIGINT, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'source accepts BIGINT');
-SELECT lives_ok(
+ ''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::SMALLINT, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'source accepts SMALLINT');
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::BIGINT, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::REAL, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::FLOAT, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+-- target
SELECT lives_ok(
'SELECT * FROM pgr_bddijkstra(
- ''SELECT id::INTEGER, source::INTEGER, target::BIGINT, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'target accepts BIGINT');
-SELECT lives_ok(
+ ''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::SMALLINT, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'target accepts SMALLINT');
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::INTEGER, target::BIGINT, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::INTEGER, target::REAL, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::INTEGER, target::FLOAT, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+
+-- cost
SELECT lives_ok(
'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::BIGINT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'cost accepts BIGINT');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::INTEGER, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'cost accepts INTEGER');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::SMALLINT, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'cost accepts SMALLINT');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::REAL, reverse_cost::FLOAT FROM edge_table'',
- 2, 3, true, true)',
- 'cost accepts REAL');
+ 2, 3, true, true)');
+-- reverse_cost
SELECT lives_ok(
'SELECT * FROM pgr_bddijkstra(
+ ''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table'',
+ 2, 3, true, true)');
+SELECT throws_ok(
+ 'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::BIGINT FROM edge_table'',
- 2, 3, true, true)',
- 'reverse_cost accepts BIGINT');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::INTEGER FROM edge_table'',
- 2, 3, true, true)',
- 'reverse_cost accepts INTEGER');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::SMALLINT FROM edge_table'',
- 2, 3, true, true)',
- 'reverse_cost accepts SMALLINT');
-SELECT lives_ok(
+ 2, 3, true, true)');
+SELECT throws_ok(
'SELECT * FROM pgr_bddijkstra(
''SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::REAL FROM edge_table'',
- 2, 3, true, true)',
- 'reverse_cost accepts REAL');
-
-
-SELECT todo_end();
+ 2, 3, true, true)');
diff --git a/src/bd_dijkstra/test/pgtap/v2-bdDijkstra-compare-dijkstra.sql b/src/bd_dijkstra/test/pgtap/v2-bdDijkstra-compare-dijkstra.sql
new file mode 100644
index 0000000..e8be9e4
--- /dev/null
+++ b/src/bd_dijkstra/test/pgtap/v2-bdDijkstra-compare-dijkstra.sql
@@ -0,0 +1,99 @@
+\i setup.sql
+
+SELECT plan(2312);
+
+SET client_min_messages TO ERROR;
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION bddijkstra_compare_dijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+bddijkstra_sql TEXT;
+BEGIN
+
+ FOR i IN 1.. cant LOOP
+ FOR j IN 1.. cant LOOP
+
+ -- DIRECTED
+ inner_sql := 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, true)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, true)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, false)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+
+ -- DIRECTED & NOT HAS_RCOST
+ inner_sql := 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, false)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+
+ -- UNDIRECTED
+ inner_sql := 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, true)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, true)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, false)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+
+
+ -- UNDIRECTED & NOT HAS_RCOST
+ inner_sql := 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, false)';
+
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, false)';
+ RETURN query SELECT set_eq(bddijkstra_sql, dijkstra_sql, bddijkstra_sql);
+
+ -- EXEPTION: when HAS_RCOST = true but no has_rcost found
+ inner_sql := 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table';
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true, true)';
+ RETURN query SELECT throws_ok(bddijkstra_sql);
+ bddijkstra_sql := 'SELECT * FROM pgr_bddijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false, true)';
+ RETURN query SELECT throws_ok(bddijkstra_sql);
+
+ END LOOP;
+ END LOOP;
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+SELECT * from bddijkstra_compare_dijkstra();
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/src/bd_dijkstra/test/test.conf b/src/bd_dijkstra/test/test.conf
index bd9032a..030969d 100644
--- a/src/bd_dijkstra/test/test.conf
+++ b/src/bd_dijkstra/test/test.conf
@@ -5,6 +5,7 @@
'comment' => 'Bi-directional Dijkstra test for any versions.',
'data' => ['bd_dijkstra-any-00.data'],
'tests' => [qw(
+ doc-bdDijkstra
bd_dijkstra-any-01
bd_dijkstra-any-02
bd_dijkstra-any-03
diff --git a/src/common/doc/types/cost_result.rst b/src/common/doc/cost_result.rst
similarity index 98%
rename from src/common/doc/types/cost_result.rst
rename to src/common/doc/cost_result.rst
index 7e70987..c5f7950 100644
--- a/src/common/doc/types/cost_result.rst
+++ b/src/common/doc/cost_result.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,10 +9,10 @@
.. _type_cost_result:
-pgr_costResult[]
+pgr_costResult[]
===============================================================================
-.. index::
+.. index::
single: pgr_costResult[]
Name
@@ -45,7 +45,7 @@ Description
pgr_costResult3[] - Multiple Path Results with Cost
===============================================================================
-.. index::
+.. index::
single: pgr_costResult3[]
Name
diff --git a/src/common/doc/types/geom_result.rst b/src/common/doc/geom_result.rst
similarity index 97%
rename from src/common/doc/types/geom_result.rst
rename to src/common/doc/geom_result.rst
index e47fe6e..bc9e522 100644
--- a/src/common/doc/types/geom_result.rst
+++ b/src/common/doc/geom_result.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,10 +9,10 @@
.. _type_geom_result:
-pgr_geomResult[]
+pgr_geomResult[]
===============================================================================
-.. index::
+.. index::
single: pgr_geomResult[]
Name
diff --git a/src/common/doc/pgr_version.rst b/src/common/doc/pgr_version.rst
index 4267479..49352af 100644
--- a/src/common/doc/pgr_version.rst
+++ b/src/common/doc/pgr_version.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,10 +9,10 @@
.. _pgr_version:
-pgr_version
+pgr_version
===============================================================================
-.. index::
+.. index::
single: version()
Name
@@ -70,13 +70,9 @@ Examples
SELECT version, boost FROM pgr_version();
- version | boost
+ version | boost
-----------+--------
2.2.0-dev | 1.49.0
(1 row)
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_versionless` to compare two version numbers
diff --git a/src/common/doc/types/index.rst b/src/common/doc/types_index.rst
similarity index 99%
rename from src/common/doc/types/index.rst
rename to src/common/doc/types_index.rst
index 62f9c8f..8cbd943 100644
--- a/src/common/doc/types/index.rst
+++ b/src/common/doc/types_index.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
diff --git a/src/common/doc/utilities/end_point.rst b/src/common/doc/utilities/end_point.rst
deleted file mode 100644
index 3400cf5..0000000
--- a/src/common/doc/utilities/end_point.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_end_point:
-
-pgr_endPoint - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_endPoint`` — Returns an end point of a (multi)linestring geometry.
-
-.. note:: This function is intended for the developer's aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns the geometry of the end point of the first LINESTRING of ``geom``.
-
-.. code-block:: sql
-
- text pgr_startPoint(geometry geom);
-
-
-Description
--------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:geom: ``geometry`` Geometry of a MULTILINESTRING or LINESTRING.
-
-Returns the geometry of the end point of the first LINESTRING of ``geom``.
-
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_start_point` to get the start point of a (multi)linestring.
-
diff --git a/src/common/doc/utilities/get_column_name.rst b/src/common/doc/utilities/get_column_name.rst
deleted file mode 100644
index f25b273..0000000
--- a/src/common/doc/utilities/get_column_name.rst
+++ /dev/null
@@ -1,88 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_get_column_name:
-
-pgr_getColumnName - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_getColumnName`` — Retrieves the name of the column as is stored in the postgres administration tables.
-
-.. note:: This function is intended for the developer’s aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns a ``text`` contining the registered name of the column.
-
-.. code-block:: sql
-
- text pgr_getColumnName(tab text, col text);
-
-
-Description
--------------------------------------------------------------------------------
-
-Parameters
-
-:tab: ``text`` table name with or without schema component.
-:col: ``text`` column name to be retrieved.
-
-Returns
-
- - ``text`` containing the registered name of the column.
- - ``NULL`` when :
-
- * The table “tab” is not found or
- * Column “col” is not found in table “tab” in the postgres administration tables.
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. code-block:: sql
-
- SELECT pgr_getColumnName('edge_table','the_geom');
-
- pgr_iscolumnintable
- ---------------------
- the_geom
- (1 row)
-
- SELECT pgr_getColumnName('edge_table','The_Geom');
-
- pgr_iscolumnintable
- ---------------------
- the_geom
- (1 row)
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_is_column_in_table` to check only for the existence of the column.
-* :ref:`pgr_get_table_name` to retrieve the name of the table as is stored in the postgres administration tables.
-
diff --git a/src/common/doc/utilities/get_table_name.rst b/src/common/doc/utilities/get_table_name.rst
deleted file mode 100644
index 61a3e91..0000000
--- a/src/common/doc/utilities/get_table_name.rst
+++ /dev/null
@@ -1,106 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_get_table_name:
-
-pgr_getTableName - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_getTableName`` — Retrieves the name of the column as is stored in the postgres administration tables.
-
-.. note:: This function is intended for the developer’s aid.
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns a record containing the registered names of the table and of the schema it belongs to.
-
-.. code-block:: sql
-
- (text sname, text tname) pgr_getTableName(text tab)
-
-
-Description
--------------------------------------------------------------------------------
-
-Parameters
-
-:tab: ``text`` table name with or without schema component.
-
-Returns
-
-:sname:
-
- - ``text`` containing the registered name of the schema of table "tab".
-
- * when the schema was not provided in "tab" the current schema is used.
-
- - ``NULL`` when :
-
- * The schema is not found in the postgres administration tables.
-
-:tname:
-
- - ``text`` containing the registered name of the table "tab".
- - ``NULL`` when :
-
- * The schema is not found in the postgres administration tables.
- * The table "tab" is not registered under the schema ``sname`` in the postgres administration tables
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. code-block:: sql
-
- SELECT * from pgr_getTableName('edge_table');
-
- sname | tname
- --------+------------
- public | edge_table
- (1 row)
-
- SELECT * from pgr_getTableName('EdgeTable');
-
- sname | tname
- --------+------------
- public |
- (1 row)
-
- SELECT * from pgr_getTableName('data.Edge_Table');
- sname | tname
- -------+-------
- |
- (1 row)
-
-
-The examples use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_is_column_in_table` to check only for the existence of the column.
-* :ref:`pgr_get_table_name` to retrieve the name of the table as is stored in the postgres administration tables.
-
diff --git a/src/common/doc/utilities/is_column_in_table.rst b/src/common/doc/utilities/is_column_in_table.rst
deleted file mode 100644
index d44ba17..0000000
--- a/src/common/doc/utilities/is_column_in_table.rst
+++ /dev/null
@@ -1,89 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_is_column_in_table:
-
-pgr_isColumnInTable - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_isColumnInTable`` — Check if a column is in the table.
-
-.. note:: This function is intended for the developer’s aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns ``true`` when the column “col” is in table “tab”.
-
-.. code-block:: sql
-
- boolean pgr_isColumnInTable(text tab, text col);
-
-
-Description
--------------------------------------------------------------------------------
-
-:tab: ``text`` Table name with or without schema component.
-:col: ``text`` Column name to be checked for.
-
-Returns:
-
- - ``true`` when the column “col” is in table “tab”.
- - ``false`` when:
-
- * The table "tab" is not found or
- * Column “col” is not found in table “tab”
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. code-block:: sql
-
- SELECT pgr_isColumnInTable('edge_table','x1');
-
- pgr_iscolumnintable
- ---------------------
- t
- (1 row)
-
- SELECT pgr_isColumnInTable('public.edge_table','foo');
-
- pgr_iscolumnintable
- ---------------------
- f
- (1 row)
-
-
-
-The example use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_is_column_indexed` to check if the column is indexed.
-* :ref:`pgr_get_column_name` to get the name of the column as is stored in the postgres administration tables.
-* :ref:`pgr_get_table_name` to get the name of the table as is stored in the postgres administration tables.
-
diff --git a/src/common/doc/utilities/is_column_indexed.rst b/src/common/doc/utilities/is_column_indexed.rst
deleted file mode 100644
index aa38c8e..0000000
--- a/src/common/doc/utilities/is_column_indexed.rst
+++ /dev/null
@@ -1,90 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_is_column_indexed:
-
-pgr_isColumnIndexed - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_isColumnIndexed`` — Check if a column in a table is indexed.
-
-.. note:: This function is intended for the developer’s aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns ``true`` when the column “col” in table “tab” is indexed.
-
-.. code-block:: sql
-
- boolean pgr_isColumnIndexed(text tab, text col);
-
-
-Description
--------------------------------------------------------------------------------
-
-:tab: ``text`` Table name with or without schema component.
-:col: ``text`` Column name to be checked for.
-
-Returns:
-
- - ``true`` when the column “col” in table “tab” is indexed.
- - ``false`` when:
-
- * The table "tab" is not found or
- * Column “col” is not found in table “tab” or
- * Column "col" in table "tab" is not indexed
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. code-block:: sql
-
- SELECT pgr_isColumnIndexed('edge_table','x1');
-
- pgr_iscolumnindexed
- ---------------------
- f
- (1 row)
-
- SELECT pgr_isColumnIndexed('public.edge_table','cost');
-
- pgr_iscolumnindexed
- ---------------------
- f
- (1 row)
-
-
-
-The example use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_is_column_in_table` to check only for the existence of the column in the table.
-* :ref:`pgr_get_column_name` to get the name of the column as is stored in the postgres administration tables.
-* :ref:`pgr_get_table_name` to get the name of the table as is stored in the postgres administration tables.
-
diff --git a/src/common/doc/utilities/point_to_id.rst b/src/common/doc/utilities/point_to_id.rst
deleted file mode 100644
index 11d010d..0000000
--- a/src/common/doc/utilities/point_to_id.rst
+++ /dev/null
@@ -1,66 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_point_to_id:
-
-pgr_pointToId - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_pointToId`` — Inserts a point into a vertices table and returns the corresponig id.
-
-.. note:: This function is intended for the developer's aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-This function returns the ``id`` of the row in the vertices table that corresponds to the ``point`` geometry
-
-.. code-block:: sql
-
- bigint pgr_pointToId(geometry point, double precision tolerance,text vertname text,integer srid)
-
-
-Description
--------------------------------------------------------------------------------
-
-:point: ``geometry`` "POINT" geometry to be inserted.
-:tolerance: ``float8`` Snapping tolerance of disconnected edges. (in projection unit)
-:vertname: ``text`` Vertices table name WITH schema included.
-:srid: ``integer`` SRID of the geometry point.
-
-This function returns the id of the row that corresponds to the ``point`` geometry
-
- - When the ``point`` geometry already exists in the vertices table ``vertname``, it returns the corresponding ``id``.
- - When the ``point`` geometry is not found in the vertices table ``vertname``, the function inserts the ``point`` and returns the corresponding ``id`` of the newly created vertex.
-
-.. warning:: The function do not perform any checking of the parameters. Any validation has to be done before calling this function.
-
-.. rubric:: History
-
-* Renamed in version 2.0.0
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_createVerticesTable <pgr_create_vert_table>` to create a topology based on the geometry.
-* :ref:`pgr_createTopology <pgr_create_topology>` to create a topology based on the geometry.
-
-
diff --git a/src/common/doc/utilities/quote_ident.rst b/src/common/doc/utilities/quote_ident.rst
deleted file mode 100644
index 84dcbb5..0000000
--- a/src/common/doc/utilities/quote_ident.rst
+++ /dev/null
@@ -1,124 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_quote_ident:
-
-pgr_quote_ident - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_quote_ident`` — Quotes the input text to be used as an identifier in an SQL statement string.
-
-.. note:: This function is intended for the developer's aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns the given identifier ``idname`` suitably quoted to be used as an identifier in an SQL statement string.
-
-.. code-block:: sql
-
- text pgr_quote_ident(text idname);
-
-
-Description
--------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:idname: ``text`` Name of an SQL identifier. Can include ``.`` dot notation for schemas.table identifiers
-
-Returns the given string suitably quoted to be used as an identifier in an SQL statement string.
-
- - When the identifier ``idname`` contains on or more ``.`` separators, each component is suitably quoted to be used in an SQL string.
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-Everything is lower case so nothing needs to be quoted.
-
-.. code-block:: sql
-
- SELECT pgr_quote_ident('the_geom');
-
- pgr_quote_ident
- ---------------
- the_geom
- (1 row)
-
-
- SELECT pgr_quote_ident('public.edge_table');
-
- pgr_quote_ident
- -------------------
- public.edge_table
- (1 row)
-
-The column is upper case so its double quoted.
-
-.. code-block:: sql
-
- SELECT pgr_quote_ident('edge_table.MYGEOM');
-
- pgr_quote_ident
- -------------------
- edge_table."MYGEOM"
- (1 row)
-
- SELECT pgr_quote_ident('public.edge_table.MYGEOM');
-
- pgr_quote_ident
- ---------------------------
- public.edge_table."MYGEOM"
- (1 row)
-
-
-The schema name has a capital letter so its double quoted.
-
-.. code-block:: sql
-
- SELECT pgr_quote_ident('Myschema.edge_table');
-
- pgr_quote_ident
- ----------------------
- "Myschema".edge_table
- (1 row)
-
-Ignores extra ``.`` separators.
-
-.. code-block:: sql
-
- SELECT pgr_quote_ident('Myschema...edge_table');
-
- pgr_quote_ident
- ---------------------
- "Myschema".edge_table
- (1 row)
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_get_table_name` to get the name of the table as is stored in the postgres administration tables.
-
diff --git a/src/common/doc/utilities/start_point.rst b/src/common/doc/utilities/start_point.rst
deleted file mode 100644
index b0fca55..0000000
--- a/src/common/doc/utilities/start_point.rst
+++ /dev/null
@@ -1,61 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_start_point:
-
-pgr_startPoint - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_startPoint`` — Returns a start point of a (multi)linestring geometry.
-
-.. note:: This function is intended for the developer's aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns the geometry of the start point of the first LINESTRING of ``geom``.
-
-.. code-block:: sql
-
- geometry pgr_startPoint(geometry geom);
-
-
-Description
--------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:geom: ``geometry`` Geometry of a MULTILINESTRING or LINESTRING.
-
-Returns the geometry of the start point of the first LINESTRING of ``geom``.
-
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_end_Point` to get the end point of a (multi)linestring.
-
diff --git a/src/common/doc/utilities/versionless.rst b/src/common/doc/utilities/versionless.rst
deleted file mode 100644
index b833d2c..0000000
--- a/src/common/doc/utilities/versionless.rst
+++ /dev/null
@@ -1,68 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_versionless:
-
-pgr_versionless - Deprecated Function
-===============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_versionless`` — Compare two version numbers.
-
-.. note:: This function is intended for the developer’s aid.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Returns ``true`` if the first version number is smaller than the second version number. Otherwise returns ``false``.
-
-.. code-block:: sql
-
- boolean pgr_versionless(text v1, text v2);
-
-
-Description
--------------------------------------------------------------------------------
-
-:v1: ``text`` first version number
-:v2: ``text`` second version number
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-.. code-block:: sql
-
- SELECT pgr_versionless('2.0.1', '2.1');
-
- pgr_versionless
- -----------------
- t
- (1 row)
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`developer` for the tree layout of the project.
-* :ref:`pgr_version` to get the current version of pgRouting.
diff --git a/src/common/sql/pgrouting.control.in b/src/common/sql/pgrouting.control.in
index ac30832..5950049 100644
--- a/src/common/sql/pgrouting.control.in
+++ b/src/common/sql/pgrouting.control.in
@@ -1,6 +1,6 @@
# pgRouting Extension
comment = 'pgRouting Extension'
-default_version = '${PGROUTING_VERSION_STRING}'
+default_version = '${PGROUTING_VERSION}'
relocatable = true
requires = 'plpgsql'
requires = 'postgis'
diff --git a/src/common/sql/pgrouting_version.sql b/src/common/sql/pgrouting_version.sql
index b16d881..deaf474 100644
--- a/src/common/sql/pgrouting_version.sql
+++ b/src/common/sql/pgrouting_version.sql
@@ -5,30 +5,29 @@
-- This file is release unde an MIT-X license.
-- -------------------------------------------------------------------
+/*
+.. function:: pgr_version()
+
+ Author: Stephen Woodbridge <woodbri at imaptools.com>
+
+ Returns the version of pgrouting,Git build,Git hash, Git branch and boost
+*/
+
CREATE OR REPLACE FUNCTION pgr_version()
RETURNS TABLE(
"version" varchar,
tag varchar,
- --build varchar,
hash varchar,
branch varchar,
boost varchar
) AS
$BODY$
-/*
-.. function:: pgr_version()
-
- Author: Stephen Woodbridge <woodbri at imaptools.com>
-
- Returns the version of pgrouting,Git build,Git hash, Git branch and boost
-*/
DECLARE
BEGIN
- RETURN QUERY SELECT '${PGROUTING_VERSION_STRING}'::varchar AS version,
- '${PGROUTING_GIT_TAG}'::varchar AS tag,
- --'${PGROUTING_GIT_BUILD}'::varchar AS build,
+ RETURN QUERY SELECT '${PGROUTING_VERSION}'::varchar AS version,
+ '${PGROUTING_FULL_VERSION}'::varchar AS tag,
'${PGROUTING_GIT_HASH}'::varchar AS hash,
'${PGROUTING_GIT_BRANCH}'::varchar AS branch,
'${Boost_MAJOR_VERSION}.${Boost_MINOR_VERSION}.${Boost_SUBMINOR_VERSION}'::varchar AS boost;
diff --git a/src/common/sql/utilities_pgr.sql b/src/common/sql/utilities_pgr.sql
index 830b441..ce4f0d5 100644
--- a/src/common/sql/utilities_pgr.sql
+++ b/src/common/sql/utilities_pgr.sql
@@ -190,93 +190,6 @@ LANGUAGE plpgsql VOLATILE STRICT;
/************************************************************************
-.. function:: _pgr_createIndex(tab, col,indextype)
- _pgr_createIndex(sname,tname,colname,indextypes)
-
- if the column is not indexed it creates a 'gist' index otherwise a 'btree' index
- Examples:
- * select _pgr_createIndex('tab','col','btree');
- * select _pgr_createIndex('myschema','mytable','col','gist');
- * perform 'select _pgr_createIndex('||quote_literal('tab')||','||quote_literal('col')||','||quote_literal('btree'))' ;
- * perform 'select _pgr_createIndex('||quote_literal('myschema')||','||quote_literal('mytable')||','||quote_literal('col')||','||quote_literal('gist')')' ;
- Precondition:
- sname.tname.colname is a valid column on table tname in schema sname
- indext is the indexType btree or gist
- Postcondition:
- sname.tname.colname its indexed using the indextype
-
-
- Author: Vicky Vergara <vicky_vergara at hotmail.com>>
-
- HISTORY
- Created: 2014/JUL/28
-************************************************************************/
-/*
-CREATE OR REPLACE FUNCTION _pgr_createIndex(
- sname text, tname text, colname text, indext text,
- IN reportErrs int default 1, IN fnName text default '_pgr_createIndex')
-RETURNS void AS
-$BODY$
-DECLARE
- debuglevel text;
- naming record;
- tabname text;
- query text;
- msgKind int;
-BEGIN
- msgKind = 0; -- debug_
-
- execute 'show client_min_messages' into debuglevel;
- tabname=_pgr_quote_ident(sname||'.'||tname);
- perform _pgr_msg(msgKind, fnName, 'Checking ' || colname || ' column in ' || tabname || ' is indexed');
- IF (_pgr_isColumnIndexed(sname,tname,colname, 0, fnName)) then
- perform _pgr_msg(msgKind, fnName);
- else
- if indext = 'gist' then
- query = 'create index '||_pgr_quote_ident(tname||'_'||colname||'_idx')||'
- on '||tabname||' using gist('||quote_ident(colname)||')';
- else
- query = 'create index '||_pgr_quote_ident(tname||'_'||colname||'_idx')||'
- on '||tabname||' using btree('||quote_ident(colname)||')';
- end if;
- perform _pgr_msg(msgKind, fnName, 'Adding index ' || tabname || '_' || colname || '_idx');
- perform _pgr_msg(msgKind, fnName, ' Using ' || query);
- set client_min_messages to warning;
- BEGIN
- execute query;
- EXCEPTION WHEN others THEN
- perform _pgr_onError( true, reportErrs, fnName,
- 'Could not create index on:' || cname, SQLERRM);
- END;
- execute 'set client_min_messages to '|| debuglevel;
- perform _pgr_msg(msgKind, fnName);
- END IF;
-END;
-
-$BODY$
- LANGUAGE plpgsql VOLATILE STRICT;
-
-
-CREATE OR REPLACE FUNCTION _pgr_createIndex(tabname text, colname text, indext text,
- IN reportErrs int default 1, IN fnName text default '_pgr_createIndex')
-RETURNS void AS
-$BODY$
-DECLARE
- naming record;
- sname text;
- tname text;
-
-BEGIN
- select * from _pgr_getTableName(tabname, 2, fnName) into naming;
- sname=naming.sname;
- tname=naming.tname;
- execute _pgr_createIndex(sname, tname, colname, indext, reportErrs, fnName);
-END;
-
-$BODY$
- LANGUAGE plpgsql VOLATILE STRICT;
-*/
-/************************************************************************
.. function:: _pgr_get_statement( sql ) returns the original statement if its a prepared statement
Returns:
diff --git a/src/common/src/CMakeLists.txt b/src/common/src/CMakeLists.txt
index bc34b64..ac26041 100644
--- a/src/common/src/CMakeLists.txt
+++ b/src/common/src/CMakeLists.txt
@@ -1,5 +1,6 @@
ADD_LIBRARY(common OBJECT
postgres_connection.c
+ e_report.c
restrictions_input.c
basePath_SSEC.cpp
@@ -19,4 +20,5 @@ ADD_LIBRARY(common OBJECT
ch_vertex.cpp
ch_edge.cpp
basic_edge.cpp
+ pgr_alloc.cpp
)
diff --git a/src/common/src/arrays_input.c b/src/common/src/arrays_input.c
index d57508e..d2cb14c 100644
--- a/src/common/src/arrays_input.c
+++ b/src/common/src/arrays_input.c
@@ -22,183 +22,114 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include <postgres.h>
+#include "./postgres_connection.h"
+
#include "utils/lsyscache.h"
#include "catalog/pg_type.h"
#include "utils/array.h"
-// #define DEBUG
#include "./pgr_types.h"
#include "./time_msg.h"
#include "./debug_macro.h"
#include "./arrays_input.h"
+#include <assert.h>
-
-int64_t* pgr_get_bigIntArray(size_t *arrlen, ArrayType *input) {
- int ndims;
- bool *nulls;
- Oid i_eltype;
- int16 i_typlen;
- bool i_typbyval;
- char i_typalign;
- Datum *i_data;
- int i;
- int n;
- int64_t *data;
+static
+int64_t*
+pgr_get_bigIntArr(ArrayType *v, size_t *arrlen, bool allow_empty) {
clock_t start_t = clock();
+ int64_t *c_array = NULL;;
- PGR_DBG("Getting integer array");
- /* get input array element type */
- i_eltype = ARR_ELEMTYPE(input);
- get_typlenbyvalalign(i_eltype, &i_typlen, &i_typbyval, &i_typalign);
+ Oid element_type = ARR_ELEMTYPE(v);
+ int *dim = ARR_DIMS(v);
+ int ndim = ARR_NDIM(v);
+ int nitems = ArrayGetNItems(ndim, dim);
+ Datum *elements;
+ bool *nulls;
+ int16 typlen;
+ bool typbyval;
+ char typalign;
- /* validate input data type */
- switch (i_eltype) {
- case INT2OID:
- case INT4OID:
- case INT8OID:
- break;
- default:
- elog(ERROR, "Expected array of ANY-INTEGER");
- return (int64_t*) NULL;
- break;
- }
+ assert((*arrlen) == 0);
- /* get various pieces of data from the input array */
- ndims = ARR_NDIM(input);
- n = (*ARR_DIMS(input));
- (*arrlen) = (size_t)(n);
- if (ndims != 1) {
- elog(ERROR, "One dimension expected");
+ if (allow_empty && (ndim == 0 || nitems <= 0)) {
+ PGR_DBG("ndim %i nitems % i", ndim, nitems);
+ return (int64_t*) NULL;
}
+ /* the array is not empty*/
- /* get src data */
- deconstruct_array(input, i_eltype, i_typlen, i_typbyval, i_typalign,
- &i_data, &nulls, &n);
-
- /* construct a C array */
- data = (int64_t *) malloc((*arrlen) * sizeof(int64_t));
-
- if (!data) {
- elog(ERROR, "Out of memory!");
+ if (ndim != 1) {
+ elog(ERROR, "One dimension expected");
+ return (int64_t*)NULL;
}
- PGR_DBG("array size %ld", (*arrlen));
-
- for (i = 0; i < (*arrlen); i++) {
- if (nulls[i]) {
- free(data);
- elog(ERROR, "NULL value found in Array!");
- } else {
- switch (i_eltype) {
- case INT2OID:
- data[i] = (int64_t) DatumGetInt16(i_data[i]);
- break;
- case INT4OID:
- data[i] = (int64_t) DatumGetInt32(i_data[i]);
- break;
- case INT8OID:
- data[i] = DatumGetInt64(i_data[i]);
- break;
- }
- }
+ if (nitems <= 0) {
+ elog(ERROR, "No elements found");
+ return (int64_t*)NULL;
}
- pfree(nulls);
- pfree(i_data);
-
- PGR_DBG("Finished processing array");
- time_msg(" reading Array", start_t, clock());
- return (int64_t*)data;
-}
-
-
-
-int64_t* pgr_get_bigIntArray_allowEmpty(size_t *arrlen, ArrayType *input) {
- int ndims;
- bool *nulls;
- Oid i_eltype;
- int16 i_typlen;
- bool i_typbyval;
- char i_typalign;
- Datum *i_data;
- int i;
- int n;
- int64_t *data;
- clock_t start_t = clock();
-
- PGR_DBG("Getting integer array");
- /* get input array element type */
- i_eltype = ARR_ELEMTYPE(input);
- get_typlenbyvalalign(i_eltype, &i_typlen, &i_typbyval, &i_typalign);
+ get_typlenbyvalalign(element_type,
+ &typlen, &typbyval, &typalign);
/* validate input data type */
- switch (i_eltype) {
+ switch (element_type) {
case INT2OID:
case INT4OID:
case INT8OID:
break;
default:
elog(ERROR, "Expected array of ANY-INTEGER");
- return (int64_t*) NULL;
+ return (int64_t*)NULL;
break;
}
- /* get various pieces of data from the input array */
- ndims = ARR_NDIM(input);
- n = (*ARR_DIMS(input));
- (*arrlen) = (size_t)(n);
- // PGR_DBG("dimensions %d", ndims);
- // PGR_DBG("array size %ld", (*arrlen));
+ deconstruct_array(v, element_type, typlen, typbyval,
+ typalign, &elements, &nulls,
+ &nitems);
- if (ndims == 0) {
- (*arrlen) = 0;
- PGR_DBG("array size %ld", (*arrlen));
- return (int64_t*) NULL;
- }
-
- if (ndims > 1) {
- elog(ERROR, "Expected less than two dimension");
- }
-
- /* get src data */
- deconstruct_array(input, i_eltype, i_typlen, i_typbyval, i_typalign,
- &i_data, &nulls, &n);
-
- /* construct a C array */
- data = (int64_t *) malloc((*arrlen) * sizeof(int64_t));
-
- if (!data) {
+ c_array = (int64_t *) palloc(sizeof(int64_t) * (size_t)nitems);
+ if (!c_array) {
elog(ERROR, "Out of memory!");
}
- PGR_DBG("array size %ld", (*arrlen));
- for (i = 0; i < (*arrlen); i++) {
+ int i;
+ for (i = 0; i < nitems; i++) {
if (nulls[i]) {
- free(data);
+ pfree(c_array);
elog(ERROR, "NULL value found in Array!");
} else {
- switch (i_eltype) {
+ switch (element_type) {
case INT2OID:
- data[i] = (int64_t) DatumGetInt16(i_data[i]);
+ c_array[i] = (int64_t) DatumGetInt16(elements[i]);
break;
case INT4OID:
- data[i] = (int64_t) DatumGetInt32(i_data[i]);
+ c_array[i] = (int64_t) DatumGetInt32(elements[i]);
break;
case INT8OID:
- data[i] = DatumGetInt64(i_data[i]);
+ c_array[i] = DatumGetInt64(elements[i]);
break;
}
}
}
+ (*arrlen) = (size_t)nitems;
+ pfree(elements);
pfree(nulls);
- pfree(i_data);
+ PGR_DBG("Array size %ld", (*arrlen));
+ time_msg("reading Array", start_t, clock());
+ return c_array;
+}
+
- PGR_DBG("Finished processing array");
- time_msg(" reading Array", start_t, clock());
- return (int64_t*)data;
+int64_t* pgr_get_bigIntArray(size_t *arrlen, ArrayType *input) {
+ return pgr_get_bigIntArr(input, arrlen, false);
+}
+
+
+
+int64_t* pgr_get_bigIntArray_allowEmpty(size_t *arrlen, ArrayType *input) {
+ return pgr_get_bigIntArr(input, arrlen, true);
}
diff --git a/src/common/src/basePath_SSEC.cpp b/src/common/src/basePath_SSEC.cpp
index 6fd668f..b28c955 100644
--- a/src/common/src/basePath_SSEC.cpp
+++ b/src/common/src/basePath_SSEC.cpp
@@ -21,21 +21,15 @@ along with this program; if not, write to the Free Software
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+#include "./basePath_SSEC.hpp"
-
-#include "basePath_SSEC.hpp"
#include <deque>
#include <iostream>
#include <algorithm>
-#include "./pgr_types.h"
+#include <utility>
+#include "./pgr_types.h"
+#include "./pgr_assert.h"
void Path::push_front(Path_t data) {
path.push_front(data);
@@ -48,7 +42,8 @@ void Path::push_back(Path_t data) {
}
void Path::reverse() {
- // std::swap(m_start_id, m_end_id);
+ std::swap(m_start_id, m_end_id);
+ if (path.size() <= 1) return;
std::deque< Path_t > newpath;
for (size_t i = 0; i < path.size(); ++i) {
newpath.push_front({
@@ -67,7 +62,6 @@ void Path::reverse() {
}
-
void Path::clear() {
path.clear();
m_tot_cost = 0;
@@ -98,6 +92,8 @@ Path Path::getSubpath(unsigned int j) const {
for (auto i = path.begin(); i != path.begin() + j; ++i) {
result.push_back((*i));
}
+ pgassert(result.tot_cost() != 0);
+ pgassert(this->tot_cost() != 0);
return result;
}
@@ -119,6 +115,57 @@ void Path::appendPath(const Path &o_path) {
}
+/*!
+
+ Path: 2 -> 9
+ seq node edge cost agg_cost
+ 0 2 4 1 0
+ 1 5 8 1 1
+ 2 6 9 1 2
+ 3 9 -1 0 3
+ Path: 9 -> 3
+ seq node edge cost agg_cost
+ 0 9 16 1 0
+ 1 4 3 1 1
+ 2 3 -1 0 2
+ Path: 2 -> 3
+ seq node edge cost agg_cost
+ 0 2 4 1 0
+ 1 5 8 1 1
+ 2 6 9 1 2
+ 3 9 16 1 3
+ 4 4 3 1 4
+ 5 3 -1 0 5
+
+ */
+void Path::append(const Path &other) {
+ pgassert(m_end_id == other.m_start_id);
+ if (other.m_start_id == other.m_end_id) {
+ pgassert(other.path.empty());
+ return;
+ }
+ if (m_start_id == m_end_id) {
+ pgassert(path.empty());
+ *this = other;
+ return;
+ }
+ pgassert(path.back().cost == 0);
+ pgassert(path.back().edge == -1);
+
+ m_end_id = other.m_end_id;
+
+ auto last = path.back();
+ auto agg_cost = last.agg_cost;
+
+ path.pop_back();
+
+ for (auto item : other.path) {
+ item.agg_cost += agg_cost;
+ push_back(item);
+ }
+}
+
+
void Path::generate_postgres_data(
General_path_element_t **postgres_data,
size_t &sequence) const {
diff --git a/src/common/src/basePath_SSEC.hpp b/src/common/src/basePath_SSEC.hpp
index 1964b10..99d23d0 100644
--- a/src/common/src/basePath_SSEC.hpp
+++ b/src/common/src/basePath_SSEC.hpp
@@ -22,20 +22,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_COMMON_SRC_BASEPATH_SSEC_HPP_
+#define SRC_COMMON_SRC_BASEPATH_SSEC_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+
+
+#include <boost/config.hpp>
+#include <boost/graph/adjacency_list.hpp>
#include <deque>
+#include <vector>
#include <iostream>
#include <algorithm>
#include "./pgr_types.h"
+#include "./pgr_base_graph.hpp"
+
class Path {
typedef std::deque< Path_t >::iterator pthIt;
@@ -52,6 +54,7 @@ class Path {
Path(int64_t s_id, int64_t e_id)
: m_start_id(s_id), m_end_id(e_id), m_tot_cost(0)
{}
+ Path(const Path&) = default;
int64_t start_id() const {return m_start_id;}
void start_id(int64_t value) {m_start_id = value;}
int64_t end_id() const {return m_end_id;}
@@ -104,6 +107,7 @@ class Path {
bool isEqual(const Path &subpath) const;
void appendPath(const Path &o_path);
+ void append(const Path &other);
void empty_path(unsigned int d_vertex);
void get_pg_dd_path(
@@ -209,6 +213,119 @@ class Path {
}
return count;
}
+
+
+ template <typename G , typename V> Path(
+ G &graph,
+ V v_source,
+ double distance,
+ const std::vector<V> &predecessors,
+ const std::vector<double> &distances) :
+ m_start_id(graph.graph[v_source].id),
+ m_end_id(graph.graph[v_source].id) {
+ for (V i = 0; i < distances.size(); ++i) {
+ if (distances[i] <= distance) {
+ auto cost = distances[i] - distances[predecessors[i]];
+ auto edge_id = graph.get_edge_id(predecessors[i], i, cost);
+ push_back(
+ {graph[i].id,
+ edge_id, cost,
+ distances[i]});
+ }
+ }
+ }
+
+
+
+ template <typename G , typename V> Path(
+ const G &graph,
+ const V v_source,
+ const V v_target,
+ const std::vector<V> &predecessors,
+ const std::vector<double> &distances,
+ bool only_cost,
+ bool normal = true) :
+ m_start_id(graph.graph[v_source].id),
+ m_end_id(graph.graph[v_target].id) {
+ if (!only_cost) {
+ complete_path(graph,
+ v_source,
+ v_target,
+ predecessors,
+ distances,
+ normal);
+ return;
+ }
+ /*
+ * only_cost
+ */
+ if (v_target != predecessors[v_target]) {
+ push_front(
+ {graph.graph[v_target].id,
+ -1,
+ distances[v_target],
+ distances[v_target]});
+ }
+ return;
+ }
+
+ /*! @brief constructs a path based on results
+ *
+ * Normal = false for reversed search path like in pgr_bdDijkstra
+ */
+ template <typename G , typename V> void complete_path(
+ const G &graph,
+ const V v_source,
+ const V v_target,
+ const std::vector<V> &predecessors,
+ const std::vector<double> &distances,
+ bool normal) {
+ // no path was found
+ if (v_target == predecessors[v_target]) {
+ return;
+ }
+
+ /*
+ * set the target
+ */
+ auto target = v_target;
+
+ /*
+ * the last stop is the target
+ */
+ push_front(
+ {graph.graph[target].id, -1,
+ 0, distances[target]});
+
+ /*
+ * get the path
+ */
+ while (target != v_source) {
+ /*
+ * done when the predecesor of the target is the target
+ */
+ if (target == predecessors[target]) break;
+
+ /*
+ * Inserting values in the path
+ */
+ auto cost = distances[target] - distances[predecessors[target]];
+ auto vertex_id = graph.graph[predecessors[target]].id;
+ auto edge_id = normal?
+ graph.get_edge_id(predecessors[target], target, cost)
+ : graph.get_edge_id(target, predecessors[target], cost);
+
+ push_front({
+ vertex_id,
+ edge_id,
+ cost,
+ distances[target] - cost});
+ target = predecessors[target];
+ }
+
+ return;
+ }
};
+#endif // SRC_COMMON_SRC_BASEPATH_SSEC_HPP_
diff --git a/src/common/src/basic_edge.cpp b/src/common/src/basic_edge.cpp
index 1a26931..7ff0480 100644
--- a/src/common/src/basic_edge.cpp
+++ b/src/common/src/basic_edge.cpp
@@ -21,13 +21,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
#include "./basic_edge.h"
@@ -37,7 +30,6 @@ namespace pgrouting {
void Basic_edge::cp_members(const Basic_edge &other) {
this->id = other.id;
this->cost = other.cost;
- this->first = other.first;
}
} // namespace pgrouting
diff --git a/src/common/src/basic_edge.h b/src/common/src/basic_edge.h
index 811c2ee..fdf09a7 100644
--- a/src/common/src/basic_edge.h
+++ b/src/common/src/basic_edge.h
@@ -41,7 +41,6 @@ class Basic_edge{
int64_t id;
double cost;
- bool first; // originally was true (source, target) false (target, source)
};
} // namespace pgrouting
diff --git a/src/common/src/basic_vertex.cpp b/src/common/src/basic_vertex.cpp
index 7f4d7b3..e39b13d 100644
--- a/src/common/src/basic_vertex.cpp
+++ b/src/common/src/basic_vertex.cpp
@@ -21,20 +21,14 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+#include "./basic_vertex.h"
#include <vector>
#include <algorithm>
-
#include <sstream>
-#include "./basic_vertex.h"
+#include <ostream>
+
#include "./pgr_types.h"
#include "./pgr_assert.h"
diff --git a/src/common/src/basic_vertex.h b/src/common/src/basic_vertex.h
index 7373d00..12532e7 100644
--- a/src/common/src/basic_vertex.h
+++ b/src/common/src/basic_vertex.h
@@ -27,10 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#pragma once
#include <vector>
+#include <ostream>
#include "./pgr_types.h"
+
namespace pgrouting {
class Basic_vertex {
diff --git a/src/common/src/ch_edge.cpp b/src/common/src/ch_edge.cpp
index 5875cf7..3c87ce5 100644
--- a/src/common/src/ch_edge.cpp
+++ b/src/common/src/ch_edge.cpp
@@ -28,97 +28,50 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
#include "./ch_edge.h"
+
namespace pgrouting {
-namespace contraction {
-
-void Edge::cp_members(const Edge &other, std::ostringstream& log) {
- log << "Copying members of edge\n";
- log << other;
- #if 0
- this->cost = other.cost;
- log << "after copying cost of edge\n";
- log << *this;
- this->first = other.first;
- log << "after copying first of edge\n";
- log << *this;
- this->source = other.source;
- log << "after copying source of edge\n";
- log << *this;
- this->target = other.target;
- log << "after copying target of edge\n";
- log << *this;
- this->m_contracted_vertices += other.contracted_vertices();
- log << "after adding contracted vertices\n";
- log << *this;
- #endif
- this->cost = other.cost;
- this->id = other.id;
- this->first = other.first;
- this->source = other.source;
- this->target = other.target;
- this->m_contracted_vertices += other.contracted_vertices();
- #if 0
- log << "copying eid: " << other.id << "\n";
- this->id = other.id;
- // log << "after copying id of edge\n";
- log << *this;
- #endif
- }
-
-
-void Edge::cp_members(const Edge &other) {
-
- this->cost = other.cost;
- this->id = other.id;
- this->first = other.first;
- this->source = other.source;
- this->target = other.target;
- this->m_contracted_vertices += other.contracted_vertices();
- }
-
-void Edge::cp_members(const Basic_edge &other) {
- this->id = other.id;
- this->cost = other.cost;
- this->first = other.first;
- }
-bool Edge::has_contracted_vertices() const {
- if (m_contracted_vertices.size() == 0)
- return false;
- return true;
+
+void
+CH_edge::cp_members(const CH_edge &other) {
+ this->cost = other.cost;
+ this->id = other.id;
+ this->m_contracted_vertices += other.contracted_vertices();
+}
+
+
+bool
+CH_edge::has_contracted_vertices() const {
+ return !m_contracted_vertices.empty();
}
-const Identifiers<int64_t>& Edge::contracted_vertices() const {
+const Identifiers<int64_t>&
+CH_edge::contracted_vertices() const {
return m_contracted_vertices;
}
-void Edge::add_contracted_vertex(Vertex& v, int64_t vid) {
- // adding the id(boost graph) of the contracted vertex v
+void
+CH_edge::add_contracted_vertex(CH_vertex& v, int64_t vid) {
m_contracted_vertices += vid;
- // adding the ids of the contracted vertices of the given vertex v
m_contracted_vertices += v.contracted_vertices();
- // empty the contracted vertices of the given vertex v
v.clear_contracted_vertices();
}
-void Edge::add_contracted_edge_vertices(Edge &e) {
- // adding the ids of the contracted vertices of the given edge e
+void
+CH_edge::add_contracted_edge_vertices(CH_edge &e) {
m_contracted_vertices += e.contracted_vertices();
- // empty the contracted vertices of the given edge e
e.clear_contracted_vertices();
}
-std::ostream& operator <<(std::ostream& os, const Edge& e) {
- os << "{\n id: " << e.id << ",\n";
- os << " source: " << e.source << ",\n";
- os << " target: " << e.target << ",\n";
- os << " cost: " << e.cost << ",\n";
- os << " first: " << e.first << ",\n";
- os << " contracted vertices: ";
- os << e.contracted_vertices();
- os << "\n}";
- os << "\n";
+std::ostream& operator <<(std::ostream& os, const CH_edge& e) {
+ os << "{id: " << e.id << ",\t"
+ << "source: " << e.source << ",\t"
+ << "target: " << e.target << ",\t"
+ << "cost: " << e.cost << ",\t"
+ << "contracted vertices: "
+ << e.contracted_vertices()
+ << "}";
return os;
}
-} // namespace contraction
+
} // namespace pgrouting
diff --git a/src/common/src/ch_edge.h b/src/common/src/ch_edge.h
index f5a424a..c0c75fb 100644
--- a/src/common/src/ch_edge.h
+++ b/src/common/src/ch_edge.h
@@ -34,42 +34,39 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <iostream>
#include <sstream>
#include "./ch_vertex.h"
-#include "./basic_edge.h"
+// #include "./basic_edge.h"
+
namespace pgrouting {
-namespace contraction {
-class Edge {
+class CH_edge {
public:
- Edge() = default;
- Edge(int64_t eid, int64_t source, int64_t target, double cost) :
- id(eid), source(source),
- target(target), cost(cost), first(true) {}
- Edge(int64_t eid, int64_t source, int64_t target,
- double cost, bool first) :
+ CH_edge() = default;
+
+ CH_edge(int64_t eid, int64_t source, int64_t target, double cost) :
id(eid), source(source),
- target(target), cost(cost), first(first) {}
+ target(target), cost(cost) {}
+
+ void cp_members(const CH_edge &other);
+
+ void add_contracted_vertex(CH_vertex& v, int64_t vid);
+ void add_contracted_edge_vertices(CH_edge& e);
- void cp_members(const Edge &other, std::ostringstream& log);
- void cp_members(const Edge &other);
- void cp_members(const Basic_edge &other);
- void add_contracted_vertex(Vertex& v, int64_t vid);
- void add_contracted_edge_vertices(Edge& e);
bool has_contracted_vertices() const;
- void clear_contracted_vertices() { m_contracted_vertices.clear(); }
+
+ void clear_contracted_vertices() {m_contracted_vertices.clear();}
const Identifiers<int64_t>& contracted_vertices() const;
- friend std::ostream& operator <<(std::ostream& os, const Edge& e);
+ friend std::ostream& operator <<(std::ostream& os, const CH_edge& e);
public:
int64_t id;
int64_t source;
int64_t target;
double cost;
- bool first;
+
private:
Identifiers<int64_t> m_contracted_vertices;
};
-} // namespace contraction
} // namespace pgrouting
#endif // SRC_COMMON_SRC_CH_EDGE_H_
diff --git a/src/common/src/ch_vertex.cpp b/src/common/src/ch_vertex.cpp
index 7ed5a99..c057748 100644
--- a/src/common/src/ch_vertex.cpp
+++ b/src/common/src/ch_vertex.cpp
@@ -26,95 +26,39 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+#include "./ch_vertex.h"
+
#include <algorithm>
#include <vector>
-#include "./ch_vertex.h"
namespace pgrouting {
-namespace contraction {
-const Identifiers<int64_t>& Vertex::contracted_vertices() const {
+const Identifiers<int64_t>&
+ CH_vertex::contracted_vertices() const {
return m_contracted_vertices;
}
-bool Vertex::has_contracted_vertices() const {
+bool CH_vertex::has_contracted_vertices() const {
if (m_contracted_vertices.size() == 0)
return false;
return true;
}
-void Vertex::add_contracted_vertex(Vertex& v, int64_t vid) {
- // adding the id(boost graph) of the contracted vertex v
+void CH_vertex::add_contracted_vertex(CH_vertex& v, int64_t vid) {
m_contracted_vertices += vid;
- // adding the ids of the contracted vertices of the given vertex v
m_contracted_vertices += v.contracted_vertices();
- // empty the contracted vertices of the given vertex v
v.clear_contracted_vertices();
}
-std::ostream& operator <<(std::ostream& os, const Vertex& v) {
- os << "{\n id: " << v.id << ",\n";
- os << " contracted vertices: ";
- os << v.contracted_vertices();
- os << "\n}";
- os << "\n";
+std::ostream& operator <<(std::ostream& os, const CH_vertex& v) {
+ os << "{id: " << v.id << ",\t"
+ << "contracted vertices: "
+ << v.contracted_vertices()
+ << "}";
return os;
}
-
-size_t
-check_vertices(
- std::vector < Vertex > vertices) {
- auto count(vertices.size());
- std::stable_sort(
- vertices.begin(), vertices.end(),
- [](const Vertex &lhs, const Vertex &rhs)
- {return lhs.id < rhs.id;});
- vertices.erase(
- std::unique(
- vertices.begin(), vertices.end(),
- [](const Vertex &lhs, const Vertex &rhs)
- {return lhs.id == rhs.id;}), vertices.end());
- return count - vertices.size();
-}
-
-std::vector < Vertex >
-extract_vertices(
- const std::vector <pgr_edge_t > &data_edges) {
- std::vector< Vertex > vertices;
- if (data_edges.empty()) return vertices;
- vertices.reserve(data_edges.size() * 2);
- for (const auto edge : data_edges) {
- Vertex v_source(edge, true);
- vertices.push_back(v_source);
-
- Vertex v_target(edge, false);
- vertices.push_back(v_target);
- }
- /*
- * sort and delete duplicates
- */
- std::stable_sort(
- vertices.begin(), vertices.end(),
- [](const Vertex &lhs, const Vertex &rhs)
- {return lhs.id < rhs.id;});
- vertices.erase(
- std::unique(
- vertices.begin(), vertices.end(),
- [](const Vertex &lhs, const Vertex &rhs)
- {return lhs.id == rhs.id;}), vertices.end());
- return vertices;
-}
-
-std::vector < Vertex >
-extract_vertices(
- const pgr_edge_t *data_edges,
- int64_t count) {
- return extract_vertices(
- std::vector < pgr_edge_t >(data_edges, data_edges + count));
-}
-
-} // namespace contraction
} // namespace pgrouting
diff --git a/src/common/src/ch_vertex.h b/src/common/src/ch_vertex.h
index aebe9b5..6e986ff 100644
--- a/src/common/src/ch_vertex.h
+++ b/src/common/src/ch_vertex.h
@@ -36,41 +36,40 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./identifiers.hpp"
namespace pgrouting {
-namespace contraction {
-
-class Vertex {
+class CH_vertex {
public:
int64_t id;
- Vertex() = default;
- Vertex(const Vertex &) = default;
- Vertex(const pgr_edge_t &other, bool is_source) :
+ CH_vertex() = default;
+ CH_vertex(const CH_vertex &) = default;
+ CH_vertex(const pgr_edge_t &other, bool is_source) :
id(is_source? other.source : other.target)
{}
- void cp_members(const Vertex &other) {
+ void cp_members(const CH_vertex &other) {
this->id = other.id;
}
- void add_contracted_vertex(Vertex& v, int64_t vid);
+ void add_contracted_vertex(CH_vertex& v, int64_t vid);
void add_vertex_id(int64_t vid) {m_contracted_vertices += vid;}
const Identifiers<int64_t>& contracted_vertices() const;
bool has_contracted_vertices() const;
void clear_contracted_vertices() {m_contracted_vertices.clear();}
- friend std::ostream& operator <<(std::ostream& os, const Vertex& v);
+ friend std::ostream& operator <<(std::ostream& os, const CH_vertex& v);
private:
Identifiers<int64_t> m_contracted_vertices;
};
size_t
-check_vertices(std::vector < Vertex > vertices);
+check_vertices(std::vector < CH_vertex > vertices);
-std::vector < Vertex >
+#if 0
+std::vector < CH_vertex >
extract_vertices(
const pgr_edge_t *data_edges, int64_t count);
-std::vector < Vertex >
+std::vector < CH_vertex >
extract_vertices(
const std::vector < pgr_edge_t > &data_edges);
-
-} // namespace contraction
+#endif
} // namespace pgrouting
+
#endif // SRC_COMMON_SRC_CH_VERTEX_H_
diff --git a/src/common/src/coordinates_input.c b/src/common/src/coordinates_input.c
index cfca56d..e41a525 100644
--- a/src/common/src/coordinates_input.c
+++ b/src/common/src/coordinates_input.c
@@ -22,12 +22,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// #define DEBUG
-#include "./coordinates_input.h"
+#include "./postgres_connection.h"
+#include "./coordinates_input.h"
#include "./debug_macro.h"
#include "./pgr_types.h"
-#include "./postgres_connection.h"
#include "./get_check_data.h"
#include "./time_msg.h"
@@ -133,6 +132,8 @@ void pgr_get_coordinates(
}
}
+ SPI_cursor_close(SPIportal);
+
if (total_tuples == 0) {
(*total_coordinates) = 0;
diff --git a/src/common/src/debug_macro.h b/src/common/src/debug_macro.h
index 63bb809..952fde1 100644
--- a/src/common/src/debug_macro.h
+++ b/src/common/src/debug_macro.h
@@ -28,10 +28,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#pragma once
#ifndef NDEBUG
-#include <postgres.h>
+
+#include "./postgres_connection.h"
#define PGR_DBG(...) \
- elog(DEBUG2, __VA_ARGS__)
+ elog(DEBUG3, __VA_ARGS__)
#else
#define PGR_DBG(...) do { ; } while (0)
#endif
diff --git a/src/common/src/e_report.c b/src/common/src/e_report.c
new file mode 100644
index 0000000..9e95a32
--- /dev/null
+++ b/src/common/src/e_report.c
@@ -0,0 +1,123 @@
+/*PGR-GNU*****************************************************************
+File: e_report.c
+
+Function's developer:
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+Mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ ********************************************************************PGR-GNU*/
+
+#include "./postgres_connection.h"
+#include "./debug_macro.h"
+#include "./e_report.h"
+
+void
+pgr_notice(
+ char* notice) {
+ PGR_DBG("Returned notice message = %s", notice);
+
+ if (notice) {
+ ereport(NOTICE,
+ (errmsg("%s", notice)));
+ }
+}
+
+void
+pgr_notice2(
+ char* log,
+ char* notice) {
+ PGR_DBG("Returned log message = %s", log);
+ PGR_DBG("Returned notice message = %s", notice);
+
+ if (log) {
+ pgr_notice(notice);
+ return;
+ }
+
+ if (notice) {
+ ereport(NOTICE,
+ (errmsg("%s", notice),
+ errhint("%s", log)));
+ }
+}
+
+void
+pgr_error(char* err) {
+ PGR_DBG("Returned error message = %s", err);
+
+#if 0
+ char *error = NULL;
+ if (*err_msg) {
+ error = pgr_cstring2char(*err_msg);
+ free(*err_msg);
+ }
+#endif
+ if (err) {
+ ereport(ERROR,
+ (errmsg_internal("Unexpected"),
+ errhint("%s", err)));
+ }
+}
+
+void
+pgr_error2(
+ char* log,
+ char* err) {
+ PGR_DBG("Returned log message = %s", log);
+ PGR_DBG("Returned error message = %s", err);
+
+ if (err) {
+ ereport(ERROR,
+ (errmsg_internal("%s", err),
+ errhint("%s", log)));
+ }
+}
+
+void
+pgr_global_report(
+ char* log,
+ char* notice,
+ char* err) {
+ if (!notice && log) {
+ ereport(DEBUG1,
+ (errmsg_internal("%s", log)));
+ }
+
+ if (notice) {
+ if (log) {
+ ereport(NOTICE,
+ (errmsg_internal("%s", notice),
+ errhint("%s", log)));
+ } else {
+ ereport(NOTICE,
+ (errmsg_internal("%s", notice)));
+ }
+ }
+
+ if (err) {
+ if (log) {
+ ereport(ERROR,
+ (errmsg_internal("%s", err),
+ errhint("%s", log)));
+ } else {
+ ereport(ERROR,
+ (errmsg_internal("%s", err)));
+ }
+ }
+}
diff --git a/src/common/src/e_report.h b/src/common/src/e_report.h
new file mode 100644
index 0000000..aa8d7a7
--- /dev/null
+++ b/src/common/src/e_report.h
@@ -0,0 +1,136 @@
+/*PGR-GNU*****************************************************************
+File: e_report.h
+
+Function's developer:
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+Mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ ********************************************************************PGR-GNU*/
+
+#pragma once
+
+/*! @name Postgres ereport
+ * Send notice or error to postgreSQL (cleans the char *)
+ *
+ * From the C++ err_msg, log_msg, notice_msg are returned as a (char *),
+ *
+ * Before exiting the C code the pointers need to be freed:
+ * - This task can be done when there is no error,
+ * - Call to ERROR, gives the control back to postgreSQL
+ * - leaves a leak
+ *
+ * on C++ side, the message to be returned;
+ * ~~~~{.c}
+ * std::ostringstream log;
+ * log << "the messaage";
+ * log_msg = strdup(log.str().c_str());
+ * ~~~~
+ *
+ *
+ * The char* messages are cleared.
+ * New messages are made with palloc
+ *
+ * when there is ERROR then postgreSQL takes over control
+ *
+ * @warning When error: Free all data not created with palloc before calling
+ *
+ */
+///@{
+/*! @brief notice & error
+ *
+ * ~~~~{.c}
+ * pgr_notice(&log_msg, ¬ice_msg, &error_msg);
+ *
+ * precondition: before calling ereport
+ * assert(!*log_msg);
+ * assert(!*notice_msg);
+ * assert(!*error_msg);
+ * ~~~~
+ */
+void
+pgr_global_report(
+ char* log_msg,
+ char* notice_msg,
+ char* error_msg);
+
+/*! @brief notice with no hint
+ *
+ * ~~~~{.c}
+ * pgr_notice(&log_msg, ¬ice_msg);
+ *
+ * precondition: before calling ereport
+ * assert(!log_msg);
+ * assert(!notice_msg);
+ * ~~~~
+ */
+void
+pgr_notice(
+ char* notice_msg
+ );
+
+/*! @brief notice with hint
+ *
+ * ~~~~{.c}
+ * pgr_notice(&log_msg, ¬ice_msg);
+ *
+ * precondition: before calling ereport
+ * assert(!log_msg);
+ * assert(!notice_msg);
+ * ~~~~
+ */
+void
+pgr_notice2(
+ char* log_msg,
+ char* notice_msg
+ );
+
+/*! @brief error with no hint
+ *
+ *
+ * ~~~~{.c}
+ * if (err_msg) {
+ * pfree(<data>);
+ * }
+ * pgr_error(&error_msg);
+ *
+ * precondition: before calling ereport
+ * assert(!*error_msg);
+ * ~~~~
+ */
+void
+pgr_error(char* error_msg);
+
+/*! @brief error with hint
+ *
+ * ~~~~{.c}
+ * if (err_msg) {
+ * pfree(<data>);
+ * }
+ * pgr_error(&log_msg, &error_msg);
+ *
+ * precondition: before calling ereport
+ * assert(!*log_msg);
+ * assert(!*error_msg);
+ * ~~~~
+ */
+void
+pgr_error2(
+ char* log_msg,
+ char* error_msg);
+///@}
diff --git a/src/common/src/edges_input.c b/src/common/src/edges_input.c
index f5cd114..d2028db 100644
--- a/src/common/src/edges_input.c
+++ b/src/common/src/edges_input.c
@@ -22,10 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// #define DEBUG
+#include "./postgres_connection.h"
#include "./debug_macro.h"
#include "./pgr_types.h"
-#include "./postgres_connection.h"
#include "./get_check_data.h"
#include "./edges_input.h"
#include "./time_msg.h"
@@ -61,7 +60,8 @@ void fetch_edge(
int64_t *default_id,
float8 default_rcost,
pgr_edge_t *edge,
- size_t *valid_edges) {
+ size_t *valid_edges,
+ bool normal) {
if (column_found(info[0].colNumber)) {
edge->id = pgr_SPI_getBigInt(tuple, tupdesc, info[0]);
} else {
@@ -69,8 +69,14 @@ void fetch_edge(
++(*default_id);
}
- edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[1]);
- edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[2]);
+ if (normal) {
+ edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[1]);
+ edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[2]);
+ } else {
+ edge->target = pgr_SPI_getBigInt(tuple, tupdesc, info[1]);
+ edge->source = pgr_SPI_getBigInt(tuple, tupdesc, info[2]);
+ }
+
edge->cost = pgr_SPI_getFloat8(tuple, tupdesc, info[3]);
if (column_found(info[4].colNumber)) {
@@ -205,8 +211,6 @@ get_edges_9_columns(
size_t t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
- PGR_DBG("processing %ld edge tupĺes", ntuples);
-
for (t = 0; t < ntuples; t++) {
HeapTuple tuple = tuptable->vals[t];
fetch_edge_with_xy(&tuple, &tupdesc, info,
@@ -220,15 +224,15 @@ get_edges_9_columns(
}
}
+ SPI_cursor_close(SPIportal);
if (total_tuples == 0 || valid_edges == 0) {
- PGR_DBG("NO edges found");
- return;
+ PGR_DBG("No edges found");
}
(*total_edges) = total_tuples;
- PGR_DBG("Finish reading %ld edges, %ld", total_tuples, (*total_edges));
- time_msg(" reading Edges with xy", start_t, clock());
+ PGR_DBG("Finish reading %ld edges", total_tuples);
+ time_msg("reading edges", start_t, clock());
}
@@ -239,7 +243,8 @@ get_edges_5_columns(
char *sql,
pgr_edge_t **edges,
size_t *totalTuples,
- bool ignore_id) {
+ bool ignore_id,
+ bool normal) {
clock_t start_t = clock();
const int tuple_limit = 1000000;
@@ -305,14 +310,13 @@ get_edges_5_columns(
size_t t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
- PGR_DBG("processing %ld edge tupĺes", ntuples);
-
for (t = 0; t < ntuples; t++) {
HeapTuple tuple = tuptable->vals[t];
fetch_edge(&tuple, &tupdesc, info,
&default_id, -1,
&(*edges)[total_tuples - ntuples + t],
- &valid_edges);
+ &valid_edges,
+ normal);
}
SPI_freetuptable(tuptable);
} else {
@@ -320,16 +324,15 @@ get_edges_5_columns(
}
}
+ SPI_cursor_close(SPIportal);
if (total_tuples == 0 || valid_edges == 0) {
- (*totalTuples) = 0;
- PGR_DBG("NO edges");
- return;
+ PGR_DBG("No edges found");
}
(*totalTuples) = total_tuples;
- PGR_DBG("Finish reading %ld edges, %ld", total_tuples, (*totalTuples));
- time_msg(" reading Edges", start_t, clock());
+ PGR_DBG("Reading %ld edges", total_tuples);
+ time_msg("reading edges", start_t, clock());
}
static
@@ -398,14 +401,14 @@ get_edges_flow(
size_t t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
- PGR_DBG("processing %lu edge tupĺes", ntuples);
for (t = 0; t < ntuples; t++) {
HeapTuple tuple = tuptable->vals[t];
fetch_edge(&tuple, &tupdesc, info,
&default_id, -1,
&(*edges)[total_tuples - ntuples + t],
- &valid_edges);
+ &valid_edges,
+ true);
}
SPI_freetuptable(tuptable);
} else {
@@ -413,16 +416,15 @@ get_edges_flow(
}
}
+ SPI_cursor_close(SPIportal);
if (total_tuples == 0 || valid_edges == 0) {
- (*totalTuples) = 0;
- PGR_DBG("NO edges");
- return;
+ PGR_DBG("No edges found");
}
(*totalTuples) = total_tuples;
- PGR_DBG("Finish reading %ld edges, %ld", total_tuples, (*totalTuples));
- time_msg(" reading Edges", start_t, clock());
+ PGR_DBG("Reading %ld edges", total_tuples);
+ time_msg("reading edges", start_t, clock());
}
static
@@ -484,9 +486,11 @@ get_edges_basic(
if (ntuples > 0) {
if ((*edges) == NULL)
- (*edges) = (pgr_basic_edge_t *)palloc0(total_tuples * sizeof(pgr_basic_edge_t));
+ (*edges) = (pgr_basic_edge_t *)palloc0(
+ total_tuples * sizeof(pgr_basic_edge_t));
else
- (*edges) = (pgr_basic_edge_t *)repalloc((*edges), total_tuples * sizeof(pgr_basic_edge_t));
+ (*edges) = (pgr_basic_edge_t *)repalloc(
+ (*edges), total_tuples * sizeof(pgr_basic_edge_t));
if ((*edges) == NULL) {
elog(ERROR, "Out of memory");
@@ -495,7 +499,6 @@ get_edges_basic(
size_t t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
- PGR_DBG("processing %ld edge tupĺes", ntuples);
for (t = 0; t < ntuples; t++) {
HeapTuple tuple = tuptable->vals[t];
@@ -510,18 +513,18 @@ get_edges_basic(
}
}
+ SPI_cursor_close(SPIportal);
if (total_tuples == 0 || valid_edges == 0) {
- (*totalTuples) = 0;
- PGR_DBG("NO edges");
- return;
+ PGR_DBG("No edges found");
}
(*totalTuples) = total_tuples;
- PGR_DBG("Finish reading %ld edges, %ld", total_tuples, (*totalTuples));
- time_msg(" reading Edges", start_t, clock());
+ PGR_DBG("Reading %ld edges", total_tuples);
+ time_msg("reading edges", start_t, clock());
}
+/* select id, source, target, capacity, reverse_capacity */
void
pgr_get_flow_edges(
char *sql,
@@ -531,24 +534,40 @@ pgr_get_flow_edges(
get_edges_flow(sql, edges, total_edges, ignore_id);
}
+/* select id, source, target, cost, reverse_cost */
void
pgr_get_edges(
char *edges_sql,
pgr_edge_t **edges,
size_t *total_edges) {
bool ignore_id = false;
- get_edges_5_columns(edges_sql, edges, total_edges, ignore_id);
+ bool normal = true;
+ get_edges_5_columns(edges_sql, edges, total_edges, ignore_id, normal);
}
+/* select id, source AS target, target AS source, cost, reverse_cost */
+void
+pgr_get_edges_reversed(
+ char *edges_sql,
+ pgr_edge_t **edges,
+ size_t *total_edges) {
+ bool ignore_id = false;
+ bool normal = false;
+ get_edges_5_columns(edges_sql, edges, total_edges, ignore_id, normal);
+}
+
+/* select source, target, cost, reverse_cost */
void
pgr_get_edges_no_id(
char *edges_sql,
pgr_edge_t **edges,
size_t *total_edges) {
bool ignore_id = true;
- get_edges_5_columns(edges_sql, edges, total_edges, ignore_id);
+ bool normal = true;
+ get_edges_5_columns(edges_sql, edges, total_edges, ignore_id, normal);
}
+/* select id, source, target, cost, reverse_cost, x1, y1, x2, y2 */
void
pgr_get_edges_xy(
char *edges_sql,
@@ -556,6 +575,12 @@ pgr_get_edges_xy(
size_t *total_edges) {
get_edges_9_columns(edges_sql, edges, total_edges, true);
}
+
+/* select id,
+ * source AS target,
+ * target AS source,
+ * cost, reverse_cost,
+ * x1, y1, x2, y2 */
void
pgr_get_edges_xy_reversed(
char *edges_sql,
@@ -564,11 +589,12 @@ pgr_get_edges_xy_reversed(
get_edges_9_columns(edges_sql, edges, total_edges, false);
}
+/* used in flow algorithms */
void
pgr_get_basic_edges(
- char *sql,
- pgr_basic_edge_t **edges,
- size_t *total_edges) {
+ char *sql,
+ pgr_basic_edge_t **edges,
+ size_t *total_edges) {
bool ignore_id = false;
get_edges_basic(sql, edges, total_edges, ignore_id);
}
diff --git a/src/common/src/edges_input.h b/src/common/src/edges_input.h
index 5585f7d..20130d0 100644
--- a/src/common/src/edges_input.h
+++ b/src/common/src/edges_input.h
@@ -49,8 +49,6 @@ void pgr_get_edges_no_id(
-
-
/*! @brief basic edge_sql
For queries of the type:
@@ -67,6 +65,10 @@ void pgr_get_edges(
char *edges_sql,
pgr_edge_t **edges,
size_t *total_edges);
+void pgr_get_edges_reversed(
+ char *edges_sql,
+ pgr_edge_t **edges,
+ size_t *total_edges);
@@ -149,6 +151,8 @@ void pgr_get_basic_edges(
pgr_basic_edge_t **edges,
size_t *total_edges);
+
+
/* **************** FOR USERS DOCUMENTATION
basic_edges_sql_start
diff --git a/src/common/src/get_check_data.c b/src/common/src/get_check_data.c
index 62e1144..6e4528f 100644
--- a/src/common/src/get_check_data.c
+++ b/src/common/src/get_check_data.c
@@ -22,12 +22,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include <postgres.h>
+#include "./../../common/src/postgres_connection.h"
+
#include "catalog/pg_type.h"
-#include "executor/spi.h"
-// #define DEBUG
#include "./pgr_types.h"
#include "./debug_macro.h"
#include "./get_check_data.h"
@@ -49,7 +48,9 @@ static
bool
fetch_column_info(
Column_info_t *info) {
+#if 0
PGR_DBG("Fetching column info of %s", info->name);
+#endif
info->colNumber = SPI_fnumber(SPI_tuptable->tupdesc, info->name);
if (info->strict && !column_found(info->colNumber)) {
elog(ERROR, "Column '%s' not Found", info->name);
@@ -59,7 +60,9 @@ fetch_column_info(
if (SPI_result == SPI_ERROR_NOATTRIBUTE) {
elog(ERROR, "Type of column '%s' not Found", info->name);
}
+#if 0
PGR_DBG("Column %s found: %lu", info->name, info->type);
+#endif
return true;
}
PGR_DBG("Column %s not found", info->name);
@@ -181,7 +184,9 @@ pgr_SPI_getBigInt(HeapTuple *tuple, TupleDesc *tupdesc, Column_info_t info) {
"Unexpected Column type of %s. Expected ANY-INTEGER",
info.name);
}
+#if 0
PGR_DBG("Variable: %s Value: %ld", info.name, value);
+#endif
return value;
}
@@ -215,16 +220,16 @@ pgr_SPI_getFloat8(HeapTuple *tuple, TupleDesc *tupdesc, Column_info_t info) {
"Unexpected Column type of %s. Expected ANY-NUMERICAL",
info.name);
}
+#if 0
PGR_DBG("Variable: %s Value: %lf", info.name, value);
+#endif
return value;
}
+/**
+ * under development
+ */
char*
pgr_SPI_getText(HeapTuple *tuple, TupleDesc *tupdesc, Column_info_t info) {
- char* value = NULL;
- char* val = NULL;
- val = SPI_getvalue(*tuple, *tupdesc, info.colNumber);
- value = DatumGetCString(&val);
- pfree(val);
- return value;
+ return DatumGetCString(SPI_getvalue(*tuple, *tupdesc, info.colNumber));
}
diff --git a/src/common/src/get_check_data.h b/src/common/src/get_check_data.h
index 85ac8a8..5140119 100644
--- a/src/common/src/get_check_data.h
+++ b/src/common/src/get_check_data.h
@@ -34,8 +34,8 @@ void pgr_fetch_column_info(
void pgr_check_any_integer_type(Column_info_t info);
void pgr_check_any_numerical_type(Column_info_t info);
-void pgr_check_text_type(Column_info_t info);
void pgr_check_char_type(Column_info_t info);
+void pgr_check_text_type(Column_info_t info);
void pgr_check_boolean_type(Column_info_t info);
diff --git a/src/common/src/identifiers.hpp b/src/common/src/identifiers.hpp
index fef8b60..6860c3d 100644
--- a/src/common/src/identifiers.hpp
+++ b/src/common/src/identifiers.hpp
@@ -27,8 +27,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
+#ifndef SRC_COMMON_SRC_IDENTIFIERS_HPP_
+#define SRC_COMMON_SRC_IDENTIFIERS_HPP_
#pragma once
+
#include <set>
#include <algorithm>
#include <sstream>
@@ -39,20 +41,23 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
template <typename T>
class Identifiers {
public:
+ typedef typename std::set<T>::iterator iterator;
+ typedef typename std::set<T>::const_iterator const_iterator;
+
Identifiers<T>() = default;
+ /* TODO avoid pointers */
Identifiers<T>(T* container, size_t size) {
for (size_t i = 0; i < size; ++i) {
m_ids.insert(container[i]);
}
}
+
const std::set<T>& ids() const;
size_t size() const { return m_ids.size(); }
- typedef typename std::set<T>::iterator iterator;
- typedef typename std::set<T>::const_iterator const_iterator;
//! \brief Returns true when the set is empty
inline bool empty() const { return m_ids.empty(); }
inline void clear() { m_ids.clear(); }
- bool has(const T other) const;
+ bool has(const T element) const;
bool isDisjoint(const T other) const;
bool isDisjoint(const Identifiers<T> &other) const;
void insert(const Identifiers<T> &other);
@@ -63,6 +68,10 @@ class Identifiers {
const_iterator end() const { return m_ids.end(); }
bool operator ==(const Identifiers<T> &other) const;
const T& operator[](size_t index) const;
+
+ //! @name mathematical set operations
+ /// @{
+
Identifiers<T> operator +(const T &other) const;
Identifiers<T> operator *(const T &other) const;
Identifiers<T> operator -(const T &other) const;
@@ -75,6 +84,8 @@ class Identifiers {
Identifiers<T>& operator +=(const Identifiers<T> &other);
Identifiers<T>& operator *=(const Identifiers<T> &other);
Identifiers<T>& operator -=(const Identifiers<T> &other);
+ /// @}
+
template<T>
friend std::ostream& operator<<(
std::ostream& os,
@@ -348,3 +359,6 @@ const T& Identifiers<T>::operator[](size_t index) const {
}
return *std::next(m_ids.begin(), index);
}
+
+
+#endif // SRC_COMMON_SRC_IDENTIFIERS_HPP_
diff --git a/src/common/src/matrixRows_input.c b/src/common/src/matrixRows_input.c
index e227af0..313c5c6 100644
--- a/src/common/src/matrixRows_input.c
+++ b/src/common/src/matrixRows_input.c
@@ -22,10 +22,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// #define DEBUG
+#include "./postgres_connection.h"
+
#include "./debug_macro.h"
#include "./pgr_types.h"
-#include "./postgres_connection.h"
#include "./get_check_data.h"
#include "./time_msg.h"
#include "./matrixRows_input.h"
@@ -121,6 +121,8 @@ void pgr_get_matrixRows(
}
}
+ SPI_cursor_close(SPIportal);
+
if (total_tuples == 0) {
(*total_rows) = 0;
diff --git a/src/common/src/debug_macro.h b/src/common/src/pgr_alloc.cpp
similarity index 75%
copy from src/common/src/debug_macro.h
copy to src/common/src/pgr_alloc.cpp
index 63bb809..3ba4c28 100644
--- a/src/common/src/debug_macro.h
+++ b/src/common/src/pgr_alloc.cpp
@@ -1,6 +1,5 @@
/*PGR-GNU*****************************************************************
-
-File: debug_macro.h
+File: pgr_palloc.cpp
Copyright (c) 2015 Celia Virginia Vergara Castillo
Mail: vicky_vergara at hotmail.com
@@ -23,17 +22,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_COMMON_SRC_DEBUG_MACRO_H_
-#define SRC_COMMON_SRC_DEBUG_MACRO_H_
-#pragma once
-
-#ifndef NDEBUG
-#include <postgres.h>
+#include "./pgr_alloc.hpp"
+#include <string>
-#define PGR_DBG(...) \
- elog(DEBUG2, __VA_ARGS__)
-#else
-#define PGR_DBG(...) do { ; } while (0)
-#endif
+char *
+pgr_msg(const std::string &msg) {
+ char* duplicate = NULL;
+ duplicate = pgr_alloc(msg.size() + 1, duplicate);
+ memcpy(duplicate, msg.c_str(), msg.size());
+ duplicate[msg.size()] = '\0';
+ return duplicate;
+}
-#endif // SRC_COMMON_SRC_DEBUG_MACRO_H_
diff --git a/src/common/src/pgr_alloc.hpp b/src/common/src/pgr_alloc.hpp
index 72a28af..67d6c9a 100644
--- a/src/common/src/pgr_alloc.hpp
+++ b/src/common/src/pgr_alloc.hpp
@@ -21,16 +21,25 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+#ifndef SRC_COMMON_SRC_PGR_ALLOC_HPP_
+#define SRC_COMMON_SRC_PGR_ALLOC_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
+
+
+extern "C" {
+#if PGSQL_VERSION < 94
+#ifdef __MINGW32__
#include <winsock2.h>
#include <windows.h>
-#ifdef open
-#undef open
#endif
#endif
-#include <stdlib.h>
+#include "./postgres_connection.h"
+#include <utils/palloc.h>
+}
+
+#include <string>
/*! \fn pgr_alloc(std::size_t size, T *ptr)
@@ -47,13 +56,28 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
+
template <typename T>
T*
-pgr_alloc(std::size_t size, T *ptr) {
+pgr_alloc(std::size_t size, T* ptr) {
if (!ptr) {
- ptr = (T*) malloc(size * sizeof(T));
+ ptr = static_cast<T*>(SPI_palloc(size * sizeof(T)));
} else {
- ptr = (T*) realloc(ptr, size * sizeof(T));
+ ptr = static_cast<T*>(SPI_repalloc(ptr, size * sizeof(T)));
}
- return (T*) ptr;
+ return ptr;
}
+
+template <typename T>
+T*
+pgr_free(T* ptr) {
+ if (ptr) {
+ pfree(ptr);
+ }
+ return nullptr;
+}
+
+char *
+pgr_msg(const std::string &msg);
+
+#endif // SRC_COMMON_SRC_PGR_ALLOC_HPP_
diff --git a/src/common/src/pgr_assert.cpp b/src/common/src/pgr_assert.cpp
index 4f2d77d..69dfcb7 100644
--- a/src/common/src/pgr_assert.cpp
+++ b/src/common/src/pgr_assert.cpp
@@ -10,6 +10,7 @@
*
*****************************************************************PGR-MIT*/
#include "./pgr_assert.h"
+
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
@@ -17,20 +18,10 @@
#ifdef __linux__
#include <execinfo.h>
#endif
+
#include <string>
#include <exception>
-#if 0
-#ifdef assert
-#undef assert
-#endif
-
-#ifndef __STRING
-#define __STRING(x) #x
-#endif
-
-#define __TOSTRING(x) __STRING(x)
-#endif
std::string get_backtrace() {
#ifdef __linux__
diff --git a/src/common/src/pgr_base_graph.hpp b/src/common/src/pgr_base_graph.hpp
index 25c5153..d9517d7 100644
--- a/src/common/src/pgr_base_graph.hpp
+++ b/src/common/src/pgr_base_graph.hpp
@@ -22,18 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_COMMON_SRC_PGR_BASE_GRAPH_HPP_
+#define SRC_COMMON_SRC_PGR_BASE_GRAPH_HPP_
#pragma once
-#if defined(__MinGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#undef min
-#undef max
-#ifdef open
-#undef open
-#endif
-#endif
-
-
#include <boost/graph/iteration_macros.hpp>
#include <boost/config.hpp>
@@ -56,6 +47,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./basic_edge.h"
#include "./pgr_assert.h"
+namespace pgrouting {
+
/*! @brief boost::graph simplified to pgRouting needs
This class gives the handling basics of a boost::graph of kind G
@@ -86,7 +79,7 @@ Data obtained from postgresql is stored in
A C array of pgr_edge_t type.
~~~~{.c}
-std::vector< T_V >
+std::vector< T_V >
extract_vertices(pgr_edge_t *, size_t)
~~~~
@@ -95,7 +88,7 @@ Data obtained from postgresql is stored in
o a vector container.
~~~~{.c}
-std::vector< T_V >
+std::vector< T_V >
extract_vertices(std::vector< pgr_edge_t >)
~~~~
@@ -112,19 +105,19 @@ The code is prepared to be used for:
boost::adjacency_list
< boost::vecS, // not tested with other values
boost::vecS, // not tested with other values
-boost::undirectedS, // USinG UNDIRECTED
+boost::undirectedS, // USinG UNDIRECTED
Basic_vertex, // the vertex class
Basic_edge > // the edge class
~~~~
-Eample Usage:
+Example Usage:
=============
For this example we will use:
- Basic_vertex
-- Basic_edge
+- Basic_edge
- pgr_edge_t
@@ -134,7 +127,7 @@ Create Graph type
~~~~{.c}
typedef typename
graph::Pgr_base_graph <
-boost::adjacency_list <
+boost::adjacency_list <
boost::vecS,
boost::vecS,
boost::bidirectionalS,
@@ -158,7 +151,7 @@ Vector of unique vertices of the graph
~~~~{.c}
size_t total_edges;
pgr_edge_t *my_edges = NULL;
-pgr_get_edges(edges_sql, &my_edges, &total_tuples);
+pgr_get_edges(edges_sql, &my_edges, &total_tuples);
std::vector< Basic_Vertex > vertices(pgrouting::extract_vertices(my_edges));
~~~~
@@ -202,21 +195,20 @@ pgrouting::DirectedGraph digraph(
- the vertices are inserted
-Fill the graph
+Fill the graph
---------------------
After initializing the graph with the vertices, the edges can be added.
~~~~{.c}
// inserting edges from a C array
-digraph.graph_insert_data(my_edges, total_edges);
+digraph.insert_edges(my_edges, total_edges);
// adding more edges to the graph from a vector container
-digraph.graph_insert_data(new_edges);
+digraph.insert_edges(new_edges);
~~~~
*/
-namespace pgrouting {
namespace graph {
template <class G, typename Vertex, typename Edge>
@@ -225,13 +217,13 @@ class Pgr_base_graph;
} // namespace graph
-/** @name Graph types
+/** @name Graph types
Type | pgRouting
:---------: | :---------------------
UndirectedGraph | Basic undirected graph
DirectedGraph | Basic directed graph
- xyUndirectedGraph | X & Y values stored on the vertex
- xyDirectedGraph | X & Y values stored on the vertex
+ xyUndirectedGraph | X & Y values stored on the vertex
+ xyDirectedGraph | X & Y values stored on the vertex
*/
//@{
typedef graph::Pgr_base_graph <
@@ -258,20 +250,6 @@ boost::adjacency_list < boost::listS, boost::vecS,
XY_vertex, Basic_edge >,
XY_vertex, Basic_edge > xyDirectedGraph;
-#if 0
-// TODO(Rohith) this is only used on internal query tests
-typedef graph::Pgr_base_graph <
-boost::adjacency_list < boost::listS, boost::vecS,
- boost::undirectedS,
- contraction::Vertex, Basic_edge >,
- contraction::Vertex, Basic_edge > CUndirectedGraph;
-
-typedef graph::Pgr_base_graph <
-boost::adjacency_list < boost::listS, boost::vecS,
- boost::bidirectionalS,
- contraction::Vertex, Basic_edge >,
- contraction::Vertex, Basic_edge > CDirectedGraph;
-#endif
//@}
@@ -293,6 +271,7 @@ class Pgr_base_graph {
*/
//@{
typedef G B_G;
+ typedef T_E G_T_E;
typedef typename boost::graph_traits < G >::vertex_descriptor V;
typedef typename boost::graph_traits < G >::edge_descriptor E;
typedef typename boost::graph_traits < G >::vertex_iterator V_i;
@@ -383,10 +362,10 @@ class Pgr_base_graph {
}
- //! @name Insert data
+ //! @name Insert edges
//@{
/*! @brief Inserts *count* edges of type *T* into the graph
- *
+ *
* Converts the edges to a std::vector<T> & calls the overloaded
* twin function.
*
@@ -394,29 +373,30 @@ class Pgr_base_graph {
* @param count
*/
template < typename T >
- void graph_insert_data(const T *edges, int64_t count) {
- graph_insert_data(std::vector < T >(edges, edges + count));
+ void insert_edges(const T *edges, int64_t count) {
+ insert_edges(std::vector < T >(edges, edges + count));
}
+
/*! @brief Inserts *count* edges of type *pgr_edge_t* into the graph
The set of edges should not have an illegal vertex defined
-
+
When the graph is empty calls:
- @b extract_vertices
and throws an exception if there are illegal vertices.
-
-
+
+
When developing:
- if an illegal vertex is found an exception is thrown
- That means that the set of vertices should be checked in the
code that is being developed
-
+
No edge is inserted when there is an error on the vertices
@param edges
*/
template < typename T >
- void graph_insert_data(const std::vector < T > &edges) {
+ void insert_edges(const std::vector < T > &edges) {
#if 0
// This code does not work with contraction
if (num_vertices() == 0) {
@@ -437,21 +417,21 @@ class Pgr_base_graph {
* PRECONDITIONS:
* ~~~~~{.c}
* precondition(boost::num_vertices(graph) == 0);
- * for (vertex : vertices)
+ * for (vertex : vertices)
* precondition(!has_vertex(vertex.id));
* ~~~~~
*
* POSTCONDITIONS:
* ~~~~~{.c}
* postcondition(boost::num_vertices(graph) == vertices.size());
- * for (vertex : vertices)
+ * for (vertex : vertices)
* precondition(has_vertex(vertex.id));
* ~~~~~
*/
void add_vertices(std::vector< T_V > vertices);
public:
- //! @name boost wrappers
+ //! @name boost wrappers with original id
//@{
//! @brief get the out-degree of a vertex
@@ -466,6 +446,14 @@ class Pgr_base_graph {
}
return out_degree(get_V(vertex_id));
}
+ degree_size_type in_degree(int64_t vertex_id) const {
+ if (!has_vertex(vertex_id)) {
+ return 0;
+ }
+ return is_directed()?
+ in_degree(get_V(vertex_id))
+ : out_degree(get_V(vertex_id));
+ }
/*! @brief get the vertex descriptor of the vertex
@@ -502,12 +490,55 @@ class Pgr_base_graph {
return vertices_map.find(vid) != vertices_map.end();
}
- //! @brief True when vid is in the graph
+
+
+ //! @name to be or not to be
+ //@{
+
+ bool is_directed() const {return m_gType == DIRECTED;}
+ bool is_undirected() const {return m_gType == UNDIRECTED;}
+ bool is_source(V v_idx, E e_idx) const {return v_idx == source(e_idx);}
+ bool is_target(V v_idx, E e_idx) const {return v_idx == target(e_idx);}
+
+ //@}
+
+ //! @name boost wrappers with V
+ //@{
+
+
+ T_E& operator[](E e_idx) {return graph[e_idx];}
+ const T_E& operator[](E e_idx) const {return graph[e_idx];}
+
+ T_V& operator[](V v_idx) {return graph[v_idx];}
+ const T_V& operator[](V v_idx) const {return graph[v_idx];}
+
+ V source(E e_idx) const {return boost::source(e_idx, graph);}
+ V target(E e_idx) const {return boost::target(e_idx, graph);}
+ V adjacent(V v_idx, E e_idx) const {
+ pgassert(is_source(v_idx, e_idx) || is_target(v_idx, e_idx));
+ return is_source(v_idx, e_idx)?
+ target(e_idx) :
+ source(e_idx);
+ }
+
+
+ /*! @brief in degree of a vertex
+ *
+ * - when its undirected there is no "concept" of in degree
+ * - out degree is returned
+ * - on directed in degree of vertex is returned
+ */
degree_size_type in_degree(V &v) const {
- return boost::in_degree(v, graph);
+ return is_directed()?
+ boost::in_degree(v, graph) :
+ boost::out_degree(v, graph);
}
- //! @brief True when vid is in the graph
+ /*! @brief out degree of a vertex
+ *
+ * regardles of undirected or directed graph
+ * - out degree is returned
+ */
degree_size_type out_degree(V &v) const {
return boost::out_degree(v, graph);
}
@@ -586,9 +617,9 @@ class Pgr_base_graph {
out != out_end; ++out) {
log << ' '
<< g.graph[*out].id << "=("
- << g.graph[source(*out, g.graph)].id << ", "
- << g.graph[target(*out, g.graph)].id << ") = "
- << g.graph[*out].cost <<"@t";
+ << g[g.source(*out)].id << ", "
+ << g[g.target(*out)].id << ") = "
+ << g.graph[*out].cost <<"\t";
}
log << std::endl;
}
@@ -602,10 +633,6 @@ class Pgr_base_graph {
size_t num_vertices() const { return boost::num_vertices(graph);}
- T_V operator[](V v) const {
- return graph[v];
- }
-
void graph_add_edge(const T_E &edge);
@@ -631,10 +658,10 @@ Pgr_base_graph< G, T_V, T_E >::disconnect_edge(int64_t p_from, int64_t p_to) {
// store the edges that are going to be removed
for (boost::tie(out, out_end) = out_edges(g_from, graph);
out != out_end; ++out) {
- if (target(*out, graph) == g_to) {
+ if (target(*out) == g_to) {
d_edge.id = graph[*out].id;
- d_edge.source = graph[source(*out, graph)].id;
- d_edge.target = graph[target(*out, graph)].id;
+ d_edge.source = graph[source(*out)].id;
+ d_edge.target = graph[target(*out)].id;
d_edge.cost = graph[*out].cost;
removed_edges.push_back(d_edge);
}
@@ -664,8 +691,8 @@ Pgr_base_graph< G, T_V, T_E >::disconnect_out_going_edge(
out != out_end; ++out) {
if (graph[*out].id == edge_id) {
d_edge.id = graph[*out].id;
- d_edge.source = graph[source(*out, graph)].id;
- d_edge.target = graph[target(*out, graph)].id;
+ d_edge.source = graph[source(*out)].id;
+ d_edge.target = graph[target(*out)].id;
d_edge.cost = graph[*out].cost;
removed_edges.push_back(d_edge);
boost::remove_edge((*out), graph);
@@ -694,8 +721,8 @@ Pgr_base_graph< G, T_V, T_E >::disconnect_vertex(V vertex) {
for (boost::tie(out, out_end) = out_edges(vertex, graph);
out != out_end; ++out) {
d_edge.id = graph[*out].id;
- d_edge.source = graph[source(*out, graph)].id;
- d_edge.target = graph[target(*out, graph)].id;
+ d_edge.source = graph[source(*out)].id;
+ d_edge.target = graph[target(*out)].id;
d_edge.cost = graph[*out].cost;
removed_edges.push_back(d_edge);
}
@@ -706,8 +733,8 @@ Pgr_base_graph< G, T_V, T_E >::disconnect_vertex(V vertex) {
for (boost::tie(in, in_end) = in_edges(vertex, graph);
in != in_end; ++in) {
d_edge.id = graph[*in].id;
- d_edge.source = graph[source(*in, graph)].id;
- d_edge.target = graph[target(*in, graph)].id;
+ d_edge.source = graph[source(*in)].id;
+ d_edge.target = graph[target(*in)].id;
d_edge.cost = graph[*in].cost;
removed_edges.push_back(d_edge);
}
@@ -736,13 +763,13 @@ Pgr_base_graph< G, T_V, T_E >::get_edge_id(
E e;
EO_i out_i, out_end;
V v_source, v_target;
- double minCost = std::numeric_limits<double>::max();
+ double minCost = (std::numeric_limits<double>::max)();
int64_t minEdge = -1;
for (boost::tie(out_i, out_end) = boost::out_edges(from, graph);
out_i != out_end; ++out_i) {
e = *out_i;
- v_target = target(e, graph);
- v_source = source(e, graph);
+ v_target = target(e);
+ v_source = source(e);
if ((from == v_source) && (to == v_target)
&& (distance == graph[e].cost))
return graph[e].id;
@@ -807,7 +834,6 @@ Pgr_base_graph< G, T_V, T_E >::graph_add_edge(const T &edge) {
boost::add_edge(vm_s, vm_t, graph);
graph[e].cost = edge.cost;
graph[e].id = edge.id;
- graph[e].first = true;
}
if (edge.reverse_cost >= 0) {
@@ -816,7 +842,6 @@ Pgr_base_graph< G, T_V, T_E >::graph_add_edge(const T &edge) {
graph[e].cost = edge.reverse_cost;
graph[e].id = edge.id;
- graph[e].first = false;
}
}
@@ -841,3 +866,5 @@ Pgr_base_graph< G, T_V, T_E >::add_vertices(
} // namespace graph
} // namespace pgrouting
+
+#endif // SRC_COMMON_SRC_PGR_BASE_GRAPH_HPP_
diff --git a/src/common/src/pgr_types.h b/src/common/src/pgr_types.h
index 0615cd2..4ac8339 100644
--- a/src/common/src/pgr_types.h
+++ b/src/common/src/pgr_types.h
@@ -27,14 +27,28 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#pragma once
-#ifndef __cplusplus
+#ifdef __cplusplus
+
+#include <cstddef>
+
+#else // __cplusplus
// for bool
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-pedantic"
+#endif
+
#include <postgres.h>
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
// For NULL & size_t
#include <stdlib.h>
-#endif
+
+
+#endif // __cplusplus
// For int64_t etc
#include <stdint.h>
@@ -79,12 +93,12 @@ typedef struct {
/*
* This one is for processing
*/
-typedef struct {
+struct Path_t{
int64_t node;
int64_t edge;
double cost;
double agg_cost;
-} Path_t;
+};
/*
* This ones are for returning the info to postgres
@@ -189,6 +203,22 @@ struct {
expectType eType;
} Column_info_t;
+
+/**************************************************************************
+ * return type for contraction
+ * ***********************************************************************/
+typedef struct {
+ int64_t id;
+ char* type;
+ int64_t source;
+ int64_t target;
+ double cost;
+ int64_t *contracted_vertices;
+ int contracted_vertices_size;
+} pgr_contracted_blob;
+
+
+
enum graphType {UNDIRECTED = 0, DIRECTED};
/**************************************************************************
@@ -208,16 +238,16 @@ typedef struct {
} Customer_t;
/*
- OUT seq INTEGER, done in the .c code
- OUT vehicle_seq INTEGER,
- OUT vehicle_id INTEGER,
- OUT order_id BIGINT,
- OUT travelTime FLOAT,
- OUT arrivalTime FLOAT,
- OUT waitTime FLOAT,
- OUT serviceTime FLOAT,
- OUT departureTime FLOAT,
-*/
+ OUT seq INTEGER, done in the .c code
+ OUT vehicle_seq INTEGER,
+ OUT vehicle_id INTEGER,
+ OUT order_id BIGINT,
+ OUT travelTime FLOAT,
+ OUT arrivalTime FLOAT,
+ OUT waitTime FLOAT,
+ OUT serviceTime FLOAT,
+ OUT departureTime FLOAT,
+ */
typedef struct {
int vehicle_id;
diff --git a/src/common/src/points_input.c b/src/common/src/points_input.c
index 18b3f2d..e44edea 100644
--- a/src/common/src/points_input.c
+++ b/src/common/src/points_input.c
@@ -22,9 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#include "./postgres_connection.h"
#include "./debug_macro.h"
#include "./pgr_types.h"
-#include "./postgres_connection.h"
#include "./get_check_data.h"
#include "./points_input.h"
diff --git a/src/common/src/postgres_connection.c b/src/common/src/postgres_connection.c
index 9137bf3..d82e85f 100644
--- a/src/common/src/postgres_connection.c
+++ b/src/common/src/postgres_connection.c
@@ -22,14 +22,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include <postgres.h>
+#include "./postgres_connection.h"
+#include "utils/builtins.h"
+
#include "catalog/pg_type.h"
-#include "executor/spi.h"
+#include <string.h>
-// #define DEBUG
#include "./debug_macro.h"
-#include "./postgres_connection.h"
void
pgr_send_error(int errcode) {
@@ -49,19 +49,29 @@ pgr_send_error(int errcode) {
char*
-pgr_text2char(text *in) {
- char *out = palloc(VARSIZE(in));
+pgr_cstring2char(const char *inStr) {
+
+ if(!inStr) return NULL;
- memcpy(out, VARDATA(in), VARSIZE(in) - VARHDRSZ);
- out[VARSIZE(in) - VARHDRSZ] = '\0';
- return out;
+ char *outStr;
+ outStr = palloc(strlen(inStr));
+ if (!outStr) return NULL;
+
+ memcpy(outStr, inStr, strlen(inStr));
+
+ outStr[strlen(inStr)] = '\0';
+
+ return outStr;
}
+
// http://www.postgresql.org/docs/9.4/static/spi-spi-finish.html
void
pgr_SPI_finish(void) {
+#if 0
PGR_DBG("Disconnecting SPI");
+#endif
int code = SPI_OK_FINISH;
code = SPI_finish();
if (code != SPI_OK_FINISH) { // SPI_ERROR_UNCONNECTED
@@ -71,7 +81,9 @@ pgr_SPI_finish(void) {
void
pgr_SPI_connect(void) {
+#if 0
PGR_DBG("Connecting to SPI");
+#endif
int SPIcode;
SPIcode = SPI_connect();
if (SPIcode != SPI_OK_CONNECT) {
@@ -81,7 +93,9 @@ pgr_SPI_connect(void) {
SPIPlanPtr
pgr_SPI_prepare(char* sql) {
+#if 0
PGR_DBG("Preparing Plan");
+#endif
SPIPlanPtr SPIplan;
SPIplan = SPI_prepare(sql, 0, NULL);
if (SPIplan == NULL) {
@@ -92,7 +106,9 @@ pgr_SPI_prepare(char* sql) {
Portal
pgr_SPI_cursor_open(SPIPlanPtr SPIplan) {
+#if 0
PGR_DBG("Opening Portal");
+#endif
Portal SPIportal;
SPIportal = SPI_cursor_open(NULL, SPIplan, NULL, NULL, true);
if (SPIportal == NULL) {
diff --git a/src/common/src/postgres_connection.h b/src/common/src/postgres_connection.h
index 0e89b40..ffbad67 100644
--- a/src/common/src/postgres_connection.h
+++ b/src/common/src/postgres_connection.h
@@ -25,15 +25,53 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#define SRC_COMMON_SRC_POSTGRES_CONNECTION_H_
#pragma once
+
+
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-pedantic"
+#endif
+
#include <postgres.h>
+
+
+
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wsign-conversion"
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
+
#include "executor/spi.h"
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
+#pragma GCC diagnostic pop
+#endif
+
+#include "utils/builtins.h" // for text_to_cstring
+
+#if PGSQL_VERSION > 92
+#include "access/htup_details.h"
+#endif
+
+
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
+
+#include <funcapi.h>
+#include <fmgr.h>
+
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
void pgr_send_error(int errcode);
void pgr_SPI_finish(void);
void pgr_SPI_connect(void);
SPIPlanPtr pgr_SPI_prepare(char* sql);
Portal pgr_SPI_cursor_open(SPIPlanPtr SPIplan);
-char* pgr_text2char(text *in);
+char* pgr_cstring2char(const char *inStr);
#endif // SRC_COMMON_SRC_POSTGRES_CONNECTION_H_
diff --git a/src/common/src/restrictions_input.c b/src/common/src/restrictions_input.c
index a39a193..b4dde83 100644
--- a/src/common/src/restrictions_input.c
+++ b/src/common/src/restrictions_input.c
@@ -23,13 +23,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include <postgres.h>
-#include "executor/spi.h"
-
+#include "./postgres_connection.h"
#include "./debug_macro.h"
#include "./pgr_types.h"
#include "./time_msg.h"
-#include "./postgres_connection.h"
#include "./get_check_data.h"
#include "./restrictions_input.h"
@@ -143,6 +140,8 @@ pgr_get_restriction_data(
}
}
+ SPI_cursor_close(SPIportal);
+
if (total_tuples == 0) {
(*total_restrictions) = 0;
PGR_DBG("NO restrictions");
diff --git a/src/common/src/time_msg.c b/src/common/src/time_msg.c
index 81c10ce..cd0cac5 100644
--- a/src/common/src/time_msg.c
+++ b/src/common/src/time_msg.c
@@ -23,14 +23,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "./time_msg.h"
#include <time.h>
-#include <postgres.h>
+#include "./postgres_connection.h"
+
+#include "./time_msg.h"
void time_msg(char *msg, clock_t start_t, clock_t end_t) {
double elapsed_t = (double)(end_t - start_t) / CLOCKS_PER_SEC;
- elog(DEBUG1, "Elapsed time for %s: %lfsec = (%lf - %f) / CLOCKS_PER_SEC ",
+ elog(DEBUG2, "Elapsed time for %s:\n %lf sec = (%lf - %f) / CLOCKS_PER_SEC ",
msg,
elapsed_t,
(double) end_t,
diff --git a/src/common/src/xy_vertex.cpp b/src/common/src/xy_vertex.cpp
index 802b281..5fb0978 100644
--- a/src/common/src/xy_vertex.cpp
+++ b/src/common/src/xy_vertex.cpp
@@ -21,19 +21,12 @@
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+#include "./xy_vertex.h"
#include <vector>
#include <algorithm>
-#include "./xy_vertex.h"
#include "./pgr_types.h"
#include "./pgr_assert.h"
diff --git a/src/common/src/xy_vertex.h b/src/common/src/xy_vertex.h
index dccdf8a..34e4276 100644
--- a/src/common/src/xy_vertex.h
+++ b/src/common/src/xy_vertex.h
@@ -26,6 +26,13 @@
#define SRC_COMMON_SRC_XY_VERTEX_H_
#pragma once
+#ifdef Max
+#undef Max
+#endif
+#ifdef Min
+#undef Min
+#endif
+
#include <CGAL/Simple_cartesian.h>
#include <vector>
diff --git a/src/contraction/doc/contraction.rst b/src/contraction/doc/contraction-family.rst
similarity index 98%
rename from src/contraction/doc/contraction.rst
rename to src/contraction/doc/contraction-family.rst
index dca8433..707d718 100644
--- a/src/contraction/doc/contraction.rst
+++ b/src/contraction/doc/contraction-family.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -10,16 +10,21 @@
.. _contraction:
-Contraction
+Contraction - Family of functions
===============================================================================
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
:ref:`pgr_contractGraph`
+.. toctree::
+ :hidden:
+
+ pgr_contractGraph
+
Introduction
-------------
@@ -300,7 +305,7 @@ This implementation, cycles ``max_cycles`` times through ``operations_order`` .
<input>
do max_cycles times {
- for (operation in operations_order)
+ for (operation in operations_order)
{ do operation }
}
<output>
@@ -319,11 +324,11 @@ The original graph:
.. image:: images/undirected_sampledata_a.png
After doing a dead end contraction operation:
-
+
.. image:: images/undirected_sampledata_b.png
Doing a linear contraction operation to the graph above
-
+
.. image:: images/undirected_sampledata_c.png
@@ -419,16 +424,16 @@ Verify visually the updates.
:start-after: -- q9
:end-before: -- q10
-- vertices that belong to the contracted graph are the non contracted vertices
+- vertices that belong to the contracted graph are the non contracted vertices
.. literalinclude:: doc-contraction.queries
:start-after: -- q10
:end-before: -- case1
-.. rubric:: case 1: Both source and target belong to the contracted graph.
+.. rubric:: case 1: Both source and target belong to the contracted graph.
Inspecting the contracted graph above, vertex 3 and vertex 11 are part of the contracted graph. In the following query:
-
+
- vertices_in_graph hold the vertices that belong to the contracted graph.
- when selecting the edges, only edges that have the source and the target in that set are the edges belonging to the contracted graph, that is done in the WHERE clause.
@@ -474,7 +479,7 @@ The results, on the contracted graph match the results as if it was done on the
.. rubric:: case 4: Source belongs to the contracted graph, while target belongs to an vertex subgraph.
Inspecting the contracted graph above, vertex 3 is part of the contracted graph and vertex 7 belongs to the contracted subgraph of vertex 5. In the following query:
-
+
- expand7 holds the contracted vertices of vertex where vertex 7 belongs. (belongs to vertex 5)
- vertices_in_graph hold the vertices that belong to the contracted graph and the contracted vertices of vertex 5.
- when selecting the edges, only edges that have the source and the target in that set are the edges belonging to the contracted graph, that is done in the WHERE clause.
@@ -513,7 +518,7 @@ See Also
* http://www.cs.cmu.edu/afs/cs/academic/class/15210-f12/www/lectures/lecture16.pdf
* http://algo2.iti.kit.edu/documents/routeplanning/geisberger_dipl.pdf
-* The queries use :ref:`pgr_contractGraph` function and the :ref:`sampledata` network.
+* The queries use :ref:`pgr_contractGraph` function and the :ref:`sampledata` network.
.. rubric:: Indices and tables
diff --git a/src/contraction/doc/doc-contractGraph.queries b/src/contraction/doc/doc-contractGraph.queries
index 247c655..7b3757f 100644
--- a/src/contraction/doc/doc-contractGraph.queries
+++ b/src/contraction/doc/doc-contractGraph.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
-- q1
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
@@ -54,3 +58,5 @@ ARRAY[2]);
(4 rows)
-- q5
+ROLLBACK;
+ROLLBACK
diff --git a/src/contraction/doc/doc-contraction.queries b/src/contraction/doc/doc-contraction.queries
index 46cbaf3..ef82961 100644
--- a/src/contraction/doc/doc-contraction.queries
+++ b/src/contraction/doc/doc-contraction.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
-- q00
SELECT id, source, target, cost, reverse_cost FROM edge_table;
id | source | target | cost | reverse_cost
@@ -23,7 +27,7 @@ SELECT id, source, target, cost, reverse_cost FROM edge_table;
(18 rows)
-- q01
-SET client_min_messages TO error;
+SET client_min_messages TO ERROR;
SET
-- q1
ALTER TABLE edge_table ADD contracted_vertices BIGINT[];
@@ -34,6 +38,8 @@ ALTER TABLE edge_table ADD is_contracted BOOLEAN DEFAULT false;
ALTER TABLE
ALTER TABLE edge_table_vertices_pgr ADD is_contracted BOOLEAN DEFAULT false;
ALTER TABLE
+SET client_min_messages TO NOTICE;
+SET
-- q2
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
@@ -352,3 +358,5 @@ SELECT * FROM pgr_dijkstra($$
(5 rows)
-- end
+ROLLBACK;
+ROLLBACK
diff --git a/src/contraction/doc/pgr_contractGraph.rst b/src/contraction/doc/pgr_contractGraph.rst
index e511bec..284eedc 100644
--- a/src/contraction/doc/pgr_contractGraph.rst
+++ b/src/contraction/doc/pgr_contractGraph.rst
@@ -7,28 +7,25 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
- INSTRUCTIONS
- - if section consists of only one value then use this file as index.rst
- - change [...] (including the square braquets) to appropriate values
- - one file / function, may signatures of the same function go in the same file
-
.. _pgr_contractGraph:
pgr_contractGraph - Proposed
===============================================================================
-``pgr_contractGraph`` — Performs graph contraction and returns the contracted vertices and edges.
-
+``pgr_contractGraph`` — Performs graph contraction and returns the contracted vertices and edges.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.3.0
+
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
+
Synopsis
-------------
@@ -40,12 +37,12 @@ Characteristics
The main Characteristics are:
- Process is done only on edges with positive costs.
-
+
- There are two types of contraction methods used namely,
- Dead End Contraction
- Linear Contraction
-
+
- The values returned include the added edges and contracted vertices.
- The returned values are ordered as follows:
@@ -61,7 +58,7 @@ Signature Summary:
The pgr_contractGraph function has the following signatures:
.. code-block:: none
-
+
pgr_contractGraph(edges_sql, contraction_order)
pgr_contractGraph(edges_sql, contraction_order, max_cycles, forbidden_vertices, directed)
@@ -78,7 +75,7 @@ Minimal signature
.......................................
.. code-block:: none
-
+
pgr_contractGraph(edges_sql, contraction_order)
:Example: Making a dead end contraction and a linear contraction.
@@ -91,7 +88,7 @@ Complete signature
.......................................
.. code-block:: none
-
+
pgr_contractGraph(edges_sql, contraction_order, max_cycles, forbidden_vertices, directed)
:Example: Making a dead end contraction and a linear contraction and vertex 2 is forbidden from contraction
@@ -101,7 +98,7 @@ Complete signature
:end-before: -- q3
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
@@ -134,7 +131,7 @@ The function returns a single row. The columns of the row are:
Column Type Description
============================ ================= ===================================================================
**seq** ``INTEGER`` Sequential value starting from **1**.
-**type** ``TEXT`` Type of the `id`.
+**type** ``TEXT`` Type of the `id`.
- 'v' when `id` is an identifier of a vertex.
- 'e' when `id` is an identifier of an edge.
**id** ``BIGINT`` Identifier of:
@@ -142,7 +139,7 @@ Column Type Description
- The vertex belongs to the edge_table passed as a parameter.
* the edge when `type = 'e'`.
-
+
- The `id` is a decreasing sequence starting from **-1**.
- Representing a pseudo `id` as is not incorporated into the edge_table.
diff --git a/src/contraction/src/contractGraph.c b/src/contraction/src/contractGraph.c
index c2e51d6..5b16f8e 100644
--- a/src/contraction/src/contractGraph.c
+++ b/src/contraction/src/contractGraph.c
@@ -5,9 +5,9 @@ Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
-Function's developer:
+Function's developer:
Copyright (c) 2016 Rohith Reddy
-Mail:
+Mail:
------
@@ -27,164 +27,148 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
#include "utils/lsyscache.h"
-#include "utils/builtins.h"
-#include "fmgr.h"
#ifndef INT8ARRAYOID
#define INT8ARRAYOID 1016
#endif
-/*
- Uncomment when needed
-*/
-// #define DEBUG
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
+#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./structs.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./contractGraph_driver.h"
PGDLLEXPORT Datum contractGraph(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(contractGraph);
-/********************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(char* edges_sql,
- int64_t *forbidden_vertices,
- int64_t *contraction_order,
- size_t size_forbidden_vertices,
- size_t size_contraction_order,
+ ArrayType* order,
int num_cycles,
+ ArrayType* forbidden,
+
bool directed,
pgr_contracted_blob **result_tuples,
size_t *result_count) {
+ /*
+ * nothing to do
+ */
+ if (num_cycles < 1) return;
+
pgr_SPI_connect();
- PGR_DBG("num_cycles %d ", num_cycles);
- PGR_DBG("directed %d ", directed);
- PGR_DBG("edges_sql %s", edges_sql);
- PGR_DBG("Load data");
- pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
- // TODO (Rohith) decide if is a requirement (ERROR) or not
- if (num_cycles < 1) {
- // TODO (Rohith) if ERROR free edges_sql, and the arrays
- PGR_DBG("Required: at least one cycle\n");
- (*result_count) = 0;
- (*result_tuples) = NULL;
- pgr_SPI_finish();
- return;
- }
- for (size_t i = 0; i < size_contraction_order; ++i) {
- if (is_valid_contraction(contraction_order[i]) != 1) {
- PGR_DBG("Error: Enter a valid Contraction Type\n");
- (*result_count) = 0;
- (*result_tuples) = NULL;
- pgr_SPI_finish();
- return;
- }
- }
- pgr_get_edges(edges_sql, &edges, &total_tuples);
- PGR_DBG("finished Loading");
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+
+ size_t size_forbidden_vertices = 0;
+ int64_t* forbidden_vertices =
+ pgr_get_bigIntArray_allowEmpty(
+ &size_forbidden_vertices,
+ forbidden);
+ PGR_DBG("size_forbidden_vertices %ld", size_forbidden_vertices);
+
+ size_t size_contraction_order = 0;
+ int64_t* contraction_order =
+ pgr_get_bigIntArray(
+ &size_contraction_order,
+ order);
+ PGR_DBG("size_contraction_order %ld ", size_contraction_order);
+
+
+ size_t total_edges = 0;
+ pgr_edge_t* edges = NULL;
+ pgr_get_edges(edges_sql, &edges, &total_edges);
+ if (total_edges == 0) {
+ if (forbidden_vertices) pfree(forbidden_vertices);
+ if (contraction_order) pfree(contraction_order);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
- char *err_msg = NULL;
-#if 1
+
+ PGR_DBG("Starting timer");
+ clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
do_pgr_contractGraph(
- edges,
- total_tuples,
- forbidden_vertices,
- size_forbidden_vertices,
- contraction_order,
- size_contraction_order,
+ edges, total_edges,
+ forbidden_vertices, size_forbidden_vertices,
+ contraction_order, size_contraction_order,
num_cycles,
directed,
- result_tuples,
- result_count,
+ result_tuples, result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
-#endif
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
- free(err_msg);
- pfree(edges);
+
+ time_msg("processing pgr_contraction()", start_t, clock());
+
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (forbidden_vertices) pfree(forbidden_vertices);
+ if (contraction_order) pfree(contraction_order);
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
-PG_FUNCTION_INFO_V1(contractGraph);
PGDLLEXPORT Datum
contractGraph(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- size_t call_cntr;
- size_t max_calls;
TupleDesc tuple_desc;
+
+ /**********************************************************************/
pgr_contracted_blob *result_tuples = NULL;
size_t result_count = 0;
- int64_t* contraction_order;
- int64_t* forbidden_vertices;
- size_t size_contraction_order;
- size_t size_forbidden_vertices;
+ /**********************************************************************/
+
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
funcctx = SRF_FIRSTCALL_INIT();
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
/**********************************************************************/
- /* MODIFY AS NEEDED */
/*
- edges_sql TEXT,
- contraction_order BIGINT[],
- max_cycles integer DEFAULT 1,
- forbidden_vertices BIGINT[] DEFAULT ARRAY[]::BIGINT[],
- directed BOOLEAN DEFAULT true
- **********************************************************************/
-
- forbidden_vertices = (int64_t*)
- pgr_get_bigIntArray_allowEmpty(&size_forbidden_vertices , PG_GETARG_ARRAYTYPE_P(3));
- PGR_DBG("size_forbidden_vertices %ld", size_forbidden_vertices);
-
- contraction_order = (int64_t*)
- pgr_get_bigIntArray(&size_contraction_order, PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("size_contraction_order %ld ", size_contraction_order);
-#if 1
- PGR_DBG("Calling process");
+ edges_sql TEXT,
+ contraction_order BIGINT[],
+ max_cycles integer DEFAULT 1,
+ forbidden_vertices BIGINT[] DEFAULT ARRAY[]::BIGINT[],
+ directed BOOLEAN DEFAULT true,
+
+ **********************************************************************/
+
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- forbidden_vertices,
- contraction_order,
- size_forbidden_vertices,
- size_contraction_order,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
PG_GETARG_INT32(2),
+ PG_GETARG_ARRAYTYPE_P(3),
PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
-#endif
- PGR_DBG("Cleaning arrays");
- free(contraction_order);
- free(forbidden_vertices);
- PGR_DBG("Returned %d tuples\n", (int)result_count);
+
+
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -192,54 +176,72 @@ contractGraph(PG_FUNCTION_ARGS) {
funcctx->tuple_desc = tuple_desc;
MemoryContextSwitchTo(oldcontext);
}
+
funcctx = SRF_PERCALL_SETUP();
- call_cntr = funcctx->call_cntr;
- max_calls = funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_contracted_blob*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
- Datum *contracted_vertices_array;
char *nulls;
- ArrayType * arrayType;
int16 typlen;
- bool typbyval;
- char typalign;
- values =(Datum *)palloc(7 * sizeof(Datum));
- nulls = palloc(7 * sizeof(bool));
+ size_t call_cntr = funcctx->call_cntr;
+
+ /**********************************************************************/
+ size_t numb = 7;
+ values =(Datum *)palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 7; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- int contracted_vertices_size =
- (int)result_tuples[call_cntr].contracted_vertices_size;
- contracted_vertices_array = (Datum *)palloc(sizeof(Datum) *
+
+ size_t contracted_vertices_size =
+ (size_t)result_tuples[call_cntr].contracted_vertices_size;
+
+ Datum* contracted_vertices_array;
+ contracted_vertices_array = (Datum*) palloc(sizeof(Datum) *
(size_t)contracted_vertices_size);
+
for (i = 0; i < contracted_vertices_size; ++i) {
- PGR_DBG("Storing contracted vertex %ld", result_tuples[call_cntr].contracted_vertices[i]);
+ PGR_DBG("Storing contracted vertex %ld",
+ result_tuples[call_cntr].contracted_vertices[i]);
contracted_vertices_array[i] =
Int64GetDatum(result_tuples[call_cntr].contracted_vertices[i]);
}
+
+ bool typbyval;
+ char typalign;
get_typlenbyvalalign(INT8OID, &typlen, &typbyval, &typalign);
- arrayType = construct_array(contracted_vertices_array,
- contracted_vertices_size,
+ ArrayType* arrayType;
+ /*
+ * https://doxygen.postgresql.org/arrayfuncs_8c.html
+
+ ArrayType* construct_array(
+ Datum* elems,
+ int nelems,
+ Oid elmtype, int elmlen, bool elmbyval, char elmalign
+ )
+ */
+ arrayType = construct_array(
+ contracted_vertices_array,
+ (int)contracted_vertices_size,
INT8OID, typlen, typbyval, typalign);
+ /*
+ void TupleDescInitEntry(
+ TupleDesc desc,
+ AttrNumber attributeNumber,
+ const char * attributeName,
+ Oid oidtypeid,
+ int32 typmod,
+ int attdim
+ )
+ */
TupleDescInitEntry(tuple_desc, (AttrNumber) 4, "contracted_vertices",
INT8ARRAYOID, -1, 0);
-#if 1
- PGR_DBG("%ld | %s | %ld | %ld | %f | %d",
- result_tuples[call_cntr].id,
- result_tuples[call_cntr].type,
- result_tuples[call_cntr].source,
- result_tuples[call_cntr].target,
- result_tuples[call_cntr].cost,
- result_tuples[call_cntr].contracted_vertices_size);
-#endif
- PGR_DBG("Storing complete\n");
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = CStringGetTextDatum(result_tuples[call_cntr].type);
values[2] = Int64GetDatum(result_tuples[call_cntr].id);
@@ -247,21 +249,19 @@ contractGraph(PG_FUNCTION_ARGS) {
values[4] = Int64GetDatum(result_tuples[call_cntr].source);
values[5] = Int64GetDatum(result_tuples[call_cntr].target);
values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
- // values[7] = Int32GetDatum(result_tuples[call_cntr].contracted_vertices_size);
+
/*********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
- // cleaning up the contracted vertices array
- if (result_tuples[call_cntr].contracted_vertices) {
- free(result_tuples[call_cntr].contracted_vertices);
+
+ /*
+ * cleaning up the contracted vertices array
+ */
+ if (result_tuples[funcctx->call_cntr].contracted_vertices) {
+ pfree(result_tuples[funcctx->call_cntr].contracted_vertices);
}
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- PGR_DBG("Freeing values");
- if (result_tuples) free(result_tuples);
SRF_RETURN_DONE(funcctx);
}
- PGR_DBG("End of Function");
}
-
diff --git a/src/contraction/src/contractGraph_driver.cpp b/src/contraction/src/contractGraph_driver.cpp
index 74525f8..7bd11d4 100644
--- a/src/contraction/src/contractGraph_driver.cpp
+++ b/src/contraction/src/contractGraph_driver.cpp
@@ -5,9 +5,9 @@ Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
-Function's developer:
+Function's developer:
Copyright (c) 2016 Rohith Reddy
-Mail:
+Mail:
------
@@ -27,43 +27,150 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#include "./contractGraph_driver.h"
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-
-#ifdef unlink
-#undef unlink
-#endif
-
-#endif
-
-
-// #define DEBUG
#include <string.h>
#include <sstream>
#include <deque>
#include <vector>
-#include "./contractGraph_driver.h"
+#include "./pgr_contractionGraph.hpp"
#include "./pgr_contract.hpp"
+#include "./../../common/src/pgr_alloc.hpp"
#include "./../../common/src/pgr_types.h"
-#include "./structs.h"
-#include "./../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/identifiers.hpp"
+static
+bool
+is_valid_contraction(int64_t number) {
+ switch (number) {
+ case 1:
+ case 2:
+ return true;
+ break;
+ default:
+ return false;
+ break;
+ }
+}
+
+
+template <typename G>
+static void process_contraction(
+ G &graph,
+ const std::vector< pgr_edge_t > &edges,
+ const std::vector< int64_t > forbidden_vertices,
+ const std::vector< int64_t > contraction_order,
+ int64_t max_cycles,
+ Identifiers<int64_t> &remaining_vertices,
+ std::vector< pgrouting::CH_edge > &shortcut_edges,
+ std::ostringstream &log,
+ std::ostringstream &err) {
+ graph.insert_edges(edges);
+ /*
+ * this check does not ignore vertices ids that do not belong to the graph
+ */
+ log << "Checking for valid forbidden vertices\n";
+ for (const auto vertex : forbidden_vertices) {
+ if (!graph.has_vertex(vertex)) {
+ err << "Invalid forbidden vertex: " << vertex << "\n";
+ return;
+ }
+ }
+
+ Identifiers<typename G::V> forbid_vertices;
+ for (const auto &vertex : forbidden_vertices) {
+ if (graph.has_vertex(vertex)) {
+ forbid_vertices.insert(graph.get_V(vertex));
+ }
+ }
+
+#ifndef NDEBUG
+ log << "Before contraction\n";
+ graph.print_graph(log);
+#endif
+
+ /*
+ * Function call to get the contracted graph.
+ */
+ pgrouting::contraction::Pgr_contract<G> result(graph,
+ forbid_vertices,
+ contraction_order,
+ max_cycles, remaining_vertices,
+ shortcut_edges, log);
+
+#ifndef NDEBUG
+ log << "After contraction\n";
+ log << graph;
+ log << "Remaining Vertices:" << "\n";
+ for (const auto vertex : remaining_vertices) {
+ log << vertex << "\n";
+ }
+ log << "Added Edges:" << "\n";
+ for (const auto edge : shortcut_edges) {
+ log << edge << "\n";
+ }
+#endif
+}
+
+template <typename G>
+static
+void get_postgres_result(
+ G &graph,
+ const Identifiers<int64_t> remaining_vertices,
+ const std::vector< pgrouting::CH_edge > shortcut_edges,
+ pgr_contracted_blob **return_tuples) {
+ (*return_tuples) = pgr_alloc(
+ remaining_vertices.size() + shortcut_edges.size(),
+ (*return_tuples));
+
+ size_t sequence = 0;
+
+ for (auto id : remaining_vertices) {
+ int64_t* contracted_vertices = NULL;
+ auto ids = graph.get_contracted_vertices(id);
+ contracted_vertices = pgr_alloc(
+ ids.size(), contracted_vertices);
+ int count = 0;
+ for (const auto id : ids) {
+ contracted_vertices[count++] = id;
+ }
+ (*return_tuples)[sequence] = {id, const_cast<char*>("v"), -1, -1, -1.00,
+ contracted_vertices, count};
+
+ ++sequence;
+ }
+
+ for (auto edge : shortcut_edges) {
+ int64_t* contracted_vertices = NULL;
+ auto ids = graph.get_ids(edge.contracted_vertices());
+
+ contracted_vertices = pgr_alloc(
+ ids.size(), contracted_vertices);
+ int count = 0;
+ for (const auto id : ids) {
+ contracted_vertices[count++] = id;
+ }
+ (*return_tuples)[sequence] = {edge.id, const_cast<char*>("e"),
+ edge.source, edge.target, edge.cost,
+ contracted_vertices, count};
+
+ ++sequence;
+ }
+}
+
+
/************************************************************
- edges_sql TEXT,
- contraction_order BIGINT[],
- forbidden_vertices BIGINT[] DEFAULT ARRAY[]::BIGINT[],
- max_cycles integer DEFAULT 1,
- directed BOOLEAN DEFAULT true
+ edges_sql TEXT,
+ contraction_order BIGINT[],
+ forbidden_vertices BIGINT[] DEFAULT ARRAY[]::BIGINT[],
+ max_cycles integer DEFAULT 1,
+ directed BOOLEAN DEFAULT true
***********************************************************/
- void
- do_pgr_contractGraph(
+void
+do_pgr_contractGraph(
pgr_edge_t *data_edges,
size_t total_edges,
int64_t *forbidden_vertices,
@@ -74,204 +181,135 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
bool directed,
pgr_contracted_blob **return_tuples,
size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- std::ostringstream debug;
- graphType gType = directed? DIRECTED: UNDIRECTED;
- std::vector< pgr_edge_t > edges(data_edges, data_edges + total_edges);
- std::vector < pgrouting::contraction::Vertex > vertices(pgrouting::contraction::extract_vertices(edges));
- Identifiers<int64_t> remaining_vertices;
- std::vector< pgrouting::contraction::Edge > shortcut_edges;
-
- log << "Original Graph: \n" <<
+ char **log_msg,
+ char **notice_msg,
+ char **err_msg) {
+ std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
+ try {
+ pgassert(total_edges != 0);
+ pgassert(size_contraction_order != 0);
+ pgassert(max_cycles != 0);
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
+
+ std::ostringstream debug;
+ /*
+ * Converting to C++ structures
+ */
+ std::vector<pgr_edge_t> edges(data_edges, data_edges + total_edges);
+ std::vector<int64_t> forbid(
+ forbidden_vertices,
+ forbidden_vertices + size_forbidden_vertices);
+ std::vector<int64_t> ordering(
+ contraction_order,
+ contraction_order + size_contraction_order);
+
+ for (const auto o : ordering) {
+ if (!is_valid_contraction(o)) {
+ *err_msg = pgr_msg("Invalid Contraction Type found");
+ log << "Contraction type " << o << " not valid";
+ *log_msg = pgr_msg(log.str().c_str());
+ return;
+ }
+ }
+
+
+ /*
+ * Extracting vertices of the graph
+ */
+ Identifiers<int64_t> remaining_vertices;
+ std::vector< pgrouting::CH_edge > shortcut_edges;
+
+#ifndef NDEBUG
+ log << "Original Graph: \n" <<
std::setprecision(32);
- for (const auto edge : edges) {
- log << "id = " << edge.id
+ for (const auto edge : edges) {
+ log << "id = " << edge.id
<< "\tsource = " << edge.source
<< "\ttarget = " << edge.target
<< "\tcost = " << edge.cost
<< "\treverse_cost = " << edge.reverse_cost
<< ")\n";
- }
- log << "size_contraction_order " << size_contraction_order << "\n";
- log << "contraction_order: " <<"{ ";
- for (size_t i = 0; i < size_contraction_order; ++i) {
- log << contraction_order[i] << ", ";
- }
- log << " }\n";
+ }
+ log << "size_contraction_order " << ordering.size() << "\n";
+ log << "contraction_order: " <<"{ ";
+ for (const auto o : ordering) {
+ log << o << ", ";
+ }
+ log << " }\n";
- log << "size_forbidden_vertices " << size_forbidden_vertices << "\n";
- log << "forbidden_vertices" << "{ ";
- for (size_t i = 0; i < size_forbidden_vertices; ++i) {
- log << forbidden_vertices[i] << ", ";
- }
- log << " }\n";
- log << "max_cycles " << max_cycles << "\n";
- log << "directed " << gType << "\n";
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::CHDirectedGraph digraph(vertices, gType);
- digraph.graph_insert_data(data_edges, total_edges);
- log << "Checking for valid forbidden vertices\n";
- for (size_t i = 0; i < size_forbidden_vertices; ++i) {
- if (!digraph.has_vertex(forbidden_vertices[i])) {
- log << "Invalid forbidden vertex: " << forbidden_vertices[i] << "\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
- }
- Identifiers<int64_t> forbid_vertices(forbidden_vertices,
- size_forbidden_vertices);
- log << "Before contraction\n";
- digraph.print_graph(log);
- /* Function call to get the contracted graph. */
- pgr_contractGraph(digraph,
- forbid_vertices,
- contraction_order, size_contraction_order,
- max_cycles, remaining_vertices,
- shortcut_edges, debug);
-
- log << "After contraction\n";
- digraph.print_graph(log);
- log << debug.str().c_str() << "\n";
- (*return_tuples) = pgr_alloc(remaining_vertices.size()+shortcut_edges.size(), (*return_tuples));
- size_t sequence = 0;
- int i = 1;
- log << "Remaining Vertices:" << "\n";
- for (const auto vertex : remaining_vertices) {
- log << vertex << "\n";
- }
- char *type;
- for (auto id : remaining_vertices) {
- type = strdup("v");
- int64_t *contracted_vertices = NULL;
- int contracted_vertices_size = 0;
- digraph.get_contracted_vertices(&contracted_vertices,
- contracted_vertices_size, id);
- (*return_tuples)[sequence] = {i, id, type, -1, -1, -1.00,
- contracted_vertices, contracted_vertices_size};
- i++;
- ++sequence;
- }
- log << "Added Edges:" << "\n";
- for (const auto edge : shortcut_edges) {
- log << edge << "\n";
- }
- for (auto edge : shortcut_edges) {
- type = strdup("e");
- int64_t *contracted_vertices = NULL;
- int contracted_vertices_size = 0;
- digraph.get_ids(&contracted_vertices,
- contracted_vertices_size, edge.contracted_vertices());
- (*return_tuples)[sequence] = {i, edge.id, type,
- edge.source, edge.target, edge.cost,
- contracted_vertices, contracted_vertices_size};
- i++;
- ++sequence;
- }
-
- (*return_count) = sequence;
- log << "Returning from driver\n";
- } else {
- log << "Working with Undirected Graph\n";
-
- pgrouting::CHUndirectedGraph undigraph(vertices, gType);
- undigraph.graph_insert_data(data_edges, total_edges);
- log << "Checking for valid forbidden vertices\n";
- for (size_t i = 0; i < size_forbidden_vertices; ++i) {
- if (!undigraph.has_vertex(forbidden_vertices[i])) {
- log << "Invalid forbidden vertex: " << forbidden_vertices[i] << "\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
- }
- Identifiers<int64_t> forbid_vertices(forbidden_vertices,
- size_forbidden_vertices);
- log << "Before contraction\n";
- undigraph.print_graph(log);
- /* Function call to get the contracted graph. */
- pgr_contractGraph(undigraph,
- forbid_vertices,
- contraction_order, size_contraction_order,
- max_cycles, remaining_vertices,
- shortcut_edges, debug);
- log << debug.str().c_str() << "\n";
- log << "After contraction\n";
- undigraph.print_graph(log);
- log << "Size of remaining_vertices: " << remaining_vertices.size() << std::endl;
- (*return_tuples) = pgr_alloc(remaining_vertices.size()+shortcut_edges.size(), (*return_tuples));
- size_t sequence = 0;
- int i = 1;
- log << "Remaining Vertices:" << "\n";
- for (const auto vertex : remaining_vertices) {
- log << vertex << "\n";
- }
- char *type;
- for (auto id : remaining_vertices) {
- type = strdup("v");
- int64_t *contracted_vertices = NULL;
- int contracted_vertices_size = 0;
- undigraph.get_contracted_vertices(&contracted_vertices,
- contracted_vertices_size, id);
- (*return_tuples)[sequence] = {i, id, type, -1, -1, -1.00,
- contracted_vertices, contracted_vertices_size};
- i++;
- ++sequence;
- }
- log << "Added Edges:" << "\n";
- for (const auto edge : shortcut_edges) {
- log << edge << "\n";
- }
- for (auto edge : shortcut_edges) {
- type = strdup("e");
- int64_t *contracted_vertices = NULL;
- int contracted_vertices_size = 0;
- undigraph.get_ids(&contracted_vertices,
- contracted_vertices_size, edge.contracted_vertices());
- (*return_tuples)[sequence] = {i, edge.id, type,
- edge.source, edge.target, edge.cost,
- contracted_vertices, contracted_vertices_size};
- i++;
- ++sequence;
- }
- (*return_count) = sequence;
- }
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
+ log << "size_forbidden_vertices " << forbid.size() << "\n";
+ log << "forbidden_vertices" << "{ ";
+ for (const auto vertex : forbid) {
+ log << vertex << ", ";
+ }
+ log << " }\n";
+ log << "max_cycles " << max_cycles << "\n";
+ log << "directed " << directed << "\n";
#endif
- }
- catch (AssertFailedException &except) {
- log << except.what() << "\n";
- *err_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- log << except.what() << "\n";
- *err_msg = strdup(log.str().c_str());
- } catch(...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- }
- }
-
- int is_valid_contraction(int64_t number) {
- switch (number) {
- case 1:
- return 1;
- break;
- case 2:
- return 1;
- break;
- default:
- return -1;
- break;
- }
- }
+ graphType gType = directed? DIRECTED: UNDIRECTED;
+ if (directed) {
+ log << "Working with directed Graph\n";
+ pgrouting::CHDirectedGraph digraph(gType);
+
+ process_contraction(digraph, edges, forbid, ordering,
+ max_cycles,
+ remaining_vertices, shortcut_edges,
+ log, err);
+
+ get_postgres_result(
+ digraph,
+ remaining_vertices,
+ shortcut_edges,
+ return_tuples);
+ } else {
+ log << "Working with Undirected Graph\n";
+ pgrouting::CHUndirectedGraph undigraph(gType);
+ process_contraction(undigraph, edges, forbid, ordering,
+ max_cycles,
+ remaining_vertices, shortcut_edges,
+ log, err);
+ get_postgres_result(
+ undigraph,
+ remaining_vertices,
+ shortcut_edges,
+ return_tuples);
+ }
+ (*return_count) = remaining_vertices.size()+shortcut_edges.size();
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ }
+}
diff --git a/src/contraction/src/contractGraph_driver.h b/src/contraction/src/contractGraph_driver.h
index d6724af..21b09f7 100644
--- a/src/contraction/src/contractGraph_driver.h
+++ b/src/contraction/src/contractGraph_driver.h
@@ -28,9 +28,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#ifndef SRC_CONTRACTION_SRC_CONTRACTGRAPH_DRIVER_H_
#define SRC_CONTRACTION_SRC_CONTRACTGRAPH_DRIVER_H_
+#pragma once
#include "./../../common/src/pgr_types.h"
-#include "./structs.h"
#ifdef __cplusplus
extern "C" {
@@ -55,8 +55,10 @@ extern "C" {
bool directed,
pgr_contracted_blob **return_tuples,
size_t *return_count,
- char ** err_msg);
- int is_valid_contraction(int64_t number);
+ char **log_msg,
+ char **notice_msg,
+ char **err_msg);
+
#ifdef __cplusplus
}
diff --git a/src/contraction/src/pgr_contract.hpp b/src/contraction/src/pgr_contract.hpp
index 28512aa..5e008fb 100644
--- a/src/contraction/src/pgr_contract.hpp
+++ b/src/contraction/src/pgr_contract.hpp
@@ -27,418 +27,157 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_CONTRACTION_SRC_PGR_CONTRACT_HPP_
+#define SRC_CONTRACTION_SRC_PGR_CONTRACT_HPP_
#pragma once
-#include <stack>
-#include <iostream>
-#include <sstream>
+
#include <deque>
-#include <queue>
-#include <string>
-#include <utility>
-#include <functional>
#include <vector>
-#include <map>
+#include "../../common/src/pgr_assert.h"
#include "./pgr_contractionGraph.hpp"
-#include "./pgr_deadEndContraction.hpp"
#include "./pgr_linearContraction.hpp"
-#include "../../common/src/pgr_assert.h"
-
-
-template < class G > class Pgr_contract;
-
-template < class G >
-void perform_deadEnd(G &graph,
- Identifiers<int64_t> forbidden_vertices,
- std::ostringstream& debug) {
- pgrouting::Pgr_deadEndContraction<G> deadendContractor;
- debug << "Setting forbidden_vertices";
- deadendContractor.setForbiddenVertices(graph, forbidden_vertices
- , debug);
-
- deadendContractor.calculateVertices(graph, debug);
- try {
- deadendContractor.doContraction(graph, debug);
- }
- catch ( ... ) {
- debug << "Caught unknown exception!\n";
- }
-}
-
-#if 1
+#include "./pgr_deadEndContraction.hpp"
-template < class G >
-void perform_linear(G &graph,
- Identifiers<int64_t>& forbidden_vertices,
- std::ostringstream& debug) {
- std::ostringstream linear_debug;
- pgrouting::Pgr_linearContraction<G> linearContractor;
- linearContractor.setForbiddenVertices(graph, forbidden_vertices
- , linear_debug);
- linearContractor.calculateVertices(graph, linear_debug);
- try {
- linearContractor.doContraction(graph, linear_debug);
- }
- catch ( ... ) {
- linear_debug << "Caught unknown exception!\n";
- }
- debug << linear_debug.str().c_str() << "\n";
-}
-#endif
+namespace pgrouting {
+namespace contraction {
template < class G >
-void pgr_contractGraph(
- G &graph, Identifiers<int64_t> forbidden_vertices,
- int64_t *contraction_order,
- size_t size_contraction_order,
- int64_t max_cycles,
- Identifiers<int64_t> &remaining_vertices,
- std::vector<pgrouting::contraction::Edge> &shortcut_edges,
- std::ostringstream& debug) {
- std::deque<int64_t> contract_order;
- // push -1 to indicate the start of the queue
- contract_order.push_back(-1);
- for (size_t i = 0; i < size_contraction_order; ++i) {
- contract_order.push_back(contraction_order[i]);
- }
- for (int64_t i = 0; i < max_cycles; ++i) {
- int64_t front = contract_order.front();
- debug << "Starting cycle " << i+1 << "\n";
- contract_order.pop_front();
- contract_order.push_back(front);
- front = contract_order.front();
- while (front != -1) {
- switch (front) {
- case -1:
- debug << "Finished cycle " << i+1 << std::endl;
- break;
- default:
- debug << "contraction "<< front << " asked" << std::endl;
- if (front == 1) {
- debug << "Graph before dead end contraction" << std::endl;
- graph.print_graph(debug);
- debug << "Performing dead end contraction" << std::endl;
- perform_deadEnd(graph, forbidden_vertices, debug);
- debug << "Graph after dead end contraction" << std::endl;
- graph.print_graph(debug);
- } else if (front == 2) {
- debug << "Graph before linear contraction" << std::endl;
- graph.print_graph(debug);
- debug << "Performing linear contraction" << std::endl;
- perform_linear(graph, forbidden_vertices, debug);
- debug << "Graph after linear contraction" << std::endl;
- graph.print_graph(debug);
- }
- contract_order.pop_front();
- contract_order.push_back(front);
- front = contract_order.front();
- }
- }
- }
- graph.get_changed_vertices(remaining_vertices);
- debug << "Printing shortcuts\n";
- for (auto shortcut : graph.shortcuts) {
- debug << shortcut;
- shortcut_edges.push_back(shortcut);
- }
-}
-
-bool is_valid_contraction_number(int number) {
- switch (number) {
- case -2:
- return false;
- break;
- case -1:
- return false;
- break;
- case 0:
- return true;
- break;
- case 1:
- return true;
- break;
- default:
- return false;
- break;
- }
-}
-
-template < class G >
class Pgr_contract {
- public:
- /** @name Graph related types
- Type | boost meaning | pgRouting meaning
- :---------: | :-------------------- | :----------------------
- G | boost::adjacency_list | Graph
- V | vertex_descriptor | Think of it as local ID of a vertex
- E | edge_descriptor | Think of it as local ID of an edge
- V_i | vertex_iterator | To cycle the vertices of the Graph
- E_i | edge_iterator | To cycle the edges of the Graph
- EO_i | out_edge_iterator | To cycle the out going edges of a vertex
- EI_i | in_edge_iterator | To cycle the in coming edges of a vertex (only in bidirectional graphs)
- */
- // @{
typedef typename G::V V;
- typedef typename G::E E;
- typedef typename G::V_i V_i;
- typedef typename G::E_i E_i;
- typedef typename G::EO_i EO_i;
- #if 0
- typedef typename G::degree_to_V_i degree_to_V_i;
- #endif
- typedef typename G::EI_i EI_i;
- // @}
- // ! @name Framework related functions
- // @{
- /*! \brief Disconnects all incoming and outgoing edges from the vertex
- * Calls the disconnect_vertex function of the graph with assertions
- * @param graph
- * @param vertex_id
- */
- void disconnectVertex(G &graph, int64_t vertex_id);
- /*! \brief Stores the ids of those vertices forbidden from contraction in a set
- * Stores them in the set *forbidden_vertices*
- * @param forbidden_vertices
- * @param size_forbidden_vertices
- */
- void setForbiddenVertices(int64_t *forbidden_vertices,
- size_t size_forbidden_vertices);
-
- /*! \brief Stores ids of all the vertices of the graph in a set
- * Stores them in the set *all_vertices*
- * @param graph
- */
- void getAllVertices(G &graph);
-
- /*! \brief Stores the set of ids of those vertices which are not contracted
- * Stores them in the set *non_contracted*
- */
- void getNonContractedVertices();
-
- /*! \brief Returns a set of ids of all those vertices adjacent to vertex
- * with id *vertex_id*
- * Calls the disconnect_vertex function of the graph with assertions
- * @param graph
- * @param vertex_id
- */
- Identifiers<int64_t> getAdjacentVertices(G &graph, int64_t vertex_id);
- /*! \brief Writes the string form of identifier class to the *stream*
- * @param stream
- * @param identifiers
- */
- void print_identifiers(std::ostringstream& stream, Identifiers<int64_t> identifiers);
-
- /*! \brief Writes the string form of forbidden vertices to the *stream*
- * @param stream
- */
- void print_forbidden_vertices(std::ostringstream& stream);
-
- /*! \brief Writes the string form of all vertices to the *stream*
- * @param stream
- */
- void print_all_vertices(std::ostringstream& stream);
-
- /*! \brief Writes the string form of non contracted vertices to the *stream*
- * @param stream
- */
- void print_non_contracted_vertices(std::ostringstream& stream);
-
- // @}
- // ! @name Dead end contraction related functions
- // @{
-
- /*! \brief Checks whether a vertex is a dead end vertex
- * @param graph
- * @param vertex_id
- */
- bool is_dead_end(G &graph, int64_t vertex_id) const;
-
- /*! \brief Stores ids of dead end vertices of the graph in a set
- * Stores them in the set *dead_end_vertices*
- * @param graph
- */
- void getDeadEndSet(G &graph);
-
- /*! \brief Writes the string form of dead end vertices to the *stream*
- * @param stream
- */
- void print_dead_end_vertices(std::ostringstream& stream);
-
- // @}
-
- // bool is_connected(G &graph, V v) const;
- #if 0
- void contract_to_level(
- G &graph,
- int64_t level);
- #endif
- #if 0
- void dead_end_contraction(G &graph);
- void remove_2_degree_vertices(G &graph);
+ void perform_deadEnd(G &graph,
+ Identifiers<V> forbidden_vertices,
+ std::ostringstream& debug) {
+ Pgr_deadend<G> deadendContractor;
+ debug << "Setting forbidden_vertices";
+ deadendContractor.setForbiddenVertices(forbidden_vertices);
- void calculateDegrees(G &graph);
-
- void degreeMap(G &graph, std::ostringstream& dmap);
-
- void getGraphName(std::ostringstream& name, Contraction_type ctype);
-
- int64_t getGraph_string(G &graph, std::ostringstream& estring);
-
- void getRemovedE_string(G &graph, std::ostringstream& estring);
-
- void getRemovedV_string(std::ostringstream& vstring);
-
- void getPseudoE_string(std::ostringstream& pstring);
-
- typedef typename std::map<V, std::deque<Edge> > removed_V;
- typedef typename std::map<V, std::deque<Edge> >::iterator removed_V_i;
- typedef typename std::map<int64_t, std::pair<int64_t, int64_t> > psuedo_E;
- typedef typename std::map<int64_t, std::pair<int64_t, int64_t> >::iterator psuedo_E_i;
- typedef std::map< int, std::priority_queue<int64_t, std::vector<int64_t>, std::greater<int64_t> > > degree_to_V;
- // typedef std::map< int, std::vector<int64_t> > degree_to_V;
- typedef typename std::vector<V>::iterator Q_i;
- #endif
-
- private:
- int64_t last_edge_id;
- // ! Used for storing the ids of all vertices of the graph
- Identifiers<int64_t> all;
- // ! Used for storing the ids of dead end vertices of the graph
- Identifiers<int64_t> dead_end;
- // ! Used for storing the ids of vertices of the graph which are not contracted
- Identifiers<int64_t> non_contracted;
- // ! Used for storing the ids of vertices forbidden from contraction
- Identifiers<int64_t> forbidden;
- #if 0
- removed_V removedVertices;
- psuedo_E pseudoEdges;
- degree_to_V degree_to_V_map;
- #endif
- // set of dead_end_vertices;
- // Identifiers<V> dead_end_vertices;
-};
-
-
-/******************** IMPLEMENTATION ******************/
-template < class G >
-void Pgr_contract< G >::disconnectVertex(G &graph, int64_t vertex_id) {
- pgassert(graph.is_connected(vertex_id));
- pgassert(is_dead_end(vertex_id));
- graph.disconnect_vertex(vertex_id);
- pgassert(!graph.is_connected(vertex_id));
-}
-
-template < class G >
-void Pgr_contract< G >::setForbiddenVertices(int64_t *forbidden_vertices,
- size_t size_forbidden_vertices ) {
- for (int64_t i = 0; i < size_forbidden_vertices; ++i) {
- forbidden += forbidden_vertices[i];
+ deadendContractor.calculateVertices(graph);
+ try {
+ deadendContractor.doContraction(graph);
+ }
+ catch ( ... ) {
+ debug << "Caught unknown exception!\n";
}
-}
-
-template <class G>
-void Pgr_contract< G >::getAllVertices(G &graph) {
- // Identifiers<int64_t> dead_end_vertices;
- V_i vi;
- for (vi = vertices(graph.graph).first; vi != vertices(graph.graph).second; ++vi) {
- // debug << "Checking vertex " << graph.graph[(*vi)].id << '\n';
- all += graph.graph[(*vi)].id;
}
-}
-template <class G>
-void Pgr_contract< G >::getNonContractedVertices() {
- non_contracted = all - dead_end;
-}
-template < class G >
-Identifiers<int64_t> Pgr_contract< G >::getAdjacentVertices(G &graph, int64_t vertex_id) {
- EO_i out, out_end;
- EI_i in, in_end;
- V v;
- Identifiers<int64_t> adjacent_vertices_set;
- if (!graph.has_vertex(vertex_id)) {
- return adjacent_vertices_set;
- }
- v = graph.get_V(vertex_id);
- for (boost::tie(out, out_end) = out_edges(v, graph.graph);
- out != out_end; ++out) {
- adjacent_vertices_set += graph.graph[target(*out, graph.graph)].id;
+ void perform_linear(G &graph,
+ Identifiers<V>& forbidden_vertices,
+ std::ostringstream& debug) {
+ std::ostringstream linear_debug;
+ Pgr_linear<G> linearContractor;
+ linearContractor.setForbiddenVertices(forbidden_vertices);
+ linearContractor.calculateVertices(graph);
+ try {
+ linearContractor.doContraction(graph);
}
- for (boost::tie(in, in_end) = in_edges(v, graph.graph);
- in != in_end; ++in) {
- adjacent_vertices_set += graph.graph[source(*in, graph.graph)].id;
+ catch ( ... ) {
+ linear_debug << "Caught unknown exception!\n";
}
- return adjacent_vertices_set;
-}
-
-template <class G>
-void Pgr_contract< G >::print_identifiers(std::ostringstream& stream, Identifiers<int64_t> identifiers) {
- stream << identifiers << '\n';
-}
-
-template <class G>
-void Pgr_contract< G >::print_forbidden_vertices(std::ostringstream& stream) {
- stream << forbidden << '\n';
-}
-
-template <class G>
-void Pgr_contract< G >::print_all_vertices(std::ostringstream& stream) {
- stream << all << '\n';
-}
-
+ debug << linear_debug.str().c_str() << "\n";
+ }
-template <class G>
-void Pgr_contract< G >::print_non_contracted_vertices(std::ostringstream& stream) {
- stream << non_contracted << '\n';
-}
-template < class G >
-bool Pgr_contract< G >::is_dead_end(G &graph, int64_t vertex_id) const {
- // debug << "in_degree: " << graph.in_degree(vertex_id) << '\n';
- // debug << "out_degree: " << graph.out_degree(vertex_id) << '\n';
- V v;
- if (!graph.has_vertex(vertex_id)) {
- return false;
- }
- v = graph.get_V(vertex_id);
- if (graph.out_degree(v) == 1 && graph.in_degree(v) == 0) return true;
- if (graph.out_degree(v) == 0 && graph.in_degree(v) == 1) return true;
- if (graph.out_degree(v) == 1 && graph.in_degree(v) == 1) {
- int64_t incoming_edge_id, outgoing_edge_id;
- EO_i out, out_end;
- EI_i in, in_end;
- for (boost::tie(out, out_end) = out_edges(v, graph.graph);
- out != out_end; ++out) {
- outgoing_edge_id = graph.graph[*out].id;
+ public:
+ Pgr_contract(
+ G &graph,
+ Identifiers<V> forbidden_vertices,
+ std::vector<int64_t> contraction_order,
+ int64_t max_cycles,
+ Identifiers<int64_t> &remaining_vertices,
+ std::vector<pgrouting::CH_edge> &shortcut_edges,
+ std::ostringstream& debug) {
+ std::deque<int64_t> contract_order;
+ // push -1 to indicate the start of the queue
+ contract_order.push_back(-1);
+ contract_order.insert(
+ contract_order.end(),
+ contraction_order.begin(), contraction_order.end());
+ for (int64_t i = 0; i < max_cycles; ++i) {
+ int64_t front = contract_order.front();
+ debug << "Starting cycle " << i+1 << "\n";
+ contract_order.pop_front();
+ contract_order.push_back(front);
+ front = contract_order.front();
+ while (front != -1) {
+ switch (front) {
+ case -1:
+ debug << "Finished cycle " << i+1 << std::endl;
+ break;
+ default:
+ debug << "contraction "<< front
+ << " asked" << std::endl;
+ if (front == 1) {
+#ifndef NDEBUG
+ debug << "Graph before dead end contraction"
+ << std::endl;
+ graph.print_graph(debug);
+ debug << "Performing dead end contraction"
+ << std::endl;
+#endif
+ perform_deadEnd(graph, forbidden_vertices, debug);
+#ifndef NDEBUG
+ debug << "Graph after dead end contraction"
+ << std::endl;
+ graph.print_graph(debug);
+#endif
+ } else if (front == 2) {
+#ifndef NDEBUG
+ debug << "Graph before linear contraction"
+ << std::endl;
+ graph.print_graph(debug);
+ debug << "Performing linear contraction"
+ << std::endl;
+#endif
+ perform_linear(graph, forbidden_vertices, debug);
+#ifndef NDEBUG
+ debug << "Graph after linear contraction"
+ << std::endl;
+ graph.print_graph(debug);
+#endif
+ }
+ contract_order.pop_front();
+ contract_order.push_back(front);
+ front = contract_order.front();
+ }
+ }
}
- for (boost::tie(in, in_end) = in_edges(v, graph.graph);
- in != in_end; ++in) {
- incoming_edge_id = graph.graph[*in].id;
+ remaining_vertices = graph.get_changed_vertices();
+ debug << "Printing shortcuts\n";
+ for (auto shortcut : graph.shortcuts) {
+ debug << shortcut;
+ shortcut_edges.push_back(shortcut);
}
- if (incoming_edge_id == outgoing_edge_id)
- return true;
- return false;
}
- return false;
-}
-template <class G>
-void Pgr_contract< G >::getDeadEndSet(G &graph) {
- V_i vi;
- for (vi = vertices(graph.graph).first; vi != vertices(graph.graph).second; ++vi) {
- // debug << "Checking vertex " << graph.graph[(*vi)].id << '\n';
- if (is_dead_end(graph, graph.graph[(*vi)].id)) {
- // debug << "Adding " << graph.graph[(*vi)].id << "to dead end" << '\n';
- dead_end += graph.graph[(*vi)].id;
+#if 0
+ bool is_valid_contraction_number(int number) {
+ switch (number) {
+ case -2:
+ return false;
+ break;
+ case -1:
+ return false;
+ break;
+ case 0:
+ return true;
+ break;
+ case 1:
+ return true;
+ break;
+ default:
+ return false;
+ break;
}
}
-}
+#endif
+};
+
+} // namespace contraction
+} // namespace pgrouting
-template <class G>
-void Pgr_contract< G >::print_dead_end_vertices(std::ostringstream& stream) {
- stream << dead_end << '\n';
-}
+#endif // SRC_CONTRACTION_SRC_PGR_CONTRACT_HPP_
diff --git a/src/contraction/src/pgr_contractionGraph.hpp b/src/contraction/src/pgr_contractionGraph.hpp
index 4b607a8..3025f0e 100644
--- a/src/contraction/src/pgr_contractionGraph.hpp
+++ b/src/contraction/src/pgr_contractionGraph.hpp
@@ -5,9 +5,9 @@ Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
-Function's developer:
+Function's developer:
Copyright (c) 2016 Rohith Reddy
-Mail:
+Mail:
------
@@ -27,27 +27,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_CONTRACTION_SRC_PGR_CONTRACTIONGRAPH_HPP_
+#define SRC_CONTRACTION_SRC_PGR_CONTRACTIONGRAPH_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-
-#ifdef open
-#undef open
-#endif
-
-#ifdef unlink
-#undef unlink
-#endif
-
-#endif
-
#include <limits>
#include <algorithm>
#include <vector>
-#include <map>
+
#include "../../common/src/pgr_base_graph.hpp"
@@ -61,470 +49,252 @@ class Pgr_contractionGraph;
typedef graph::Pgr_contractionGraph <
boost::adjacency_list < boost::listS, boost::vecS,
boost::undirectedS,
- contraction::Vertex, contraction::Edge >,
- contraction::Vertex, contraction::Edge > CHUndirectedGraph;
+ CH_vertex, CH_edge >,
+ CH_vertex, CH_edge > CHUndirectedGraph;
typedef graph::Pgr_contractionGraph <
boost::adjacency_list < boost::listS, boost::vecS,
boost::bidirectionalS,
- contraction::Vertex, contraction::Edge >,
- contraction::Vertex, contraction::Edge > CHDirectedGraph;
+ CH_vertex, CH_edge >,
+ CH_vertex, CH_edge > CHDirectedGraph;
namespace graph {
template <class G, typename T_V, typename T_E>
class Pgr_contractionGraph : public Pgr_base_graph<G, T_V, T_E> {
public:
- typedef typename boost::graph_traits < G >::vertex_descriptor V;
- typedef typename boost::graph_traits < G >::edge_descriptor E;
- typedef typename boost::graph_traits < G >::vertex_iterator V_i;
- typedef typename boost::graph_traits < G >::edge_iterator E_i;
- typedef typename boost::graph_traits < G >::out_edge_iterator EO_i;
- typedef typename boost::graph_traits < G >::in_edge_iterator EI_i;
- typedef typename std::map< int64_t, V > id_to_V;
- typedef typename id_to_V::const_iterator LI;
- Identifiers<V> removed_vertices;
- std::vector< T_E > shortcuts;
- typedef typename boost::graph_traits < G >::degree_size_type degree_size_type;
-
- /*! @brief Binary function that accepts two elements , and returns a value convertible to bool.
- Used as a compare function to sort the edges in increasing order of edge id
- */
- static bool compareById(const T_E &edge1, const T_E &edge2) {
- return edge1.id > edge2.id;
- }
-
- /*!
- Prepares the _graph_ to be of type *gtype* with vertices as *vertices*
- */
- Pgr_contractionGraph< G , T_V, T_E >(const std::vector< T_V > &vertices, graphType gtype)
- : Pgr_base_graph< G , T_V, T_E >(vertices, gtype) {
- }
-
- /*!
- Prepares the _graph_ to be of type *gtype*
- */
- explicit Pgr_contractionGraph< G , T_V, T_E >(graphType gtype)
- : Pgr_base_graph< G , T_V, T_E >(gtype) {
- }
-
- // ! @name Insert data
- // @{
- /*! \brief Inserts *count* edges of type *T* into the graph
- *
- * Converts the edges to a std::vector<T> & calls the overloaded
- * twin function.
- *
- * @param edges
- * @param count
- */
- template < typename T >
- void graph_insert_data(const T *edges, int64_t count) {
- graph_insert_data(std::vector < T >(edges, edges + count));
- }
- /*! \brief Inserts vector of edges of type *T* into the graph
- *
- * @param edges
- */
- template < typename T >
- void graph_insert_data(const std::vector < T > &edges) {
- for (const auto edge : edges) {
- graph_add_edge(edge);
- }
- }
- // @}
-
- // ! @brief True when *v* is in the graph
- /*!
- True when
- - Indegree of *v* is 0 &
- - Outdegree of *v* is 0
- @param [in] v vertex_id
- */
- bool is_connected(int64_t v) const {
- if (this->in_degree(this->get_V(v)) == 0 && this->out_degree(this->get_V(v)) == 0) {
- return false;
- }
- return true;
- }
-
- // ! @brief get the vertex descriptor of the vertex adjacent to *v*
- /*!
- - Degree of *v* is 1
- @param [in] v vertex_descriptor
- @return V: The vertex descriptor of the vertex adjacent to *v*
- */
- V find_adjacent_vertex(V v) const {
- EO_i out, out_end;
- EI_i in, in_end;
- V out_vertex, in_vertex;
- out_vertex = in_vertex = -1;
- for (boost::tie(out, out_end) = out_edges(v, this->graph);
- out != out_end; ++out) {
- out_vertex = target(*out, this->graph);
- }
- for (boost::tie(in, in_end) = in_edges(v, this->graph);
- in != in_end; ++in) {
- in_vertex = source(*in, this->graph);
- }
- if (in_vertex == -1)
- return out_vertex;
- else if (out_vertex == -1)
- return in_vertex;
- else if (out_vertex == in_vertex)
- return in_vertex;
- return out_vertex;
- }
-
- /*! @brief get the vertex descriptors of adjacent vertices of *v*
- @param [in] v vertex_descriptor
- @return Identifiers<V>: The set of vertex descriptors adjacent to the given vertex *v*
- */
- Identifiers<V> find_adjacent_vertices(V v) const {
- EO_i out, out_end;
- EI_i in, in_end;
- Identifiers<V> adjacent_vertices;
- V out_vertex, in_vertex;
- out_vertex = in_vertex = -1;
- for (boost::tie(out, out_end) = out_edges(v, this->graph);
- out != out_end; ++out) {
- out_vertex = target(*out, this->graph);
- adjacent_vertices += out_vertex;
- }
- for (boost::tie(in, in_end) = in_edges(v, this->graph);
- in != in_end; ++in) {
- in_vertex = source(*in, this->graph);
- adjacent_vertices += in_vertex;
- }
- return adjacent_vertices;
- }
-
- T_V& operator[](V v) {
- return this->graph[v];
- }
-
- T_E& operator[](E e) {
- return this->graph[e];
- }
-
- /*! @brief get the user ids given the boost graph ids in string format
- @param [in] log string
- @param [in] boost_ids The set of boost graph ids of vertices
- */
- void get_ids(std::ostringstream &log,
- Identifiers<int64_t> boost_ids) {
- log << "{";
- for (auto id : boost_ids) {
- log << this->graph[id].id << ", ";
- }
- log << "}";
- }
-
- /*! @brief get the user ids given the boost graph ids in array format
- @param [in] boost_ids The set of boost graph ids of vertices
- @param [in] contracted_vertices The array of contracted vertices
- @param [in] contracted_vertices_size The size of the array of contracted vertices
- */
- void get_ids(int64_t **contracted_vertices,
- int &contracted_vertices_size,
- Identifiers<int64_t> boost_ids) {
- contracted_vertices_size = (int)boost_ids.size();
- (*contracted_vertices) = (int64_t*)malloc(sizeof(int64_t)*contracted_vertices_size);
- int64_t count = 0;
- for (auto id : boost_ids) {
- (*contracted_vertices)[count++] = this->graph[id].id;
- }
- }
-
- /*! @brief get the remaining vertices of the graph after contraction
- @param [in] remaining_vertices The vector of vertices remaining after contraction
- */
- void get_remaining_vertices(std::vector<T_V>& remaining_vertices) {
- for (auto vi = vertices(this->graph).first; vi != vertices(this->graph).second; ++vi) {
- if (!removed_vertices.has(*vi)) {
- remaining_vertices.push_back(this->graph[*vi]);
- }
- }
- }
-
- /*! @brief get the vertices of the graph with atleast one contracted vertex
- @param [in] remaining_vertices The set of vertices with atleast one contracted vertex
- */
- void get_changed_vertices(Identifiers<int64_t>& remaining_vertices) {
- // log << "remaining_vertices\n";
- for (auto vi = vertices(this->graph).first; vi != vertices(this->graph).second; ++vi) {
- if (!removed_vertices.has(*vi) && this->graph[*vi].has_contracted_vertices()) {
- remaining_vertices += this->graph[*vi].id;
- }
- }
- }
-
- /*! @brief get the edges of the graph that are added during contraction
- @param [in] shortcut_edges The vector of edges added during contraction
- */
- void get_shortcuts(std::vector<T_E>& shortcut_edges) {
- // log << "Getting shortcuts\n";
- for (auto shortcut : shortcuts) {
- // log << shortcut;
- shortcut_edges.push_back(shortcut);
- }
- std::sort(shortcut_edges.begin(), shortcut_edges.end(), compareById);
- }
-
- /*! @brief get the edge with minimum cost between two vertices
- @param [in] source vertex_descriptor of source vertex
- @param [in] destination vertex_descriptor of target vertex
- @return E: The edge descriptor of the edge with minimum cost
- */
- E get_min_cost_edge(V source, V destination) {
- E e;
- EO_i out_i, out_end;
- E min_cost_edge;
- double min_cost = std::numeric_limits<double>::max();
- for (boost::tie(out_i, out_end) = boost::out_edges(source, this->graph);
- out_i != out_end; ++out_i) {
- e = *out_i;
- if (target(e, this->graph) == destination) {
- if (this->graph[e].cost < min_cost) {
- min_cost = this->graph[e].cost;
- min_cost_edge = e;
- }
- }
- }
- // log << "Min cost edge from " << this->graph[source].id << " to " << this->graph[destination].id << std::endl;
- // log << this->graph[min_cost_edge];
- return min_cost_edge;
- }
-
- /*! @brief get the in-degree of a vertex from its neighbor
- @param [in] vertex vertex_descriptor of the given vertex
- @param [in] neighbor vertex_descriptor of neighbor
- @return degree_size_type: The in-degree of *vertex* from *neighbor*
- */
- degree_size_type in_degree_from_vertex(V vertex, V neighbor) {
- degree_size_type degree = 0;
- EI_i in_i, in_end;
- E e;
- for (boost::tie(in_i, in_end) = boost::in_edges(vertex, this->graph);
- in_i != in_end; ++in_i) {
- e = *in_i;
-
- if (source(e, this->graph) == neighbor) {
- degree++;
- }
- }
- return degree;
- }
- /*! @brief get the out-degree of a vertex to its neighbor
- @param [in] vertex vertex_descriptor of the given vertex
- @param [in] neighbor vertex_descriptor of neighbor
- @return degree_size_type: The out-degree of *vertex* to *neighbor*
- */
- degree_size_type out_degree_to_vertex(V vertex, V neighbor) {
- degree_size_type degree = 0;
- EO_i out_i, out_end;
- E e;
- for (boost::tie(out_i, out_end) = boost::out_edges(vertex, this->graph);
- out_i != out_end; ++out_i) {
- e = *out_i;
-
- if (target(e, this->graph) == neighbor) {
- degree++;
- }
- }
- return degree;
- }
-
- /*! @brief print the edges added during contraction
- */
- void print_shortcuts(std::ostringstream& log) {
- log << "Printing shortcuts\n";
- for (auto shortcut : shortcuts) {
- log << shortcut;
- }
- }
-
- /*! @brief print the graph with contracted vertices of
- all vertices and edges
- */
- void print_graph(std::ostringstream &log) {
- EO_i out, out_end;
- for (auto vi = vertices(this->graph).first; vi != vertices(this->graph).second; ++vi) {
- if ((*vi) >= this->m_num_vertices) break;
- log << this->graph[(*vi)].id << "(" << (*vi) << ")"
- << this->graph[(*vi)].contracted_vertices() << std::endl;
- log << " out_edges_of(" << this->graph[(*vi)].id << "):";
- for (boost::tie(out, out_end) = out_edges(*vi, this->graph);
- out != out_end; ++out) {
- log << ' ' << this->graph[*out].id << "=(" << this->graph[source(*out, this->graph)].id
- << ", " << this->graph[target(*out, this->graph)].id << ") = "
- << this->graph[*out].cost <<"\t";
- }
- log << std::endl;
- }
- }
-
- /*! @brief get the contracted vertex ids of a given vertex in string format
- @param [in] vid vertex_id
- @param [in] log stringstream which stores the vertex ids of contracted vertices of *vid*
- */
- void get_contracted_vertices(std::ostringstream &log, int64_t vid) {
- if (!this->has_vertex(vid)) return;
- V v = this->get_V(vid);
- log << "{";
- for (auto vertex : this->graph[v].contracted_vertices()) {
- log << this->graph[vertex].id << ", ";
- }
- log << "}";
- }
-
-
- /*! @brief get the contracted vertex ids of a given vertex in string format
- @param [in] vid vertex_id
- @param [in] contracted_vertices The array of contracted vertices of *vid*
- @param [in] contracted_vertices_size The size of the array of contracted vertices of *vid*
- */
- void get_contracted_vertices(int64_t **contracted_vertices,
- int &contracted_vertices_size, int64_t vid) {
- if (!this->has_vertex(vid)) return;
- V v = this->get_V(vid);
- contracted_vertices_size = (int)this->graph[v].contracted_vertices().size();
- (*contracted_vertices) = (int64_t*)malloc(sizeof(int64_t)*contracted_vertices_size);
- int64_t count = 0;
- for (auto vertex : this->graph[v].contracted_vertices()) {
- (*contracted_vertices)[count++] = this->graph[vertex].id;
- }
- }
-
- /*! @brief add the contracted vertices of an edge *e* to the vertex *v*
- @param [in] v vertex_descriptor
- @param [in] e Edge of type *T_E*
- */
- void add_contracted_edge_vertices(V v, T_E &e) {
- for (auto vid : e.contracted_vertices()) {
- this->graph[v].add_vertex_id(vid);
- }
- e.clear_contracted_vertices();
- }
-
- /*! \brief Inserts an edge of type *T* into the graph
- * @param edge
- */
- template < typename T>
- void graph_add_edge(const T &edge) {
- bool inserted;
- E e;
- if ((edge.cost < 0) && (edge.reverse_cost < 0))
- return;
- /*
- * true: for source
- * false: for target
- */
- auto vm_s = this->get_V(T_V(edge, true));
- auto vm_t = this->get_V(T_V(edge, false));
- pgassert(this->vertices_map.find(edge.source) != this->vertices_map.end());
- pgassert(this->vertices_map.find(edge.target) != this->vertices_map.end());
- if (edge.cost >= 0) {
- boost::tie(e, inserted) =
- boost::add_edge(vm_s, vm_t, this->graph);
- this->graph[e].cost = edge.cost;
- this->graph[e].id = edge.id;
- this->graph[e].first = true;
- this->graph[e].source = edge.source;
- this->graph[e].target = edge.target;
- }
- if (edge.reverse_cost >= 0) {
- boost::tie(e, inserted) =
- boost::add_edge(vm_t, vm_s, this->graph);
-
- this->graph[e].cost = edge.reverse_cost;
- this->graph[e].id = edge.id;
- this->graph[e].first = false;
- this->graph[e].target = edge.source;
- this->graph[e].source = edge.target;
- }
- }
-
- /*! \brief add edges(shortuct) to the graph during contraction
- @param [in] edge of type *T_E* is to be added
- @param [in] log string stream used for debugging purposes
- */
- void graph_add_shortcut(const T_E &edge, std::ostringstream& log) {
- bool inserted;
- E e;
- if (edge.cost < 0)
- return;
- /*
- * true: for source
- * false: for target
- */
- log << "Graph before adding shortcut\n";
- print_graph(log);
- pgassert(this->vertices_map.find(edge.source) != this->vertices_map.end());
- pgassert(this->vertices_map.find(edge.target) != this->vertices_map.end());
- auto vm_s = this->get_V(edge.source);
- auto vm_t = this->get_V(edge.target);
- log << "Adding edge between " << this->graph[vm_s] << ", "
- << this->graph[vm_t] << std::endl;
-
- if (edge.cost >= 0) {
- boost::tie(e, inserted) =
- boost::add_edge(vm_s, vm_t, this->graph);
- log << "inserted: " << inserted << std::endl;
- this->graph[e].cp_members(edge, log);
- log << this->graph[e];
- // this->graph[e].id = this->graph[e].eid;
- log << "Graph after adding shortcut\n";
- print_graph(log);
- T_E shortcut;
- shortcut.cp_members(edge, log);
- shortcuts.push_back(shortcut);
- }
- }
-
- /*! \brief Disconnects all incoming and outgoing edges from the vertex
- boost::graph doesn't recommend th to insert/remove vertices, so a vertex removal is
- simulated by disconnecting the vertex from the graph
- - No edge is disconnected if the vertices id's do not exist in the graph
- - All removed edges are stored for future reinsertion
- - All parallel edges are disconnected (automatically by boost)
- @param [in] vertex original vertex id of the starting point of the edge
- @param [in] log string stream used for debugging purposes
- */
- void disconnect_vertex(std::ostringstream &log, V vertex) {
- T_E d_edge;
- EO_i out, out_end;
- log << "Disconnecting current vertex " << this->graph[vertex].id << "\n";
- removed_vertices += vertex;
- // store the edges that are going to be removed
- for (boost::tie(out, out_end) = out_edges(vertex, this->graph);
- out != out_end; ++out) {
- d_edge.id = this->graph[*out].id;
- d_edge.source = this->graph[source(*out, this->graph)].id;
- d_edge.target = this->graph[target(*out, this->graph)].id;
- d_edge.cost = this->graph[*out].cost;
- this->removed_edges.push_back(d_edge);
- }
-
- // special case
- if (this->m_gType == DIRECTED) {
- EI_i in, in_end;
- for (boost::tie(in, in_end) = in_edges(vertex, this->graph);
- in != in_end; ++in) {
- d_edge.id = this->graph[*in].id;
- d_edge.source = this->graph[source(*in, this->graph)].id;
- d_edge.target = this->graph[target(*in, this->graph)].id;
- d_edge.cost = this->graph[*in].cost;
- this->removed_edges.push_back(d_edge);
- }
- }
- try {
- boost::clear_vertex(vertex, this->graph);
- }
- catch ( ... ) {
- log << "Caught unknown exception!\n";
- }
- }
+ typedef typename boost::graph_traits < G >::vertex_descriptor V;
+ typedef typename boost::graph_traits < G >::edge_descriptor E;
+ typedef typename boost::graph_traits < G >::vertex_iterator V_i;
+ typedef typename boost::graph_traits < G >::edge_iterator E_i;
+ typedef typename boost::graph_traits < G >::out_edge_iterator EO_i;
+ typedef typename boost::graph_traits < G >::in_edge_iterator EI_i;
+ typedef typename boost::graph_traits < G >::degree_size_type
+ degree_size_type;
+
+ Identifiers<V> removed_vertices;
+ std::vector<T_E> shortcuts;
+
+ /*! @brief Binary function that accepts two elements , and returns a value convertible to bool.
+ Used as a compare function to sort the edges in increasing order of edge id
+ */
+ static bool compareById(const T_E &edge1, const T_E &edge2) {
+ return edge1.id > edge2.id;
+ }
+
+ /*!
+ Prepares the _graph_ to be of type *gtype*
+ */
+ explicit Pgr_contractionGraph< G , T_V, T_E >(graphType gtype)
+ : Pgr_base_graph< G , T_V, T_E >(gtype) {
+ }
+
+ /*! @brief get the vertex descriptors of adjacent vertices of *v*
+ @param [in] v vertex_descriptor
+ @return Identifiers<V>: The set of vertex descriptors adjacent to the given vertex *v*
+ */
+ Identifiers<V> find_adjacent_vertices(V v) const {
+ EO_i out, out_end;
+ EI_i in, in_end;
+ Identifiers<V> adjacent_vertices;
+
+ for (boost::tie(out, out_end) = out_edges(v, this->graph);
+ out != out_end; ++out) {
+ adjacent_vertices += this->adjacent(v, *out);
+ }
+ for (boost::tie(in, in_end) = in_edges(v, this->graph);
+ in != in_end; ++in) {
+ adjacent_vertices += this->adjacent(v, *in);
+ }
+ return adjacent_vertices;
+ }
+
+
+ std::vector<int64_t> get_ids(
+ Identifiers<int64_t> boost_ids) const {
+ std::vector<int64_t> ids(boost_ids.size());
+ size_t count = 0;
+ for (auto id : boost_ids) {
+ ids[count++] = this->graph[id].id;
+ }
+ return ids;
+ }
+
+
+ /*! @brief vertices with at least one contracted vertex
+ *
+ @result The vids Identifiers with at least one contracted vertex
+ */
+ Identifiers<int64_t> get_changed_vertices() {
+ Identifiers<int64_t> vids;
+ for (auto vi = vertices(this->graph).first;
+ vi != vertices(this->graph).second;
+ ++vi) {
+ if (!removed_vertices.has(*vi)
+ && this->graph[*vi].has_contracted_vertices()) {
+ vids += this->graph[*vi].id;
+ }
+ }
+ return vids;
+ }
+
+
+ /*! @brief get the edge with minimum cost between two vertices
+ @param [in] source vertex_descriptor of source vertex
+ @param [in] destination vertex_descriptor of target vertex
+ @return E: The edge descriptor of the edge with minimum cost
+ */
+ E get_min_cost_edge(V source, V destination) {
+ EO_i out_i, out_end;
+ E min_cost_edge;
+ double min_cost = (std::numeric_limits<double>::max)();
+ for (boost::tie(out_i, out_end) =
+ boost::out_edges(source, this->graph);
+ out_i != out_end; ++out_i) {
+ auto e = *out_i;
+ if (this->target(e) == destination) {
+ if (this->graph[e].cost < min_cost) {
+ min_cost = this->graph[e].cost;
+ min_cost_edge = e;
+ }
+ }
+ }
+ return min_cost_edge;
+ }
+
+ /*! @brief The number of edges from @b neighbor to @b vertex
+
+ @param [in] vertex is the target of the edges
+ @param [in] neighbor is the source of the edges
+ @return degree_size_type: The in-degree of *vertex* from *neighbor*
+ */
+ degree_size_type in_degree_from_vertex(V vertex, V neighbor) {
+ return out_degree_to_vertex(neighbor, vertex);
+ }
+
+ /*! @brief The number of edges from @b vertex to @b neighbor
+
+ @param [in] vertex vertex_descriptor of the given vertex
+ @param [in] neighbor vertex_descriptor of neighbor
+ @return degree_size_type: The out-degree of *vertex* to *neighbor*
+ */
+ degree_size_type out_degree_to_vertex(V vertex, V neighbor) {
+ degree_size_type degree = 0;
+ EO_i out_i, out_end;
+ for (boost::tie(out_i, out_end) =
+ boost::out_edges(vertex, this->graph);
+ out_i != out_end; ++out_i) {
+ if (this->is_directed()
+ && (this->is_source(vertex, *out_i)
+ && this->is_target(neighbor, *out_i))) {
+ degree++;
+ } else if (this->is_undirected() &&
+ this->adjacent(vertex, *out_i) == neighbor) {
+ degree++;
+ }
+ }
+ return degree;
+ }
+
+
+ /*! @brief print the graph with contracted vertices of
+ all vertices and edges
+ */
+ void print_graph(std::ostringstream &log) {
+ EO_i out, out_end;
+ for (auto vi = vertices(this->graph).first;
+ vi != vertices(this->graph).second;
+ ++vi) {
+ if ((*vi) >= this->m_num_vertices) break;
+ log << this->graph[*vi].id << "(" << (*vi) << ")"
+ << this->graph[*vi].contracted_vertices() << std::endl;
+ log << " out_edges_of(" << this->graph[*vi].id << "):";
+ for (boost::tie(out, out_end) = out_edges(*vi, this->graph);
+ out != out_end; ++out) {
+ log << ' ' << this->graph[*out].id
+ << "=(" << this->graph[this->source(*out)].id
+ << ", " << this->graph[this->target(*out)].id << ") = "
+ << this->graph[*out].cost <<"\t";
+ }
+ log << std::endl;
+ }
+ }
+
+
+
+ /*! @brief get the contracted vertex ids of a given vertex in array format
+ @param [in] vid vertex_id
+
+ @returns ids of contracted_vertices
+ */
+ std::vector<int64_t> get_contracted_vertices(int64_t vid) {
+ if (!this->has_vertex(vid)) return std::vector<int64_t>();
+ auto v = this->get_V(vid);
+ std::vector<int64_t> ids(this->graph[v].contracted_vertices().size());
+
+ size_t count = 0;
+ for (auto idx : this->graph[v].contracted_vertices()) {
+ ids[count++] = this->graph[idx].id;
+ }
+ return ids;
+ }
+
+
+
+
+
+ /*! @brief add the contracted vertices of an edge *e* to the vertex *v*
+ @param [in] v vertex_descriptor
+ @param [in] e Edge of type *T_E*
+ */
+ void add_contracted_edge_vertices(V v, T_E &e) {
+ for (auto vid : e.contracted_vertices()) {
+ this->graph[v].add_vertex_id(vid);
+ }
+ e.clear_contracted_vertices();
+ }
+
+
+ /*! @brief add edges(shortuct) to the graph during contraction
+
+ a -> b -> c
+
+ a -> c
+
+ edge (a, c) is a new edge e
+ e.contracted_vertices = b + b.contracted vertices
+ b is "removed" disconnected from the graph
+ - by removing all edges to/from b
+
+
+ @param [in] edge of type *T_E* is to be added
+ */
+
+ void add_shortcut(const T_E &edge) {
+ std::ostringstream log;
+ bool inserted;
+ E e;
+ if (edge.cost < 0)
+ return;
+
+ pgassert(this->vertices_map.find(edge.source)
+ != this->vertices_map.end());
+ pgassert(this->vertices_map.find(edge.target)
+ != this->vertices_map.end());
+
+ auto vm_s = this->get_V(edge.source);
+ auto vm_t = this->get_V(edge.target);
+
+ boost::tie(e, inserted) =
+ boost::add_edge(vm_s, vm_t, this->graph);
+
+ this->graph[e].cp_members(edge);
+
+ shortcuts.push_back(edge);
+ }
};
+
} // namespace graph
} // namespace pgrouting
+
+#endif // SRC_CONTRACTION_SRC_PGR_CONTRACTIONGRAPH_HPP_
diff --git a/src/contraction/src/pgr_deadEndContraction.hpp b/src/contraction/src/pgr_deadEndContraction.hpp
index c1aac90..a2b2ecf 100644
--- a/src/contraction/src/pgr_deadEndContraction.hpp
+++ b/src/contraction/src/pgr_deadEndContraction.hpp
@@ -1,5 +1,5 @@
/*PGR-GNU*****************************************************************
-File: pgr_contractionGraph.c
+File: pgr_deadend.hpp
Generated with Template by:
Copyright (c) 2015 pgRouting developers
@@ -26,204 +26,383 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+#ifndef SRC_CONTRACTION_SRC_PGR_DEADENDCONTRACTION_HPP_
+#define SRC_CONTRACTION_SRC_PGR_DEADENDCONTRACTION_HPP_
#pragma once
-#ifdef __MINGW32__
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+
#include <queue>
#include <functional>
#include <vector>
#include "../../common/src/identifiers.hpp"
+
namespace pgrouting {
+namespace contraction {
+
template < class G >
-class Pgr_deadEndContraction {
+class Pgr_deadend {
+ private:
+ typedef typename G::V V;
+ typedef typename G::E E;
+
public:
- typedef typename G::V V;
- typedef typename G::E E;
- typedef typename G::V_i V_i;
- typedef typename G::E_i E_i;
- typedef typename G::EO_i EO_i;
- typedef typename G::EI_i EI_i;
- void setForbiddenVertices(G &graph,
- Identifiers<int64_t> forbidden_vertices,
- std::ostringstream& debug);
- void setForbiddenVertices(G &graph, int64_t *forbidden_vertices,
- size_t size_forbidden_vertices,
- std::ostringstream& debug);
- void calculateVertices(G &graph,
- std::ostringstream& debug);
- bool is_dead_end(G &graph, V v,
- std::ostringstream& debug);
- void add_if_dead_end(G &graph, V v,
- std::ostringstream& debug);
- void doContraction(G &graph,
- std::ostringstream& debug);
+ void setForbiddenVertices(
+ Identifiers<V> forbidden_vertices);
+
+ void calculateVertices(G &graph);
+ /// @brief true when \b v is a dead end
+ bool is_dead_end(G &graph, V v);
+ void add_if_dead_end(G &graph, V v);
+ void doContraction(G &graph);
private:
- Identifiers<V> deadendVertices;
- Identifiers<V> forbiddenVertices;
+ Identifiers<V> deadendVertices;
+ Identifiers<V> forbiddenVertices;
+ std::ostringstream debug;
};
- template < class G >
- void Pgr_deadEndContraction< G >::setForbiddenVertices(G &graph,
- Identifiers<int64_t> forbidden_vertices,
- std::ostringstream& debug) {
- debug << "Setting forbidden vertices\n";
- for (auto forbiddenVertex : forbidden_vertices) {
- forbiddenVertices += graph.get_V(forbiddenVertex);
- }
- }
+/******* IMPLEMENTATION ************/
+template < class G >
+void
+Pgr_deadend< G >::setForbiddenVertices(
+ Identifiers<V> forbidden_vertices) {
+#ifndef NDEBUG
+ debug << "Setting forbidden vertices\n";
+#endif
+ forbiddenVertices = forbidden_vertices;
+}
- template < class G >
- void Pgr_deadEndContraction< G >::setForbiddenVertices(G &graph,
- int64_t *forbidden_vertices,
- size_t size_forbidden_vertices,
- std::ostringstream& debug) {
- debug << "Setting forbidden vertices\n";
- for (int64_t i = 0; i < size_forbidden_vertices; ++i) {
- forbiddenVertices += graph.get_V(forbidden_vertices[i]);
- }
+
+template < class G >
+void Pgr_deadend<G>::calculateVertices(G &graph) {
+ debug << "Calculating vertices\n";
+
+ for (auto vi = vertices(graph.graph).first;
+ vi != vertices(graph.graph).second;
+ ++vi) {
+#ifndef NDEBUG
+ debug << "Checking vertex " << graph[(*vi)].id << '\n';
+#endif
+ if (is_dead_end(graph, *vi)) {
+#ifndef NDEBUG
+ debug << "Adding " << graph[(*vi)].id << " to dead end" << '\n';
+#endif
+ deadendVertices += (*vi);
}
+ }
+ deadendVertices -= forbiddenVertices;
+}
- template < class G >
- void Pgr_deadEndContraction<G>::calculateVertices(G &graph,
- std::ostringstream& debug) {
- debug << "Calculating vertices\n";
- V_i vi;
- for (vi = vertices(graph.graph).first; vi != vertices(graph.graph).second; ++vi) {
- debug << "Checking vertex " << graph.graph[(*vi)].id << '\n';
- if (is_dead_end(graph, *vi, debug)) {
- debug << "Adding " << graph.graph[(*vi)].id << " to dead end" << '\n';
- deadendVertices += (*vi);
- }
- }
- deadendVertices -= forbiddenVertices;
+template < class G >
+bool Pgr_deadend<G>::is_dead_end(G &graph, V v) {
+#ifndef NDEBUG
+ debug << "Is dead end: " << graph.graph[v].id << "?\n";
+#endif
+
+ if (forbiddenVertices.has(v)) {
+ /**
+ * - fobbiden_vertices
+ * - Not considered as dead end
+ */
+
+ return false;
+ }
+
+ if (graph.is_undirected()) {
+ /**
+ * undirected:
+ * ----------
+ * - There is only one adjacent vertex:
+ * - All adjcent edges are from a single vertex
+ *
+
+ @dot
+ graph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ v -- a0;
+ v -- a0;
+ }
+ @enddot
+
+ */
+ Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(v);
+ if (adjacent_vertices.size() == 1) {
+ return true;
}
+ return false;
+ }
- template < class G >
- bool Pgr_deadEndContraction<G>::is_dead_end(G &graph, V v,
- std::ostringstream& debug) {
- debug << "Is dead end: " << graph.graph[v].id << "?\n";
- // debug << "in_degree: " << graph.in_degree(vertex_id) << '\n';
- // debug << "out_degree: " << graph.out_degree(vertex_id) << '\n';
- // if(graph.out_degree(v) == 1 && graph.in_degree(v) == 0) return true;
- // if(graph.out_degree(v) == 0 && graph.in_degree(v) == 1) return true;
- if (graph.m_gType == UNDIRECTED) {
- /* the condition in case of undirected graph
- is all incoming edges come from a single vertex
- */
- debug << "undirected\nAdjacent Vertices\n";
- Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(v);
- debug << adjacent_vertices;
- // only one adjacent vertex
- if (adjacent_vertices.size() == 1)
- return true;
- else
- return false;
- } else {
- if (graph.out_degree(v) == 1 && graph.in_degree(v) == 1) {
- int64_t incoming_edge_id = -1;
- int64_t outgoing_edge_id = -2;
- EO_i out, out_end;
- EI_i in, in_end;
- for (boost::tie(out, out_end) = out_edges(v, graph.graph);
- out != out_end; ++out) {
- outgoing_edge_id = graph.graph[*out].id;
- }
- for (boost::tie(in, in_end) = in_edges(v, graph.graph);
- in != in_end; ++in) {
- incoming_edge_id = graph.graph[*in].id;
- }
- if (incoming_edge_id == outgoing_edge_id) {
- debug << "Yes\n";
- return true;
- }
- debug << "No\n";
- return false;
- }
- // additional cases
- if (graph.out_degree(v) == 0 && graph.in_degree(v) > 0) {
- return true;
- }
- /* dead start
- if (graph.in_degree(v) == 0 && graph.out_degree(v) > 0) {
- return true;
- }
- */
- debug << "No\n";
- return false;
+ pgassert(graph.is_directed());
+ /*
+ * directed graph
+ *
+ * is dead end when:
+ * (2) one incoming edge, no outgoing edge (dead end)
+ * (3) one outgoing edge, one incoming edge
+ * and both are from/to the same vertex
+ * (4) many incoming edges
+ * and no outgoing edges
+ * (5) many outgoing edges TODO but all go to same vertex
+ * and no incoming edges
+ *
+ * NOT dead end when:
+ * (3) one outgoing edge, one incoming edge
+ * and both from/to different vertex
+ *
+ * note: when contracting case 4 & 5, the vertex has to be
+ * part of all the adjacent vertices
+ */
+
+ if (graph.in_degree(v) == 0 && graph.out_degree(v) == 1) {
+ /**
+ * directed
+ * ----------
+ * case (1): (dead start)
+ * - one outgoing edge,
+ * - no incoming edge
+ *
+
+ @dot
+ digraph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ v -> a0;
+ }
+ @enddot
+
+ */
+ return true;
+ }
+
+ if (graph.in_degree(v) == 1 && graph.out_degree(v) == 0) {
+ /**
+ * case (2): (dead end)
+ * - no outgoing edge,
+ * - one incoming edge
+ *
+
+ @dot
+ digraph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ a0 -> v;
+ }
+ @enddot
+
+ */
+ return true;
+ }
+
+ if (graph.out_degree(v) == 1 && graph.in_degree(v) == 1) {
+ /**
+ * case (3):
+ * - one outgoing edge,
+ * - one incoming edge
+ * - one adjacent vertex
+ *
+
+ @dot
+ digraph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ v -> a0;
+ a0 -> v;
+ }
+ @enddot
+
+ */
+ auto out_e = *(out_edges(v, graph.graph).first);
+ auto in_e = *(in_edges(v, graph.graph).first);
+
+ auto out_v = graph.is_source(v, out_e) ?
+ graph.target(out_e) : graph.source(out_e);
+ auto in_v = graph.is_source(v, in_e) ?
+ graph.target(in_e) : graph.source(in_e);
+
+ if (out_v == in_v) {
+ return true;
}
return false;
+ }
+
+ if (graph.in_degree(v) > 0 && graph.out_degree(v) == 0) {
+ /**
+ * case (4):
+ * - no outgoing edge,
+ * - many incoming edges
+ *
+ *
+
+ @dot
+ digraph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ a0 -> v;
+ a1 -> v;
+ a0 -> v;
+ }
+ @enddot
+
+ */
+ return true;
+ }
+
+ if (graph.in_degree(v) > 0 && graph.out_degree(v) > 0) {
+ /**
+ * case (5):
+ * - many outgoing edge,
+ * - many incoming edges
+ * - All adjacent edges are from a single vertex
+ *
+ *
+
+ @dot
+ digraph G {
+ graph [rankdir=LR];
+ subgraph cluster0 {
+ node [shape=point,height=0.2,style=filled,color=black];
+ style=filled;
+ color=lightgrey;
+ a0; a1; a2;
+ label = "rest of graph";
+ }
+ v [color=green];
+ a0 -> v;
+ a0 -> v;
+ v -> a0;
+ v -> a0;
+ }
+ @enddot
+
+ */
+
+ auto adjacent_vertices = graph.find_adjacent_vertices(v);
+ if (adjacent_vertices.size() == 1) {
+ return true;
}
+ }
+ debug << "Is Not Dead End\n";
+ return false;
+}
- template < class G >
- void Pgr_deadEndContraction<G>::add_if_dead_end(G &graph, V v,
- std::ostringstream& debug) {
- debug << "Adding if dead end\n";
- if (is_dead_end(graph, v, debug)) {
- deadendVertices += v;
- } else {
- debug << "Not dead end\n";
- }
+template < class G >
+void
+Pgr_deadend<G>::add_if_dead_end(G &graph, V v) {
+ if (is_dead_end(graph, v)) {
+ deadendVertices += v;
+ }
+}
+
+template < class G >
+void
+Pgr_deadend<G>::doContraction(G &graph) {
+#ifndef NDEBUG
+ debug << "Performing contraction\n";
+#endif
+ std::priority_queue<V, std::vector<V>, std::greater<V> > deadendPriority;
+
+ for (V deadendVertex : deadendVertices) {
+ deadendPriority.push(deadendVertex);
+ }
+
+ while (!deadendPriority.empty()) {
+ V current_vertex = deadendPriority.top();
+ deadendPriority.pop();
+
+ if (!is_dead_end(graph, current_vertex)) {
+ continue;
}
- template < class G >
- void Pgr_deadEndContraction<G>::doContraction(G &graph,
- std::ostringstream& debug) {
- debug << "Performing contraction\n";
- std::priority_queue<V, std::vector<V>, std::greater<V> > deadendPriority;
- for (V deadendVertex : deadendVertices) {
- deadendPriority.push(deadendVertex);
+ Identifiers<V> adjacent_vertices =
+ graph.find_adjacent_vertices(current_vertex);
+
+ for (auto adjacent_vertex : adjacent_vertices) {
+#ifndef NDEBUG
+ debug << "Contracting current vertex "
+ << graph[current_vertex].id << std::endl;
+#endif
+ graph[adjacent_vertex].add_contracted_vertex(
+ graph[current_vertex], current_vertex);
+
+#ifndef NDEBUG
+ debug << "Adding contracted vertices of the edge\n";
+#endif
+ auto o_edges = out_edges(current_vertex, graph.graph);
+ for (auto out = o_edges.first;
+ out != o_edges.second;
+ ++out) {
+ debug << graph.graph[*out];
+ graph.add_contracted_edge_vertices(
+ adjacent_vertex, graph[*out]);
+ }
+ auto i_edges = in_edges(current_vertex, graph.graph);
+ for (auto in = i_edges.first;
+ in != i_edges.second; ++in) {
+#ifndef NDEBUG
+ debug << graph.graph[*in];
+#endif
+ graph.add_contracted_edge_vertices(adjacent_vertex, graph[*in]);
}
- // debug << "Dead end vertices" << std::endl;
- // debug << deadendVertices;
- while (!deadendPriority.empty()) {
- V current_vertex = deadendPriority.top();
- deadendPriority.pop();
- if (!is_dead_end(graph, current_vertex, debug)) {
- continue;
- }
- Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(current_vertex);
- for (auto adjacent_vertex : adjacent_vertices) {
- // debug << "Current Vertex: "<< graph[current_vertex].id << std::endl;
- // debug << "Adjacent Vertex: "<< graph[adjacent_vertex].id << std::endl;
- debug << "Contracting current vertex "<< graph[current_vertex].id << std::endl;
- graph[adjacent_vertex].add_contracted_vertex(graph[current_vertex], current_vertex);
- // Adding contracted vertices of the edge
- EO_i out, out_end;
- EI_i in, in_end;
- debug << "Adding contracted vertices of the edge\n";
- for (boost::tie(out, out_end) = out_edges(current_vertex, graph.graph);
- out != out_end; ++out) {
- debug << graph.graph[*out];
- graph.add_contracted_edge_vertices(adjacent_vertex, graph.graph[*out]);
- }
- for (boost::tie(in, in_end) = in_edges(current_vertex, graph.graph);
- in != in_end; ++in) {
- debug << graph.graph[*in];
- graph.add_contracted_edge_vertices(adjacent_vertex, graph.graph[*in]);
- }
- debug << "Current Vertex:\n";
- debug << graph[current_vertex];
- // debug << graph.graph[current_vertex].print_vertex(debug, graph.graph);
- debug << "Adjacent Vertex:\n";
- // debug << graph.graph[adjacent_vertex].print_vertex(debug, graph.graph);
- debug << graph[adjacent_vertex];
- graph.disconnect_vertex(debug, current_vertex);
- deadendVertices -= current_vertex;
- debug << "Adjacent vertex dead_end?: " << is_dead_end(graph, adjacent_vertex, debug) << std::endl;
- if (is_dead_end(graph, adjacent_vertex, debug)
- && !forbiddenVertices.has(adjacent_vertex)) {
- deadendVertices += adjacent_vertex;
- deadendPriority.push(adjacent_vertex);
- }
- }
+#ifndef NDEBUG
+ debug << "Current Vertex:\n";
+ debug << graph[current_vertex];
+ debug << "Adjacent Vertex:\n";
+ debug << graph[adjacent_vertex];
+#endif
+ graph.disconnect_vertex(current_vertex);
+ deadendVertices -= current_vertex;
+#ifndef NDEBUG
+ debug << "Adjacent vertex dead_end?: "
+ << is_dead_end(graph, adjacent_vertex)
+ << std::endl;
+#endif
+ if (is_dead_end(graph, adjacent_vertex)
+ && !forbiddenVertices.has(adjacent_vertex)) {
+ deadendVertices += adjacent_vertex;
+ deadendPriority.push(adjacent_vertex);
}
}
+ }
+}
+} // namespace contraction
} // namespace pgrouting
+
+#endif // SRC_CONTRACTION_SRC_PGR_DEADENDCONTRACTION_HPP_
diff --git a/src/contraction/src/pgr_linearContraction.hpp b/src/contraction/src/pgr_linearContraction.hpp
index a72e164..6c36e54 100644
--- a/src/contraction/src/pgr_linearContraction.hpp
+++ b/src/contraction/src/pgr_linearContraction.hpp
@@ -1,5 +1,5 @@
/*PGR-GNU*****************************************************************
-File: pgr_contractionGraph.c
+File: pgr_linear.c
Generated with Template by:
Copyright (c) 2015 pgRouting developers
@@ -26,234 +26,249 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+#ifndef SRC_CONTRACTION_SRC_PGR_LINEARCONTRACTION_HPP_
+#define SRC_CONTRACTION_SRC_PGR_LINEARCONTRACTION_HPP_
#pragma once
-#ifdef __MINGW32__
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
-#include <functional>
+
+
#include <queue>
+#include <functional>
#include <vector>
+
#include "../../common/src/identifiers.hpp"
+
+
namespace pgrouting {
+namespace contraction {
+
template < class G >
-class Pgr_linearContraction {
+class Pgr_linear {
+ private:
+ typedef typename G::V V;
+ typedef typename G::E E;
+ typedef typename G::V_i V_i;
+ typedef typename G::E_i E_i;
+ typedef typename G::EO_i EO_i;
+ typedef typename G::EI_i EI_i;
+ typedef typename G::degree_size_type degree_size_type;
+
+
public:
- typedef typename G::V V;
- typedef typename G::E E;
- typedef typename G::V_i V_i;
- typedef typename G::E_i E_i;
- typedef typename G::EO_i EO_i;
- typedef typename G::EI_i EI_i;
- typedef typename G::degree_size_type degree_size_type;
- Pgr_linearContraction():last_edge_id(0) {}
- void setForbiddenVertices(G &graph,
- Identifiers<int64_t> forbidden_vertices,
- std::ostringstream& debug);
- void setForbiddenVertices(G &graph, int64_t *forbidden_vertices,
- size_t size_forbidden_vertices,
- std::ostringstream& debug);
- void calculateVertices(G &graph,
- std::ostringstream& debug);
- void doContraction(G &graph,
- std::ostringstream& debug);
+ Pgr_linear():last_edge_id(0) {}
+ void setForbiddenVertices(
+ Identifiers<V> forbidden_vertices);
+ void calculateVertices(G &graph);
+ void doContraction(G &graph);
+
+ private:
+ int64_t get_next_id() {
+ return --last_edge_id;
+ }
+
+ bool is_linear(G &graph, V v);
+ void add_if_linear(G &graph, V v);
+ void add_edge_pair(V vertex, int64_t &incoming_eid,
+ int64_t &outgoing_eid);
+ void add_shortcut(G &graph, V vertex,
+ E incoming_edge,
+ E outgoing_edge);
+ void add_shortcut(G &graph,
+ pgrouting::CH_edge &shortcut);
private:
- Identifiers<V> linearVertices;
- Identifiers<V> forbiddenVertices;
- int64_t last_edge_id;
- bool is_linear(G &graph, V v,
- std::ostringstream& debug);
- void add_if_linear(G &graph, V v,
- std::ostringstream& debug);
- void add_edge_pair(V vertex, int64_t &incoming_eid,
- int64_t &outgoing_eid,
- std::ostringstream& debug);
- void add_shortcut(G &graph, V vertex,
- E incoming_edge,
- E outgoing_edge,
- std::ostringstream& debug);
- void add_shortcut(G &graph,
- pgrouting::contraction::Edge &shortcut,
- std::ostringstream& debug);
- int64_t& get_next_id() {
- return --last_edge_id;
- }
+ Identifiers<V> linearVertices;
+ Identifiers<V> forbiddenVertices;
+
+ int64_t last_edge_id;
+ std::ostringstream debug;
};
- template < class G >
- void Pgr_linearContraction< G >::setForbiddenVertices(G &graph,
- Identifiers<int64_t> forbidden_vertices,
- std::ostringstream& debug) {
- debug << "Setting forbidden vertices\n";
- for (auto forbiddenVertex : forbidden_vertices) {
- forbiddenVertices += graph.get_V(forbiddenVertex);
- }
- }
+/*************** IMPLEMENTTION **************/
- template < class G >
- void Pgr_linearContraction< G >::setForbiddenVertices(G &graph,
- int64_t *forbidden_vertices,
- size_t size_forbidden_vertices,
- std::ostringstream& debug) {
- debug << "Setting forbidden vertices\n";
- for (int64_t i = 0; i < size_forbidden_vertices; ++i) {
- forbiddenVertices += graph.get_V(forbidden_vertices[i]);
- }
- }
+template < class G >
+void
+Pgr_linear< G >::setForbiddenVertices(
+ Identifiers<V> forbidden_vertices) {
+ debug << "Setting forbidden vertices\n";
+ forbiddenVertices = forbidden_vertices;
+}
- template < class G >
- bool Pgr_linearContraction<G>::is_linear(G &graph, V v,
- std::ostringstream& debug) {
- degree_size_type in_degree, out_degree;
- in_degree = graph.in_degree(v);
- out_degree = graph.out_degree(v);
- Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(v);
- if (adjacent_vertices.size() == 2) {
- if (in_degree > 0 && out_degree > 0) {
- debug << graph.graph[v].id << " is linear " << std::endl;
- return true;
- }
- }
- debug << graph.graph[v].id << " is not linear " << std::endl;
- return false;
+
+template < class G >
+bool Pgr_linear<G>::is_linear(G &graph, V v) {
+ degree_size_type in_degree, out_degree;
+ in_degree = graph.in_degree(v);
+ out_degree = graph.out_degree(v);
+ Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(v);
+ if (adjacent_vertices.size() == 2) {
+ if (in_degree > 0 && out_degree > 0) {
+ debug << graph.graph[v].id << " is linear " << std::endl;
+ return true;
}
+ }
+ debug << graph.graph[v].id << " is not linear " << std::endl;
+ return false;
+}
- template < class G >
- void Pgr_linearContraction<G>::calculateVertices(G &graph,
- std::ostringstream& debug) {
- debug << "Calculating vertices\n";
- V_i vi;
- for (vi = vertices(graph.graph).first; vi != vertices(graph.graph).second; ++vi) {
- debug << "Checking vertex " << graph.graph[(*vi)].id << '\n';
- if (is_linear(graph, *vi, debug)) {
- // debug << "Adding " << graph.graph[(*vi)].id << " to linear" << '\n';
- linearVertices += (*vi);
- }
- }
- linearVertices -= forbiddenVertices;
+template < class G >
+void Pgr_linear<G>::calculateVertices(G &graph) {
+ debug << "Calculating vertices\n";
+ V_i vi;
+ for (vi = vertices(graph.graph).first;
+ vi != vertices(graph.graph).second;
+ ++vi) {
+ debug << "Checking vertex " << graph.graph[(*vi)].id << '\n';
+ if (is_linear(graph, *vi)) {
+ linearVertices += (*vi);
}
+ }
+ linearVertices -= forbiddenVertices;
+}
- template < class G >
- void Pgr_linearContraction<G>::doContraction(G &graph,
- std::ostringstream& debug) {
- std::ostringstream contraction_debug;
- contraction_debug << "Performing contraction\n";
- std::priority_queue<V, std::vector<V>, std::greater<V> > linearPriority;
- for (V linearVertex : linearVertices) {
- linearPriority.push(linearVertex);
+template < class G >
+void Pgr_linear<G>::doContraction(G &graph) {
+ std::ostringstream contraction_debug;
+ contraction_debug << "Performing contraction\n";
+ std::priority_queue<V, std::vector<V>, std::greater<V> > linearPriority;
+ for (const auto linearVertex : linearVertices) {
+ linearPriority.push(linearVertex);
+ }
+ contraction_debug << "Linear vertices" << std::endl;
+ for (const auto v : linearVertices) {
+ contraction_debug << graph[v].id << ", ";
+ }
+ contraction_debug << std::endl;
+ while (!linearPriority.empty()) {
+ V current_vertex = linearPriority.top();
+ linearPriority.pop();
+ if (!is_linear(graph, current_vertex)) {
+ linearVertices -= current_vertex;
+ continue;
+ }
+ Identifiers<V> adjacent_vertices =
+ graph.find_adjacent_vertices(current_vertex);
+ pgassert(adjacent_vertices.size() == 2);
+ V vertex_1 = adjacent_vertices[0];
+ V vertex_2 = adjacent_vertices[1];
+ contraction_debug << "Adjacent vertices\n";
+ contraction_debug << graph[vertex_1].id
+ << ", " << graph[vertex_2].id
+ << std::endl;
+
+ if (graph.m_gType == DIRECTED) {
+ if (graph.out_degree_to_vertex(vertex_1, current_vertex) > 0 &&
+ graph.in_degree_from_vertex(vertex_2, current_vertex) > 0) {
+ E e1 = graph.get_min_cost_edge(vertex_1,
+ current_vertex);
+ E e2 = graph.get_min_cost_edge(current_vertex,
+ vertex_2);
+ add_shortcut(graph, current_vertex, e1, e2);
}
- contraction_debug << "Linear vertices" << std::endl;
- for (auto v : linearVertices) {
- contraction_debug << graph[v].id << ", ";
+
+ if (graph.out_degree_to_vertex(vertex_2, current_vertex) > 0 &&
+ graph.in_degree_from_vertex(vertex_1, current_vertex) > 0) {
+ E e1 = graph.get_min_cost_edge(vertex_2,
+ current_vertex);
+ E e2 = graph.get_min_cost_edge(current_vertex,
+ vertex_1);
+ add_shortcut(graph, current_vertex, e1, e2);
}
- contraction_debug << std::endl;
- while (!linearPriority.empty()) {
- V current_vertex = linearPriority.top();
- linearPriority.pop();
- if (!is_linear(graph, current_vertex, debug)) {
- linearVertices -= current_vertex;
- continue;
- }
- Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(current_vertex);
- pgassert(adjacent_vertices.size() == 2);
- V vertex_1 = adjacent_vertices[0];
- V vertex_2 = adjacent_vertices[1];
- contraction_debug << "Adjacent vertices\n";
- contraction_debug << graph[vertex_1].id << ", " << graph[vertex_2].id << std::endl;
-
- if (graph.m_gType == DIRECTED) {
- if (graph.out_degree_to_vertex(vertex_1, current_vertex) > 0
- && graph.in_degree_from_vertex(vertex_2, current_vertex) > 0) {
- E e1 = graph.get_min_cost_edge(vertex_1,
- current_vertex);
- E e2 = graph.get_min_cost_edge(current_vertex,
- vertex_2);
- add_shortcut(graph, current_vertex, e1, e2, contraction_debug);
- }
-
- if (graph.out_degree_to_vertex(vertex_2, current_vertex) > 0
- && graph.in_degree_from_vertex(vertex_1, current_vertex) > 0) {
- E e1 = graph.get_min_cost_edge(vertex_2,
- current_vertex);
- E e2 = graph.get_min_cost_edge(current_vertex,
- vertex_1);
- add_shortcut(graph, current_vertex, e1, e2, contraction_debug);
- }
- } else if (graph.m_gType == UNDIRECTED) {
- if (graph.out_degree_to_vertex(vertex_1, current_vertex) > 0
- && graph.in_degree_from_vertex(vertex_2, current_vertex) > 0) {
- contraction_debug << "UNDIRECTED graph before contraction\n";
- graph.print_graph(contraction_debug);
- E e1 = graph.get_min_cost_edge(vertex_1,
- current_vertex);
- E e2 = graph.get_min_cost_edge(current_vertex,
- vertex_2);
- add_shortcut(graph, current_vertex, e1, e2, contraction_debug);
- }
- }
-
- graph.disconnect_vertex(contraction_debug, current_vertex);
- linearVertices -= current_vertex;
- if (is_linear(graph, vertex_1, debug)
- && !forbiddenVertices.has(vertex_1)) {
- linearPriority.push(vertex_1);
- linearVertices += vertex_1;
- }
- if (is_linear(graph, vertex_2, debug)
- && !forbiddenVertices.has(vertex_2)) {
- linearPriority.push(vertex_2);
- linearVertices += vertex_2;
- }
+ } else if (graph.m_gType == UNDIRECTED) {
+ if (graph.out_degree_to_vertex(vertex_1, current_vertex) > 0 &&
+ graph.in_degree_from_vertex(vertex_2, current_vertex) > 0) {
+ contraction_debug << "UNDIRECTED graph before contraction\n";
+ graph.print_graph(contraction_debug);
+ E e1 = graph.get_min_cost_edge(vertex_1,
+ current_vertex);
+ E e2 = graph.get_min_cost_edge(current_vertex,
+ vertex_2);
+ add_shortcut(graph, current_vertex, e1, e2);
}
- debug << contraction_debug.str().c_str() << "\n";
}
-
-
- template < class G >
- void Pgr_linearContraction<G>::add_shortcut(G &graph, V vertex,
- E incoming_edge,
- E outgoing_edge,
- std::ostringstream& debug) {
- if (graph.m_gType == UNDIRECTED) {
- Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(vertex);
- V vertex_1 = adjacent_vertices[0];
- V vertex_2 = adjacent_vertices[1];
- E shortcut_E;
- contraction::Edge shortcut(get_next_id(), graph[vertex_1].id,
- graph[vertex_2].id,
- graph[incoming_edge].cost + graph[outgoing_edge].cost);
- shortcut.add_contracted_vertex(graph[vertex], vertex);
- shortcut.add_contracted_edge_vertices(graph[incoming_edge]);
- shortcut.add_contracted_edge_vertices(graph[outgoing_edge]);
- debug << "Adding shortcut\n";
- debug << shortcut;
- graph.graph_add_shortcut(shortcut, debug);
- debug << "Added shortcut\n";
- } else if (graph.m_gType == DIRECTED) {
- contraction::Edge shortcut(get_next_id(), graph[incoming_edge].source,
- graph[outgoing_edge].target,
- graph[incoming_edge].cost + graph[outgoing_edge].cost);
- shortcut.add_contracted_vertex(graph[vertex], vertex);
- shortcut.add_contracted_edge_vertices(graph[incoming_edge]);
- shortcut.add_contracted_edge_vertices(graph[outgoing_edge]);
- debug << "Adding shortcut\n";
- debug << shortcut;
- graph.graph_add_shortcut(shortcut, debug);
- debug << "Added shortcut\n";
- }
+ graph.disconnect_vertex(current_vertex);
+ linearVertices -= current_vertex;
+ if (is_linear(graph, vertex_1)
+ && !forbiddenVertices.has(vertex_1)) {
+ linearPriority.push(vertex_1);
+ linearVertices += vertex_1;
}
- template < class G >
- void Pgr_linearContraction<G>::add_shortcut(G &graph,
- pgrouting::contraction::Edge &shortcut,
- std::ostringstream& debug) {
- graph.graph_add_shortcut(shortcut, debug);
+ if (is_linear(graph, vertex_2)
+ && !forbiddenVertices.has(vertex_2)) {
+ linearPriority.push(vertex_2);
+ linearVertices += vertex_2;
}
+ }
+ debug << contraction_debug.str().c_str() << "\n";
+}
+
+/*! \brief add edges(shortuct) to the graph during contraction
+
+ a --incomming--> b ---outgoing--> c
+
+ a -> c
+
+ edge (a, c) is a new edge: @b shortcut
+ e.contracted_vertices = b + b.contracted vertices
+ b is "removed" disconnected from the graph
+ - by removing all edges to/from b
+ */
+
+template < class G >
+void
+Pgr_linear<G>::add_shortcut(
+ G &graph, V vertex,
+ E incoming_edge,
+ E outgoing_edge) {
+ pgassert(incoming_edge != outgoing_edge);
+
+ auto a = graph.adjacent(vertex, incoming_edge);
+ auto c = graph.adjacent(vertex, outgoing_edge);
+ pgassert(a != vertex);
+ pgassert(a != c);
+ pgassert(vertex != c);
+
+ if (graph.is_undirected()) {
+ Identifiers<V> adjacent_vertices = graph.find_adjacent_vertices(vertex);
+ V vertex_1 = adjacent_vertices[0];
+ V vertex_2 = adjacent_vertices[1];
+ E shortcut_E;
+ CH_edge shortcut(get_next_id(), graph[vertex_1].id,
+ graph[vertex_2].id,
+ graph[incoming_edge].cost + graph[outgoing_edge].cost);
+ shortcut.add_contracted_vertex(graph[vertex], vertex);
+ shortcut.add_contracted_edge_vertices(graph[incoming_edge]);
+ shortcut.add_contracted_edge_vertices(graph[outgoing_edge]);
+ debug << "Adding shortcut\n";
+ debug << shortcut;
+ graph.add_shortcut(shortcut);
+ debug << "Added shortcut\n";
+ } else {
+ CH_edge shortcut(
+ get_next_id(),
+ graph[a].id,
+ graph[c].id,
+ graph[incoming_edge].cost + graph[outgoing_edge].cost);
+ shortcut.add_contracted_vertex(graph[vertex], vertex);
+ shortcut.add_contracted_edge_vertices(graph[incoming_edge]);
+ shortcut.add_contracted_edge_vertices(graph[outgoing_edge]);
+ debug << "Adding shortcut\n";
+ debug << shortcut;
+ graph.add_shortcut(shortcut);
+ debug << "Added shortcut\n";
+ }
+}
+template < class G >
+void Pgr_linear<G>::add_shortcut(G &graph,
+ pgrouting::CH_edge &shortcut) {
+ graph.add_shortcut(shortcut);
+}
+
+} // namespace contraction
} // namespace pgrouting
+
+#endif // SRC_CONTRACTION_SRC_PGR_LINEARCONTRACTION_HPP_
diff --git a/src/contraction/src/structs.h b/src/contraction/src/structs.h
deleted file mode 100644
index 6be78fb..0000000
--- a/src/contraction/src/structs.h
+++ /dev/null
@@ -1,48 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: structs.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Rohith Reddy
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-#ifndef SRC_CONTRACTION_SRC_STRUCTS_H_
-#define SRC_CONTRACTION_SRC_STRUCTS_H_
-
-#ifndef __cplusplus
-#include "postgres.h"
-#endif
-#include <stdint.h>
-
-typedef struct {
- int64_t seq;
- int64_t id;
- char *type;
- int64_t source;
- int64_t target;
- double cost;
- int64_t *contracted_vertices;
- int contracted_vertices_size;
-} pgr_contracted_blob;
-
-
-#endif // SRC_CONTRACTION_SRC_STRUCTS_H_
diff --git a/src/contraction/test/directed-deadend.result b/src/contraction/test/directed-deadend.result
new file mode 100644
index 0000000..34baa1d
--- /dev/null
+++ b/src/contraction/test/directed-deadend.result
@@ -0,0 +1,11 @@
+--q1 Checking dead end contraction for single edge
+1|v|2|{1}|-1|-1|-1
+--q2 Checking dead end contraction for two edges
+1|v|3|{1,2}|-1|-1|-1
+--q3 Checking dead end contraction for sample data
+1|v|2|{1}|-1|-1|-1
+2|v|5|{7,8}|-1|-1|-1
+3|v|10|{13}|-1|-1|-1
+4|v|15|{14}|-1|-1|-1
+5|v|17|{16}|-1|-1|-1
+--q5 Checking dead end contraction for a graph with no dead end vertex
diff --git a/src/contraction/test/directed-deadend.test.sql b/src/contraction/test/directed-deadend.test.sql
new file mode 100644
index 0000000..117ad16
--- /dev/null
+++ b/src/contraction/test/directed-deadend.test.sql
@@ -0,0 +1,44 @@
+
+
+/*
+\echo --q0 Checking for valid contraction
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
+ ARRAY[-1]::integer[], 1, ARRAY[]::BIGINT[], true);
+*/
+-- \echo --q0 -------------------------------------------
+
+\echo --q1 Checking dead end contraction for single edge
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
+ ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q1 -------------------------------------------
+
+\echo --q2 Checking dead end contraction for two edges
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id < 3',
+ ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q2 -------------------------------------------
+
+\echo --q3 Checking dead end contraction for sample data
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q3 -------------------------------------------
+
+/*
+-- this test fails becuse parameter is wrong
+\echo --q4 Checking that forbidden vertices can only be one dimensional or empty
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
+ ARRAY[ [2,3,4,5], [4,5,6,7] ]::BIGINT[][], ARRAY[0]::integer[], 1, true);
+-- \echo --q4 -------------------------------------------
+*/
+
+\echo --q5 Checking dead end contraction for a graph with no dead end vertex
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 2 OR id = 4 OR id = 5 OR id = 8',
+ ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q5 -------------------------------------------
+
diff --git a/src/contraction/test/directed-development.result b/src/contraction/test/directed-development.result
index 952269c..6a1b034 100644
--- a/src/contraction/test/directed-development.result
+++ b/src/contraction/test/directed-development.result
@@ -1,4 +1,3 @@
---q0 Checking for valid contraction
--q1 Checking dead end contraction for single edge
1|v|2|{1}|-1|-1|-1
--q2 Checking dead end contraction for two edges
@@ -34,17 +33,18 @@
7|e|-4|{12}|11|9|2
--q12 Checking linear contraction, dead end for sample data
1|v|2|{1}|-1|-1|-1
-2|v|10|{13}|-1|-1|-1
-3|v|15|{14}|-1|-1|-1
-4|v|17|{16}|-1|-1|-1
-5|e|-1|{4}|9|3|2
-6|e|-2|{8}|5|7|2
-7|e|-3|{8}|7|5|2
-8|e|-4|{12}|11|9|2
+2|v|5|{7,8}|-1|-1|-1
+3|v|10|{13}|-1|-1|-1
+4|v|15|{14}|-1|-1|-1
+5|v|17|{16}|-1|-1|-1
+6|e|-1|{4}|9|3|2
+7|e|-2|{8}|5|7|2
+8|e|-3|{8}|7|5|2
+9|e|-4|{12}|11|9|2
--q13 Checking linear contraction for a square like graph
1|e|-1|{2}|3|5|2
2|e|-2|{2,5}|3|6|3
--q14 Checking linear contraction, dead end for a square like graph
1|v|3|{2,5,6}|-1|-1|-1
2|e|-1|{2}|3|5|2
-3|e|-2|{2,5}|3|6|3
\ No newline at end of file
+3|e|-2|{2,5}|3|6|3
diff --git a/src/contraction/test/directed-development.test.sql b/src/contraction/test/directed-development.test.sql
index e527df4..11de63a 100644
--- a/src/contraction/test/directed-development.test.sql
+++ b/src/contraction/test/directed-development.test.sql
@@ -1,60 +1,93 @@
-BEGIN;
-SET client_min_messages TO WARNING;
-
+/*
+-- this test fails becuse parameter is wrong
\echo --q0 Checking for valid contraction
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
ARRAY[-1]::integer[], 1, ARRAY[]::BIGINT[], true);
+*/
-- \echo --q0 -------------------------------------------
\echo --q1 Checking dead end contraction for single edge
+-- GRAPH: 1 <=> 2
+-- EXPECTED
+-- 1 | v | 2 | {1} | -1 | -1 | -1
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+
+
-- \echo --q1 -------------------------------------------
\echo --q2 Checking dead end contraction for two edges
+--GRAPH: 1 <=> 2 <- 3
+-- EXPECTED
+-- 1 | v | 3 | {1,2} | -1 | -1 | -1
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id < 3',
ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+
+
-- \echo --q2 -------------------------------------------
\echo --q3 Checking dead end contraction for sample data
+
+-- EXPECTED
+-- 1 | v | 2 | {1} | -1 | -1 | -1
+-- 2 | v | 5 | {7,8} | -1 | -1 | -1
+-- 3 | v | 10 | {13} | -1 | -1 | -1
+-- 4 | v | 15 | {14} | -1 | -1 | -1
+-- 5 | v | 17 | {16} | -1 | -1 | -1
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
--- \echo --q3 -------------------------------------------
-/*
--- this test fails becuse parameter is wrong
-\echo --q4 Checking that forbidden vertices can only be one dimensional or empty
-SELECT * FROM pgr_contractGraph(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 1',
- ARRAY[ [2,3,4,5], [4,5,6,7] ]::BIGINT[][], ARRAY[0]::integer[], 1, true);
--- \echo --q4 -------------------------------------------
-*/
+
+-- \echo --q3 -------------------------------------------
\echo --q5 Checking dead end contraction for a graph with no dead end vertex
+-- 5 <- 6
+-- " ^
+-- 2 <- 3
+
+-- EXPECTED
+-- (empty)
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table
WHERE id = 2 OR id = 4 OR id = 5 OR id = 8',
ARRAY[1]::integer[], 1, ARRAY[]::BIGINT[], true);
+
-- \echo --q5 -------------------------------------------
\echo --q6 Checking for linear vertices case 1
+-- GRPAH 1 <=> 2
+-- EXPECTED
+-- 1 | e | -1 | {3} | 4 | 6 | 2
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table
WHERE id = 3 OR id = 5',
ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+
-- \echo --q6 -------------------------------------------
\echo --q7 Checking for linear vertices case 2
+-- GRAPH 10 <=> 5 <=> 6
+-- EXPECTED
+-- 1 | e | -1 | {5} | 6 | 10 | 2
+-- 2 | e | -2 | {5} | 10 | 6 | 2
+-- New edges: 6 <=> 10
+
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table
WHERE id = 8 OR id = 10',
ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+
-- \echo --q7 -------------------------------------------
@@ -97,6 +130,16 @@ SELECT * FROM pgr_contractGraph(
-- \echo --q13 -------------------------------------------
\echo --q14 Checking linear contraction, dead end for a square like graph
+-- GRAPH
+-- 5 <- 6
+-- " ^
+-- 2 <- 3
+-- 1|v|3|{2,5,6}|-1|-1|-1
+-- 2|e|-1|{2}|3|5|2
+-- 3|e|-2|{2,5}|3|6|3
+
+-- 3 -> 5
+
SELECT * FROM pgr_contractGraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table
WHERE id = 2 OR id = 4 OR id = 5 OR id = 8',
@@ -104,4 +147,3 @@ SELECT * FROM pgr_contractGraph(
-ROLLBACK;
diff --git a/src/contraction/test/directed-linear.result b/src/contraction/test/directed-linear.result
new file mode 100644
index 0000000..99d451f
--- /dev/null
+++ b/src/contraction/test/directed-linear.result
@@ -0,0 +1,17 @@
+--q6 Checking for linear vertices case 1
+1|e|-1|{3}|4|6|2
+--q7 Checking for linear vertices case 2
+1|e|-1|{5}|6|10|2
+2|e|-2|{5}|10|6|2
+--q8 Checking for linear vertices case 3
+1|e|-1|{2}|3|5|2
+--q9 Checking for linear vertices case 4
+1|e|-1|{6}|3|9|2
+--q10 Checking linear contraction for sample data
+1|e|-1|{4}|9|3|2
+2|e|-2|{8}|5|7|2
+3|e|-3|{8}|7|5|2
+4|e|-4|{12}|11|9|2
+--q13 Checking linear contraction for a square like graph
+1|e|-1|{2}|3|5|2
+2|e|-2|{2,5}|3|6|3
diff --git a/src/contraction/test/directed-linear.test.sql b/src/contraction/test/directed-linear.test.sql
new file mode 100644
index 0000000..9eb7af6
--- /dev/null
+++ b/src/contraction/test/directed-linear.test.sql
@@ -0,0 +1,45 @@
+
+\echo --q6 Checking for linear vertices case 1
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 3 OR id = 5',
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q6 -------------------------------------------
+
+
+\echo --q7 Checking for linear vertices case 2
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 8 OR id = 10',
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q7 -------------------------------------------
+
+
+\echo --q8 Checking for linear vertices case 3
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 2 OR id = 4',
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q8 -------------------------------------------
+
+\echo --q9 Checking for linear vertices case 4
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 5 OR id = 9',
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q9 -------------------------------------------
+
+\echo --q10 Checking linear contraction for sample data
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table' ,
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q10 -------------------------------------------
+
+
+\echo --q13 Checking linear contraction for a square like graph
+SELECT * FROM pgr_contractGraph(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table
+ WHERE id = 2 OR id = 4 OR id = 5 OR id = 8',
+ ARRAY[2]::integer[], 1, ARRAY[]::BIGINT[], true);
+-- \echo --q13 -------------------------------------------
+
diff --git a/src/contraction/test/doc-contractGraph.test.sql b/src/contraction/test/doc-contractGraph.test.sql
index 7715be9..59d4c71 100644
--- a/src/contraction/test/doc-contractGraph.test.sql
+++ b/src/contraction/test/doc-contractGraph.test.sql
@@ -18,4 +18,4 @@ ARRAY[1]);
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
ARRAY[2]);
-\echo -- q5
\ No newline at end of file
+\echo -- q5
diff --git a/src/contraction/test/doc-contraction.test.sql b/src/contraction/test/doc-contraction.test.sql
index 7731ced..a576b15 100644
--- a/src/contraction/test/doc-contraction.test.sql
+++ b/src/contraction/test/doc-contraction.test.sql
@@ -2,13 +2,14 @@
SELECT id, source, target, cost, reverse_cost FROM edge_table;
\echo -- q01
-SET client_min_messages TO error;
+SET client_min_messages TO ERROR;
\echo -- q1
ALTER TABLE edge_table ADD contracted_vertices BIGINT[];
ALTER TABLE edge_table_vertices_pgr ADD contracted_vertices BIGINT[];
ALTER TABLE edge_table ADD is_contracted BOOLEAN DEFAULT false;
ALTER TABLE edge_table_vertices_pgr ADD is_contracted BOOLEAN DEFAULT false;
+SET client_min_messages TO NOTICE;
\echo -- q2
-- showing original results
SELECT * FROM pgr_contractGraph(
diff --git a/src/contraction/test/expand_graph.test.sql b/src/contraction/test/expand_graph.test.sql
index 1acf978..3df993e 100644
--- a/src/contraction/test/expand_graph.test.sql
+++ b/src/contraction/test/expand_graph.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
\echo 'step 1: Initial edge table'
@@ -168,53 +167,3 @@ END;
$total$ LANGUAGE plpgsql;
-/*
--- Testing the update function
- SELECT * FROM pgr_update_contraction_columns(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- ARRAY[]::BIGINT[], ARRAY[0, 1]::integer[], 1, true );
-
-SELECT 'step 9: Creating the edge table and vertex table of the contracted graph';
-
-CREATE TABLE contracted_edge_table_vertices_pgr AS
-SELECT *
-FROM edge_table_vertices_pgr WHERE is_contracted = false;
-
-CREATE TABLE contracted_edge_table AS
-SELECT *
-FROM edge_table WHERE source IN (SELECT id FROM contracted_edge_table_vertices_pgr)
-AND target IN (SELECT id FROM contracted_edge_table_vertices_pgr);
-
-SELECT 'step 10: Edge table after modification';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM edge_table ORDER BY id;
-
-SELECT 'step 11: Vertex table after modification';
-
-SELECT id, is_contracted, contracted_vertices FROM edge_table_vertices_pgr ORDER BY id;
-
-SELECT 'step 12: Edge table representing the contracted graph';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM contracted_edge_table ORDER BY id;
-
-SELECT 'step 13: Vertex table representing the contracted graph';
-
-SELECT id, is_contracted, contracted_vertices FROM contracted_edge_table_vertices_pgr ORDER BY id;
-
-SELECT 'step 14: Expanding the contracted graph......';
-
--- Testing the expand function
- SELECT * FROM pgr_expand_contracted_graph(
- 'edge_table', 'edge_table_vertices_pgr',
- 'contracted_edge_table', 'contracted_edge_table_vertices_pgr');
-
-SELECT 'step 15: Edge table representing the expanded graph';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM contracted_edge_table ORDER BY id;
-
-SELECT 'step 16: Vertex table representing the expanded graph';
-
-SELECT id, is_contracted, contracted_vertices FROM contracted_edge_table_vertices_pgr ORDER BY id;
-*/
-
-ROLLBACK;
diff --git a/src/contraction/test/expand_graph_without_function.test.sql b/src/contraction/test/expand_graph_without_function.test.sql
index a4bfbf5..998f7d9 100644
--- a/src/contraction/test/expand_graph_without_function.test.sql
+++ b/src/contraction/test/expand_graph_without_function.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
SELECT 'step 1: Initial edge table';
@@ -34,53 +33,3 @@ SELECT 'step 8: Vertex table after adding columns';
SELECT id, is_contracted, contracted_vertices FROM edge_table_vertices_pgr;
-
-/*
--- Testing the update function
- SELECT * FROM pgr_update_contraction_columns(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- ARRAY[]::BIGINT[], ARRAY[0, 1]::integer[], 1, true );
-
-SELECT 'step 9: Creating the edge table and vertex table of the contracted graph';
-
-CREATE TABLE contracted_edge_table_vertices_pgr AS
-SELECT *
-FROM edge_table_vertices_pgr WHERE is_contracted = false;
-
-CREATE TABLE contracted_edge_table AS
-SELECT *
-FROM edge_table WHERE source IN (SELECT id FROM contracted_edge_table_vertices_pgr)
-AND target IN (SELECT id FROM contracted_edge_table_vertices_pgr);
-
-SELECT 'step 10: Edge table after modification';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM edge_table ORDER BY id;
-
-SELECT 'step 11: Vertex table after modification';
-
-SELECT id, is_contracted, contracted_vertices FROM edge_table_vertices_pgr ORDER BY id;
-
-SELECT 'step 12: Edge table representing the contracted graph';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM contracted_edge_table ORDER BY id;
-
-SELECT 'step 13: Vertex table representing the contracted graph';
-
-SELECT id, is_contracted, contracted_vertices FROM contracted_edge_table_vertices_pgr ORDER BY id;
-
-SELECT 'step 14: Expanding the contracted graph......';
-
--- Testing the expand function
- SELECT * FROM pgr_expand_contracted_graph(
- 'edge_table', 'edge_table_vertices_pgr',
- 'contracted_edge_table', 'contracted_edge_table_vertices_pgr');
-
-SELECT 'step 15: Edge table representing the expanded graph';
-
-SELECT id, source, target, cost, reverse_cost, is_contracted, contracted_vertices FROM contracted_edge_table ORDER BY id;
-
-SELECT 'step 16: Vertex table representing the expanded graph';
-
-SELECT id, is_contracted, contracted_vertices FROM contracted_edge_table_vertices_pgr ORDER BY id;
-*/
-ROLLBACK;
diff --git a/src/contraction/test/pgtap/contraction-types-check.sql b/src/contraction/test/pgtap/contraction-types-check.sql
index 40827db..bead151 100644
--- a/src/contraction/test/pgtap/contraction-types-check.sql
+++ b/src/contraction/test/pgtap/contraction-types-check.sql
@@ -215,7 +215,7 @@ SELECT * FROM pgr_contractgraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
ARRAY[1]::smallint[], 1, ARRAY[ ]::bigint[]);
-SELECT throws_ok('q1', 'XX000', 'Expected less than two dimension',
+SELECT throws_ok('q1', 'XX000', 'One dimension expected',
'Throws because forbidden_vertices is BIGINT[][]');
SELECT throws_ok('q2', 'XX000', 'One dimension expected',
@@ -234,4 +234,4 @@ SELECT lives_ok('q12');
SELECT lives_ok('q13');
SELECT finish();
-ROLLBACK;
\ No newline at end of file
+ROLLBACK;
diff --git a/src/contraction/test/pgtap/directed_dead_end.sql b/src/contraction/test/pgtap/directed_dead_end.sql
index a06416c..8c752bd 100644
--- a/src/contraction/test/pgtap/directed_dead_end.sql
+++ b/src/contraction/test/pgtap/directed_dead_end.sql
@@ -22,7 +22,7 @@ PREPARE v2e1q11 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
FROM ( VALUES (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
-SELECT set_eq('v2e1q10', 'v2e1q11', '1: Directed graph with single edge and no forbidden vertices');
+SELECT set_eq('v2e1q10', 'v2e1q11', 'SINGLE EDGE 1: Directed graph with single edge and no forbidden vertices');
-- 1 is forbidden vertex
@@ -37,7 +37,7 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
FROM ( VALUES (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
-SELECT set_eq('v2e1q20', 'v2e1q21', '1: Directed graph with single edge and 1 as forbidden vertex');
+SELECT set_eq('v2e1q20', 'v2e1q21', 'SINGLE EDGE 2: Directed graph with single edge and 1 as forbidden vertex');
-- TWO EDGES
@@ -52,7 +52,7 @@ PREPARE v3e2q11 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
FROM ( VALUES (1, 'v', 4, ARRAY[2, 3]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
-SELECT set_eq('v3e2q10', 'v3e2q11', '1: Directed graph two edges and no forbidden vertices');
+SELECT set_eq('v3e2q10', 'v3e2q11', 'TWO EDGES 1: Directed graph two edges and no forbidden vertices');
-- 3 is forbidden
PREPARE v3e2q20 AS
@@ -62,9 +62,9 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
PREPARE v3e2q21 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
-FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
+FROM ( VALUES (1, 'v', 3, ARRAY[2,4]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
-SELECT set_eq('v3e2q20', 'v3e2q21', '2: Directed graph with two edges and vertex 3 as forbidden vertex');
+SELECT set_eq('v3e2q20', 'v3e2q21', 'TWO EDGES 2: Directed graph with two edges and vertex 3 as forbidden vertex');
-- 2 is forbidden
PREPARE v3e2q30 AS
@@ -72,7 +72,11 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2 OR id = 3',
ARRAY[1]::INTEGER[], 1, ARRAY[2]::integer[], true);
-SELECT set_eq('v3e2q30', 'qempty', '2: Directed graph with two edges and vertex 2 as forbidden vertex');
+PREPARE v3e2q31 AS
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM ( VALUES (1, 'v', 2, ARRAY[3,4]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
+
+SELECT set_eq('v3e2q30', 'v3e2q31', 'TWO EDGES 3: Directed graph with two edges and vertex 2 as forbidden vertex');
-- no forbidden vertices
PREPARE v3e2q40 AS
@@ -81,8 +85,11 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v3e2q41 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1), (2, 'v', 10, ARRAY[11]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v3e2q40', 'v3e2q41', '3: Directed graph with two edges and no forbidden vertices');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES (1, 'v', 10, ARRAY[6,11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
+
+SELECT set_eq('v3e2q40', 'v3e2q41', 'TWO EDGES 4: Directed graph with two edges and no forbidden vertices');
+
-- 11 is forbidden
PREPARE v3e2q50 AS
@@ -90,7 +97,11 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 11 or id = 12',
ARRAY[1]::INTEGER[], 1, ARRAY[11]::integer[], true);
-SELECT set_eq('v3e2q50', 'qempty', '3: Directed graph with two edges and vertex 11 as forbidden vertex');
+PREPARE v3e2q51 AS
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES (1, 'v', 11, ARRAY[6,10]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost ) ;
+
+SELECT set_eq('v3e2q50', 'v3e2q51', 'TWO EDGES 5: Directed graph with two edges and no forbidden vertices');
-- no forbidden
PREPARE v3e2q60 AS
@@ -99,9 +110,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v3e2q61 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 10, ARRAY[11]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v3e2q60', 'v3e2q61', '4: Directed graph with two edges and no forbidden vertices');
+SELECT set_eq('v3e2q60', 'v3e2q61', 'TWO EDGES 6: Directed graph with two edges and no forbidden vertices');
-- 2 is forbidden
PREPARE v3e2q70 AS
@@ -110,9 +125,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[2]::integer[], true);
PREPARE v3e2q71 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 10, ARRAY[11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[3]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v3e2q70', 'v3e2q71', '4: Directed graph with two edges and 2 is forbidden vertex');
+SELECT set_eq('v3e2q70', 'v3e2q71', 'TWO EDGES 7: Directed graph with two edges and 2 is forbidden vertex');
-- 11 is forbidden
PREPARE v3e2q80 AS
@@ -121,9 +140,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[11]::integer[], true);
PREPARE v3e2q81 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v3e2q80', 'v3e2q81', '4: Directed graph with two edges and 11 is forbidden vertex');
+SELECT set_eq('v3e2q80', 'v3e2q81', 'TWO EDGES 8: Directed graph with two edges and 11 is forbidden vertex');
-- THREE EDGES
@@ -134,9 +157,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v4e3q11 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[6, 11, 12]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 12, ARRAY[3, 6, 11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e3q10', 'v4e3q11', '5: Directed graph with three edges and no forbidden vertices');
+SELECT set_eq('v4e3q10', 'v4e3q11', 'THREE EDGES 1: Directed graph with three edges and no forbidden vertices');
-- 3 is forbidden
PREPARE v4e3q20 AS
@@ -145,9 +171,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3]::integer[], true);
PREPARE v4e3q21 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[6, 11, 12]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[6, 11, 12]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e3q20', 'v4e3q21', 'THREE EDGES 2: Directed graph with three edges and 3 is forbidden vertex');
-SELECT set_eq('v4e3q20', 'v4e3q21', '5: Directed graph with three edges and 3 is forbidden vertex');
-- 6 is forbidden
PREPARE v4e3q30 AS
@@ -156,9 +186,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[6]::integer[], true);
PREPARE v4e3q31 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 6, ARRAY[11, 12]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 6, ARRAY[3, 11, 12]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e3q30', 'v4e3q31', 'THREE EDGES 3: Directed graph with three edges and 6 is forbidden vertex');
-SELECT set_eq('v4e3q30', 'v4e3q31', '5: Directed graph with three edges and 6 is forbidden vertex');
-- 11 is forbidden
PREPARE v4e3q40 AS
@@ -167,16 +201,19 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[11]::integer[], true);
PREPARE v4e3q41 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 11, ARRAY[12]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e3q40', 'v4e3q41', '5: Directed graph with three edges and 11 is forbidden vertex');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 11, ARRAY[3,6,12]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT set_eq('v4e3q40', 'v4e3q41', 'THREE EDGES 4: Directed graph with three edges and 11 is forbidden vertex');
-- 12 is forbidden
PREPARE v4e3q50 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM pgr_contractgraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 5 or id = 11 or id = 13',
- ARRAY[1]::INTEGER[], 1, ARRAY[12]::integer[], true);
+ ARRAY[1]::INTEGER[], 1, ARRAY[3,6,12]::integer[], true);
-SELECT set_eq('v4e3q50', 'qempty', '5: Directed graph with three edges and 12 is forbidden vertex');
+SELECT set_eq('v4e3q50', 'qempty', 'THREE EDGES 5: Directed graph with three edges and 12 is forbidden vertex');
-- no forbidden vertices
PREPARE v5e3q10 AS
@@ -185,9 +222,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v5e3q11 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 4, ARRAY[2, 3]::bigint[], -1, -1, -1), (2, 'v', 10, ARRAY[11]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 4, ARRAY[2, 3]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v5e3q10', 'v5e3q11', '7: Directed graph with three edges and no forbidden vertices');
+SELECT set_eq('v5e3q10', 'v5e3q11', 'THREE EDGES 6: Directed graph with three edges and no forbidden vertices');
-- 11 is forbidden
PREPARE v5e3q20 AS
@@ -196,9 +237,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[11]::integer[], true);
PREPARE v5e3q21 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 4, ARRAY[2, 3]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 4, ARRAY[2, 3]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v5e3q20', 'v5e3q21', '7: Directed graph with three edges and 11 is forbidden vertex');
+SELECT set_eq('v5e3q20', 'v5e3q21', 'THREE EDGES 7: Directed graph with three edges and 11 is forbidden vertex');
-- 2 is forbidden
PREPARE v5e3q30 AS
@@ -207,9 +252,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[2]::integer[], true);
PREPARE v5e3q31 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 10, ARRAY[11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[3,4]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v5e3q30', 'v5e3q31', '7: Directed graph with three edges and 2 is forbidden vertex');
+SELECT set_eq('v5e3q30', 'v5e3q31', 'THREE EDGES 8: Directed graph with three edges and 2 is forbidden vertex');
-- 3 is forbidden
PREPARE v5e3q40 AS
@@ -218,9 +267,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3]::integer[], true);
PREPARE v5e3q41 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 10, ARRAY[11]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2,4]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost);
-SELECT set_eq('v5e3q40', 'v5e3q41', '7: Directed graph with three edges and 3 is forbidden vertex');
+SELECT set_eq('v5e3q40', 'v5e3q41', 'THREE EDGES 9: Directed graph with three edges and 3 is forbidden vertex');
-- 2 and 11 are forbidden
PREPARE v5e3q50 AS
@@ -228,17 +281,31 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2 or id = 3 or id = 12',
ARRAY[1]::INTEGER[], 1, ARRAY[2, 11]::integer[], true);
-SELECT set_eq('v5e3q50', 'qempty', '7: Directed graph with three edges and 2 and 11 are forbidden vertices');
+PREPARE v5e3q51 AS
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[3,4]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost);
+
+SELECT set_eq('v5e3q50', 'v5e3q51', 'THREE EDGES 10: Directed graph with three edges and 2 and 11 are forbidden vertices');
-- 3 and 11 are forbidden
PREPARE v5e3q60 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM pgr_contractgraph(
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2 or id = 3 or id = 12',
ARRAY[1]::INTEGER[], 1, ARRAY[3, 11]::integer[], true);
+
PREPARE v5e3q61 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1)) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v5e3q60', 'v5e3q61', '7: Directed graph with three edges and 3 and 11 are forbidden vertices');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2,4]::bigint[], -1, -1, -1),
+ (2, 'v', 11, ARRAY[10]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v5e3q60', 'v5e3q61', 'THREE EDGES 11: Directed graph with three edges and 3 and 11 are forbidden vertices');
+-- EDGES 1 3 6
-- no forbidden vertices
PREPARE v6e3q10 AS
SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM pgr_contractgraph(
@@ -246,9 +313,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v6e3q11 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1), (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1), (3, 'v', 8, ARRAY[7]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1),
+ (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1),
+ (3, 'v', 8, ARRAY[7]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q10', 'v6e3q11', '8: Directed graph with three edges and no forbidden vertices');
+SELECT set_eq('v6e3q10', 'v6e3q11', 'THREE EDGES 12: Directed graph with three edges and no forbidden vertices');
-- 1 is forbidden
PREPARE v6e3q20 AS
@@ -257,9 +329,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[1]::integer[], true);
PREPARE v6e3q21 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1), (3, 'v', 8, ARRAY[7]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1),
+ (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1),
+ (3, 'v', 8, ARRAY[7]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q20', 'v6e3q21', '8: Directed graph with three edges and 1 is forbidden vertex');
+SELECT set_eq('v6e3q20', 'v6e3q21', 'THREE EDGES 13: Directed graph with three edges and 1 is forbidden vertex');
-- 3 is forbidden
PREPARE v6e3q30 AS
@@ -268,9 +345,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3]::integer[], true);
PREPARE v6e3q31 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1), (2, 'v', 8, ARRAY[7]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1),
+ (2, 'v', 3, ARRAY[4]::bigint[], -1, -1, -1),
+ (3, 'v', 8, ARRAY[7]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q30', 'v6e3q31', '8: Directed graph with three edges and 3 is forbidden vertex');
+SELECT set_eq('v6e3q30', 'v6e3q31', 'THREE EDGES 14: Directed graph with three edges and 3 is forbidden vertex');
-- 7 is forbidden
PREPARE v6e3q40 AS
@@ -279,9 +361,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[7]::integer[], true);
PREPARE v6e3q41 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1), (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1), (3, 'v', 7, ARRAY[8]::integer[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1),
+ (2, 'v', 4, ARRAY[3]::integer[], -1, -1, -1),
+ (3, 'v', 7, ARRAY[8]::integer[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q40', 'v6e3q41', '8: Directed graph with three edges and 7 is forbidden vertex');
+SELECT set_eq('v6e3q40', 'v6e3q41', 'THREE EDGES 15: Directed graph with three edges and 7 is forbidden vertex');
-- 1 and 3 are forbidden
PREPARE v6e3q50 AS
@@ -290,9 +377,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[1, 3]::integer[], true);
PREPARE v6e3q51 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 8, ARRAY[7]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1),
+ (2, 'v', 3, ARRAY[4]::bigint[], -1, -1, -1),
+ (3, 'v', 8, ARRAY[7]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q50', 'v6e3q51', '8: Directed graph with three edges and 1 and 3 are forbidden vertices');
+SELECT set_eq('v6e3q50', 'v6e3q51', 'THREE EDGES 16: Directed graph with three edges and 1 and 3 are forbidden vertices');
-- 3 and 7 are forbidden
PREPARE v6e3q60 AS
@@ -301,9 +393,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3, 7]::integer[], true);
PREPARE v6e3q61 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1), (2, 'v', 7, ARRAY[8]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[1]::bigint[], -1, -1, -1),
+ (2, 'v', 3, ARRAY[4]::bigint[], -1, -1, -1),
+ (3, 'v', 7, ARRAY[8]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q60', 'v6e3q61', '8: Directed graph with three edges and 3 and 7 are forbidden vertices');
+SELECT set_eq('v6e3q60', 'v6e3q61', 'THREE EDGES 17: Directed graph with three edges and 3 and 7 are forbidden vertices');
-- 1 and 7 are forbidden
PREPARE v6e3q70 AS
@@ -312,9 +409,14 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[1, 7]::integer[], true);
PREPARE v6e3q71 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 4, ARRAY[3]::bigint[], -1, -1, -1), (3, 'v', 7, ARRAY[8]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 1, ARRAY[2]::bigint[], -1, -1, -1),
+ (2, 'v', 4, ARRAY[3]::bigint[], -1, -1, -1),
+ (3, 'v', 7, ARRAY[8]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v6e3q70', 'v6e3q71', '8: Directed graph with three edges and 1 and 7 are forbidden vertices');
+SELECT set_eq('v6e3q70', 'v6e3q71', 'THREE EDGES 18: Directed graph with three edges and 1 and 7 are forbidden vertices');
-- FOUR EDGES
@@ -325,9 +427,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::integer[], 1, ARRAY[]::integer[], true);
PREPARE v4e4q11 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 4, ARRAY[2, 3, 6, 11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 11, ARRAY[2, 3, 4, 6]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q10', 'v4e4q11', '9: Directed graph with four edges and no forbidden vertices');
+SELECT set_eq('v4e4q10', 'v4e4q11', 'FOUR EDGES 1: Directed graph with four edges and no forbidden vertices');
-- 2 is forbidden
PREPARE v4e4q20 AS
@@ -336,9 +441,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[2]::integer[], true);
PREPARE v4e4q21 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[6, 11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 2, ARRAY[3, 4, 6, 11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q20', 'v4e4q21', '9: Directed graph with four edges and 2 is forbidden vertex');
+SELECT set_eq('v4e4q20', 'v4e4q21', 'FOUR EDGES 2: Directed graph with four edges and 2 is forbidden vertex');
-- 3 is forbidden
PREPARE v4e4q30 AS
@@ -347,8 +455,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3]::integer[], true);
PREPARE v4e4q31 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2, 6, 11]::bigint[], -1, -1, -1)) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q30', 'v4e4q31', '9: Directed graph with four edges and 3 is forbidden vertex');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2, 4, 6, 11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e4q30', 'v4e4q31', 'FOUR EDGES 3: Directed graph with four edges and 3 is forbidden vertex');
-- 6 is forbidden
PREPARE v4e4q40 AS
@@ -357,8 +469,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[6]::integer[], true);
PREPARE v4e4q41 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q40', 'v4e4q41', '9: Directed graph with four edges and 6 is forbidden vertex');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 6, ARRAY[2,3,4,11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e4q40', 'v4e4q41', 'FOUR EDGES 4: Directed graph with four edges and 6 is forbidden vertex');
-- 11 is forbidden
PREPARE v4e4q50 AS
@@ -367,8 +483,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[11]::integer[], true);
PREPARE v4e4q51 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q50', 'v4e4q51', '9: Directed graph with four edges and 11 is forbidden vertex');
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 11, ARRAY[2,3,4,6]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e4q50', 'v4e4q51', 'FOUR EDGES 5: Directed graph with four edges and 11 is forbidden vertex');
-- 2,3 are forbidden
@@ -378,9 +498,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[2, 3]::integer[], true);
PREPARE v4e4q61 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[6, 11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[4, 6, 11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q60', 'v4e4q61', '9: Directed graph with four edges and 2 and 3 is forbidden vertex');
+SELECT set_eq('v4e4q60', 'v4e4q61', 'FOUR EDGES 6: Directed graph with four edges and 2 and 3 is forbidden vertex');
-- 2,6 are forbidden
@@ -390,9 +513,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[2, 6]::integer[], true);
PREPARE v4e4q71 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[4]::bigint[], -1, -1, -1),
+ (2, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q70', 'v4e4q71', '9: Directed graph with four edges and 2 and 6 forbidden vertex');
+SELECT set_eq('v4e4q70', 'v4e4q71', 'FOUR EDGES 7: Directed graph with four edges and 2 and 6 forbidden vertex');
-- 2,11 are forbidden
PREPARE v4e4q80 AS
@@ -400,7 +527,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
'SELECT id, source, target, cost, reverse_cost FROM edge_table WHERE id = 2 or id = 3 or id = 5 or id = 11',
ARRAY[1]::INTEGER[], 1, ARRAY[2, 11]::integer[], true);
-SELECT set_eq('v4e4q80', 'qempty', '9: Directed graph with four edges and 2 and 11 forbidden vertex');
+PREPARE v4e4q81 AS
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[4]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
+
+SELECT set_eq('v4e4q80', 'v4e4q81', 'FOUR EDGES 8: Directed graph with four edges and 2 and 11 forbidden vertex');
-- 3,6 are forbidden
PREPARE v4e4q90 AS
@@ -409,9 +542,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3, 6]::integer[], true);
PREPARE v4e4q91 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1), (2, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2,4]::bigint[], -1, -1, -1),
+ (2, 'v', 6, ARRAY[11]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q90', 'v4e4q91', '9: Directed graph with four edges and 3 and 6 forbidden vertex');
+SELECT set_eq('v4e4q90', 'v4e4q91', 'FOUR EDGES 9: Directed graph with four edges and 3 and 6 forbidden vertex');
-- 3,11 are forbidden
PREPARE v4e4q100 AS
@@ -420,9 +557,12 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[3, 11]::integer[], true);
PREPARE v4e4q101 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 3, ARRAY[2,4]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q100', 'v4e4q101', '9: Directed graph with four edges and 3 and 11 forbidden vertex');
+SELECT set_eq('v4e4q100', 'v4e4q101', 'FOUR EDGES 10: Directed graph with four edges and 3 and 11 forbidden vertex');
-- 6,11 are forbidden
PREPARE v4e4q110 AS
@@ -431,10 +571,13 @@ SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source
ARRAY[1]::INTEGER[], 1, ARRAY[6, 11]::integer[], true);
PREPARE v4e4q111 AS
-SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost FROM ( VALUES (1, 'v', 3, ARRAY[2]::bigint[], -1, -1, -1) ) AS t(seq, type, id, contracted_vertices, source, target, cost );
+SELECT seq, type, id, unnest(contracted_vertices) AS contracted_vertices, source, target, cost
+FROM (VALUES
+ (1, 'v', 6, ARRAY[2,3,4]::bigint[], -1, -1, -1)
+) AS t(seq, type, id, contracted_vertices, source, target, cost );
-SELECT set_eq('v4e4q110', 'v4e4q111', '9: Directed graph with four edges and 6 and 11 forbidden vertex');
+SELECT set_eq('v4e4q110', 'v4e4q111', 'FOUR EDGES 11: Directed graph with four edges and 6 and 11 forbidden vertex');
SELECT finish();
-ROLLBACK;
\ No newline at end of file
+ROLLBACK;
diff --git a/src/contraction/test/proof_of_concept.test.sql b/src/contraction/test/proof_of_concept.test.sql
index 377e306..4d045f1 100644
--- a/src/contraction/test/proof_of_concept.test.sql
+++ b/src/contraction/test/proof_of_concept.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
\echo Adding an additional column to store if its part of the contracted graph
ALTER TABLE edge_table ADD is_contracted BOOLEAN DEFAULT false;
@@ -87,4 +86,3 @@ SELECT * FROM pgr_dijkstra($$
AND is_contracted=false$$,
3, 9, false);
-ROLLBACK;
diff --git a/src/contraction/test/proof_of_concept_1.test.sql b/src/contraction/test/proof_of_concept_1.test.sql
index dfdbead..7ac86c3 100644
--- a/src/contraction/test/proof_of_concept_1.test.sql
+++ b/src/contraction/test/proof_of_concept_1.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
\echo Adding an additional column to store if its part of the contracted graph
ALTER TABLE edge_table ADD is_contracted BOOLEAN DEFAULT false;
@@ -67,4 +66,3 @@ SELECT * FROM
pgr_dijkstra('SELECT id, source, target, cost, reverse_cost FROM edge_table where source IN (3, 5, 6, 7, 8, 9, 11, 15, 17) AND target IN (3, 5, 6, 7, 8, 9, 11, 15, 17) AND is_contracted=false',
3, 9, false);
-ROLLBACK;
diff --git a/src/contraction/test/return_types.test.sql b/src/contraction/test/return_types.test.sql
index af2afa9..58014e0 100644
--- a/src/contraction/test/return_types.test.sql
+++ b/src/contraction/test/return_types.test.sql
@@ -7,7 +7,6 @@ int (-2,147,483,648) to (2,147,483,647)
/*
Testing for ids > 10^8
*/
-BEGIN;
\echo --q1
UPDATE edge_table
@@ -68,4 +67,3 @@ SELECT * FROM pgr_contractGraph(
\echo --q11
-ROLLBACK;
\ No newline at end of file
diff --git a/src/contraction/test/test.conf b/src/contraction/test/test.conf
index 8459b76..4e98f98 100644
--- a/src/contraction/test/test.conf
+++ b/src/contraction/test/test.conf
@@ -13,6 +13,8 @@
expand_graph
doc-contraction
directed-development
+ directed-deadend
+ directed-linear
doc-contractGraph
)],
diff --git a/src/convenience/doc/doc-conversion.queries b/src/convenience/doc/doc-conversion.queries
index 9e78e5e..083eeda 100644
--- a/src/convenience/doc/doc-conversion.queries
+++ b/src/convenience/doc/doc-conversion.queries
@@ -1,25 +1,3 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License AS published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
BEGIN;
BEGIN
SET client_min_messages TO NOTICE;
@@ -82,6 +60,7 @@ SELECT * FROM pgr_pointstovids(
'edge_table'
);
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
pgr_pointstovids
------------------
{1,2,3,5}
diff --git a/src/convenience/doc/doc-matrix.queries b/src/convenience/doc/doc-matrix.queries
index d96de48..179cf13 100644
--- a/src/convenience/doc/doc-matrix.queries
+++ b/src/convenience/doc/doc-matrix.queries
@@ -19,6 +19,7 @@ SELECT * from pgr_tsp(
);
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deprecated function pgr_pointsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
seq | id
-----+----
0 | 1
@@ -46,6 +47,7 @@ SELECT * FROM pgr_vidstodmatrix(
'edge_table');
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
NOTICE: Deprecated function pgr_vidsToDMatrix
dmatrix | ids
-------------------------------------------+-----------
@@ -63,7 +65,9 @@ SELECT * FROM pgr_tsp(
);
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
seq | id
-----+----
0 | 1
@@ -103,6 +107,7 @@ SELECT * FROM pgr_tsp(
1
);
NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
seq | id
-----+----
0 | 1
diff --git a/src/convenience/doc/pgr_flipEdges.rst b/src/convenience/doc/pgr_flipEdges.rst
deleted file mode 100644
index 849ace7..0000000
--- a/src/convenience/doc/pgr_flipEdges.rst
+++ /dev/null
@@ -1,73 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_flip_edges:
-
-pgr_flipEdges - Deprecated Function
-==============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_flipEdges`` - flip the edges in an array of geometries so the connect end to end.
-
-Synopsis
-------------------------------------------------------------------------------
-
-The function returns:
-
- - ``geometry[]`` An array of the input geometries with the geometries flipped end to end such that the geometries are oriented as a path from start to end.
-
-.. code-block:: sql
-
- geometry[] pgr_flipEdges(ga geometry[])
-
-
-Description
------------------------------------------------------------------------------
-
-Given an array of linestrings that are supposedly connected end to end like the results of a route, check the edges and flip any end for end if they do not connect with the previous seegment and return the array with the segments flipped as appropriate.
-
-.. rubric:: Parameters
-
-:ga: ``geometry[]`` An array of geometries, like the results of a routing query.
-
-.. warning::
-
- * No checking is done for edges that do not connect.
- * Input geometries MUST be LINESTRING or MULTILINESTRING.
- * Only the first LINESTRING of a MULTILINESTRING is considered.
-
-.. rubric:: History
-
-* Deprecated in version 2.3.0
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-.. literalinclude:: doc-conversion.queries
- :start-after: --q2
- :end-before: --q3
-
-See also
---------
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/src/convenience/doc/pgr_pointToEdgeNode.rst b/src/convenience/doc/pgr_pointToEdgeNode.rst
index 64bc55b..72ef049 100644
--- a/src/convenience/doc/pgr_pointToEdgeNode.rst
+++ b/src/convenience/doc/pgr_pointToEdgeNode.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -21,9 +21,9 @@ Name
``pgr_pointToEdgeNode`` - Converts a point to a ``vertex_id`` based on closest edge.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
Synopsis
@@ -78,8 +78,6 @@ The example uses the :ref:`sampledata` network.
See Also
-----------------------------------------------------------------------------
-* :ref:`pgr_points_to_vids` - convert an array of point geometries into vertex ids.
-
.. rubric:: Indices and tables
diff --git a/src/convenience/doc/pgr_pointsToDMatrix.rst b/src/convenience/doc/pgr_pointsToDMatrix.rst
deleted file mode 100644
index 2a5f35d..0000000
--- a/src/convenience/doc/pgr_pointsToDMatrix.rst
+++ /dev/null
@@ -1,84 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_points_to_dmatrix:
-
-pgr_pointsToDMatrix - Deprecated Function
-==============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_pointsToDMatrix`` - Creates a distance matrix from an array of points.
-
-Synopsis
-------------------------------------------------------------------------------
-
-Create a distance symmetric distance matrix suitable for TSP using Euclidean distances based on the st_distance(). You might want to create a variant of this the uses st_distance_sphere() or st_distance_spheriod() or some other function.
-
-The function returns:
-
- - ``record`` - with two fields as describe here
- * :dmatrix: ``float8[]`` - the distance matrix suitable to pass to pgrTSP() function.
- * :ids: ``integer[]`` - an array of ids for the distance matrix.
-
-.. code-block:: sql
-
- record pgr_pointsToDMatrix(pnts geometry[], OUT dmatrix double precision[], OUT ids integer[])
-
-
-Description
------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:pnts: ``geometry[]`` - An array of point geometries.
-
-.. warning::
-
- The generated matrix will be symmetric as required for pgr_TSP.
-
-.. rubric:: History
-
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q1
- :end-before: --q1.1
-
-This example shows how this can be used in the context of feeding the results into pgr_tsp() function.
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q1.1
- :end-before: --q2
-
-
-See Also
------------------------------------------------------------------------------
-
-* :ref:`pgr_vids_to_dmatrix2`
-* :ref:`pgr_vids_to_dmatrix`
-* :ref:`pgr_tsp-V2.0`
-
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/src/convenience/doc/pgr_pointsToVids.rst b/src/convenience/doc/pgr_pointsToVids.rst
deleted file mode 100644
index f9fc384..0000000
--- a/src/convenience/doc/pgr_pointsToVids.rst
+++ /dev/null
@@ -1,83 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_points_to_vids:
-
-pgr_pointsToVids - Proposed
-==============================================================================
-
-.. index::
- single: pointsToVids(Complete Signature) --proposed
-
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_pointsToVids`` - Converts an array of point geometries into vertex ids.
-
-
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
-
-
-Synopsis
-------------------------------------------------------------------------------
-
-Given an array of point geometries and an edge table and a max search tol distance the function converts points into vertex ids using pgr_pointtoedgenode().
-
-The function returns:
-
- - ``integer[]`` - An array of ``vertex_id``.
-
-.. code-block:: sql
-
- integer[] pgr_pointsToVids(pnts geometry[], edges text, tol float8 DEFAULT(0.01))
-
-
-Description
------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:pnts: ``geometry[]`` - An array of point geometries.
-:edges: ``text`` - The edge table to be used for the conversion.
-:tol: ``float8`` - The maximum search distance for locating the closest edge.
-
-.. warning::
-
- You need to check the results for any vids=-1 which indicates if failed to locate an edge.
-
-.. rubric:: History
-
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-.. literalinclude:: doc-conversion.queries
- :start-after: --q4
- :end-before: --q5
-
-
-This example uses the :ref:`sampledata` network.
-
-
-See Also
------------------------------------------------------------------------------
-
-* :ref:`pgr_point_to_edgenode` - convert a point geometry to the closest vertex_id of an edge..
-
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/src/convenience/doc/pgr_textToPoints.rst b/src/convenience/doc/pgr_textToPoints.rst
deleted file mode 100644
index 2467443..0000000
--- a/src/convenience/doc/pgr_textToPoints.rst
+++ /dev/null
@@ -1,71 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_text_to_points:
-
-pgr_textToPoints - Deprecated Function
-==============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_textToPoints`` - Converts a text string of the format "x,y;x,y;x,y;..." into and array of point geometries.
-
-Synopsis
-------------------------------------------------------------------------------
-
-Given a text string of the format "x,y;x,y;x,y;..." and the srid to use, split the string and create and array point geometries.
-
-The function returns:
-
- -
-
-.. code-block:: sql
-
- integer pgr_textToPoints(pnts text, srid integer DEFAULT(4326))
-
-
-Description
------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:pnts: ``text`` A text string of the format "x,y;x,y;x,y;..." where x is longitude and y is latitude if use values in lat-lon.
-:srid: ``integer`` The SRID to use when constructing the point geometry. If the paratmeter is absent it defaults to ``SRID:4326``.
-
-.. rubric:: History
-
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-.. literalinclude:: doc-conversion.queries
- :start-after: --q3
- :end-before: --q4
-
-
-See Also
------------------------------------------------------------------------------
-
-* :ref:`pgr_point_to_edgenode`
-* :ref:`pgr_points_to_vids`
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
-
diff --git a/src/convenience/doc/pgr_vidsToDMatrix.rst b/src/convenience/doc/pgr_vidsToDMatrix.rst
deleted file mode 100644
index 899165c..0000000
--- a/src/convenience/doc/pgr_vidsToDMatrix.rst
+++ /dev/null
@@ -1,101 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_vids_to_dmatrix:
-
-pgr_vidsToDMatrix - Deprecated Function
-==============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_vidsToDMatrix`` - Creates a distances matrix from an array of ``vertex_id``.
-
-Synopsis
-------------------------------------------------------------------------------
-
-This function takes an array of ``vertex_id``, the original array of points used to generate the array of ``vertex_id``, an edge table name and a tol. It then computes kdijkstra() distances for each vertex to all the other vertices and creates a symmetric distance matrix suitable for TSP. The pnt array and the tol are used to establish a BBOX for limiting selection of edges. The extents of the points is expanded by tol.
-
-The function returns:
-
- - ``record`` - with two fields as describe here
- * :dmatrix: ``float8[]`` - the distance matrix suitable to pass to pgrTSP() function.
- * :ids: ``integer[]`` - an array of ids for the distance matrix.
-
-
-.. code-block:: sql
-
- record pgr_vidsToDMatrix(IN vids integer[], IN pnts geometry[], IN edges text, tol float8 DEFAULT(0.1), OUT dmatrix double precision[], OUT ids integer[])
-
-
-Description
------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:vids: ``integer[]`` - An array of ``vertex_id``.
-:pnts: ``geometry[]`` - An array of point geometries that approximates the extents of the ``vertex_id``.
-:edges: ``text`` - The edge table to be used for the conversion.
-:tol: ``float8`` - The amount to expand the BBOX extents of ``pnts`` when building the graph.
-
-.. warning::
-
- * we compute a symmetric matrix because TSP requires that so the distances are better the Euclidean but but are not perfect
- * kdijkstra() can fail to find a path between some of the vertex ids. We to not detect this other than the cost might get set to -1.0, so the dmatrix should be checked for this as it makes it invalid for TSP
-
-.. rubric:: History
-
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-This example uses existing data of points.
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q2
- :end-before: --q2.1
-
-This example uses points that are not part of the graph.
- - :ref:`pgr_text_to_points` - is used to convert the locations into point geometries.
- - :ref:`pgr_points_to_vids` - to convert the array of point geometries into vertex ids.
-
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q2.1
- :end-before: --q2.2
-
-
-This example shows how this can be used in the context of feeding the results into pgr_tsp() function.
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q2.2
- :end-before: --q3
-
-This example uses the :ref:`sampledata` network.
-
-
-See Also
------------------------------------------------------------------------------
-
-* :ref:`pgr_vids_to_dmatrix2`
-* :ref:`pgr_text_to_points`
-* :ref:`pgr_tsp-V2.0`
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
diff --git a/src/convenience/doc/pgr_vidsToDMatrix2.rst b/src/convenience/doc/pgr_vidsToDMatrix2.rst
deleted file mode 100644
index 880b52f..0000000
--- a/src/convenience/doc/pgr_vidsToDMatrix2.rst
+++ /dev/null
@@ -1,92 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_vids_to_dmatrix2:
-
-pgr_vidsToDMatrix - Deprecated Function
-==============================================================================
-
-.. warning:: This function is deprecated!!!
-
- * Is no longer supported.
- * May be removed from future versions.
- * There is no replacement.
-
-Name
-------------------------------------------------------------------------------
-
-``pgr_vidsToDMatrix`` - Creates a distances matrix from an array of ``vertex_id``.
-
-Synopsis
-------------------------------------------------------------------------------
-
-This function takes an array of ``vertex_id``, a ``sql`` statement to select the edges, and some boolean arguments to control the behavior. It then computes kdijkstra() distances for each vertex to all the other vertices and creates a distance matrix suitable for TSP.
-
-The function returns:
-
- * :dmatrix: ``float8[]`` - the distance matrix suitable to pass to pgr_TSP() function.
-
-.. code-block:: sql
-
- pgr_vidsToDMatrix(IN sql text, IN vids integer[], IN directed boolean, IN has_reverse_cost boolean, IN want_symmetric boolean, OUT dmatrix double precision[])
-
-
-
-Description
------------------------------------------------------------------------------
-
-.. rubric:: Parameters
-
-:sql: ``text`` - A SQL statement to select the edges needed for the solution.
-:vids: ``integer[]`` - An array of ``vertex_id``.
-:directed: ``boolean`` - A flag to indicate if the graph is directed.
-:has_reverse_cost: ``boolean`` - A flag to indicate if the SQL has a column ``reverse_cost``.
-:want_symmetric: ``boolean`` - A flag to indicate if you want a symmetric or asymmetric matrix. You will need a symmetric matrix for pgr_TSP(). If the matriix is asymmetric, the then the cell(i,j) and cell(j,i) will be set to the average of those two cells except if one or the other are -1.0 then it will take the value of the other cell. If both are negative they will be left alone.
-
-.. warning::
-
- * kdijkstra() can fail to find a path between some of the vertex ids. We to not detect this other than the cost might get set to -1.0, so the dmatrix should be checked for this as it makes it invalid for TSP
-
-
-
-.. rubric:: History
-
-* Proposed in version 2.1.0
-
-
-Examples
------------------------------------------------------------------------------
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q3
- :end-before: --q4
-
-
-This example shows how this can be used in the context of feeding the results into pgr_tsp() function.
-
-.. literalinclude:: doc-matrix.queries
- :start-after: --q4
- :end-before: --q5
-
-
-This example uses the :ref:`sampledata` network.
-
-
-See Also
------------------------------------------------------------------------------
-
-* :ref:`pgr_vids_to_dmatrix`
-* :ref:`pgr_text_to_points`
-* :ref:`pgr_tsp-V2.0`
-
-
-.. rubric:: Indices and tables
-
-* :ref:`genindex`
-* :ref:`search`
diff --git a/src/convenience/sql/CMakeLists.txt b/src/convenience/sql/CMakeLists.txt
index 00ee38f..afc5cc9 100644
--- a/src/convenience/sql/CMakeLists.txt
+++ b/src/convenience/sql/CMakeLists.txt
@@ -2,7 +2,6 @@
LIST(APPEND PACKAGE_SQL_FILES
${CMAKE_CURRENT_SOURCE_DIR}/pgrouting_conversion_tools.sql
${CMAKE_CURRENT_SOURCE_DIR}/pgrouting_dmatrix_tools.sql
- ${CMAKE_CURRENT_SOURCE_DIR}/pgr_fakeContraction.sql
${CMAKE_CURRENT_SOURCE_DIR}/pgr_vidsToDMatrix.sql
)
diff --git a/src/convenience/sql/pgr_fakeContraction.sql b/src/convenience/sql/pgr_fakeContraction.sql
deleted file mode 100644
index 365cffc..0000000
--- a/src/convenience/sql/pgr_fakeContraction.sql
+++ /dev/null
@@ -1,56 +0,0 @@
-create type contraction_vertex as (seq int, id int, type char, contracted text);
-create or replace function pgr_fakeContraction(edges text, ch_order integer[])
- returns setof contraction_vertex as
-$body$
-declare
- cv contraction_vertex%ROWTYPE;
- row record;
-begin
- if ch_order = ARRAY[1] then
- -- dealing with dead end contraction
- for row in SELECT * FROM (
- VALUES
- (1, 2, 'v', '{1}'),
- (2, 3, 'v', '{}'),
- (3, 4, 'v', '{}'),
- (4, 5, 'v', '{7, 8}'),
- (5, 6, 'v', '{}'),
- (6, 9, 'v', '{}'),
- (7, 10, 'v', '{13}'),
- (8, 11, 'v', '{}'),
- (9, 13, 'v', '{}'),
- (10, 15, 'v', '{14}'),
- (11, 17, 'v', '{16}'))
- AS t (seq, id, type, contracted) loop
- cv.seq := row.seq;
- cv.id := row.id;
- cv.type := row.type;
- cv.contracted := row.contracted;
- return next cv;
- end loop;
- end if;
- if ch_order = ARRAY[1, 2] then
- -- dealing with dead end and linear contraction
- for row in SELECT * FROM (
- VALUES
- (1, -1, 'e', '{1, 2}'),
- (2, -2, 'e', '{4}'),
- (3, -3, 'e', '{10, 13}'),
- (4, -4, 'e', '{12}'),
- (5, 5, 'v', '{7, 8}'),
- (6, 6, 'v', '{}'),
- (7, 9, 'v', '{}'),
- (8, 11, 'v', '{}'),
- (9, 15, 'v', '{14}'),
- (10, 17, 'v', '{16}'))
- AS t (seq, id, type, contracted) loop
- cv.seq := row.seq;
- cv.id := row.id;
- cv.type := row.type;
- cv.contracted := row.contracted;
- return next cv;
- end loop;
- end if;
-end;
-$body$
-language 'plpgsql' ;
diff --git a/src/convenience/sql/pgrouting_conversion_tools.sql b/src/convenience/sql/pgrouting_conversion_tools.sql
index 57a0ba5..ca9a58d 100644
--- a/src/convenience/sql/pgrouting_conversion_tools.sql
+++ b/src/convenience/sql/pgrouting_conversion_tools.sql
@@ -173,6 +173,7 @@ declare
g geometry;
begin
+ RAISE NOTICE 'Deperecated function: pgr_pointsToVids';
-- cycle through each point and locate the nearest edge and vertex on that edge
for g in select unnest(pnts) loop
v := v || pgr_pointtoedgenode(edges, g, tol);
diff --git a/src/convenience/test/doc-conversion.result b/src/convenience/test/doc-conversion.result
index 574fcd2..c7db8f3 100644
--- a/src/convenience/test/doc-conversion.result
+++ b/src/convenience/test/doc-conversion.result
@@ -21,5 +21,6 @@ POINT(3 1)
POINT(2 2)
--q4
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
{1,2,3,5}
--q5
diff --git a/src/convenience/test/doc-conversion.test.sql b/src/convenience/test/doc-conversion.test.sql
index 4514499..5a49f71 100644
--- a/src/convenience/test/doc-conversion.test.sql
+++ b/src/convenience/test/doc-conversion.test.sql
@@ -1,27 +1,3 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License AS published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-BEGIN;
-SET client_min_messages TO NOTICE;
\echo --q1
SELECT * FROM pgr_pointtoedgenode('edge_table', 'POINT(2 0)'::geometry, 0.02);
SELECT * FROM pgr_pointtoedgenode('edge_table', 'POINT(3 2)'::geometry, 0.02);
@@ -48,4 +24,3 @@ SELECT * FROM pgr_pointstovids(
'edge_table'
);
\echo --q5
-ROLLBACK;
diff --git a/src/convenience/test/doc-matrix.result b/src/convenience/test/doc-matrix.result
index 8493a2b..1a5b06e 100644
--- a/src/convenience/test/doc-matrix.result
+++ b/src/convenience/test/doc-matrix.result
@@ -5,6 +5,7 @@ NOTICE: Deprecated function pgr_pointsToDMatrix
--q1.1
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deprecated function pgr_pointsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|3
2|2
@@ -15,12 +16,15 @@ NOTICE: Deprecated function pgr_vidsToDMatrix
--q2.1
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
NOTICE: Deprecated function pgr_vidsToDMatrix
{{0,1,4,2},{1,0,3,1},{4,3,0,2},{2,1,2,0}}|{1,2,3,5}
--q2.2
NOTICE: Deperecated function: pgr_textToPoints
NOTICE: Deperecated function: pgr_textToPoints
+NOTICE: Deperecated function: pgr_pointsToVids
NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|2
2|3
@@ -32,6 +36,7 @@ NOTICE: Deprecated function pgr_vidsToDMatrix
{{0,1,2,2},{1,0,1,1},{2,1,0,2},{2,1,2,0}}
--q4
NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|2
2|3
diff --git a/src/convenience/test/doc-matrix.test.sql b/src/convenience/test/doc-matrix.test.sql
index 362dcae..94b2263 100644
--- a/src/convenience/test/doc-matrix.test.sql
+++ b/src/convenience/test/doc-matrix.test.sql
@@ -1,6 +1,3 @@
-BEGIN;
-
-SET client_min_messages TO NOTICE;
\echo --q1
SELECT * FROM pgr_pointstodmatrix(pgr_texttopoints('2,0;2,1;3,1;2,2', 0));
@@ -56,4 +53,3 @@ SELECT * FROM pgr_tsp(
);
\echo --q5
-ROLLBACK;
diff --git a/src/convenience/test/test.conf b/src/convenience/test/test.conf
index a4011ac..ffac8cb 100644
--- a/src/convenience/test/test.conf
+++ b/src/convenience/test/test.conf
@@ -6,9 +6,11 @@
'data' => ['sampledata.data'],
'tests' => [qw(
vidstodmatrix-any-01
- doc-matrix
doc-conversion
)],
+ 'linux' => [qw(
+ doc-matrix
+ )],
'documentation' => [qw(
doc-matrix
diff --git a/src/convenience/test/vidstodmatrix-any-01.test.sql b/src/convenience/test/vidstodmatrix-any-01.test.sql
index db1a2ed..c3ea7bf 100644
--- a/src/convenience/test/vidstodmatrix-any-01.test.sql
+++ b/src/convenience/test/vidstodmatrix-any-01.test.sql
@@ -21,7 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-BEGIN;
SET client_min_messages TO NOTICE;
select * from pgr_vidsToDMatrix(
'select id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost from edge_table',
@@ -32,4 +31,3 @@ SET client_min_messages TO NOTICE;
'select id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost from edge_table',
array[1,5,13,11,12,4],
true, true, true);
- ROLLBACK;
diff --git a/src/costMatrix/doc/costMatrix.rst b/src/costMatrix/doc/cost-category.rst
similarity index 59%
copy from src/costMatrix/doc/costMatrix.rst
copy to src/costMatrix/doc/cost-category.rst
index 3b01c49..83bff70 100644
--- a/src/costMatrix/doc/costMatrix.rst
+++ b/src/costMatrix/doc/cost-category.rst
@@ -7,52 +7,35 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
-.. _CostMatrix:
+.. _Cost:
-Cost Matrix
+Cost - Category
===============================================================================
- - :ref:`pgr_dijkstraCostMatrix`
- - :ref:`pgr_withPointsCostMatrix`
+.. index from here
+* :ref:`pgr_aStarCost`
+* :ref:`pgr_dijkstraCost`
+* :ref:`pgr_withPointsCost`
-.. include:: ../../proposedNext.rst
+.. index to here
+
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-
-
General Information
-------------------------------------------------------------------------------
-Sinopsis
-...................
-
-:ref:`tsp` needs as input a symmetric cost matrix and no edge `(u, v)` must value :math:`\infty`.
-
-This collection of functions will return a cost matrix in form of a table.
-
Characteristics
................
The main Characteristics are:
-* Can be used as input to :ref:`pgr_tsp`.
-
- * :directly: when the resulting matrix is symmetric and there is no :math:`\infty` value.
- * It will be the users responsibility to make the matrix symmetric.
-
- * By using geometric or harmonic average of the non symmetric values.
- * By using max or min the non symmetric values.
- * By setting the upper triangle to be the mirror image of the lower triangle.
- * By setting the lower triangle to be the mirror image of the upper triangle.
-
- * It is also the users responsibility to fix an :math:`\infty` value.
-
* Each function works as part of the family it belongs to.
* It does not return a path.
-* Returns the sum of the costs of the shortest path for pair combination of nodes in the graph.
+* Returns the sum of the costs of the resulting path(s) for pair combination of nodes in the graph.
* Process is done only on edges with positive costs.
* Values are returned when there is a path.
@@ -72,22 +55,18 @@ The main Characteristics are:
* The `agg_cost` of `(u, v)` is the same as for `(v, u)`.
-* Any duplicated value in the `start_vids` are ignored.
+* Any duplicated value in the `start_vids` or in `end_vids` are ignored.
* The returned values are ordered:
* `start_vid` ascending
* `end_vid` ascending
-* Running time: approximately :math:`O(| start\_vids | * (V \log V + E))`
-
See Also
................
-* :ref:`pgr_tsp`
-
.. rubric:: Indices and tables
* :ref:`genindex`
diff --git a/src/costMatrix/doc/costMatrix.rst b/src/costMatrix/doc/costMatrix-category.rst
similarity index 90%
rename from src/costMatrix/doc/costMatrix.rst
rename to src/costMatrix/doc/costMatrix-category.rst
index 3b01c49..c6b3e78 100644
--- a/src/costMatrix/doc/costMatrix.rst
+++ b/src/costMatrix/doc/costMatrix-category.rst
@@ -9,23 +9,33 @@
.. _CostMatrix:
-Cost Matrix
+Cost Matrix - Category
===============================================================================
- - :ref:`pgr_dijkstraCostMatrix`
- - :ref:`pgr_withPointsCostMatrix`
+.. index from here
+* :ref:`pgr_aStarCostMatrix`
+* :ref:`pgr_dijkstraCostMatrix`
+* :ref:`pgr_withPointsCostMatrix`
-.. include:: ../../proposedNext.rst
+.. index to here
+
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
+.. toctree::
+ :hidden:
+
+ pgr_aStarCostMatrix
+ pgr_dijkstraCostMatrix
+ pgr_withPointsCostMatrix
+
-
General Information
-------------------------------------------------------------------------------
-Sinopsis
+Synopsis
...................
:ref:`tsp` needs as input a symmetric cost matrix and no edge `(u, v)` must value :math:`\infty`.
diff --git a/src/costMatrix/doc/doc-pgr_fooDmatrix.queries b/src/costMatrix/doc/doc-pgr_fooDmatrix.queries
index 59da6ee..8fe65ed 100644
--- a/src/costMatrix/doc/doc-pgr_fooDmatrix.queries
+++ b/src/costMatrix/doc/doc-pgr_fooDmatrix.queries
@@ -1,6 +1,6 @@
BEGIN;
BEGIN
-SET client_min_messages TO WARNING;
+SET client_min_messages TO NOTICE;
SET
-- dijkstra q1
SELECT * FROM pgr_dijkstraCostMatrix(
@@ -128,5 +128,69 @@ SELECT * FROM pgr_TSP(
(5 rows)
-- withPoints q4
+-- astar q1
+SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5)
+);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 1 | 2 | 1
+ 1 | 3 | 6
+ 1 | 4 | 5
+ 2 | 1 | 1
+ 2 | 3 | 5
+ 2 | 4 | 4
+ 3 | 1 | 2
+ 3 | 2 | 1
+ 3 | 4 | 3
+ 4 | 1 | 3
+ 4 | 2 | 2
+ 4 | 3 | 1
+(12 rows)
+
+-- astar q2
+SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
+ directed := false, heuristic := 2
+);
+ start_vid | end_vid | agg_cost
+-----------+---------+----------
+ 1 | 2 | 1
+ 1 | 3 | 2
+ 1 | 4 | 3
+ 2 | 1 | 1
+ 2 | 3 | 1
+ 2 | 4 | 2
+ 3 | 1 | 2
+ 3 | 2 | 1
+ 3 | 4 | 1
+ 4 | 1 | 3
+ 4 | 2 | 2
+ 4 | 3 | 1
+(12 rows)
+
+-- astar q3
+SELECT * FROM pgr_TSP(
+ $$
+ SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
+ directed:= false, heuristic := 2
+ )
+ $$,
+ randomize := false
+);
+ seq | node | cost | agg_cost
+-----+------+------+----------
+ 1 | 1 | 1 | 0
+ 2 | 2 | 1 | 1
+ 3 | 3 | 1 | 2
+ 4 | 4 | 3 | 3
+ 5 | 1 | 0 | 6
+(5 rows)
+
+-- astar q4
ROLLBACK;
ROLLBACK
diff --git a/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst b/src/costMatrix/doc/pgr_aStarCostMatrix.rst
similarity index 55%
copy from src/costMatrix/doc/pgr_dijkstraCostMatrix.rst
copy to src/costMatrix/doc/pgr_aStarCostMatrix.rst
index 30494ce..2d5eaeb 100644
--- a/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst
+++ b/src/costMatrix/doc/pgr_aStarCostMatrix.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -7,40 +7,42 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
-.. _pgr_dijkstraCostMatrix:
+.. _pgr_aStarCostMatrix:
-pgr_dijkstraCostMatrix - proposed
+pgr_aStarCostMatrix - proposed
===============================================================================
Name
-------------------------------------------------------------------------------
-``pgr_dijkstraCostMatrix`` - Calculates the a cost matrix using pgr_dijktras.
+``pgr_aStarCostMatrix`` - Calculates the a cost matrix using :ref:`pgr_aStar`.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.4.0
+
Synopsis
-------------------------------------------------------------------------------
-Using Dijkstra algorithm, calculate and return a cost matrix.
+Using aStar algorithm, calculate and return a cost matrix.
Signature Summary
-----------------
.. code-block:: none
- pgr_dijkstraCostMatrix(edges_sql, start_vids)
- pgr_dijkstraCostMatrix(edges_sql, start_vids, directed)
+ pgr_aStarCostMatrix(edges_sql, vids)
+ pgr_aStarCostMatrix(edges_sql, vids, directed, heuristic, factor, epsilon)
RETURNS SET OF (start_vid, end_vid, agg_cost)
@@ -49,7 +51,7 @@ Signatures
-------------------------------------------------------------------------------
.. index::
- single: dijkstraCostMatrix(Minimal Use) - Proposed
+ single: aStarCostMatrix(Minimal Use) - Proposed
Minimal Signature
...............................................................................
@@ -59,7 +61,7 @@ The minimal signature:
.. code-block:: none
- pgr_dijkstraCostMatrix(edges_sql, start_vid)
+ pgr_aStarCostMatrix(edges_sql, vids)
RETURNS SET OF (start_vid, end_vid, agg_cost)
@@ -67,19 +69,19 @@ The minimal signature:
.. literalinclude:: doc-pgr_fooDmatrix.queries
- :start-after: -- dijkstra q1
- :end-before: -- dijkstra q2
+ :start-after: -- astar q1
+ :end-before: -- astar q2
.. index::
- single: dijkstraCostMatrix(Complete Signature) - Proposed
+ single: aStarCostMatrix(Complete Signature) - Proposed
Complete Signature
...............................................................................
.. code-block:: none
- pgr_dijkstraCostMatrix(edges_sql, start_vids, directed:=true)
+ pgr_aStarCostMatrix(edges_sql, vids, directed, heuristic, factor, epsilon)
RETURNS SET OF (start_vid, end_vid, agg_cost)
@@ -88,17 +90,16 @@ Complete Signature
This example returns a symmetric cost matrix.
.. literalinclude:: doc-pgr_fooDmatrix.queries
- :start-after: -- dijkstra q2
- :end-before: -- dijkstra q3
+ :start-after: -- astar q2
+ :end-before: -- astar q3
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
- :start-after: basic_edges_sql_start
- :end-before: basic_edges_sql_end
-
+.. include:: pgRouting-concepts.rst
+ :start-after: xy_edges_sql_start
+ :end-before: xy_edges_sql_end
Description of the parameters of the signatures
@@ -108,15 +109,31 @@ Description of the parameters of the signatures
Parameter Type Description
================ ====================== =================================================
**edges_sql** ``TEXT`` Edges SQL query as described above.
-**start_vids** ``ARRAY[ANY-INTEGER]`` Array of identifiers of the vertices.
-**directed** ``BOOLEAN`` (optional). When ``false`` the graph is considered as Undirected. Default is ``true`` which considers the graph as Directed.
+**vids** ``ARRAY[ANY-INTEGER]`` Array of vertices_identifiers.
+**directed** ``BOOLEAN`` - Optional.
+
+ - When ``false`` the graph is considered as Undirected.
+ - Default is ``true`` which considers the graph as Directed.
+
+**heuristic** ``INTEGER`` (optional). Heuristic number. Current valid values 0~5. Default ``5``
+
+ - 0: h(v) = 0 (Use this value to compare with pgr_dijkstra)
+ - 1: h(v) abs(max(dx, dy))
+ - 2: h(v) abs(min(dx, dy))
+ - 3: h(v) = dx * dx + dy * dy
+ - 4: h(v) = sqrt(dx * dx + dy * dy)
+ - 5: h(v) = abs(dx) + abs(dy)
+
+**factor** ``FLOAT`` (optional). For units manipulation. :math:`factor > 0`. Default ``1``.
+**epsilon** ``FLOAT`` (optional). For less restricted results. :math:`epsilon >= 1`. Default ``1``.
================ ====================== =================================================
-.. Description of the return values
+.. include:: pgRouting-concepts.rst
+ :start-after: return_cost_start
+ :end-before: return_cost_end
-.. include:: dmatrix_return_values.txt
Examples
@@ -125,14 +142,14 @@ Examples
:Example: Use with tsp
.. literalinclude:: doc-pgr_fooDmatrix.queries
- :start-after: -- dijkstra q3
- :end-before: -- dijkstra q4
+ :start-after: -- astar q3
+ :end-before: -- astar q4
See Also
-------------------------------------------------------------------------------
-* :ref:`dijkstra`
+* :ref:`astar`
* :ref:`costMatrix`
* :ref:`tsp`
* The queries use the :ref:`sampledata` network.
diff --git a/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst b/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst
index 30494ce..c7cc3f4 100644
--- a/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst
+++ b/src/costMatrix/doc/pgr_dijkstraCostMatrix.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -18,17 +18,18 @@ Name
``pgr_dijkstraCostMatrix`` - Calculates the a cost matrix using pgr_dijktras.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.3.0
+
Synopsis
-------------------------------------------------------------------------------
@@ -95,7 +96,7 @@ This example returns a symmetric cost matrix.
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
@@ -113,10 +114,9 @@ Parameter Type Description
================ ====================== =================================================
-
-.. Description of the return values
-
-.. include:: dmatrix_return_values.txt
+.. include:: pgRouting-concepts.rst
+ :start-after: return_cost_start
+ :end-before: return_cost_end
Examples
diff --git a/src/costMatrix/doc/pgr_withPointsCostMatrix.rst b/src/costMatrix/doc/pgr_withPointsCostMatrix.rst
index 4217401..1a11c6f 100644
--- a/src/costMatrix/doc/pgr_withPointsCostMatrix.rst
+++ b/src/costMatrix/doc/pgr_withPointsCostMatrix.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,17 +19,19 @@ Name
``pgr_withPointsCostMatrix`` - Calculates the shortest path and returns only the aggregate cost of the shortest path(s) found, for the combination of points given.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Signature Summary
-------------------------------------------------------------------------------
@@ -40,7 +42,7 @@ Signature Summary
pgr_withPointsCostMatrix(edges_sql, points_sql, start_vids, directed, driving_side)
RETURNS SET OF (start_vid, end_vid, agg_cost)
-.. note:: There is no **details** flag, unlike the other members of the withPoints family of functions.
+.. note:: There is no **details** flag, unlike the other members of the withPoints family of functions.
Signatures
@@ -101,11 +103,11 @@ Description of the Signatures
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
@@ -129,10 +131,9 @@ Parameter Type Description
================ ====================== =================================================
-
-.. Description of the return values
-
-.. include:: dmatrix_return_values.txt
+.. include:: pgRouting-concepts.rst
+ :start-after: return_cost_start
+ :end-before: return_cost_end
Examples
diff --git a/src/costMatrix/sql/CMakeLists.txt b/src/costMatrix/sql/CMakeLists.txt
index 11f8d6c..aaab586 100644
--- a/src/costMatrix/sql/CMakeLists.txt
+++ b/src/costMatrix/sql/CMakeLists.txt
@@ -2,12 +2,8 @@
LIST(APPEND PACKAGE_SQL_FILES
${CMAKE_CURRENT_SOURCE_DIR}/withPointsCostMatrix.sql
${CMAKE_CURRENT_SOURCE_DIR}/dijkstraCostMatrix.sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/astarCostMatrix.sql
- #for version 3.0
- #${CMAKE_CURRENT_SOURCE_DIR}/astarCostMatrix.sql
-
- # coded but not used
- #${CMAKE_CURRENT_SOURCE_DIR}/eucledianCostMatrix.sql
)
# set in parent scope
diff --git a/src/costMatrix/sql/eucledianCostMatrix.sql b/src/costMatrix/sql/eucledianCostMatrix.sql
deleted file mode 100644
index fbbe3db..0000000
--- a/src/costMatrix/sql/eucledianCostMatrix.sql
+++ /dev/null
@@ -1,92 +0,0 @@
--- vertices_sql has the form
--- SELECT id, the_geom FROM .....
-
-CREATE OR REPLACE FUNCTION pgr_eucledianCostMatrix(vertices_sql TEXT,
- OUT start_vid BIGINT,
- OUT end_vid BIGINT,
- OUT agg_cost DOUBLE PRECISION)
-RETURNS SETOF RECORD AS
-$BODY$
-DECLARE
- sql text;
- rec record;
- has_the_geom BOOLEAN DEFAULT false;
- has_id BOOLEAN DEFAULT false;
- has_x BOOLEAN DEFAULT false;
- has_y BOOLEAN DEFAULT false;
-
-BEGIN
-
- sql := 'CREATE TABLE ___tmp AS ' || vertices_sql ;
- EXECUTE sql;
-
- RETURN query SELECT * FROM pgr_eucledianDMatrix('___tmp'::regclass);
-
- DROP TABLE ___tmp;
- RETURN;
-
-END
-$BODY$
-language plpgsql volatile cost 10;
-
-CREATE OR REPLACE FUNCTION pgr_eucledianCostMatrix(
- vertices_sql regclass,
- OUT start_vid BIGINT,
- OUT end_vid BIGINT,
- OUT agg_cost DOUBLE PRECISION)
-RETURNS SETOF RECORD AS
-$BODY$
-DECLARE
- sql text;
- which INTEGER := 0;
- rec record;
- has_the_geom BOOLEAN DEFAULT false;
- has_id BOOLEAN DEFAULT false;
- has_x BOOLEAN DEFAULT false;
- has_y BOOLEAN DEFAULT false;
-
-BEGIN
- sql = format('SELECT id, the_geom from %I ', vertices_sql);
- BEGIN
- EXECUTE sql || 'LIMIT 1';
- which := 1;
- EXCEPTION WHEN OTHERS THEN
- which := 0;
- END;
-
- IF which = 0 THEN
- sql = format('SELECT id, x, y from %I ', vertices_sql);
- BEGIN
- EXECUTE sql || 'LIMIT 1';
- which := 2;
- EXCEPTION WHEN OTHERS THEN
- RAISE EXCEPTION 'An expected column was not found in the query (3)'
- USING HINT = 'Please verify columns: (id, the_geom) or (id, x, y) columns';
- END;
- END IF;
-
-
- IF which = 1 THEN
- sql := 'WITH
- vertices AS (' || sql || '),
- distances AS (SELECT DISTINCT a.id::BIGINT AS start_id, b.id::BIGINT as end_id, ST_Distance(a.the_geom, b.the_geom) as distance
- FROM vertices AS a, vertices AS b
- WHERE a.id != b.id
- ORDER BY start_id, end_id)
- SELECT * from distances';
- ELSE
- sql := 'WITH
- vertices AS (' || sql || '),
- distances AS (SELECT DISTINCT a.id::BIGINT AS start_id, b.id::BIGINT as end_id, ST_Distance(ST_MakePoint(a.x,a.y), ST_MakePoint(b.x,b.y)) as distance
- FROM vertices AS a, vertices AS b
- WHERE a.id != b.id
- ORDER BY start_id, end_id)
- SELECT * from distances';
- END IF;
-
- BEGIN
- RETURN query EXECUTE sql;
- END;
-END
-$BODY$
-language plpgsql volatile cost 10;
diff --git a/src/costMatrix/test/doc-pgr_fooDmatrix-mac.test.sql b/src/costMatrix/test/doc-pgr_fooDmatrix-mac.test.sql
index cacbf7f..007e026 100644
--- a/src/costMatrix/test/doc-pgr_fooDmatrix-mac.test.sql
+++ b/src/costMatrix/test/doc-pgr_fooDmatrix-mac.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
SET client_min_messages TO WARNING;
\echo -- dijkstra q1
@@ -48,4 +47,3 @@ SELECT * FROM pgr_TSP(
);
\echo -- withPoints q4
-ROLLBACK;
diff --git a/src/costMatrix/test/doc-pgr_fooDmatrix-windows.test.sql b/src/costMatrix/test/doc-pgr_fooDmatrix-windows.test.sql
index cacbf7f..007e026 100644
--- a/src/costMatrix/test/doc-pgr_fooDmatrix-windows.test.sql
+++ b/src/costMatrix/test/doc-pgr_fooDmatrix-windows.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
SET client_min_messages TO WARNING;
\echo -- dijkstra q1
@@ -48,4 +47,3 @@ SELECT * FROM pgr_TSP(
);
\echo -- withPoints q4
-ROLLBACK;
diff --git a/src/costMatrix/test/doc-pgr_fooDmatrix.result b/src/costMatrix/test/doc-pgr_fooDmatrix.result
index 5a20003..5841300 100644
--- a/src/costMatrix/test/doc-pgr_fooDmatrix.result
+++ b/src/costMatrix/test/doc-pgr_fooDmatrix.result
@@ -64,3 +64,36 @@
4|6|1.3|3.9
5|-6|0|5.2
-- withPoints q4
+-- astar q1
+1|2|1
+1|3|6
+1|4|5
+2|1|1
+2|3|5
+2|4|4
+3|1|2
+3|2|1
+3|4|3
+4|1|3
+4|2|2
+4|3|1
+-- astar q2
+1|2|1
+1|3|2
+1|4|3
+2|1|1
+2|3|1
+2|4|2
+3|1|2
+3|2|1
+3|4|1
+4|1|3
+4|2|2
+4|3|1
+-- astar q3
+1|1|1|0
+2|2|1|1
+3|3|1|2
+4|4|3|3
+5|1|0|6
+-- astar q4
diff --git a/src/costMatrix/test/doc-pgr_fooDmatrix.test.sql b/src/costMatrix/test/doc-pgr_fooDmatrix.test.sql
index cacbf7f..5a4ce39 100644
--- a/src/costMatrix/test/doc-pgr_fooDmatrix.test.sql
+++ b/src/costMatrix/test/doc-pgr_fooDmatrix.test.sql
@@ -1,6 +1,7 @@
-BEGIN;
-SET client_min_messages TO WARNING;
+------------------------
+-- dijkstra
+------------------------
\echo -- dijkstra q1
SELECT * FROM pgr_dijkstraCostMatrix(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
@@ -25,7 +26,9 @@ SELECT * FROM pgr_TSP(
);
\echo -- dijkstra q4
+------------------------
-- withPoints
+------------------------
\echo -- withPoints q1
SELECT * FROM pgr_withPointsCostMatrix(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
@@ -48,4 +51,32 @@ SELECT * FROM pgr_TSP(
);
\echo -- withPoints q4
-ROLLBACK;
+
+------------------------
+-- pgr_aStar
+------------------------
+\echo -- astar q1
+SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5)
+);
+\echo -- astar q2
+SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
+ directed := false, heuristic := 2
+);
+\echo -- astar q3
+SELECT * FROM pgr_TSP(
+ $$
+ SELECT * FROM pgr_aStarCostMatrix(
+ 'SELECT id, source, target, cost, reverse_cost, x1, y1, x2, y2 FROM edge_table',
+ (SELECT array_agg(id) FROM edge_table_vertices_pgr WHERE id < 5),
+ directed:= false, heuristic := 2
+ )
+ $$,
+ randomize := false
+);
+\echo -- astar q4
+
+
diff --git a/src/dijkstra/doc/dijkstra.rst b/src/dijkstra/doc/dijkstra-family.rst
similarity index 82%
rename from src/dijkstra/doc/dijkstra.rst
rename to src/dijkstra/doc/dijkstra-family.rst
index ddeeb89..e0dcf8e 100644
--- a/src/dijkstra/doc/dijkstra.rst
+++ b/src/dijkstra/doc/dijkstra-family.rst
@@ -12,20 +12,27 @@
Dijkstra - Family of functions
===============================================================================
- - :ref:`pgr_dijkstra` - Dijkstra's algorithm for the shortest paths.
+.. index from here
-The following algorithms are based on pgr_dijkstra
+* :ref:`pgr_dijkstra` - Dijkstra's algorithm for the shortest paths.
+* :ref:`pgr_dijkstraCost` - Get the aggregate cost of the shortest paths.
+* :ref:`pgr_dijkstraCostMatrix` - Use pgr_dijkstra to create a costs matrix.
+* :ref:`pgr_drivingDistance` - Use pgr_dijkstra to calculate catchament information.
+* :ref:`pgr_ksp` - Use Yen algorithm with pgr_dijkstra to get the K shortest paths.
+* :ref:`pgr_dijkstraVia` - Get a route of a seuence of vertices.
- - :ref:`pgr_dijkstraCost` - Get the aggregate cost of the shortest paths.
- - :ref:`pgr_drivingDistance` - Get catchament information.
- - :ref:`pgr_ksp` - Get the aggregate cost of the shortest paths.
+.. index to here
.. toctree::
:hidden:
- ./pgr_dijkstra
- ./pgr_dijkstraCost
+ pgr_dijkstra
+ pgr_dijkstraCost
+ pgr_dijkstraCostMatrix
+ pgr_drivingDistance
+ pgr_KSP
+ pgr_dijkstraVia
The problem definition (Advanced documentation)
@@ -91,11 +98,11 @@ Then:
\varnothing &\quad \text{otherwise} \\
\end{cases}
-:math:`\boldsymbol{\pi} = \{(path_\seq_i, node_i, edge_i, cost_i, agg\_cost_i)\}`
+:math:`\boldsymbol{\pi} = \{(path\_seq_i, node_i, edge_i, cost_i, agg\_cost_i)\}`
where:
- - :math:`path_\seq_i = i`
- - :math:`path_\seq_{| \pi |} = | \pi |`
+ - :math:`path\_seq_i = i`
+ - :math:`path\_seq_{| \pi |} = | \pi |`
- :math:`node_i \in V`
- :math:`node_1 = start_{vid}`
- :math:`node_{| \pi |} = end_{vid}`
@@ -107,7 +114,7 @@ where:
In other words: The algorithm returns a the shortest path between :math:`start_{vid}` and :math:`end_{vid}` , if it exists, in terms of a sequence of nodes and of edges,
- - :math:`path_\seq` indicates the relative position in the path of the :math:`node` or :math:`edge`.
+ - :math:`path\_seq` indicates the relative position in the path of the :math:`node` or :math:`edge`.
- :math:`cost` is the cost of the edge to be used to go to the next node.
- :math:`agg\_cost` is the cost from the :math:`start_{vid}` up to the node.
diff --git a/src/dijkstra/doc/doc-pgr_dijkstra.queries b/src/dijkstra/doc/doc-pgr_dijkstra.queries
index 9bd3a04..a61fe72 100644
--- a/src/dijkstra/doc/doc-pgr_dijkstra.queries
+++ b/src/dijkstra/doc/doc-pgr_dijkstra.queries
@@ -247,8 +247,8 @@ SELECT * FROM pgr_dijkstra(
-----+----------+-----------+------+------+------+----------
1 | 1 | 2 | 2 | 4 | 1 | 0
2 | 2 | 2 | 5 | -1 | 0 | 1
- 3 | 1 | 11 | 11 | 11 | 1 | 0
- 4 | 2 | 11 | 6 | 8 | 1 | 1
+ 3 | 1 | 11 | 11 | 12 | 1 | 0
+ 4 | 2 | 11 | 10 | 10 | 1 | 1
5 | 3 | 11 | 5 | -1 | 0 | 2
(5 rows)
@@ -409,8 +409,8 @@ SELECT * FROM pgr_dijkstra(
-----+----------+-----------+------+------+------+----------
1 | 1 | 2 | 2 | 4 | 1 | 0
2 | 2 | 2 | 5 | -1 | 0 | 1
- 3 | 1 | 11 | 11 | 11 | 1 | 0
- 4 | 2 | 11 | 6 | 8 | 1 | 1
+ 3 | 1 | 11 | 11 | 12 | 1 | 0
+ 4 | 2 | 11 | 10 | 10 | 1 | 1
5 | 3 | 11 | 5 | -1 | 0 | 2
(5 rows)
@@ -604,8 +604,6 @@ SELECT * FROM pgr_dijkstra(
2 | 2 | 2 | 3 | 3 | -1 | 0 | 1
(2 rows)
-SET client_min_messages TO NOTICE;
-SET
SELECT * FROM pgr_dijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
2, 3,
diff --git a/src/dijkstra/doc/doc-pgr_dijkstraCost.queries b/src/dijkstra/doc/doc-pgr_dijkstraCost.queries
index 6cb2411..ddb9a9b 100644
--- a/src/dijkstra/doc/doc-pgr_dijkstraCost.queries
+++ b/src/dijkstra/doc/doc-pgr_dijkstraCost.queries
@@ -1,5 +1,7 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_dijkstraCost(
'select id, source, target, cost, reverse_cost from edge_table',
@@ -79,5 +81,5 @@ SELECT * FROM pgr_dijkstraCost(
(6 rows)
--q8
-ROLLBACK
+ROLLBACK;
ROLLBACK
diff --git a/src/dijkstra/doc/doc-pgr_dijkstraVia.queries b/src/dijkstra/doc/doc-pgr_dijkstraVia.queries
index 3dcbdfd..241fd80 100644
--- a/src/dijkstra/doc/doc-pgr_dijkstraVia.queries
+++ b/src/dijkstra/doc/doc-pgr_dijkstraVia.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q00
SELECT * FROM pgr_dijkstraVia(
'SELECT id, source, target, cost, reverse_cost FROM edge_table order by id',
@@ -126,3 +130,5 @@ WHERE node = 9 and (agg_cost <> 0 or seq = 1);
11 | 8 | 9 | 2 | visits
(2 rows)
+ROLLBACK;
+ROLLBACK
diff --git a/src/dijkstra/doc/pgr_dijkstra.rst b/src/dijkstra/doc/pgr_dijkstra.rst
index c690894..ef8608b 100644
--- a/src/dijkstra/doc/pgr_dijkstra.rst
+++ b/src/dijkstra/doc/pgr_dijkstra.rst
@@ -15,11 +15,15 @@ pgr_dijkstra
``pgr_dijkstra`` — Returns the shortest path(s) using Dijkstra algorithm.
In particular, the Dijkstra algorithm implemented by Boost.Graph.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/dijkstra_shortest_paths.html
Boost Graph Inside
+.. rubric:: Availability
+
+* pgr_dijkstra(one to one) 2.0.0, signature change 2.1.0
+* pgr_dijkstra(other signatures) 2.1.0
Synopsis
-------------------------------------------------------------------------------
@@ -84,7 +88,7 @@ Minimal signature
pgr_dijkstra(TEXT edges_sql, BIGINT start_vid, BIGINT end_vid)
RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost) or EMPTY SET
-The minimal signature is for a **directed** graph from one ``start_vid`` to one ``end_vid``:
+The minimal signature is for a **directed** graph from one ``start_vid`` to one ``end_vid``.
:Example:
@@ -210,32 +214,34 @@ The extra ``start_vid`` and ``end_vid`` in the result is used to distinguish to
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../sql/dijkstra.sql
- :start-after: pgr_dijkstra_parameters_start
- :end-before: pgr_dijkstra_parameters_end
+.. pgr_dijkstra_parameters_start
-Description of the return values
+Description of the parameters of the signatures
...............................................................................
-Returns set of ``(seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)``
+============== ================== ======== =================================================
+Column Type Default Description
+============== ================== ======== =================================================
+**sql** ``TEXT`` SQL query as described above.
+**start_vid** ``BIGINT`` Identifier of the starting vertex of the path.
+**start_vids** ``ARRAY[BIGINT]`` Array of identifiers of starting vertices.
+**end_vid** ``BIGINT`` Identifier of the ending vertex of the path.
+**end_vids** ``ARRAY[BIGINT]`` Array of identifiers of ending vertices.
+**directed** ``BOOLEAN`` ``true`` - When ``true`` Graph is considered `Directed`
+ - When ``false`` the graph is considered as `Undirected`.
+============== ================== ======== =================================================
+
+.. pgr_dijkstra_parameters_end
+
-============== ========== =================================================
-Column Type Description
-============== ========== =================================================
-**seq** ``INT`` Sequential value starting from **1**.
-**path_seq** ``INT`` Relative position in the path. Has value **1** for the beginning of a path.
-**start_vid** ``BIGINT`` Identifier of the starting vertex. Used when multiple starting vetrices are in the query.
-**end_vid** ``BIGINT`` Identifier of the ending vertex. Used when multiple ending vertices are in the query.
-**node** ``BIGINT`` Identifier of the node in the path from ``start_vid`` to ``end_vid``.
-**edge** ``BIGINT`` Identifier of the edge used to go from ``node`` to the next node in the path sequence. ``-1`` for the last node of the path.
-**cost** ``FLOAT`` Cost to traverse from ``node`` using ``edge`` to the next node in the path sequence.
-**agg_cost** ``FLOAT`` Aggregate cost from ``start_v`` to ``node``.
-============== ========== =================================================
+.. include:: pgRouting-concepts.rst
+ :start-after: return_path_start
+ :end-before: return_path_end
Additional Examples
@@ -313,11 +319,6 @@ The examples in this section use the following:
:end-before: -- q18
-.. rubric:: History
-
-* Added functionality in version 2.1.0
-* Renamed in version 2.0.0
-
See Also
-------------------------------------------------------------------------------
diff --git a/src/dijkstra/doc/pgr_dijkstraCost.rst b/src/dijkstra/doc/pgr_dijkstraCost.rst
index 0533e5d..32fd5ae 100644
--- a/src/dijkstra/doc/pgr_dijkstraCost.rst
+++ b/src/dijkstra/doc/pgr_dijkstraCost.rst
@@ -9,7 +9,7 @@
.. _pgr_dijkstraCost:
-pgr_dijkstraCost
+pgr_dijkstraCost
===============================================================================
@@ -21,11 +21,15 @@ Synopsis
Using Dijkstra algorithm implemented by Boost.Graph, and extract only the
aggregate cost of the shortest path(s) found, for the combination of vertices given.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/dijkstra_shortest_paths.html
Boost Graph Inside
+.. rubric:: Availability
+
+* pgr_dijkstraCost(all signatures) 2.2.0
+
The ``pgr_dijkstraCost`` algorithm, is a good choice to calculate the sum of the costs
of the shortest path for a subset of pairs of nodes of the graph.
We make use of the Boost's implementation of dijkstra which runs in
@@ -208,28 +212,17 @@ This signature performs a Dijkstra from each ``start_vid`` in ``start_vids`` to
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../sql/dijkstra.sql
+.. include:: ./pgr_dijkstra.rst
:start-after: pgr_dijkstra_parameters_start
:end-before: pgr_dijkstra_parameters_end
-
-
-Description of the return values
-...............................................................................
-
-Returns set of ``(start_vid, end_vid, agg_cost)``
-
-============= ============= =================================================
-Column Type Description
-============= ============= =================================================
-**start_vid** ``BIGINT`` Identifier of the starting vertex.
-**end_vid** ``BIGINT`` Identifier of the ending vertex.
-**agg_cost** ``FLOAT`` Aggregate cost of the shortest path from ``start_vid`` to ``end_vid``.
-============= ============= =================================================
+.. include:: pgRouting-concepts.rst
+ :start-after: return_cost_start
+ :end-before: return_cost_end
Additional Examples
@@ -248,10 +241,6 @@ Additional Examples
:end-before: --q8
-.. rubric:: History
-
-* New in version 2.2.0
-
See Also
-------------------------------------------------------------------------------
diff --git a/src/dijkstra/doc/pgr_dijkstraVia.rst b/src/dijkstra/doc/pgr_dijkstraVia.rst
index e8480fe..e1deb6e 100644
--- a/src/dijkstra/doc/pgr_dijkstraVia.rst
+++ b/src/dijkstra/doc/pgr_dijkstraVia.rst
@@ -20,11 +20,13 @@ Name
a list of vertices.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Synopsis
-------------------------------------------------------------------------------
@@ -91,11 +93,11 @@ Complete Signature
Description of the Signature
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../sql/dijkstraVia.sql
+.. include:: ../sql_queries/dijkstraVia.sql
:start-after: pgr_dijkstra_via_parameters_start
:end-before: pgr_dijkstra_via_parameters_end
diff --git a/src/dijkstra/doc/pgr_dijkstra_v2.rst b/src/dijkstra/doc/pgr_dijkstra_v2.rst
deleted file mode 100644
index c136224..0000000
--- a/src/dijkstra/doc/pgr_dijkstra_v2.rst
+++ /dev/null
@@ -1,113 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_dijkstra_v2:
-
-pgr_dijkstra - Deprecated Signature
-===============================================================================
-
-.. warning:: This function signature is deprecated!!!
-
- * That means it has been replaced by new signature(s)
- * This signature is no longer supported, and may be removed from future versions.
- * All code that use this function signature should be converted to use its replacement :ref:`pgr_dijkstra` (One to One).
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_dijkstra`` — Returns the shortest path using Dijkstra algorithm.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-Dijkstra's algorithm, conceived by Dutch computer scientist Edsger Dijkstra in 1956. It is a graph search algorithm that solves the single-source shortest path problem for a graph with non-negative edge path costs, producing a shortest path tree. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows, that make up a path.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_dijkstra(text sql, integer source, integer target,
- boolean directed, boolean has_rcost);
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :reverse_cost: ``float8`` (optional) the cost for the reverse traversal of the edge. This is only used when the ``directed`` and ``has_rcost`` parameters are ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:target: ``int4`` id of the end point
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: node ID
-:id2: edge ID (``-1`` for the last row)
-:cost: cost to traverse from ``id1`` using ``id2``
-
-
-.. rubric:: History
-
-* Renamed in version 2.0.0
-
-
-Examples: Directed
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-
-.. literalinclude:: dijkstra-v2.queries
- :start-after: --q1
- :end-before: --q2
-
-
-* With ``reverse_cost``
-
-.. literalinclude:: dijkstra-v2.queries
- :start-after: --q2
- :end-before: --q3
-
-
-
-Examples: Undirected
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-
-.. literalinclude:: dijkstra-v2.queries
- :start-after: --q3
- :end-before: --q4
-
-
-* With ``reverse_cost``
-
-.. literalinclude:: dijkstra-v2.queries
- :start-after: --q4
- :end-before: --q5
-
-
-The queries use the :ref:`sampledata` network.
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`dijkstra`, :ref:`pgr_dijkstra`
-* :ref:`type_cost_result`
-* http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
diff --git a/src/dijkstra/sql/dijkstra.sql b/src/dijkstra/sql/dijkstra.sql
index bfe4bc9..7ff9dd0 100644
--- a/src/dijkstra/sql/dijkstra.sql
+++ b/src/dijkstra/sql/dijkstra.sql
@@ -24,7 +24,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-/* ********** FOR USERS DOCUMENTATION
+/*FOR USERS DOCUMENTATION
The following applies to:
pgr_dijkstra
@@ -50,7 +50,7 @@ Column Type Default Description
pgr_dijkstra_parameters_end
-*/
+FOR-USER*/
CREATE OR REPLACE FUNCTION _pgr_dijkstra(edges_sql TEXT, start_vid BIGINT, end_vid BIGINT, directed BOOLEAN,
only_cost BOOLEAN DEFAULT false,
diff --git a/src/dijkstra/sql/dijkstraVia.sql b/src/dijkstra/sql/dijkstraVia.sql
index 8ab1076..a15d465 100644
--- a/src/dijkstra/sql/dijkstraVia.sql
+++ b/src/dijkstra/sql/dijkstraVia.sql
@@ -25,7 +25,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-/* ******** FOR USERS DOCUMENTATION
+/*FOR USERS DOCUMENTATION
pgr_dijkstra_via_parameters_start
@@ -47,7 +47,7 @@ Parameter Type Default Description
pgr_dijkstra_via_parameters_end
-*/
+USER*/
CREATE OR REPLACE FUNCTION pgr_dijkstraVia(
diff --git a/src/dijkstra/src/CMakeLists.txt b/src/dijkstra/src/CMakeLists.txt
index 974cfe7..e3b688d 100644
--- a/src/dijkstra/src/CMakeLists.txt
+++ b/src/dijkstra/src/CMakeLists.txt
@@ -5,9 +5,5 @@ ADD_LIBRARY(dijkstra OBJECT
many_to_many_dijkstra.c
dijkstraVia.c
-
- one_to_one_dijkstra_driver.cpp
- one_to_many_dijkstra_driver.cpp
many_to_many_dijkstra_driver.cpp
- many_to_one_dijkstra_driver.cpp
dijkstraVia_driver.cpp)
diff --git a/src/dijkstra/src/dijkstraVia.c b/src/dijkstra/src/dijkstraVia.c
index 5192822..bc93d9f 100644
--- a/src/dijkstra/src/dijkstraVia.c
+++ b/src/dijkstra/src/dijkstraVia.c
@@ -25,38 +25,24 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- Uncomment when needed
-*/
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./dijkstraVia_driver.h"
PGDLLEXPORT Datum dijkstraVia(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(dijkstraVia);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
-process( char* edges_sql,
- int64_t *via_vidsArr,
- size_t size_via_vidsArr,
+process(char* edges_sql,
+ ArrayType *vias,
bool directed,
bool strict,
bool U_turn_on_edge,
@@ -64,67 +50,64 @@ process( char* edges_sql,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
- pgr_edge_t *edges;
- edges = NULL;
- size_t total_tuples;
- total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ int64_t* via_vidsArr = NULL;
+ size_t size_via_vidsArr = 0;
+ via_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_via_vidsArr, vias);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ pgr_edge_t* edges = NULL;
+ size_t total_edges = 0;
+ pgr_get_edges(edges_sql, &edges, &total_edges);
+
+ if (total_edges == 0) {
+ if (via_vidsArr) pfree(via_vidsArr);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("directed: %d", directed);
- PGR_DBG("strict: %d", strict);
- PGR_DBG("U_turn_on_edge: %d", U_turn_on_edge);
-
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
-
- char *err_msg = (char *)"";
- do_pgr_dijkstraViaVertex(
- edges,
- total_tuples,
- via_vidsArr,
- size_via_vidsArr,
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_dijkstraVia(
+ edges, total_edges,
+ via_vidsArr, size_via_vidsArr,
directed,
strict,
U_turn_on_edge,
result_tuples,
result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra Via", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ time_msg("processing pgr_dijkstraVia", start_t, clock());
- free(err_msg);
- pfree(edges);
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (via_vidsArr) pfree(via_vidsArr);
pgr_SPI_finish();
}
-/* */
-/*******************************************************************************/
-PG_FUNCTION_INFO_V1(dijkstraVia);
+
PGDLLEXPORT Datum
dijkstraVia(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
Routes_t *result_tuples = 0;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -132,39 +115,33 @@ dijkstraVia(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED
+ /**********************************************************************
* pgr_dijkstraVia(edges_sql text,
* vertices anyarray,
* directed boolean default true,
* strict boolean default false,
* U_turn_on_edge boolean default false,
- *******************************************************************************/
-
- PGR_DBG("Initializing arrays");
- int64_t* via_vidsArr;
- size_t size_via_vidsArr;
- via_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_via_vidsArr, PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("Via VertexArr size %ld ", size_via_vidsArr);
+ **********************************************************************/
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- via_vidsArr, size_via_vidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
PG_GETARG_BOOL(2),
PG_GETARG_BOOL(3),
PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
- PGR_DBG("Cleaning arrays");
- free(via_vidsArr);
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -175,26 +152,35 @@ dijkstraVia(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (Routes_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
-
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- // OUT seq BIGINT, OUT path_id BIGINT, OUT path_seq BIGINT, OUT start_vid BIGINT, OUT end_vid BIGINT, OUT node BIGINT, OUT edge BIGINT, OUT cost FLOAT, OUT agg_cost FLOAT, OUT route_agg_cost FLOAT)
+ size_t call_cntr = funcctx->call_cntr;
+
+ /**********************************************************************/
+ /*
+ OUT seq INTEGER,
+ OUT path_id INTEGER,
+ OUT path_seq INTEGER,
+ OUT start_vid BIGINT,
+ OUT end_vid BIGINT,
+ OUT node BIGINT,
+ OUT edge BIGINT,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT,
+ OUT route_agg_cost FLOAT
+ */
size_t numb_out = 10;
values = palloc(numb_out * sizeof(Datum));
nulls = palloc(numb_out * sizeof(bool));
size_t i;
- for(i = 0; i< numb_out; ++i) {
+ for (i = 0; i< numb_out; ++i) {
nulls[i] = false;
}
@@ -210,15 +196,12 @@ dijkstraVia(PG_FUNCTION_ARGS) {
values[8] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
values[9] = Float8GetDatum(result_tuples[call_cntr].route_agg_cost);
- /*******************************************************************************/
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/dijkstra/src/dijkstraVia_driver.cpp b/src/dijkstra/src/dijkstraVia_driver.cpp
index 0af2721..8599df4 100644
--- a/src/dijkstra/src/dijkstraVia_driver.cpp
+++ b/src/dijkstra/src/dijkstraVia_driver.cpp
@@ -25,20 +25,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./dijkstraVia_driver.h"
#include <sstream>
#include <deque>
#include <vector>
-#include "./pgr_dijkstra.hpp"
-#include "./dijkstraVia_driver.h"
-#include "./../../common/src/pgr_alloc.hpp"
+#include "./pgr_dijkstra.hpp"
+#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
@@ -66,28 +62,33 @@ pgr_dijkstraViaVertex(
continue;
}
- // Delete uTurn edges only valid for paths that are not the first path
+ // Delete U Turn edges only valid for paths that are not the first path
if (!U_turn_on_edge && i > 1) {
- // we can only delete if there is was a path, that is at least one edge size
+ /*
+ * Can only delete if there was a path,
+ * that is at least one edge size
+ */
if (path.size() > 1) {
- // Delete from the graph the last edge if its outgoing also
- // edge to be removed = second to last edge path[i].edge;
+ /*
+ * Delete from the graph the last edge if its outgoing also
+ * edge to be removed = second to last edge path[i].edge;
+ */
int64_t edge_to_be_removed = path[path.size() - 2].edge;
int64_t last_vertex_of_path = prev_vertex;
// and the current vertex is not a dead end
if (graph.out_degree(last_vertex_of_path) > 1) {
- log << "departing from " << last_vertex_of_path
- << " deleting edge " << edge_to_be_removed << "\n";
- graph.disconnect_out_going_edge(last_vertex_of_path, edge_to_be_removed);
+ log << "\ndeparting from " << last_vertex_of_path
+ << " deleting edge " << edge_to_be_removed << "\n";
+ graph.disconnect_out_going_edge(
+ last_vertex_of_path,
+ edge_to_be_removed);
}
}
}
- path.clear();
-
- log << "from " << prev_vertex << " to " << vertex << "\n";
- pgr_dijkstra(graph, path, prev_vertex, vertex);
+ log << "\nfrom " << prev_vertex << " to " << vertex;
+ path = pgr_dijkstra(graph, prev_vertex, vertex);
if (!U_turn_on_edge && i > 1) {
graph.restore_graph();
@@ -96,8 +97,9 @@ pgr_dijkstraViaVertex(
* no path was found with the deleted edge
* try with the edge back in the graph
*/
- log << "WAS empty so again from " << prev_vertex << " to " << vertex << "\n";
- pgr_dijkstra(graph, path, prev_vertex, vertex);
+ log << "\nEmpty so again from "
+ << prev_vertex << " to " << vertex;
+ path = pgr_dijkstra(graph, prev_vertex, vertex);
}
}
@@ -160,42 +162,59 @@ get_route(
return sequence;
}
-// CREATE OR REPLACE FUNCTION pgr_dijkstraViaVertices(sql text, vertices anyarray, directed boolean default true,
void
-do_pgr_dijkstraViaVertex(
- pgr_edge_t *data_edges, size_t total_tuples,
- int64_t *via_vidsArr, size_t size_via_vidsArr,
+do_pgr_dijkstraVia(
+ pgr_edge_t* data_edges, size_t total_edges,
+ int64_t* via_vidsArr, size_t size_via_vidsArr,
bool directed,
bool strict,
bool U_turn_on_edge,
- Routes_t **return_tuples, size_t *return_count,
- char ** err_msg) {
+ Routes_t** return_tuples, size_t* return_count,
+
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg) {
std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
+
try {
- if (total_tuples == 1) {
- log << "Required: more than one tuple\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
+ pgassert(total_edges != 0);
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
graphType gType = directed? DIRECTED: UNDIRECTED;
std::deque< Path >paths;
- log << "Inserting vertices into a c++ vector structure\n";
- std::vector< int64_t > via_vertices(via_vidsArr, via_vidsArr + size_via_vidsArr);
+ log << "\nInserting vertices into a c++ vector structure";
+ std::vector< int64_t > via_vertices(
+ via_vidsArr, via_vidsArr + size_via_vidsArr);
if (directed) {
- log << "Working with directed Graph\n";
+ log << "\nWorking with directed Graph";
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstraViaVertex(digraph, via_vertices, paths, strict, U_turn_on_edge, log);
+ digraph.insert_edges(data_edges, total_edges);
+ pgr_dijkstraViaVertex(
+ digraph,
+ via_vertices,
+ paths,
+ strict,
+ U_turn_on_edge,
+ log);
} else {
- log << "Working with Undirected Graph\n";
+ log << "\nWorking with Undirected Graph";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstraViaVertex(undigraph, via_vertices, paths, strict, U_turn_on_edge, log);
+ undigraph.insert_edges(data_edges, total_edges);
+ pgr_dijkstraViaVertex(
+ undigraph,
+ via_vertices,
+ paths,
+ strict,
+ U_turn_on_edge,
+ log);
}
size_t count(count_tuples(paths));
@@ -203,30 +222,43 @@ do_pgr_dijkstraViaVertex(
if (count == 0) {
(*return_tuples) = NULL;
(*return_count) = 0;
- log <<
- "No paths found\n";
- *err_msg = strdup(log.str().c_str());
+ notice <<
+ "No paths found";
+ *log_msg = pgr_msg(notice.str().c_str());
return;
}
// get the space required to store all the paths
(*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
+ log << "\nConverting a set of paths into the tuples";
(*return_count) = (get_route(return_tuples, paths));
(*return_tuples)[count - 1].edge = -2;
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
-
-
-
diff --git a/src/dijkstra/src/dijkstraVia_driver.h b/src/dijkstra/src/dijkstraVia_driver.h
index a0550b2..7da7893 100644
--- a/src/dijkstra/src/dijkstraVia_driver.h
+++ b/src/dijkstra/src/dijkstraVia_driver.h
@@ -25,8 +25,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_DIJKSTRAVIAVERTEX_SRC_DIJKSTRAVIAVERTEX_DRIVER_H_
-#define SRC_DIJKSTRAVIAVERTEX_SRC_DIJKSTRAVIAVERTEX_DRIVER_H_
+#ifndef SRC_DIJKSTRA_SRC_DIJKSTRAVIA_DRIVER_H_
+#define SRC_DIJKSTRA_SRC_DIJKSTRAVIA_DRIVER_H_
+#pragma once
#include "./../../common/src/pgr_types.h"
@@ -34,20 +35,27 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
extern "C" {
#endif
- // CREATE OR REPLACE FUNCTION pgr_dijkstraViaVertices(sql text, vertices anyarray, directed boolean default true,
+ /*
+ CREATE OR REPLACE FUNCTION pgr_dijkstraViaVertices(
+ sql text,
+ vertices anyarray,
+ directed boolean default true,
+ */
void
- do_pgr_dijkstraViaVertex(
- pgr_edge_t *data_edges, size_t total_tuples,
+ do_pgr_dijkstraVia(
+ pgr_edge_t *data_edges, size_t total_edges,
int64_t *via_vidsArr, size_t size_via_vidsArr,
bool directed,
bool strict,
bool U_turn_on_edge,
Routes_t **return_tuples, size_t *return_count,
- char ** err_msg);
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
}
#endif
-#endif // SRC_DIJKSTRAVIAVERTEX_SRC_DIJKSTRAVIAVERTEX_DRIVER_H_
+#endif // SRC_DIJKSTRA_SRC_DIJKSTRAVIA_DRIVER_H_
diff --git a/src/dijkstra/src/many_to_many_dijkstra.c b/src/dijkstra/src/many_to_many_dijkstra.c
index f9e282c..cab39ef 100644
--- a/src/dijkstra/src/many_to_many_dijkstra.c
+++ b/src/dijkstra/src/many_to_many_dijkstra.c
@@ -28,103 +28,108 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./many_to_many_dijkstra_driver.h"
PGDLLEXPORT Datum many_to_many_dijkstra(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(many_to_many_dijkstra);
-
-/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char* edges_sql,
- int64_t *start_vidsArr, size_t size_start_vidsArr,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
+ ArrayType *starts,
+ ArrayType *ends,
bool directed,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
+ int64_t* start_vidsArr = NULL;
+ size_t size_start_vidsArr = 0;
+ start_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_start_vidsArr, starts);
+
+ int64_t* end_vidsArr = NULL;
+ size_t size_end_vidsArr = 0;
+ end_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_end_vidsArr, ends);
+
pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ size_t total_edges = 0;
+ pgr_get_edges(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+
+ if (total_edges == 0) {
+ if (end_vidsArr) pfree(end_vidsArr);
+ if (start_vidsArr) pfree(start_vidsArr);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
-
- char *err_msg = NULL;
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
do_pgr_many_to_many_dijkstra(
- edges,
- total_tuples,
- start_vidsArr,
- size_start_vidsArr,
- end_vidsArr,
- size_end_vidsArr,
+ edges, total_edges,
+ start_vidsArr, size_start_vidsArr,
+ end_vidsArr, size_end_vidsArr,
+
directed,
only_cost,
+ true, // normal
+
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra many to many", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
- free(err_msg);
- pfree(edges);
+ if (only_cost) {
+ time_msg("processing pgr_dijkstraCost(many to many)", start_t, clock());
+ } else {
+ time_msg("processing pgr_dijkstra(many to many)", start_t, clock());
+ }
+
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_vidsArr) pfree(start_vidsArr);
+ if (end_vidsArr) pfree(end_vidsArr);
pgr_SPI_finish();
}
-/* */
-/*****************************************************************************/
-PG_FUNCTION_INFO_V1(many_to_many_dijkstra);
PGDLLEXPORT Datum
many_to_many_dijkstra(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ /**********************************************************************/
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
- /**************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -132,44 +137,31 @@ many_to_many_dijkstra(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*********************************************************************/
- /* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text,
- // start_vids anyarray,
- // end_vids anyarray,
- // directed boolean default true,
-
- PGR_DBG("Initializing arrays");
- int64_t* start_vidsArr;
- size_t size_start_vidsArr;
- start_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_vidsArr, PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("start_vidsArr size %ld ", size_start_vidsArr);
-
- int64_t* end_vidsArr;
- size_t size_end_vidsArr;
- end_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_vidsArr, PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("end_vidsArr size %ld ", size_end_vidsArr);
-
- PGR_DBG("Calling process");
+ /**********************************************************************/
+ // pgr_dijkstra(
+ // sql TEXT,
+ // start_vids ANYARRAY,
+ // end_vids ANYARRAY,
+ // directed BOOLEAN default true,
+ // only_cost BOOLEAN default false
+
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- start_vidsArr, size_start_vidsArr,
- end_vidsArr, size_end_vidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_BOOL(3),
PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
- PGR_DBG("Cleaning arrays");
- free(end_vidsArr);
- free(start_vidsArr);
- /* */
- /*********************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -184,33 +176,32 @@ many_to_many_dijkstra(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
+ size_t call_cntr = funcctx->call_cntr;
- /*********************************************************************/
- /* MODIFY AS NEEDED */
- // OUT seq integer,
+ /**********************************************************************/
+ // OUT seq INTEGER,
// OUT path_seq INTEGER,
- // OUT start_vid,
+ // OUT start_vid BIGINT,
// OUT end_vid BIGINT,
- // OUT node bigint,
- // OUT edge bigint,
- // OUT cost float,
- // OUT agg_cost float)
+ // OUT node BIGINT,
+ // OUT edge BIGINT,
+ // OUT cost FLOAT,
+ // OUT agg_cost FLOAT)
- values = palloc(8 * sizeof(Datum));
- nulls = palloc(8 * sizeof(bool));
+ size_t numb = 8;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 8; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
@@ -222,15 +213,12 @@ many_to_many_dijkstra(PG_FUNCTION_ARGS) {
values[5] = Int64GetDatum(result_tuples[call_cntr].edge);
values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
values[7] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*********************************************************************/
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/dijkstra/src/many_to_many_dijkstra_driver.cpp b/src/dijkstra/src/many_to_many_dijkstra_driver.cpp
index 0db5d04..f0ee9dd 100644
--- a/src/dijkstra/src/many_to_many_dijkstra_driver.cpp
+++ b/src/dijkstra/src/many_to_many_dijkstra_driver.cpp
@@ -27,21 +27,50 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./many_to_many_dijkstra_driver.h"
#include <sstream>
#include <deque>
#include <vector>
-#include <set>
+#include <algorithm>
+
#include "./pgr_dijkstra.hpp"
-#include "./many_to_many_dijkstra_driver.h"
#include "../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
+template < class G >
+std::deque< Path >
+pgr_dijkstra(
+ G &graph,
+ std::vector < int64_t > sources,
+ std::vector < int64_t > targets,
+ bool only_cost,
+ bool normal) {
+ std::sort(sources.begin(), sources.end());
+ sources.erase(
+ std::unique(sources.begin(), sources.end()),
+ sources.end());
+
+ std::sort(targets.begin(), targets.end());
+ targets.erase(
+ std::unique(targets.begin(), targets.end()),
+ targets.end());
+
+ Pgr_dijkstra< G > fn_dijkstra;
+ auto paths = fn_dijkstra.dijkstra(graph, sources, targets, only_cost);
+
+ if (!normal) {
+ for (auto &path : paths) {
+ path.reverse();
+ }
+ }
+ return paths;
+}
+
+
+
// CREATE OR REPLACE FUNCTION pgr_dijkstra(
// sql text,
// start_vids anyarray,
@@ -50,75 +79,97 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
void
do_pgr_many_to_many_dijkstra(
pgr_edge_t *data_edges,
- size_t total_tuples,
+ size_t total_edges,
int64_t *start_vidsArr,
size_t size_start_vidsArr,
int64_t *end_vidsArr,
size_t size_end_vidsArr,
bool directed,
bool only_cost,
+ bool normal,
General_path_element_t **return_tuples,
size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg) {
std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
+
try {
+ pgassert(total_edges != 0);
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
+
graphType gType = directed? DIRECTED: UNDIRECTED;
+ log << "Inserting vertices into a c++ vector structure";
+ std::vector<int64_t>
+ start_vertices(start_vidsArr, start_vidsArr + size_start_vidsArr);
+ std::vector< int64_t >
+ end_vertices(end_vidsArr, end_vidsArr + size_end_vidsArr);
+
std::deque< Path >paths;
- log << "Inserting vertices into a c++ vector structure\n";
- std::set< int64_t >
- s_start_vertices(start_vidsArr, start_vidsArr + size_start_vidsArr);
- std::set< int64_t >
- s_end_vertices(end_vidsArr, end_vidsArr + size_end_vidsArr);
-
- std::vector< int64_t > start_vertices(s_start_vertices.begin(), s_start_vertices.end());
- std::vector< int64_t > end_vertices(s_end_vertices.begin(), s_end_vertices.end());
if (directed) {
- log << "Working with directed Graph\n";
+ log << "\nWorking with directed Graph";
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(digraph, paths, start_vertices, end_vertices, only_cost);
+ digraph.insert_edges(data_edges, total_edges);
+ paths = pgr_dijkstra(
+ digraph,
+ start_vertices, end_vertices,
+ only_cost, normal);
} else {
- log << "Working with Undirected Graph\n";
+ log << "\nWorking with Undirected Graph";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(undigraph, paths, start_vertices, end_vertices, only_cost);
+ undigraph.insert_edges(data_edges, total_edges);
+ paths = pgr_dijkstra(
+ undigraph,
+ start_vertices, end_vertices,
+ only_cost, normal);
}
-
size_t count(0);
-
count = count_tuples(paths);
if (count == 0) {
(*return_tuples) = NULL;
(*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
+ notice <<
+ "No paths found";
+ *log_msg = pgr_msg(notice.str().c_str());
return;
}
(*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
+ log << "\nConverting a set of paths into the tuples";
(*return_count) = (collapse_paths(return_tuples, paths));
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
-
-
-
-
-
diff --git a/src/dijkstra/src/many_to_many_dijkstra_driver.h b/src/dijkstra/src/many_to_many_dijkstra_driver.h
index 78b2ccf..3bc8b17 100644
--- a/src/dijkstra/src/many_to_many_dijkstra_driver.h
+++ b/src/dijkstra/src/many_to_many_dijkstra_driver.h
@@ -42,23 +42,26 @@ extern "C" {
// start_vids anyarray,
// end_vids anyarray,
// directed boolean default true,
- void
- do_pgr_many_to_many_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t *start_vidsArr,
- size_t size_start_vidsArr,
- int64_t *end_vidsArr,
- size_t size_end_vidsArr,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg);
+ void do_pgr_many_to_many_dijkstra(
+ pgr_edge_t *data_edges,
+ size_t total_tuples,
+ int64_t *start_vidsArr,
+ size_t size_start_vidsArr,
+ int64_t *end_vidsArr,
+ size_t size_end_vidsArr,
+ bool directed,
+ bool only_cost,
+ bool normal,
+ General_path_element_t **return_tuples,
+ size_t *return_count,
+
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
-}
+ }
#endif
#endif // SRC_DIJKSTRA_SRC_MANY_TO_MANY_DIJKSTRA_DRIVER_H_
diff --git a/src/dijkstra/src/many_to_one_dijkstra.c b/src/dijkstra/src/many_to_one_dijkstra.c
index 6fe7845..a82a1a4 100644
--- a/src/dijkstra/src/many_to_one_dijkstra.c
+++ b/src/dijkstra/src/many_to_one_dijkstra.c
@@ -28,40 +28,25 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./many_to_one_dijkstra_driver.h"
+#include "./many_to_many_dijkstra_driver.h"
PGDLLEXPORT Datum many_to_one_dijkstra(PG_FUNCTION_ARGS);
-/******************************************************************************/
-/* MODIFY AS NEEDED */
+PG_FUNCTION_INFO_V1(many_to_one_dijkstra);
+
static
void
process(
char* edges_sql,
- int64_t *start_vidsArr,
- size_t size_start_vidsArr,
+ ArrayType *starts,
int64_t end_vid,
bool directed,
bool only_cost,
@@ -69,62 +54,73 @@ process(
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
+ int64_t* start_vidsArr = NULL;
+ size_t size_start_vidsArr = 0;
+ start_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_start_vidsArr, starts);
+
pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ size_t total_edges = 0;
+ pgr_get_edges_reversed(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
+ if (start_vidsArr) pfree(start_vidsArr);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
-
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_dijkstra(
+ edges, total_edges,
+ &end_vid, 1,
+ start_vidsArr, size_start_vidsArr,
- char *err_msg = NULL;
- do_pgr_many_to_one_dijkstra(
- edges,
- total_tuples,
- start_vidsArr,
- size_start_vidsArr,
- end_vid,
directed,
only_cost,
+ false, // data is reversed
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra many to one", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
- free(err_msg);
- pfree(edges);
+ if (only_cost) {
+ time_msg("processing pgr_dijkstraCost(many to one)", start_t, clock());
+ } else {
+ time_msg("processing pgr_dijkstra(many to one)", start_t, clock());
+ }
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_vidsArr) pfree(start_vidsArr);
+
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
-PG_FUNCTION_INFO_V1(many_to_one_dijkstra);
PGDLLEXPORT Datum
many_to_one_dijkstra(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ /**********************************************************************/
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
- /**************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -132,37 +128,29 @@ many_to_one_dijkstra(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*********************************************************************/
- /* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text,
- // start_vids anyarray,
+ /**********************************************************************/
+ // pgr_dijkstra(
+ // sql TEXT,
+ // start_vids ANYARRAY,
// end_vid BIGINT,
// directed BOOLEAN default true,
+ // only_cost BOOLEAN default false
- PGR_DBG("Initializing arrays");
- int64_t* start_vidsArr;
- size_t size_start_vidsArr;
- start_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_vidsArr, PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("start_vidsArr size %ld ", size_start_vidsArr);
-
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- start_vidsArr, size_start_vidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
PG_GETARG_INT64(2),
PG_GETARG_BOOL(3),
PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
- PGR_DBG("Cleaning arrays");
- free(start_vidsArr);
- /* */
- /*********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -177,37 +165,34 @@ many_to_one_dijkstra(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
+ size_t call_cntr = funcctx->call_cntr;
- /*********************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// OUT seq INTEGER,
// OUT path_seq INTEGER,
// OUT start_vid BIGINT,
- // OUT end_vid BIGINT,
// OUT node BIGINT,
// OUT edge BIGINT,
// OUT cost FLOAT,
// OUT agg_cost FLOAT)
- values = palloc(7 * sizeof(Datum));
- nulls = palloc(7 * sizeof(bool));
+ size_t numb = 7;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 7; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
@@ -215,15 +200,12 @@ many_to_one_dijkstra(PG_FUNCTION_ARGS) {
values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*********************************************************************/
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/dijkstra/src/many_to_one_dijkstra_driver.cpp b/src/dijkstra/src/many_to_one_dijkstra_driver.cpp
deleted file mode 100644
index 7bd5243..0000000
--- a/src/dijkstra/src/many_to_one_dijkstra_driver.cpp
+++ /dev/null
@@ -1,121 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: many_to_one_dijkstra_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail: vicky_vergara at hotmail.com
-
-Copyright (c) 2015 pgRouting developers
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <deque>
-#include <vector>
-#include <set>
-#include "./pgr_dijkstra.hpp"
-#include "./many_to_one_dijkstra_driver.h"
-
-#include "../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/pgr_types.h"
-
-// CREATE OR REPLACE FUNCTION pgr_dijkstra(
-// sql text,
-// start_vids anyarray,
-// end_vid BIGINT,
-// directed BOOLEAN default true,
-void
-do_pgr_many_to_one_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t *start_vidsArr,
- size_t size_start_vidsArr,
- int64_t end_vid,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- std::deque< Path >paths;
- log << "Inserting vertices into a c++ vector structure\n";
- std::set< int64_t > s_start_vertices(start_vidsArr, start_vidsArr + size_start_vidsArr);
- std::vector< int64_t > start_vertices(s_start_vertices.begin(), s_start_vertices.end());
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(digraph, paths, start_vertices, end_vid, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(undigraph, paths, start_vertices, end_vid, only_cost);
- }
-
-
- size_t count(0);
- count = count_tuples(paths);
-
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/dijkstra/src/many_to_one_dijkstra_driver.h b/src/dijkstra/src/many_to_one_dijkstra_driver.h
deleted file mode 100644
index 4179606..0000000
--- a/src/dijkstra/src/many_to_one_dijkstra_driver.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: many_to_one_dijkstra_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail: vicky_vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_DIJKSTRA_SRC_MANY_TO_ONE_DIJKSTRA_DRIVER_H_
-#define SRC_DIJKSTRA_SRC_MANY_TO_ONE_DIJKSTRA_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text,
- // start_vids anyarray,
- // end_vid BIGINT,
- // directed BOOLEAN default true,
- void
- do_pgr_many_to_one_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t *start_vidsArr,
- size_t size_start_vidsArr,
- int64_t end_vid,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_DIJKSTRA_SRC_MANY_TO_ONE_DIJKSTRA_DRIVER_H_
diff --git a/src/dijkstra/src/one_to_many_dijkstra.c b/src/dijkstra/src/one_to_many_dijkstra.c
index 5244dae..de9f4b0 100644
--- a/src/dijkstra/src/one_to_many_dijkstra.c
+++ b/src/dijkstra/src/one_to_many_dijkstra.c
@@ -27,103 +27,102 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./one_to_many_dijkstra_driver.h"
+#include "./many_to_many_dijkstra_driver.h"
PGDLLEXPORT Datum one_to_many_dijkstra(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(one_to_many_dijkstra);
-/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char* edges_sql,
int64_t start_vid,
- int64_t *end_vidsArr,
- size_t size_end_vidsArr,
+ ArrayType *ends,
bool directed,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
+ int64_t* end_vidsArr = NULL;;
+ size_t size_end_vidsArr = 0;
+ end_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_end_vidsArr, ends);
+
pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ size_t total_edges = 0;
+ pgr_get_edges(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
+ if (end_vidsArr) pfree(end_vidsArr);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_dijkstra(
+ edges, total_edges,
+ &start_vid, 1,
+ end_vidsArr, size_end_vidsArr,
- char *err_msg = NULL;
- do_pgr_one_to_many_dijkstra(
- edges,
- total_tuples,
- start_vid,
- end_vidsArr,
- size_end_vidsArr,
directed,
only_cost,
+ true, // normal
+
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra one to many", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
- free(err_msg);
- pfree(edges);
+ if (only_cost) {
+ time_msg("processing pgr_dijkstraCost(one to many)", start_t, clock());
+ } else {
+ time_msg("processing pgr_dijkstra(one to many)", start_t, clock());
+ }
+
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (end_vidsArr) pfree(end_vidsArr);
+
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
-PG_FUNCTION_INFO_V1(one_to_many_dijkstra);
PGDLLEXPORT Datum
one_to_many_dijkstra(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
General_path_element_t *result_tuples = 0;
size_t result_count = 0;
- /* */
- /**************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -132,36 +131,31 @@ one_to_many_dijkstra(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(sql text,
- // start_vid bigint,
- // end_vids anyarray,
- // directed boolean default true,
- // only_cost boolean default false
-
- PGR_DBG("Initializing arrays");
- int64_t* end_vidsArr;
- size_t size_end_vidsArr;
- end_vidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_vidsArr, PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("targetsArr size %ld ", size_end_vidsArr);
-
- PGR_DBG("Calling process");
+ // pgr_dijkstra(
+ // sql TEXT,
+ // start_vid BIGINT,
+ // end_vids ANYARRAY,
+ // directed BOOLEAN default true,
+ // only_cost BOOLEAN default false
+
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
- end_vidsArr, size_end_vidsArr,
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_BOOL(3),
PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
- PGR_DBG("Cleaning arrays");
- free(end_vidsArr);
- /* */
/**********************************************************************/
+
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -176,37 +170,34 @@ one_to_many_dijkstra(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
+ size_t call_cntr = funcctx->call_cntr;
- /*********************************************************************/
- /* MODIFY AS NEEDED */
- // OUT seq integer,
+ /**********************************************************************/
+ // OUT seq INTEGER,
// OUT path_seq INTEGER,
// OUT end_vid BIGINT,
- // OUT node bigint,
- // OUT edge bigint,
- // OUT cost float,
- // OUT agg_cost float)
-
- values = palloc(7 * sizeof(Datum));
- nulls = palloc(7 * sizeof(bool));
+ // OUT node BIGINT,
+ // OUT edge BIGINT,
+ // OUT cost FLOAT,
+ // OUT agg_cost FLOAT)
+ size_t numb = 7;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 7; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
values[2] = Int64GetDatum(result_tuples[call_cntr].end_id);
@@ -214,16 +205,12 @@ one_to_many_dijkstra(PG_FUNCTION_ARGS) {
values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*********************************************************************/
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/dijkstra/src/one_to_many_dijkstra_driver.cpp b/src/dijkstra/src/one_to_many_dijkstra_driver.cpp
deleted file mode 100644
index f654aef..0000000
--- a/src/dijkstra/src/one_to_many_dijkstra_driver.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: one_to_many_dijkstra_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail: vicky_vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <deque>
-#include <vector>
-#include <set>
-#include "./pgr_dijkstra.hpp"
-#include "./one_to_many_dijkstra_driver.h"
-
-#include "../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/pgr_types.h"
-
-// CREATE OR REPLACE FUNCTION pgr_dijkstra(sql text, start_vid bigint, end_vids anyarray, directed boolean default true,
-void
-do_pgr_one_to_many_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t start_vid,
- int64_t *end_vidsArr,
- size_t size_end_vidsArr,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- std::deque< Path >paths;
- log << "Inserting vertices into a c++ vector structure\n";
- std::set< int64_t > s_end_vertices(end_vidsArr, end_vidsArr + size_end_vidsArr);
- std::vector< int64_t > end_vertices(s_end_vertices.begin(), s_end_vertices.end());
-
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(digraph, paths, start_vid, end_vertices, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(undigraph, paths, start_vid, end_vertices, only_cost);
- }
-
- size_t count(0);
- count = count_tuples(paths);
-
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup("Caught unknown exception!\n");
- return;
- }
-}
-
-
-
-
-
diff --git a/src/dijkstra/src/one_to_many_dijkstra_driver.h b/src/dijkstra/src/one_to_many_dijkstra_driver.h
deleted file mode 100644
index ff73f50..0000000
--- a/src/dijkstra/src/one_to_many_dijkstra_driver.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: one_to_many_dijkstra_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail: vicky_vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_DIJKSTRA_SRC_ONE_TO_MANY_DIJKSTRA_DRIVER_H_
-#define SRC_DIJKSTRA_SRC_ONE_TO_MANY_DIJKSTRA_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text,
- // start_vid bigint,
- // end_vids anyarray,
- // directed boolean default true,
- void
- do_pgr_one_to_many_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t start_vid,
- int64_t *end_vidsArr,
- size_t size_end_vidsArr,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_DIJKSTRA_SRC_ONE_TO_MANY_DIJKSTRA_DRIVER_H_
diff --git a/src/dijkstra/src/one_to_one_dijkstra.c b/src/dijkstra/src/one_to_one_dijkstra.c
index da20582..674205d 100644
--- a/src/dijkstra/src/one_to_one_dijkstra.c
+++ b/src/dijkstra/src/one_to_one_dijkstra.c
@@ -27,30 +27,20 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
+#include "./../../common/src/postgres_connection.h"
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
-#include "./one_to_one_dijkstra_driver.h"
+#include "./many_to_many_dijkstra_driver.h"
PG_MODULE_MAGIC;
PGDLLEXPORT Datum one_to_one_dijkstra(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(one_to_one_dijkstra);
-/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
@@ -61,70 +51,74 @@ process(
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- pgr_SPI_connect();
-
- PGR_DBG("Load data");
- pgr_edge_t *edges = NULL;
-
if (start_vid == end_vid) {
- (*result_count) = 0;
- (*result_tuples) = NULL;
- pgr_SPI_finish();
return;
}
- size_t total_tuples = 0;
- pgr_get_edges(edges_sql, &edges, &total_tuples);
+ pgr_SPI_connect();
+
+ pgr_edge_t *edges = NULL;
+ size_t total_edges = 0;
+ pgr_get_edges(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- char *err_msg = NULL;
- do_pgr_one_to_one_dijkstra(
- edges,
- total_tuples,
- start_vid,
- end_vid,
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_dijkstra(
+ edges, total_edges,
+ &start_vid, 1,
+ &end_vid, 1,
+
directed,
only_cost,
+ true, // normal
+
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing Dijkstra one to one", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ if (only_cost) {
+ time_msg("processing pgr_dijkstraCost(one to one)", start_t, clock());
+ } else {
+ time_msg("processing pgr_dijkstra(one to one)", start_t, clock());
+ }
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
- free(err_msg);
- pfree(edges);
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
-PG_FUNCTION_INFO_V1(one_to_one_dijkstra);
+
PGDLLEXPORT Datum
one_to_one_dijkstra(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
General_path_element_t *result_tuples = 0;
size_t result_count = 0;
- /* */
- /**************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -133,15 +127,14 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_dijkstra(
- // sql text, start_vids BIGINT,
+ // pgr_dijkstra(
+ // sql TEXT,
+ // start_vids BIGINT,
// end_vid BIGINT,
// directed BOOLEAN default true,
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
PG_GETARG_INT64(2),
PG_GETARG_BOOL(3),
@@ -149,10 +142,14 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
&result_tuples,
&result_count);
- /* */
/**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -167,19 +164,17 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
+ size_t call_cntr = funcctx->call_cntr;
/**********************************************************************/
- /* MODIFY AS NEEDED */
// OUT seq INTEGER,
// OUT path_seq INTEGER,
// OUT node BIGINT,
@@ -187,16 +182,16 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
// OUT cost FLOAT,
// OUT agg_cost FLOAT
- values = palloc(6 * sizeof(Datum));
- nulls = palloc(6 * sizeof(bool));
+ size_t numb = 6;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 6; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
values[2] = Int64GetDatum(result_tuples[call_cntr].node);
@@ -209,10 +204,6 @@ one_to_one_dijkstra(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/dijkstra/src/one_to_one_dijkstra_driver.cpp b/src/dijkstra/src/one_to_one_dijkstra_driver.cpp
deleted file mode 100644
index 2fb8e48..0000000
--- a/src/dijkstra/src/one_to_one_dijkstra_driver.cpp
+++ /dev/null
@@ -1,115 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: one_to_one_dijkstra_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail: vicky_vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <deque>
-#include <vector>
-#include "./pgr_dijkstra.hpp"
-#include "./one_to_one_dijkstra_driver.h"
-
-
-#include "../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/pgr_types.h"
-
-// CREATE OR REPLACE FUNCTION pgr_dijkstra(
-// sql text,
-// start_vids BIGINT,
-// end_vid BIGINT,
-// directed BOOLEAN default true,
-
-void
-do_pgr_one_to_one_dijkstra(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t start_vid,
- int64_t end_vid,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- Path path;
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(digraph, path, start_vid, end_vid, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_dijkstra(undigraph, path, start_vid, end_vid, only_cost);
- }
-
- size_t count(0);
-
- count = path.size();
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- size_t sequence = 0;
- path.generate_postgres_data(return_tuples, sequence);
- (*return_count) = sequence;
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/dijkstra/src/pgr_dijkstra.hpp b/src/dijkstra/src/pgr_dijkstra.hpp
index b07f2bd..d394e95 100644
--- a/src/dijkstra/src/pgr_dijkstra.hpp
+++ b/src/dijkstra/src/pgr_dijkstra.hpp
@@ -24,26 +24,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_DIJKSTRA_SRC_PGR_DIJKSTRA_HPP_
+#define SRC_DIJKSTRA_SRC_PGR_DIJKSTRA_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef unlink
-#undef unlink
-#endif
-#endif
-
-
-#include <deque>
-#include <vector>
-
#include <boost/config.hpp>
-
-
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/dijkstra_shortest_paths.hpp>
+#include <deque>
+#include <set>
+#include <vector>
+#include <algorithm>
+
#include "./../../common/src/basePath_SSEC.hpp"
#include "./../../common/src/pgr_base_graph.hpp"
#if 0
@@ -56,73 +49,93 @@ template < class G > class Pgr_dijkstra;
// for development
template < class G >
-void pgr_drivingDistance(
+std::deque<Path>
+pgr_drivingDistance(
G &graph,
- std::deque< Path > &paths,
std::vector< int64_t > start_vids,
double distance,
bool equicost) {
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.drivingDistance(graph, paths, start_vids, distance, equicost);
+ return fn_dijkstra.drivingDistance(graph, start_vids, distance, equicost);
}
template < class G >
-void
+Path
pgr_drivingDistance(
G &graph,
- Path &path,
int64_t source,
double distance) {
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.drivingDistance(graph, path, source, distance);
+ return fn_dijkstra.drivingDistance(graph, source, distance);
}
+/* 1 to 1*/
template < class G >
-void
+Path
pgr_dijkstra(
G &graph,
- Path &path,
int64_t source,
int64_t target,
bool only_cost = false) {
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, path, source, target, only_cost);
+ return fn_dijkstra.dijkstra(graph, source, target, only_cost);
}
+/* 1 to many*/
template < class G >
-void
+std::deque<Path>
pgr_dijkstra(
G &graph,
- std::deque<Path> &paths,
int64_t source,
- const std::vector< int64_t > &targets,
+ std::vector< int64_t > targets,
bool only_cost = false) {
+ std::sort(targets.begin(), targets.end());
+ targets.erase(
+ std::unique(targets.begin(), targets.end()),
+ targets.end());
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, paths, source, targets, only_cost);
+ return fn_dijkstra.dijkstra(graph, source, targets, only_cost);
}
+/* many to 1*/
template < class G >
-void
-pgr_dijkstra(G &graph,
- std::deque<Path> &paths,
- const std::vector< int64_t > &sources,
+std::deque<Path>
+pgr_dijkstra(
+ G &graph,
+ std::vector< int64_t > sources,
int64_t target,
bool only_cost = false) {
+ std::sort(sources.begin(), sources.end());
+ sources.erase(
+ std::unique(sources.begin(), sources.end()),
+ sources.end());
+
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, paths, sources, target, only_cost);
+ return fn_dijkstra.dijkstra(graph, sources, target, only_cost);
}
+/* Many to Many */
template < class G >
-void
+std::deque<Path>
pgr_dijkstra(
- G &graph, std::deque<Path> &paths,
- const std::vector< int64_t > &sources,
- const std::vector< int64_t > &targets,
+ G &graph,
+ std::vector< int64_t > sources,
+ std::vector< int64_t > targets,
bool only_cost = false) {
+ std::sort(sources.begin(), sources.end());
+ sources.erase(
+ std::unique(sources.begin(), sources.end()),
+ sources.end());
+
+ std::sort(targets.begin(), targets.end());
+ targets.erase(
+ std::unique(targets.begin(), targets.end()),
+ targets.end());
+
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, paths, sources, targets, only_cost);
+ return fn_dijkstra.dijkstra(graph, sources, targets, only_cost);
}
@@ -137,16 +150,16 @@ class Pgr_dijkstra {
//! @name drivingDistance
//@{
//! 1 to distance
- void drivingDistance(
- G &graph,
- Path &path,
- int64_t start_vertex,
- double distance);
+ Path
+ drivingDistance(
+ G &graph,
+ int64_t start_vertex,
+ double distance);
//! many to distance
- void drivingDistance(
- G &graph, std::deque< Path > &paths,
+ std::deque<Path> drivingDistance(
+ G &graph,
std::vector< int64_t > start_vertex,
double distance,
bool equiCostFlag);
@@ -155,33 +168,29 @@ class Pgr_dijkstra {
//! @name Dijkstra
//@{
//! one to one
- void dijkstra(
+ Path dijkstra(
G &graph,
- Path &path,
int64_t start_vertex,
int64_t end_vertex,
bool only_cost = false);
//! Many to one
- void dijkstra(
+ std::deque<Path> dijkstra(
G &graph,
- std::deque< Path > &paths,
const std::vector < int64_t > &start_vertex,
int64_t end_vertex,
bool only_cost = false);
//! Many to Many
- void dijkstra(
+ std::deque<Path> dijkstra(
G &graph,
- std::deque< Path > &paths,
const std::vector< int64_t > &start_vertex,
const std::vector< int64_t > &end_vertex,
bool only_cost = false);
//! one to Many
- void dijkstra(
+ std::deque<Path> dijkstra(
G &graph,
- std::deque< Path > &paths,
int64_t start_vertex,
const std::vector< int64_t > &end_vertex,
bool only_cost = false);
@@ -206,12 +215,6 @@ class Pgr_dijkstra {
V source,
const std::vector< V > &targets);
- void get_nodesInDistance(
- G &graph,
- Path &path,
- V source,
- double distance);
-
void clear() {
predecessors.clear();
distances.clear();
@@ -219,30 +222,25 @@ class Pgr_dijkstra {
}
- void get_path(
- const G &graph,
- V source,
- V target,
- Path &path) const;
- void get_cost(
- const G &graph,
- V source,
- V target,
- Path &path) const;
// used when multiple goals
- void get_path(
+ std::deque<Path> get_paths(
const G &graph,
- std::deque< Path > &paths,
V source,
- std::vector< V > &targets) const;
+ std::vector< V > &targets,
+ bool only_cost) const {
+ std::deque<Path> paths;
+ for (const auto target : targets) {
+ paths.push_back(Path(
+ graph,
+ source, target,
+ predecessors, distances,
+ only_cost, true));
+ }
+ return paths;
+ }
- void get_cost(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const;
//! @name members;
@@ -330,150 +328,12 @@ class Pgr_dijkstra {
/******************** IMPLEMENTTION ******************/
-template < class G >
-void
-Pgr_dijkstra< G >::get_nodesInDistance(
- G &graph,
- Path &path,
- V source,
- double distance) {
- path.clear();
- double cost;
- int64_t edge_id;
- Path r_path(graph[source].id, graph[source].id);
- for (V i = 0; i < distances.size(); ++i) {
- if (distances[i] <= distance) {
- cost = distances[i] - distances[predecessors[i]];
- edge_id = graph.get_edge_id(predecessors[i], i, cost);
- r_path.push_back(
- {graph[i].id,
- edge_id, cost,
- distances[i]});
- }
- }
- path = r_path;
-}
-
-
-template < class G >
-void
-Pgr_dijkstra< G >::get_path(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const {
- Path path;
- typename std::vector< V >::iterator s_it;
- for (s_it = targets.begin(); s_it != targets.end(); ++s_it) {
- path.clear();
- get_path(graph, source, *s_it, path);
- paths.push_back(path);
- }
-}
-
-template < class G >
-void
-Pgr_dijkstra< G >::get_path(
- const G &graph,
- V source,
- V target,
- Path &r_path) const {
- // backup of the target
- V target_back = target;
- uint64_t from(graph.graph[source].id);
- uint64_t to(graph.graph[target].id);
-
- // no path was found
- if (target == predecessors[target]) {
- r_path.clear();
- return;
- }
-
- // find out how large is the path
- int64_t result_size = 1;
- while (target != source) {
- if (target == predecessors[target]) break;
- result_size++;
- target = predecessors[target];
- }
-
- // recover the target
- target = target_back;
-
- // variables that are going to be stored
- int64_t vertex_id;
- int64_t edge_id;
- double cost;
-
- // working from the last to the beginning
-
- // initialize the sequence
- auto seq = result_size;
- // the last stop is the target
- Path path(from, to);
- path.push_front(
- {graph.graph[target].id, -1,
- 0, distances[target]});
-
- while (target != source) {
- // we are done when the predecesor of the target is the target
- if (target == predecessors[target]) break;
- // values to be inserted in the path
- --seq;
- cost = distances[target] - distances[predecessors[target]];
- vertex_id = graph.graph[predecessors[target]].id;
- edge_id = graph.get_edge_id(predecessors[target], target, cost);
-
- path.push_front({vertex_id, edge_id,
- cost, (distances[target] - cost)});
- target = predecessors[target];
- }
- r_path = path;
- return;
-}
-
-template < class G >
-void
-Pgr_dijkstra< G >::get_cost(
- const G &graph,
- std::deque< Path > &paths,
- V source,
- std::vector< V > &targets) const {
- Path path;
- for (auto s_it = targets.begin(); s_it != targets.end(); ++s_it) {
- path.clear();
- get_cost(graph, source, *s_it, path);
- paths.push_back(path);
- }
-}
-
-
-template < class G >
-void
-Pgr_dijkstra< G >::get_cost(
- const G &graph,
- V source,
- V target,
- Path &r_path) const {
- // backup of the target
- int64_t from(graph.graph[source].id);
- int64_t to(graph.graph[target].id);
-
- // no path was found
- if (target == predecessors[target]) {
- r_path.clear();
- } else {
- Path path(from, to);
- path.push_front(
- {to, -1, distances[target], distances[target]});
- r_path = path;
- }
-}
-template < class G >
// preparation for many to distance
-void
-Pgr_dijkstra< G >::drivingDistance(G &graph, std::deque< Path > &paths,
+template < class G >
+std::deque< Path >
+Pgr_dijkstra< G >::drivingDistance(
+ G &graph,
std::vector< int64_t > start_vertex,
double distance,
bool equicost) {
@@ -484,25 +344,23 @@ Pgr_dijkstra< G >::drivingDistance(G &graph, std::deque< Path > &paths,
// perform the algorithm
+ std::deque< Path > paths;
for (const auto &vertex : start_vertex) {
- Path path;
- drivingDistance(graph, path, vertex, distance);
- paths.push_back(path);
+ paths.push_back(
+ drivingDistance(graph, vertex, distance));
}
if (equicost) {
equi_cost(paths);
}
+ return paths;
}
template < class G >
-void
+Path
Pgr_dijkstra< G >::drivingDistance(
G &graph,
- Path &path,
int64_t start_vertex,
double distance) {
-
-
clear();
predecessors.resize(graph.num_vertices());
@@ -513,28 +371,28 @@ Pgr_dijkstra< G >::drivingDistance(
/* The node has to be in the path*/
Path p(start_vertex, start_vertex);
p.push_back({start_vertex, -1, 0, 0});
- path = p;
- return;
+ return p;
}
auto v_source(graph.get_V(start_vertex));;
- dijkstra_1_to_distance(graph, v_source, distance);
- get_nodesInDistance(graph, path, v_source, distance);
+ dijkstra_1_to_distance(graph, v_source, distance);
+
+ auto path = Path(graph, v_source, distance, predecessors, distances);
+
std::sort(path.begin(), path.end(),
[](const Path_t &l, const Path_t &r)
{return l.node < r.node;});
std::stable_sort(path.begin(), path.end(),
[](const Path_t &l, const Path_t &r)
{return l.agg_cost < r.agg_cost;});
- return;
+ return path;
}
//! Dijkstra 1 to 1
template < class G >
-void
+Path
Pgr_dijkstra< G >::dijkstra(
G &graph,
- Path &path,
int64_t start_vertex,
int64_t end_vertex,
bool only_cost) {
@@ -547,8 +405,7 @@ Pgr_dijkstra< G >::dijkstra(
if (!graph.has_vertex(start_vertex)
|| !graph.has_vertex(end_vertex)) {
- path.clear();
- return;
+ return Path(start_vertex, end_vertex);
}
// get the graphs source and target
@@ -559,20 +416,18 @@ Pgr_dijkstra< G >::dijkstra(
dijkstra_1_to_1(graph, v_source, v_target);
// get the results
- if (only_cost) {
- get_cost(graph, v_source, v_target, path);
- } else {
- get_path(graph, v_source, v_target, path);
- }
- return;
+ return Path(
+ graph,
+ v_source, v_target,
+ predecessors, distances,
+ only_cost, true);
}
//! Dijkstra 1 to many
template < class G >
-void
+std::deque<Path>
Pgr_dijkstra< G >::dijkstra(
G &graph,
- std::deque< Path > &paths,
int64_t start_vertex,
const std::vector< int64_t > &end_vertex,
bool only_cost) {
@@ -583,11 +438,12 @@ Pgr_dijkstra< G >::dijkstra(
distances.resize(graph.num_vertices());
// get the graphs source and target
- if (!graph.has_vertex(start_vertex)) return;
+ if (!graph.has_vertex(start_vertex))
+ return std::deque<Path>();
auto v_source(graph.get_V(start_vertex));
std::set< V > s_v_targets;
- for (const auto &vertex : end_vertex) {
+ for (const auto &vertex : end_vertex) {
if (graph.has_vertex(vertex)) {
s_v_targets.insert(graph.get_V(vertex));
}
@@ -597,56 +453,54 @@ Pgr_dijkstra< G >::dijkstra(
// perform the algorithm
dijkstra_1_to_many(graph, v_source, v_targets);
+ std::deque< Path > paths;
// get the results // route id are the targets
- if (only_cost) {
- get_cost(graph, paths, v_source, v_targets);
- } else {
- get_path(graph, paths, v_source, v_targets);
- }
+ paths = get_paths(graph, v_source, v_targets, only_cost);
std::stable_sort(paths.begin(), paths.end(),
[](const Path &e1, const Path &e2)->bool {
return e1.end_id() < e2.end_id();
});
- return;
+ return paths;
}
// preparation for many to 1
template < class G >
-void
+std::deque<Path>
Pgr_dijkstra< G >::dijkstra(
- G &graph, std::deque< Path > &paths,
+ G &graph,
const std::vector < int64_t > &start_vertex,
int64_t end_vertex,
bool only_cost) {
- // perform the algorithm // a call for each of the sources
+ std::deque<Path> paths;
+
for (const auto &start : start_vertex) {
- Path path;
- // each call cleans the local structures
- dijkstra(graph, path, start, end_vertex, only_cost);
- paths.push_back(path);
+ paths.push_back(
+ dijkstra(graph, start, end_vertex, only_cost));
}
std::stable_sort(paths.begin(), paths.end(),
[](const Path &e1, const Path &e2)->bool {
return e1.start_id() < e2.start_id();
});
- return;
+ return paths;
}
// preparation for many to many
template < class G >
-void
+std::deque<Path>
Pgr_dijkstra< G >::dijkstra(
- G &graph, std::deque< Path > &paths,
+ G &graph,
const std::vector< int64_t > &start_vertex,
const std::vector< int64_t > &end_vertex,
bool only_cost) {
// a call to 1 to many is faster for each of the sources
+ std::deque<Path> paths;
for (const auto &start : start_vertex) {
- dijkstra(graph, paths, start, end_vertex, only_cost);
+ auto r_paths = dijkstra(graph, start, end_vertex, only_cost);
+ paths.insert(paths.begin(), r_paths.begin(), r_paths.end());
}
std::sort(paths.begin(), paths.end(),
@@ -657,7 +511,7 @@ Pgr_dijkstra< G >::dijkstra(
[](const Path &e1, const Path &e2)->bool {
return e1.start_id() < e2.start_id();
});
- return;
+ return paths;
}
@@ -672,12 +526,13 @@ Pgr_dijkstra< G >::dijkstra_1_to_1(
try {
boost::dijkstra_shortest_paths(graph.graph, source,
boost::predecessor_map(&predecessors[0])
- .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
+ .weight_map(get(&G::G_T_E::cost, graph.graph))
.distance_map(&distances[0])
.visitor(dijkstra_one_goal_visitor(target)));
}
catch(found_goals &) {
found = true; // Target vertex found
+ } catch (...) {
}
return found;
}
@@ -691,7 +546,7 @@ Pgr_dijkstra< G >::dijkstra_1_to_distance(G &graph, V source, double distance) {
try {
boost::dijkstra_shortest_paths(graph.graph, source,
boost::predecessor_map(&predecessors[0])
- .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
+ .weight_map(get(&G::G_T_E::cost, graph.graph))
.distance_map(&distances[0])
.visitor(dijkstra_distance_visitor(
distance,
@@ -700,6 +555,7 @@ Pgr_dijkstra< G >::dijkstra_1_to_distance(G &graph, V source, double distance) {
}
catch(found_goals &) {
found = true;
+ } catch (...) {
}
return found;
}
@@ -715,13 +571,15 @@ Pgr_dijkstra< G >::dijkstra_1_to_many(
try {
boost::dijkstra_shortest_paths(graph.graph, source,
boost::predecessor_map(&predecessors[0])
- .weight_map(get(&pgrouting::Basic_edge::cost, graph.graph))
+ .weight_map(get(&G::G_T_E::cost, graph.graph))
.distance_map(&distances[0])
.visitor(dijkstra_many_goal_visitor(targets)));
}
catch(found_goals &) {
found = true; // Target vertex found
+ } catch (...) {
}
return found;
}
+#endif // SRC_DIJKSTRA_SRC_PGR_DIJKSTRA_HPP_
diff --git a/src/dijkstra/test/CMakeLists.txt b/src/dijkstra/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/dijkstra/test/dijkstra-v2.test.sql b/src/dijkstra/test/dijkstra-v2.test.sql
index 5f537f9..9615059 100644
--- a/src/dijkstra/test/dijkstra-v2.test.sql
+++ b/src/dijkstra/test/dijkstra-v2.test.sql
@@ -4,8 +4,6 @@
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
-
\echo --q1
SELECT * FROM pgr_dijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
diff --git a/src/dijkstra/test/doc-pgr_dijkstra.result b/src/dijkstra/test/doc-pgr_dijkstra.result
index 72a9caf..f9dbedd 100644
--- a/src/dijkstra/test/doc-pgr_dijkstra.result
+++ b/src/dijkstra/test/doc-pgr_dijkstra.result
@@ -101,8 +101,8 @@
3|3|5|-1|0|2
1|1|2|2|4|1|0
2|2|2|5|-1|0|1
-3|1|11|11|11|1|0
-4|2|11|6|8|1|1
+3|1|11|11|12|1|0
+4|2|11|10|10|1|1
5|3|11|5|-1|0|2
1|1|3|2|2|1|0
2|2|3|3|-1|0|1
@@ -144,8 +144,8 @@
3|3|5|-1|0|2
1|1|2|2|4|1|0
2|2|2|5|-1|0|1
-3|1|11|11|11|1|0
-4|2|11|6|8|1|1
+3|1|11|11|12|1|0
+4|2|11|10|10|1|1
5|3|11|5|-1|0|2
1|1|3|2|4|1|0
2|2|3|5|8|1|1
diff --git a/src/dijkstra/test/doc-pgr_dijkstra.test.sql b/src/dijkstra/test/doc-pgr_dijkstra.test.sql
index 55640ac..41aa7b9 100644
--- a/src/dijkstra/test/doc-pgr_dijkstra.test.sql
+++ b/src/dijkstra/test/doc-pgr_dijkstra.test.sql
@@ -1,5 +1,3 @@
-BEGIN;
-SET client_min_messages TO NOTICE;
\echo -- q1
SELECT * FROM pgr_dijkstra(
@@ -259,7 +257,6 @@ SELECT * FROM pgr_dijkstra(
FALSE
);
-- Version 2.0
-SET client_min_messages TO NOTICE;
SELECT * FROM pgr_dijkstra(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
2, 3,
@@ -268,5 +265,3 @@ SELECT * FROM pgr_dijkstra(
);
\echo -- q18
-
-ROLLBACK;
diff --git a/src/dijkstra/test/doc-pgr_dijkstraCost.test.sql b/src/dijkstra/test/doc-pgr_dijkstraCost.test.sql
index eb274b1..7221344 100644
--- a/src/dijkstra/test/doc-pgr_dijkstraCost.test.sql
+++ b/src/dijkstra/test/doc-pgr_dijkstraCost.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
\echo --q1
SELECT * FROM pgr_dijkstraCost(
'select id, source, target, cost, reverse_cost from edge_table',
@@ -35,4 +34,3 @@ SELECT * FROM pgr_dijkstraCost(
ARRAY[5, 3, 4], ARRAY[5, 3, 4]);
\echo --q8
-ROLLBACK
diff --git a/src/dijkstra/test/pgtap/oneToOne_equiv_manyToMany.test.sql b/src/dijkstra/test/pgtap/oneToOne_equiv_manyToMany.test.sql
index 1e8c8b8..ba2b354 100644
--- a/src/dijkstra/test/pgtap/oneToOne_equiv_manyToMany.test.sql
+++ b/src/dijkstra/test/pgtap/oneToOne_equiv_manyToMany.test.sql
@@ -3,6 +3,8 @@
SELECT plan(1);
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
create or REPLACE FUNCTION foo(cant INTEGER default 18 )
RETURNS SETOF TEXT AS
diff --git a/src/dijkstra/test/pgtap/oneToOne_equiv_manyToOne.test.sql b/src/dijkstra/test/pgtap/oneToOne_equiv_manyToOne.test.sql
index a5fd055..0c76ded 100644
--- a/src/dijkstra/test/pgtap/oneToOne_equiv_manyToOne.test.sql
+++ b/src/dijkstra/test/pgtap/oneToOne_equiv_manyToOne.test.sql
@@ -3,6 +3,8 @@
SELECT plan(18);
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
create or REPLACE FUNCTION foo(cant INTEGER default 18 )
RETURNS SETOF TEXT AS
@@ -23,14 +25,14 @@ BEGIN
sql_Many := sql_Many ||', ';
END IF;
sql_OneToOne := sql_OneToOne ||
- '( SELECT seq, ' || j || 'as start_vid, ' || i || 'as end_vid, node, edge, cost, agg_cost FROM pgr_dijkstra(
+ '( SELECT seq, ' || j || 'as start_vid, ' || i || 'as end_vid, node, edge, cost::text, agg_cost::text FROM pgr_dijkstra(
''SELECT id, source, target, cost, reverse_cost FROM edge_table'', '
|| j || ', ' || i ||
') )';
sql_Many := sql_Many || j ;
END LOOP;
sql_Many :=
-' SELECT path_seq, start_vid, ' || i || ' as end_vid, node, edge, cost, agg_cost FROM pgr_dijkstra(
+' SELECT path_seq, start_vid, ' || i || ' as end_vid, node, edge, cost::text, agg_cost::text FROM pgr_dijkstra(
''SELECT id, source, target, cost, reverse_cost FROM edge_table'', '
' ARRAY[' || sql_Many || '], ' || i ||
' ) ';
diff --git a/src/dijkstra/test/pgtap/oneToOne_equiv_oneToMany.test.sql b/src/dijkstra/test/pgtap/oneToOne_equiv_oneToMany.test.sql
index 9bd98b6..5a69ef7 100644
--- a/src/dijkstra/test/pgtap/oneToOne_equiv_oneToMany.test.sql
+++ b/src/dijkstra/test/pgtap/oneToOne_equiv_oneToMany.test.sql
@@ -2,6 +2,8 @@
SELECT plan(36);
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
create or REPLACE FUNCTION foo(cant INTEGER default 18, flag boolean default true )
RETURNS SETOF TEXT AS
diff --git a/src/dijkstra/test/pgtap/v2-equi-v3-undirected-N-reverse.test.sql b/src/dijkstra/test/pgtap/v2-equi-v3-undirected-N-reverse.test.sql
index 1884039..7301825 100644
--- a/src/dijkstra/test/pgtap/v2-equi-v3-undirected-N-reverse.test.sql
+++ b/src/dijkstra/test/pgtap/v2-equi-v3-undirected-N-reverse.test.sql
@@ -2,7 +2,10 @@
SET client_min_messages = WARNING;
-SELECT plan(11);
+SELECT plan(9);
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
-- all this queries are equivalent (give the same results)
PREPARE q00 AS
@@ -82,8 +85,8 @@ SELECT seq, id1, id2, cost FROM pgr_dijkstra(
- SELECT set_eq( 'q0', ARRAY[7, 8, 5, 10, 11], '1');
- SELECT set_eq( 'q00', ARRAY[6, 7, 10, 12, -1], '2');
+ -- SELECT set_eq( 'q0', ARRAY[7, 8, 5, 10, 11], '1');
+ -- SELECT set_eq( 'q00', ARRAY[6, 7, 10, 12, -1], '2');
SELECT set_eq( 'q1', 'q2', '3');
SELECT set_eq( 'q1', 'q3', '4');
SELECT set_eq( 'q1', 'q4', '5');
diff --git a/src/dijkstra/test/pgtap/v2-equi-v3-undirected-W-reverse.test.sql b/src/dijkstra/test/pgtap/v2-equi-v3-undirected-W-reverse.test.sql
index 73110fc..0ab0c50 100644
--- a/src/dijkstra/test/pgtap/v2-equi-v3-undirected-W-reverse.test.sql
+++ b/src/dijkstra/test/pgtap/v2-equi-v3-undirected-W-reverse.test.sql
@@ -4,6 +4,9 @@ SET client_min_messages = WARNING;
SELECT plan(10);
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+
-- all this queries are equivalent (give the same results)
PREPARE q00 AS
SELECT id2 FROM pgr_dijkstra(
diff --git a/src/dijkstra/test/test.conf b/src/dijkstra/test/test.conf
index 84ddc0f..7173fc9 100644
--- a/src/dijkstra/test/test.conf
+++ b/src/dijkstra/test/test.conf
@@ -5,7 +5,6 @@
'comment' => 'Dijkstra test for any versions.',
'data' => [ ],
'tests' => [qw(
-
dijkstra-v2
doc-pgr_dijkstra
doc-pgr_dijkstraVia
@@ -17,6 +16,12 @@
doc-pgr_dijkstraVia
doc-pgr_dijkstraCost
)]
+ ,'notests' => [qw(
+ dijkstra-v2
+ doc-pgr_dijkstraVia
+ doc-pgr_dijkstraCost
+ many_to_1
+ )]
},
# 'vpg-vpgis' => {}, # for version specific tests
diff --git a/src/dijkstra/tester/Makefile b/src/dijkstra/tester/Makefile
deleted file mode 100644
index 66718c4..0000000
--- a/src/dijkstra/tester/Makefile
+++ /dev/null
@@ -1,14 +0,0 @@
-
-all: testit
-
-testit: testit.o boost_wrapper.o
- g++ -g -O0 -o testit testit.o boost_wrapper.o -L/usr/lib -lm
-
-testit.o: testit.c
- gcc -g -O0 -c testit.c
-
-boost_wrapper.o: boost_wrapper.cpp
- g++ -g -O0 -I/usr/include -c boost_wrapper.cpp
-
-clean:
- rm -f *.o testit
diff --git a/src/dijkstra/tester/boost_wrapper.cpp b/src/dijkstra/tester/boost_wrapper.cpp
deleted file mode 100644
index 22ee8bf..0000000
--- a/src/dijkstra/tester/boost_wrapper.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-/*
- * Shortest path algorithm for PostgreSQL
- *
- * Copyright (c) 2005 Sylvain Pasche
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-// Include C header first for windows build issue
-#include "dijkstra.h"
-#include <cfloat>
-
-#include <boost/config.hpp>
-
-#include <boost/graph/graph_traits.hpp>
-#include <boost/graph/adjacency_list.hpp>
-#include <boost/graph/dijkstra_shortest_paths.hpp>
-
-using namespace std;
-using namespace boost;
-
-// Maximal number of nodes in the path (to avoid infinite loops)
-#define MAX_NODES 100000000
-
-struct Vertex
-{
- int id;
- float8 cost;
-};
-
-
-int
-boost_dijkstra(edge_t *edges, unsigned int count, int start_vertex, int end_vertex,
- bool directed, bool has_reverse_cost,
- path_element_t **path, int *path_count, char **err_msg)
-{
-try {
-
- // FIXME: use a template for the directedS parameters
- typedef adjacency_list < listS, vecS, directedS, no_property, Vertex> graph_t;
-
- typedef graph_traits < graph_t >::vertex_descriptor vertex_descriptor;
- typedef graph_traits < graph_t >::edge_descriptor edge_descriptor;
- typedef std::pair<int, int> Edge;
-
- // FIXME: compute this value
- const unsigned int num_nodes = ((directed && has_reverse_cost ? 2 : 1) * count) + 100;
-
- graph_t graph(num_nodes);
-
- // commented out to fix APPLE build, is it needed?
- //property_map<graph_t, edge_weight_t>::type weightmap = get(edge_weight, graph);
-
- for (std::size_t j = 0; j < count; ++j)
- {
- double cost, rcost;
- edge_descriptor e;
- bool inserted;
-
- tie(e, inserted) = add_edge(edges[j].source, edges[j].target, graph);
-
- cost = (edges[j].cost < 0.0) ? DBL_MAX : edges[j].cost;
- graph[e].cost = cost;
- graph[e].id = edges[j].id;
-
- if (!directed || (directed && has_reverse_cost))
- {
- tie(e, inserted) = add_edge(edges[j].target, edges[j].source, graph);
- graph[e].id = edges[j].id;
-
- if (has_reverse_cost)
- {
- rcost = (edges[j].reverse_cost < 0.0) ? DBL_MAX : edges[j].reverse_cost;
- graph[e].cost = rcost;
- }
- else
- {
- graph[e].cost = cost;
- }
- }
- }
-
- std::vector<vertex_descriptor> predecessors(num_vertices(graph));
-
- vertex_descriptor _source = vertex(start_vertex, graph);
-
- if (_source < 0 /*|| _source >= num_nodes*/)
- {
- *err_msg = (char *) "Starting vertex not found";
- return -1;
- }
-
- vertex_descriptor _target = vertex(end_vertex, graph);
- if (_target < 0 /*|| _target >= num_nodes*/)
- {
- *err_msg = (char *) "Ending vertex not found";
- return -1;
- }
-
- std::vector<float8> distances(num_vertices(graph));
- // calling Boost function
- dijkstra_shortest_paths(graph, _source,
- predecessor_map(&predecessors[0]).
- weight_map(get(&Vertex::cost, graph))
- .distance_map(&distances[0]));
-
- vector<int> path_vect;
- int max = MAX_NODES;
- path_vect.push_back(_target);
-
- while (_target != _source)
- {
- if (_target == predecessors[_target])
- {
- *err_msg = (char *) "No path found";
- return 0;
- }
- _target = predecessors[_target];
-
- path_vect.push_back(_target);
- if (!max--)
- {
- *err_msg = (char *) "Overflow";
- return -1;
- }
- }
-
- *path = (path_element_t *) malloc(sizeof(path_element_t) * (path_vect.size() + 1));
- *path_count = path_vect.size();
-
- for(int i = path_vect.size() - 1, j = 0; i >= 0; i--, j++)
- {
- graph_traits < graph_t >::vertex_descriptor v_src;
- graph_traits < graph_t >::vertex_descriptor v_targ;
- graph_traits < graph_t >::edge_descriptor e;
- graph_traits < graph_t >::out_edge_iterator out_i, out_end;
-
- (*path)[j].vertex_id = path_vect.at(i);
-
- (*path)[j].edge_id = -1;
- (*path)[j].cost = distances[_target];
-
- if (i == 0)
- {
- continue;
- }
-
- v_src = path_vect.at(i);
- v_targ = path_vect.at(i - 1);
- double cost = 99999999.9;
- int edge_id = 0;
-
- for (tie(out_i, out_end) = out_edges(v_src, graph);
- out_i != out_end; ++out_i)
- {
- graph_traits < graph_t >::vertex_descriptor v, targ;
- e = *out_i;
- v = source(e, graph);
- targ = target(e, graph);
-
- if (targ == v_targ)
- {
- // if there are multiple parallel edges get the lowest cost
- if (graph[*out_i].cost < cost)
- {
- edge_id = graph[*out_i].id;
- cost = graph[*out_i].cost;
- }
- }
- }
- (*path)[j].edge_id = edge_id;
- (*path)[j].cost = cost;
- }
-
- return EXIT_SUCCESS;
- }
- catch(...) {
- *err_msg = (char *) "Unknown exception caught!";
- return -1;
- }
-}
diff --git a/src/dijkstra/tester/dijkstra.h b/src/dijkstra/tester/dijkstra.h
deleted file mode 100644
index ca9854f..0000000
--- a/src/dijkstra/tester/dijkstra.h
+++ /dev/null
@@ -1,72 +0,0 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-/*
- * Shortest path algorithm for PostgreSQL
- *
- * Copyright (c) 2005 Sylvain Pasche
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- */
-
-#ifndef _DIJKSTRA_H
-#define _DIJKSTRA_H
-
-typedef double float8;
-
-typedef struct edge
-{
- int id;
- int source;
- int target;
- float8 cost;
- float8 reverse_cost;
-} edge_t;
-
-typedef struct path_element
-{
- int vertex_id;
- int edge_id;
- float8 cost;
-} path_element_t;
-
-#ifdef __cplusplus
-extern "C"
-#endif
-int boost_dijkstra(edge_t *edges, unsigned int count, int start_vertex, int end_vertex,
- bool directed, bool has_reverse_cost,
- path_element_t **path, int *path_count, char **err_msg);
-
-#endif
diff --git a/src/dijkstra/tester/testit.c b/src/dijkstra/tester/testit.c
deleted file mode 100644
index 05142f4..0000000
--- a/src/dijkstra/tester/testit.c
+++ /dev/null
@@ -1,139 +0,0 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-#include <stdlib.h>
-#include <stdio.h>
-#include <limits.h>
-#include <assert.h>
-
-typedef double float8;
-typedef int bool;
-
-typedef struct edge
-{
- int id;
- int source;
- int target;
- float8 cost;
- float8 reverse_cost;
-} edge_t;
-
-typedef struct path_element
-{
- int vertex_id;
- int edge_id;
- float8 cost;
-} path_element_t;
-
-#ifdef __cplusplus
-extern "C"
-#endif
-int boost_dijkstra(edge_t *edges, unsigned int count, int start_vertex,
- int end_vertex, bool directed, bool has_reverse_cost,
- path_element_t **path, int *path_count, char **err_msg);
-
-static edge_t edges[23] = {
- {134034453,4401484,4401467,1491.35562366006,0.0},
- {134034463,4401489,4401485,12.1046145920234,0.0},
- {134034458,4401487,4401477,177.374061187772,0.0},
- {134095663,4401465,4401476,2014.71852797927,0.0},
- {134034459,4401485,4401487,201.968135582698,0.0},
- {134095834,4401478,4401465,293.089423713387,0.0},
- {134034461,4401488,4401489,418.687894948968,0.0},
- {629678698,4415069,134860887,3776.78929640359,0.0},
- {134034456,4401477,4401481,491.242305990214,0.0},
- {134095832,4401482,4401487,76.1157555542275,0.0},
- {134034465,4401490,4401489,1956.98967514724,0.0},
- {134034454,4401483,4401486,1356.25190452873,0.0},
- {134034462,4401487,4401478,17.2205341642897,0.0},
- {134095833,4401477,4401478,2014.66722340654,0.0},
- {134034455,4401485,4401483,53.5613132396201,0.0},
- {134034467,4401488,4417647,2597.20106449741,0.0},
- {134034452,4401483,4401467,350.071683838508,0.0},
- {134034446,4401481,4401476,568.270689073724,0.0},
- {134072383,4416226,4401482,322.141177736713,0.0},
- {134034447,4401482,4401481,1522.8331095897,0.0},
- {134034466,4401486,4401490,610.880612548267,0.0},
- {134034468,4417647,4401486,507.803184036552,0.0},
- {134034464,4401490,4401485,149.914370088613,0.0}
-};
-
-int main(void) {
- int total_tuples = 23;
- int i;
-
- int ret;
- char *err_msg = NULL;
-
- int start_vertex = 4401489;
- int end_vertex = 4401483;
-
- int v_min_id = LONG_MAX;
- int v_max_id = 0;
-
- int s_count = 0;
- int t_count = 0;
-
- path_element_t *path = NULL;
- int path_count = 0;
-
- for (i=0; i<total_tuples; i++) {
- if(edges[i].source < v_min_id) v_min_id = edges[i].source;
- if(edges[i].target < v_min_id) v_min_id = edges[i].target;
- if(edges[i].source > v_max_id) v_max_id = edges[i].source;
- if(edges[i].target > v_max_id) v_max_id = edges[i].target;
- }
- printf("%i <-> %i\n", v_min_id, v_max_id);
-
- for (i=0; i<total_tuples; i++) {
- if (edges[i].source == start_vertex || edges[i].target == start_vertex)
- s_count++;
- if (edges[i].source == end_vertex || edges[i].target == end_vertex)
- t_count++;
- edges[i].source -= v_min_id;
- edges[i].target -= v_min_id;
- }
-
- assert(s_count);
- assert(t_count);
-
- start_vertex -= v_min_id;
- end_vertex -= v_min_id;
-
- ret = boost_dijkstra(edges, total_tuples, start_vertex, end_vertex,
- 0, 0, &path, &path_count, &err_msg);
-
- if (ret < 0) {
- printf("Error computing path: %s\n", err_msg);
- exit(1);
- }
-
- printf(" seq: vertex_id, edge_id, cost\n");
- for (i=0; i<path_count; i++) {
- path[i].vertex_id += v_min_id;
- printf("%6d: %10d, %10d, %10.4f\n", i, path[i].vertex_id, path[i].edge_id, path[i].cost);
- }
-
- if (path) free(path);
-
- exit(0);
-}
diff --git a/src/driving_distance/doc/doc-pgr_drivingDistance.queries b/src/driving_distance/doc/doc-pgr_drivingDistance.queries
index 4d0180f..b23f5be 100644
--- a/src/driving_distance/doc/doc-pgr_drivingDistance.queries
+++ b/src/driving_distance/doc/doc-pgr_drivingDistance.queries
@@ -1,3 +1,8 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
+--q1
/*PGR-GNU*****************************************************************
Copyright (c) 2015 pgRouting developers
@@ -25,11 +30,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-BEGIN;
-BEGIN
-SET client_min_messages TO NOTICE;
-SET
---q1
SELECT * FROM pgr_drivingDistance(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 3
diff --git a/src/driving_distance/doc/doc-pgr_drivingdistance-v2.queries b/src/driving_distance/doc/doc-pgr_drivingdistance-v2.queries
index 5fa1b9e..ef22884 100644
--- a/src/driving_distance/doc/doc-pgr_drivingdistance-v2.queries
+++ b/src/driving_distance/doc/doc-pgr_drivingdistance-v2.queries
@@ -2,6 +2,8 @@ BEGIN;
BEGIN
SET client_min_messages TO NOTICE;
SET
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_drivingDistance(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
diff --git a/src/ksp/doc/ksp.rst.back b/src/driving_distance/doc/drivingDistance-category.rst
similarity index 52%
copy from src/ksp/doc/ksp.rst.back
copy to src/driving_distance/doc/drivingDistance-category.rst
index 0eec12f..460992e 100644
--- a/src/ksp/doc/ksp.rst.back
+++ b/src/driving_distance/doc/drivingDistance-category.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -7,18 +7,27 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
-.. _ksp:
-pgr_ksp - Multiple shortest Paths based on Dijkstra
+.. _drivingDistance:
+
+Driving Distance - Category
===============================================================================
+.. index from here
+
+* :ref:`pgr_drivingDistance` - Driving Distance based on pgr_dijkstra
+* :ref:`pgr_withPointsDD` - Driving Distance based on pgr_withPoints
+* Post pocessing
+
+ * :ref:`pgr_alphaShape` - Alpha shape computation
+ * :ref:`pgr_points_as_polygon` - Polygon around set of points
+.. index to here
- - :ref:`pgr_ksp<pgr_ksp>` - Multiple shortest Paths based on Dijkstra
- - :ref:`pgr_withPointsKSP<pgr_withPointsKSP>` - Multiple shortest Paths based on Dijkstra
.. toctree::
- :hidden:
+ :hidden:
- ./pgr_ksp
+ pgr_alphaShape.rst
+ pgr_pointsAsPolygon.rst
diff --git a/src/driving_distance/doc/drivingDistance.rst b/src/driving_distance/doc/drivingDistance.rst
deleted file mode 100644
index c56a2eb..0000000
--- a/src/driving_distance/doc/drivingDistance.rst
+++ /dev/null
@@ -1,37 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-
-.. _drivingDistance:
-
-Driving Distance
-===============================================================================
-
-
- - :ref:`pgr_drivingDistance` - Driving Distance based on pgr_dijkstra
-
-.. toctree::
- :hidden:
-
- ./pgr_drivingDistance.rst
-
-.. _pgr_driving_distance_post:
-
-Driving Distance post-processing
-===============================================================================
-
- - :ref:`pgr_alphaShape` - Alpha shape computation
- - :ref:`pgr_points_as_polygon` - Polygon around set of points
-
-.. toctree::
- :hidden:
-
- ./../../alpha_shape/doc/pgr_alphaShape.rst
- ./../../alpha_shape/doc/pgr_pointsAsPolygon.rst
-
diff --git a/src/driving_distance/doc/pgr_drivingDistance.rst b/src/driving_distance/doc/pgr_drivingDistance.rst
index fac8f7c..ce9f63b 100644
--- a/src/driving_distance/doc/pgr_drivingDistance.rst
+++ b/src/driving_distance/doc/pgr_drivingDistance.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,11 +19,17 @@ Name
``pgr_drivingDistance`` - Returns the driving distance from a start node.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability
+
+* pgr_drivingDistance(single vertex) 2.0.0, signature change 2.1.0
+* pgr_drivingDistance(multiple vertices) 2.1.0
+
+
Synopsis
-------------------------------------------------------------------------------
@@ -84,7 +90,7 @@ Driving Distance From Multiple Starting Vertices
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
diff --git a/src/driving_distance/doc/pgr_drivingDistance_v2.rst b/src/driving_distance/doc/pgr_drivingDistance_v2.rst
deleted file mode 100644
index 095e8f8..0000000
--- a/src/driving_distance/doc/pgr_drivingDistance_v2.rst
+++ /dev/null
@@ -1,97 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_driving_distance_v2:
-
-pgr_drivingDistance - Deprecated Signature
-===============================================================================
-
-.. warning:: This function signature is deprecated!!!
-
- * That means it has been replaced by new signature(s)
- * This signature is no longer supported, and may be removed from future versions.
- * All code that use this function signature should be converted to use its replacement :ref:`pgr_drivingDistance`.
-
-
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_drivingDistance`` - Returns the driving distance from a start node.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-This function computes a Dijkstra shortest path solution them extracts the cost to get to each node in the network from the starting node. Using these nodes and costs it is possible to compute constant drive time polygons. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows, that make up a list of accessible points.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_drivingDistance(text sql, integer source, double precision distance,
- boolean directed, boolean has_rcost);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :reverse_cost: (optional) the cost for the reverse traversal of the edge. This is only used when the ``directed`` and ``has_rcost`` parameters are ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:distance: ``float8`` value in edge cost units (not in projection units - they might be different).
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: node ID
-:id2: edge ID (this is probably not a useful item)
-:cost: cost to get to this node ID
-
-.. warning::
-
- You must reconnect to the database after ``CREATE EXTENSION pgrouting``. Otherwise the function will return ``Error computing path: std::bad_alloc``.
-
-
-.. rubric:: History
-
-* Renamed in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-* With ``reverse_cost``
-
-.. literalinclude:: doc-pgr_drivingdistance-v2.queries
- :start-after: --q1
- :end-before: --q2
-
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_drivingDistance`
-* :ref:`pgr_alphashape` - Alpha shape computation
-* :ref:`pgr_points_as_polygon` - Polygon around set of points
diff --git a/src/driving_distance/sql/routing_dd.sql b/src/driving_distance/sql/routing_dd.sql
index b7b8198..32e8012 100644
--- a/src/driving_distance/sql/routing_dd.sql
+++ b/src/driving_distance/sql/routing_dd.sql
@@ -21,22 +21,46 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-CREATE OR REPLACE FUNCTION _pgr_drivingDistance(edges_sql text, start_vid bigint, distance float8, directed BOOLEAN,
- OUT seq integer, OUT node bigint, OUT edge bigint, OUT cost float, OUT agg_cost float)
+CREATE OR REPLACE FUNCTION pgr_drivingDistance(
+ edges_sql text,
+ start_vids anyarray,
+ distance FLOAT,
+ directed BOOLEAN DEFAULT TRUE,
+ equicost BOOLEAN DEFAULT FALSE,
+ OUT seq integer,
+ OUT from_v bigint,
+ OUT node bigint,
+ OUT edge bigint,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT)
RETURNS SETOF RECORD AS
- '$libdir/${PGROUTING_LIBRARY_NAME}', 'driving_distance'
+ '$libdir/${PGROUTING_LIBRARY_NAME}', 'driving_many_to_dist'
LANGUAGE c VOLATILE STRICT;
-CREATE OR REPLACE FUNCTION _pgr_drivingDistance(edges_sql text, start_vids anyarray, distance float8, directed BOOLEAN, equicost BOOLEAN,
- OUT seq integer, OUT start_v bigint, OUT node bigint, OUT edge bigint, OUT cost float, OUT agg_cost float)
+
+CREATE OR REPLACE FUNCTION pgr_drivingDistance(
+ edges_sql text,
+ start_vid bigint,
+ distance FLOAT8,
+ directed BOOLEAN DEFAULT TRUE,
+ OUT seq integer,
+ OUT node bigint,
+ OUT edge bigint,
+ OUT cost FLOAT,
+ OUT agg_cost FLOAT)
RETURNS SETOF RECORD AS
- '$libdir/${PGROUTING_LIBRARY_NAME}', 'driving_many_to_dist'
- LANGUAGE c VOLATILE STRICT;
+$BODY$
+ SELECT a.seq, a.node, a.edge, a.cost, a.agg_cost
+ FROM pgr_drivingDistance($1, ARRAY[$2]::BIGINT[], $3, $4, false) a;
+$BODY$
+LANGUAGE SQL VOLATILE
+COST 100
+ROWS 1000;
+
-- OLD SIGNATURE
-CREATE OR REPLACE FUNCTION pgr_drivingDistance(edges_sql text, source bigint, distance float8, directed BOOLEAN, has_rcost BOOLEAN)
+CREATE OR REPLACE FUNCTION pgr_drivingDistance(edges_sql text, source bigint, distance FLOAT8, directed BOOLEAN, has_rcost BOOLEAN)
RETURNS SETOF pgr_costresult AS
$BODY$
DECLARE
@@ -62,117 +86,10 @@ CREATE OR REPLACE FUNCTION pgr_drivingDistance(edges_sql text, source bigint, di
END IF;
RETURN query SELECT seq - 1 AS seq, node::integer AS id1, edge::integer AS id2, agg_cost AS cost
- FROM _pgr_drivingDistance(sql, source, distance, directed);
+ FROM pgr_drivingDistance($1, ARRAY[$2]::BIGINT[], $3, $4, false);
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100
ROWS 1000;
-
-
-CREATE OR REPLACE FUNCTION pgr_drivingDistance(edges_sql text, start_v bigint, distance float8, directed BOOLEAN DEFAULT TRUE,
- OUT seq integer, OUT node bigint, OUT edge bigint, OUT cost float, OUT agg_cost float)
- RETURNS SETOF RECORD AS
- $BODY$
- DECLARE
- BEGIN
- RETURN query
- SELECT * FROM _pgr_drivingDistance(edges_sql, start_v, distance, directed);
- END
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100
- ROWS 1000;
-
-
--- the multi starting point
-CREATE OR REPLACE FUNCTION pgr_drivingDistance(sql text, start_v anyarray, distance float8, directed BOOLEAN DEFAULT TRUE, equicost BOOLEAN DEFAULT FALSE,
- OUT seq integer, OUT from_v bigint, OUT node bigint, OUT edge bigint, OUT cost float, OUT agg_cost float)
- RETURNS SETOF RECORD AS
- $BODY$
- DECLARE
- BEGIN
- RETURN query
- SELECT * FROM _pgr_drivingDistance(sql, start_v, distance, directed, equicost);
- END
- $BODY$
- LANGUAGE plpgsql VOLATILE
- COST 100
- ROWS 1000;
-
-
-/*
-
------------------------------------------------------------------------
--- Core function for alpha shape computation.
--- The sql should return vertex ids and x,y values. Return ordered
--- vertex ids.
------------------------------------------------------------------------
-CREATE OR REPLACE FUNCTION pgr_alphashape(sql text, alpha float8 DEFAULT 0, OUT x float8, OUT y float8)
- RETURNS SETOF record
- AS '$libdir/librouting-2.2', 'alphashape'
- LANGUAGE c IMMUTABLE STRICT;
-
-----------------------------------------------------------
--- Draws an alpha shape around given set of points.
--- ** This should be rewritten as an aggregate. **
-----------------------------------------------------------
-CREATE OR REPLACE FUNCTION pgr_pointsAsPolygon(query varchar, alpha float8 DEFAULT 0)
- RETURNS geometry AS
- $$
- DECLARE
- r record;
- geoms geometry[];
- vertex_result record;
- i int;
- n int;
- spos int;
- q text;
- x float8[];
- y float8[];
-
- BEGIN
- geoms := array[]::geometry[];
- i := 1;
-
- FOR vertex_result IN EXECUTE 'SELECT x, y FROM pgr_alphashape($1,$2) ' USING query, alpha
- LOOP
- x[i] = vertex_result.x;
- y[i] = vertex_result.y;
- i := i+1;
- END LOOP;
-
- n := i;
- IF n = 1 THEN
- RAISE NOTICE 'n = 1';
- RETURN NULL;
- END IF;
-
- spos := 1;
- q := 'SELECT ST_GeometryFromText(''POLYGON((';
- FOR i IN 1..n LOOP
- IF x[i] IS NULL AND y[i] IS NULL THEN
- q := q || ', ' || x[spos] || ' ' || y[spos] || '))'',0) AS geom;';
- EXECUTE q INTO r;
- geoms := geoms || array[r.geom];
- q := '';
- ELSE
- IF q = '' THEN
- spos := i;
- q := 'SELECT ST_GeometryFromText(''POLYGON((';
- END IF;
- IF i = spos THEN
- q := q || x[spos] || ' ' || y[spos];
- ELSE
- q := q || ', ' || x[i] || ' ' || y[i];
- END IF;
- END IF;
- END LOOP;
-
- RETURN ST_BuildArea(ST_Collect(geoms));
- END;
- $$
- LANGUAGE 'plpgsql' VOLATILE STRICT;
- */
-
diff --git a/src/driving_distance/sql/withPoints_dd.sql b/src/driving_distance/sql/withPoints_dd.sql
index ae6ce7e..25b0807 100644
--- a/src/driving_distance/sql/withPoints_dd.sql
+++ b/src/driving_distance/sql/withPoints_dd.sql
@@ -22,43 +22,50 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
CREATE OR REPLACE FUNCTION pgr_withPointsDD(
edges_sql TEXT,
points_sql TEXT,
- start_pid BIGINT,
+ start_pid ANYARRAY,
distance FLOAT,
directed BOOLEAN DEFAULT TRUE,
driving_side CHAR DEFAULT 'b',
details BOOLEAN DEFAULT FALSE,
+ equicost BOOLEAN DEFAULT FALSE,
OUT seq INTEGER,
+ OUT start_vid BIGINT,
OUT node BIGINT,
OUT edge BIGINT,
OUT cost FLOAT,
OUT agg_cost FLOAT)
RETURNS SETOF RECORD AS
- '$libdir/${PGROUTING_LIBRARY_NAME}', 'withPoints_dd'
+ '$libdir/${PGROUTING_LIBRARY_NAME}', 'many_withPointsDD'
LANGUAGE c VOLATILE STRICT;
+
CREATE OR REPLACE FUNCTION pgr_withPointsDD(
edges_sql TEXT,
points_sql TEXT,
- start_pid ANYARRAY,
+ start_pid BIGINT,
distance FLOAT,
directed BOOLEAN DEFAULT TRUE,
driving_side CHAR DEFAULT 'b',
details BOOLEAN DEFAULT FALSE,
- equicost BOOLEAN DEFAULT FALSE,
OUT seq INTEGER,
- OUT start_vid BIGINT,
OUT node BIGINT,
OUT edge BIGINT,
OUT cost FLOAT,
OUT agg_cost FLOAT)
RETURNS SETOF RECORD AS
- '$libdir/${PGROUTING_LIBRARY_NAME}', 'many_withPointsDD'
- LANGUAGE c VOLATILE STRICT;
+$BODY$
+ SELECT a.seq, a.node, a.edge, a.cost, a.agg_cost
+ FROM pgr_withPointsDD($1, $2, ARRAY[$3]::BIGINT[], $4, $5, $6, $7, false) a;
+$BODY$
+LANGUAGE SQL VOLATILE
+COST 100
+ROWS 1000;
+
+
diff --git a/src/driving_distance/src/CMakeLists.txt b/src/driving_distance/src/CMakeLists.txt
index a74d2fa..9d568df 100644
--- a/src/driving_distance/src/CMakeLists.txt
+++ b/src/driving_distance/src/CMakeLists.txt
@@ -1,9 +1,7 @@
ADD_LIBRARY(driving_distance OBJECT
- drivedist.c
many_to_dist_driving_distance.c
- boost_interface_drivedist.cpp
-
- withPoints_dd.c
many_to_dist_withPointsDD.c
+
+ drivedist_driver.cpp
withPoints_dd_driver.cpp
)
diff --git a/src/driving_distance/src/boost_interface_drivedist.cpp b/src/driving_distance/src/boost_interface_drivedist.cpp
deleted file mode 100644
index 1fdca34..0000000
--- a/src/driving_distance/src/boost_interface_drivedist.cpp
+++ /dev/null
@@ -1,173 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: boost_interface_drivedist.cpp
-
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-vicky_vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
- ********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
-
-#include "./boost_interface_drivedist.h"
-#include <sstream>
-#include <deque>
-#include <vector>
-#include <set>
-
-#include "./../../common/src/pgr_types.h"
-#include "../../common/src/pgr_alloc.hpp"
-#include "./../../dijkstra/src/pgr_dijkstra.hpp"
-
-
-
-
-void
-do_pgr_driving_many_to_dist(
- pgr_edge_t *data_edges, size_t total_tuples,
- int64_t *start_vertex, size_t s_len,
- double distance,
- bool directedFlag,
- bool equiCostFlag,
- General_path_element_t **ret_path, size_t *path_count,
- char ** err_msg) {
- try {
- *ret_path = NULL;
- *path_count = 0;
-
- graphType gType = directedFlag? DIRECTED: UNDIRECTED;
-
- std::deque< Path >paths;
- std::set< int64_t > s_start_vertices(start_vertex, start_vertex + s_len);
- std::vector< int64_t > start_vertices(s_start_vertices.begin(), s_start_vertices.end());
-
- if (directedFlag) {
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_tuples);
- pgr_drivingDistance(digraph, paths, start_vertices, distance, equiCostFlag);
- } else {
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_tuples);
- pgr_drivingDistance(undigraph, paths, start_vertices, distance, equiCostFlag);
- }
-
- size_t count(count_tuples(paths));
-
-
- if (count == 0) {
- *err_msg = strdup("NOTICE: No return values was found");
- return;
- }
- *ret_path = pgr_alloc(count, (*ret_path));
- auto trueCount(collapse_paths(ret_path, paths));
- *path_count = trueCount;
-
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- return;
- } catch ( ... ) {
- *err_msg = strdup("Caught unknown exception!");
- if (ret_path) free(ret_path);
- *path_count = 0;
- return;
- }
-}
-
-
-
-
-void
-do_pgr_driving_distance(
- pgr_edge_t *data_edges, size_t total_edges,
- int64_t start_vertex,
- double distance,
- bool directedFlag,
- General_path_element_t **ret_path, size_t *path_count,
- char **err_msg) {
- std::ostringstream log;
- try {
- // if it already has values there will be a leak
- // call with pointing to NULL
- *ret_path = NULL;
- *path_count = 0;
-
- log << "NOTICE: Started processing pgr_drivingDistance for 1 start_vid\n";
- // in c code this should have been checked:
- // 1) start_vertex is in the data_edges DONE
-
- graphType gType = directedFlag? DIRECTED: UNDIRECTED;
-
- Path path;
-
-
- if (directedFlag) {
- log << "NOTICE: Processing Directed graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(data_edges, total_edges);
- pgr_drivingDistance(digraph, path, start_vertex, distance);
- } else {
- log << "NOTICE: Processing Undirected graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_edges);
- pgr_drivingDistance(undigraph, path, start_vertex, distance);
- }
-
- log << "Returning number of tuples" << path.size() << "\n";
- if (path.empty()) {
- log << "NOTICE: it should have at least the one for it self";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- log << "NOTICE: Calculating the number of tuples \n";
- auto count = path.size();
-
- log << "NOTICE Count: " << count << " tuples\n";
-
- *ret_path = pgr_alloc(count, (*ret_path));
-
- size_t sequence = 0;
- path.get_pg_dd_path(ret_path, sequence);
- *path_count = count;
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch ( ... ) {
- log << "NOTICE: unknown exception cought";
- *err_msg = strdup(log.str().c_str());
- if (ret_path) free(ret_path);
- *path_count = 0;
- return;
- }
-}
-
diff --git a/src/driving_distance/src/drivedist.c b/src/driving_distance/src/drivedist.c
deleted file mode 100644
index ec20422..0000000
--- a/src/driving_distance/src/drivedist.c
+++ /dev/null
@@ -1,184 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: drivedist.c
-
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:vicky_Vergara at hotmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-//#define DEBUG
-
-#include "fmgr.h"
-#include "./../../common/src/debug_macro.h"
-#include "./../../common/src/time_msg.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
-#include "./../../common/src/edges_input.h"
-#include "./boost_interface_drivedist.h"
-
-PGDLLEXPORT Datum driving_distance(PG_FUNCTION_ARGS);
-
-static
-void compute_driving_distance(
- char* sql,
- int64_t start_vertex,
- float8 distance,
- bool directed,
- General_path_element_t **path, size_t *path_count) {
- pgr_SPI_connect();
-
- pgr_edge_t *edges = NULL;
- size_t total_edges = 0;
-
-
- char *err_msg = (char *)"";
-
- PGR_DBG("Load data");
-
- pgr_get_edges(sql, &edges, &total_edges);
-
- if (total_edges == 0) {
- PGR_DBG("No edges found");
- *path = NULL;
- (*path_count) = 0;
- pgr_SPI_finish();
- return;
- }
- PGR_DBG("total edges read %ld\n", total_edges);
-
- clock_t start_t = clock();
- do_pgr_driving_distance(edges, total_edges,
- start_vertex, distance,
- directed,
- path, path_count, &err_msg);
- time_msg(" processing Driving Distance one start", start_t, clock());
-
-
- PGR_DBG("total tuples found %ld\n", *path_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- pfree(edges);
- pgr_SPI_finish();
-}
-
-
-PG_FUNCTION_INFO_V1(driving_distance);
-PGDLLEXPORT Datum
-driving_distance(PG_FUNCTION_ARGS) {
- FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
- TupleDesc tuple_desc;
- General_path_element_t *ret_path = 0;
-
- /* stuff done only on the first call of the function */
- if (SRF_IS_FIRSTCALL()) {
- MemoryContext oldcontext;
- size_t path_count = 0;
-
- /* create a function context for cross-call persistence */
- funcctx = SRF_FIRSTCALL_INIT();
-
- /* switch to memory context appropriate for multiple function calls */
- oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
- /*************************************************************************************************************
- QUERY
- CREATE OR REPLACE FUNCTION _pgr_drivingDistance(edges_sql text, start_vid bigint, distance float8, directed BOOLEAN,
- OUT seq integer, OUT node bigint, OUT edge bigint, OUT cost float, OUT agg_cost float)
- *************************************************************************************************************/
- PGR_DBG("Sub query %s\n", pgr_text2char(PG_GETARG_TEXT_P(0)));
-
- compute_driving_distance(pgr_text2char(PG_GETARG_TEXT_P(0)), // edges_sql
- PG_GETARG_INT64(1), // start_vid
- PG_GETARG_FLOAT8(2), // distance
- PG_GETARG_BOOL(3), // directed
- &ret_path, &path_count);
-
- /* total number of tuples to be returned */
- funcctx->max_calls = (uint32_t)path_count;
- funcctx->user_fctx = ret_path;
-
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
-
- funcctx->tuple_desc = tuple_desc;
-
- MemoryContextSwitchTo(oldcontext);
- }
-
- /* stuff done on every call of the function */
- funcctx = SRF_PERCALL_SETUP();
-
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
- tuple_desc = funcctx->tuple_desc;
- ret_path = (General_path_element_t*) funcctx->user_fctx;
-
- /* do when there is more left to send */
- if (call_cntr < max_calls) {
- HeapTuple tuple;
- Datum result;
- Datum *values;
- bool* nulls;
-
- values = palloc(5 * sizeof(Datum));
- nulls = palloc(5 * sizeof(bool));
-
- // TODO version 3.0 change to
- // values[0] = Int64GetDatum(ret_path[call_cntr].seq + 1);
- nulls[0] = false;
- nulls[1] = false;
- nulls[2] = false;
- nulls[3] = false;
- nulls[4] = false;
- values[0] = Int32GetDatum(ret_path[call_cntr].seq + 1);
- values[1] = Int64GetDatum(ret_path[call_cntr].node);
- values[2] = Int64GetDatum(ret_path[call_cntr].edge);
- values[3] = Float8GetDatum(ret_path[call_cntr].cost);
- values[4] = Float8GetDatum(ret_path[call_cntr].agg_cost);
-
- tuple = heap_form_tuple(tuple_desc, values, nulls);
-
- /* make the tuple into a datum */
- result = HeapTupleGetDatum(tuple);
-
- /* clean up (this is not really necessary) */
- pfree(values);
- pfree(nulls);
-
- SRF_RETURN_NEXT(funcctx, result);
- } else {
- /* do when there is no more left */
- if (ret_path) free(ret_path);
- SRF_RETURN_DONE(funcctx);
- }
-}
-
diff --git a/src/driving_distance/src/drivedist_driver.cpp b/src/driving_distance/src/drivedist_driver.cpp
new file mode 100644
index 0000000..442d8d3
--- /dev/null
+++ b/src/driving_distance/src/drivedist_driver.cpp
@@ -0,0 +1,118 @@
+/*PGR-GNU*****************************************************************
+File: boost_interface_drivedist.cpp
+
+Copyright (c) 2015 Celia Virginia Vergara Castillo
+vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+ ********************************************************************PGR-GNU*/
+
+#include "./drivedist_driver.h"
+
+#include <sstream>
+#include <deque>
+#include <vector>
+
+#include "./../../dijkstra/src/pgr_dijkstra.hpp"
+
+#include "../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
+
+
+
+
+void
+do_pgr_driving_many_to_dist(
+ pgr_edge_t *data_edges, size_t total_edges,
+ int64_t *start_vertex, size_t s_len,
+ double distance,
+ bool directedFlag,
+ bool equiCostFlag,
+ General_path_element_t **return_tuples, size_t *return_count,
+ char **log_msg,
+ char **notice_msg,
+ char **err_msg) {
+ std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
+
+ try {
+ pgassert(total_edges != 0);
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
+ pgassert((*return_tuples) == NULL);
+
+ graphType gType = directedFlag? DIRECTED: UNDIRECTED;
+
+ std::deque<Path> paths;
+ std::vector<int64_t> start_vertices(start_vertex, start_vertex + s_len);
+
+ if (directedFlag) {
+ pgrouting::DirectedGraph digraph(gType);
+ digraph.insert_edges(data_edges, total_edges);
+ paths = pgr_drivingDistance(
+ digraph, start_vertices, distance, equiCostFlag);
+ } else {
+ pgrouting::UndirectedGraph undigraph(gType);
+ undigraph.insert_edges(data_edges, total_edges);
+ paths = pgr_drivingDistance(
+ undigraph, start_vertices, distance, equiCostFlag);
+ }
+
+ size_t count(count_tuples(paths));
+
+
+ if (count == 0) {
+ *notice_msg = pgr_msg("No return values was found");
+ return;
+ }
+ *return_tuples = pgr_alloc(count, (*return_tuples));
+ auto trueCount(collapse_paths(return_tuples, paths));
+ *return_count = trueCount;
+
+
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ }
+}
diff --git a/src/driving_distance/src/boost_interface_drivedist.h b/src/driving_distance/src/drivedist_driver.h
similarity index 63%
rename from src/driving_distance/src/boost_interface_drivedist.h
rename to src/driving_distance/src/drivedist_driver.h
index 5260e33..0162127 100644
--- a/src/driving_distance/src/boost_interface_drivedist.h
+++ b/src/driving_distance/src/drivedist_driver.h
@@ -22,10 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_DRIVING_DISTANCE_SRC_BOOST_INTERFACE_DRIVEDIST_H_
-#define SRC_DRIVING_DISTANCE_SRC_BOOST_INTERFACE_DRIVEDIST_H_
+#ifndef SRC_DRIVING_DISTANCE_SRC_DRIVEDIST_DRIVER_H_
+#define SRC_DRIVING_DISTANCE_SRC_DRIVEDIST_DRIVER_H_
-#include "stdlib.h"
#include "./../../common/src/pgr_types.h"
#ifdef __cplusplus
@@ -33,23 +32,18 @@ extern "C" {
#endif
void do_pgr_driving_many_to_dist(
- pgr_edge_t * edges, size_t total_tuples,
- int64_t *start_vertex, size_t s_len,
+ pgr_edge_t* edges, size_t total_edges,
+ int64_t* start_vertex, size_t s_len,
double distance,
bool directed,
bool equicost,
- General_path_element_t **ret_path, size_t *path_count,
- char ** err_msg);
-
- void do_pgr_driving_distance(
- pgr_edge_t * edges, size_t total_tuples,
- int64_t start_vertex, double distance,
- bool directed,
- General_path_element_t **ret_path, size_t *path_count,
- char ** err_msg);
+ General_path_element_t** return_tuples, size_t* return_count,
+ char **log_msg,
+ char **notice_msg,
+ char **err_msg);
#ifdef __cplusplus
}
#endif
-#endif // SRC_DRIVING_DISTANCE_SRC_BOOST_INTERFACE_DRIVEDIST_H_
+#endif // SRC_DRIVING_DISTANCE_SRC_DRIVEDIST_DRIVER_H_
diff --git a/src/driving_distance/src/many_to_dist_driving_distance.c b/src/driving_distance/src/many_to_dist_driving_distance.c
index e1b09f6..4dec43b 100644
--- a/src/driving_distance/src/many_to_dist_driving_distance.c
+++ b/src/driving_distance/src/many_to_dist_driving_distance.c
@@ -22,119 +22,119 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// #define DEBUG
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./boost_interface_drivedist.h"
+#include "./drivedist_driver.h"
+PGDLLEXPORT Datum driving_many_to_dist(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(driving_many_to_dist);
+
-static
-void driving_many_to_dist_driver(
+static
+void process(
char* sql,
- int64_t *start_vertex, size_t num,
+ ArrayType *starts,
float8 distance,
bool directed,
- bool equicost,
- General_path_element_t **path, size_t *path_count) {
+ bool equicost,
+ General_path_element_t **result_tuples,
+ size_t *result_count) {
pgr_SPI_connect();
- pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
-
-
- char *err_msg = (char *)"";
+ size_t size_start_vidsArr = 0;
+ int64_t* start_vidsArr = pgr_get_bigIntArray(&size_start_vidsArr, starts);
+ pgr_edge_t *edges = NULL;
+ size_t total_tuples = 0;
pgr_get_edges(sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*path_count) = 0;
- *path = NULL;
return;
}
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
do_pgr_driving_many_to_dist(
edges, total_tuples,
- start_vertex, num,
+ start_vidsArr, size_start_vidsArr,
distance,
directed,
equicost,
- path, path_count, &err_msg);
- time_msg(" processing DrivingDistance many starts", start_t, clock());
+ result_tuples, result_count,
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ time_msg("processing pgr_drivingDistance()",
+ start_t, clock());
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
- pfree(edges);
- pgr_SPI_finish();
-}
+ pgr_global_report(log_msg, notice_msg, err_msg);
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_vidsArr) pfree(start_vidsArr);
-#ifndef _MSC_VER
-Datum driving_many_to_dist(PG_FUNCTION_ARGS);
-#else // _MSC_VER
-PGDLLEXPORT Datum driving_many_to_dist(PG_FUNCTION_ARGS);
-#endif // _MSC_VER
+ pgr_SPI_finish();
+}
-PG_FUNCTION_INFO_V1(driving_many_to_dist);
-#ifndef _MSC_VER
-Datum
-#else // _MSC_VER
PGDLLEXPORT Datum
-#endif
driving_many_to_dist(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- General_path_element_t *ret_path = 0;
- /* stuff done only on the first call of the function */
+ /**********************************************************************/
+ General_path_element_t* result_tuples = 0;
+ size_t result_count = 0;
+ /**********************************************************************/
+
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
- size_t path_count = 0;
- /* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();
-
- /* switch to memory context appropriate for multiple function calls */
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- int64_t* sourcesArr;
- size_t num;
-
- sourcesArr = (int64_t*) pgr_get_bigIntArray(&num, PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("sourcesArr size %ld ", num);
+ /**********************************************************************/
PGR_DBG("Calling driving_many_to_dist_driver");
- driving_many_to_dist_driver(
- pgr_text2char(PG_GETARG_TEXT_P(0)), // sql
- sourcesArr, num, // array of sources
- PG_GETARG_FLOAT8(2), // distance
- PG_GETARG_BOOL(3), // directed
- PG_GETARG_BOOL(4), // equicost
- &ret_path, &path_count);
-
- free(sourcesArr);
-
- /* total number of tuples to be returned */
- funcctx->max_calls = (uint32_t) path_count;
- funcctx->user_fctx = ret_path;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ process(
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_FLOAT8(2),
+ PG_GETARG_BOOL(3),
+ PG_GETARG_BOOL(4),
+ &result_tuples, &result_count);
+
+ /**********************************************************************/
+
+
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
+ funcctx->user_fctx = result_tuples;
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -145,50 +145,42 @@ driving_many_to_dist(PG_FUNCTION_ARGS) {
MemoryContextSwitchTo(oldcontext);
}
- /* stuff done on every call of the function */
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
- ret_path = (General_path_element_t*) funcctx->user_fctx;
+ result_tuples = (General_path_element_t*) funcctx->user_fctx;
- /* do when there is more left to send */
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- values = palloc(6 * sizeof(Datum));
- nulls = palloc(6 * sizeof(bool));
- // id, start_v, node, edge, cost, tot_cost
- nulls[0] = false;
- nulls[1] = false;
- nulls[2] = false;
- nulls[3] = false;
- nulls[4] = false;
- nulls[5] = false;
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(ret_path[call_cntr].start_id);
- values[2] = Int64GetDatum(ret_path[call_cntr].node);
- values[3] = Int64GetDatum(ret_path[call_cntr].edge);
- values[4] = Float8GetDatum(ret_path[call_cntr].cost);
- values[5] = Float8GetDatum(ret_path[call_cntr].agg_cost);
-
+ /**********************************************************************/
+ size_t numb = 6;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
+
+ size_t i;
+ for (i = 0; i < numb; ++i) {
+ nulls[i] = false;
+ }
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
+
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
-
- /* make the tuple into a datum */
result = HeapTupleGetDatum(tuple);
- /* clean up (this is not really necessary) */
pfree(values);
pfree(nulls);
SRF_RETURN_NEXT(funcctx, result);
} else {
- /* do when there is no more left */
- if (ret_path) free(ret_path);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/driving_distance/src/many_to_dist_withPointsDD.c b/src/driving_distance/src/many_to_dist_withPointsDD.c
index c54b334..69d68d5 100644
--- a/src/driving_distance/src/many_to_dist_withPointsDD.c
+++ b/src/driving_distance/src/many_to_dist_withPointsDD.c
@@ -22,21 +22,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-// #define DEBUG
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./../../common/src/points_input.h"
@@ -45,31 +37,31 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
PGDLLEXPORT Datum many_withPointsDD(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(many_withPointsDD);
-static
+static
void process(
char* edges_sql,
char* points_sql,
- int64_t *start_pids_arr, size_t size_arr,
+ ArrayType* starts,
double distance,
bool directed,
char *driving_side,
bool details,
- bool equicost,
+ bool equicost,
General_path_element_t **result_tuples,
- size_t *result_count ){
+ size_t *result_count) {
+ driving_side[0] = estimate_drivingSide(driving_side[0]);
+ PGR_DBG("estimated driving side:%c", driving_side[0]);
- driving_side[0] = (char) tolower(driving_side[0]);
- PGR_DBG("driving side:%c",driving_side[0]);
- if (! ((driving_side[0] == 'r')
- || (driving_side[0] == 'l'))) {
- driving_side[0] = 'b';
- }
+ pgr_SPI_connect();
+ size_t total_starts = 0;
+ int64_t* start_pidsArr = pgr_get_bigIntArray(&total_starts, starts);
+ PGR_DBG("sourcesArr size %ld ", total_starts);
- pgr_SPI_connect();
Point_on_edge_t *points = NULL;
size_t total_points = 0;
pgr_get_points(points_sql, &points, &total_points);
@@ -84,7 +76,8 @@ void process(
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
+ pgr_get_edges(
+ edges_of_points_query, &edges_of_points, &total_edges_of_points);
pgr_edge_t *edges = NULL;
size_t total_edges = 0;
@@ -95,66 +88,66 @@ void process(
free(edges_no_points_query);
if ((total_edges + total_edges_of_points) == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (edges) pfree(edges);
+ if (edges_of_points) pfree(edges_of_points);
+ if (points) pfree(points);
pgr_SPI_finish();
return;
}
- PGR_DBG("Starting processing");
- char *err_msg = NULL;
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- int errcode = do_pgr_many_withPointsDD(
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_withPointsDD(
edges, total_edges,
points, total_points,
edges_of_points, total_edges_of_points,
- start_pids_arr, size_arr,
+ start_pidsArr, total_starts,
distance,
directed,
driving_side[0],
details,
- equicost,
+ equicost,
result_tuples,
result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
time_msg(" processing withPointsDD many starts", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- if (!err_msg) free(err_msg);
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
- pfree(edges);
- pfree(edges_of_points);
- pfree(points);
+ pgr_global_report(log_msg, notice_msg, err_msg);
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (edges_of_points) pfree(edges_of_points);
+ if (points) pfree(points);
+ if (start_pidsArr) pfree(start_pidsArr);
pgr_SPI_finish();
-
- if (errcode) {
- pgr_send_error(errcode);
- }
}
-PG_FUNCTION_INFO_V1(many_withPointsDD);
PGDLLEXPORT Datum
many_withPointsDD(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
General_path_element_t *result_tuples = 0;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -163,8 +156,7 @@ many_withPointsDD(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPointsDD(
// edges_sql TEXT,
// points_sql TEXT,
@@ -176,31 +168,30 @@ many_withPointsDD(PG_FUNCTION_ARGS) {
// details BOOLEAN -- DEFAULT false,
// equicost BOOLEAN -- DEFAULT false,
- int64_t *sourcesArr;
- size_t num;
-
- sourcesArr = (int64_t*) pgr_get_bigIntArray(&num, PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("sourcesArr size %ld ", num);
PGR_DBG("Calling driving_many_to_dist_driver");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)), // edges_sql
- pgr_text2char(PG_GETARG_TEXT_P(1)), // points_sql
- sourcesArr, num, // start_pids array
- PG_GETARG_FLOAT8(3), // distance
-
- PG_GETARG_BOOL(4), // directed
- pgr_text2char(PG_GETARG_TEXT_P(5)), // driving side
- PG_GETARG_BOOL(6), // details
- PG_GETARG_BOOL(7), // equicost
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
+ PG_GETARG_ARRAYTYPE_P(2),
+ PG_GETARG_FLOAT8(3),
+
+ PG_GETARG_BOOL(4),
+ text_to_cstring(PG_GETARG_TEXT_P(5)),
+ PG_GETARG_BOOL(6),
+ PG_GETARG_BOOL(7),
&result_tuples, &result_count);
- free(sourcesArr);
+ /**********************************************************************/
- /* total number of tuples to be returned */
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -211,50 +202,44 @@ many_withPointsDD(PG_FUNCTION_ARGS) {
MemoryContextSwitchTo(oldcontext);
}
- /* stuff done on every call of the function */
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- /* do when there is more left to send */
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- values = palloc(6 * sizeof(Datum));
- nulls = palloc(6 * sizeof(bool));
- // id, start_v, node, edge, cost, tot_cost
- nulls[0] = false;
- nulls[1] = false;
- nulls[2] = false;
- nulls[3] = false;
- nulls[4] = false;
- nulls[5] = false;
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[2] = Int64GetDatum(result_tuples[call_cntr].node);
- values[3] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[4] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[5] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ /**********************************************************************/
+ size_t numb = 6;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
- tuple = heap_form_tuple(tuple_desc, values, nulls);
+ size_t i;
+ for (i = 0; i < numb; ++i) {
+ nulls[i] = false;
+ }
+
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
- /* make the tuple into a datum */
+ /**********************************************************************/
+
+ tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
- /* clean up (this is not really necessary) */
pfree(values);
pfree(nulls);
SRF_RETURN_NEXT(funcctx, result);
} else {
- /* do when there is no more left */
- if (result_tuples) free(result_tuples);
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/driving_distance/src/withPoints_dd.c b/src/driving_distance/src/withPoints_dd.c
deleted file mode 100644
index f351922..0000000
--- a/src/driving_distance/src/withPoints_dd.c
+++ /dev/null
@@ -1,262 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: withPoints_dd.c
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-
-#include "fmgr.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/time_msg.h"
-#include "./../../common/src/postgres_connection.h"
-#include "./../../common/src/edges_input.h"
-#include "./../../common/src/points_input.h"
-#include "./../../withPoints/src/get_new_queries.h"
-#include "./withPoints_dd_driver.h"
-// #define DEBUG
-#include "./../../common/src/debug_macro.h"
-
-PGDLLEXPORT Datum withPoints_dd(PG_FUNCTION_ARGS);
-
-
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
-static
-void
-process(
- char* edges_sql,
- char* points_sql,
- int64_t start_pid,
- double distance,
-
- bool directed,
- char *driving_side,
- bool details,
-
- General_path_element_t **result_tuples,
- size_t *result_count) {
-
- driving_side[0] = (char) tolower(driving_side[0]);
- PGR_DBG("driving side:%c",driving_side[0]);
- if (! ((driving_side[0] == 'r')
- || (driving_side[0] == 'l'))) {
- driving_side[0] = 'b';
- }
-
- pgr_SPI_connect();
-
- Point_on_edge_t *points = NULL;
- size_t total_points = 0;
- pgr_get_points(points_sql, &points, &total_points);
-
- char *edges_of_points_query = NULL;
- char *edges_no_points_query = NULL;
- get_new_queries(
- edges_sql, points_sql,
- &edges_of_points_query,
- &edges_no_points_query);
-
-
- pgr_edge_t *edges_of_points = NULL;
- size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
-
- pgr_edge_t *edges = NULL;
- size_t total_edges = 0;
- pgr_get_edges(edges_no_points_query, &edges, &total_edges);
-
- PGR_DBG("freeing allocated memory not used anymore");
- free(edges_of_points_query);
- free(edges_no_points_query);
-
- if ((total_edges + total_edges_of_points) == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
- pgr_SPI_finish();
- return;
- }
-
- PGR_DBG("Starting processing");
- char *err_msg = NULL;
- clock_t start_t = clock();
- int errcode = do_pgr_withPointsDD(
- edges, total_edges,
- points, total_points,
- edges_of_points, total_edges_of_points,
- start_pid,
- distance,
-
- driving_side[0],
- details,
- directed,
-
- result_tuples,
- result_count,
- &err_msg);
- time_msg(" processing withPointsDD one start", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- if (!err_msg) free(err_msg);
-
- pfree(edges);
- pfree(edges_of_points);
- pfree(points);
-
- pgr_SPI_finish();
-
- if (errcode) {
- pgr_send_error(errcode);
- }
-
-}
-
-/* */
-/*******************************************************************************/
-
-
-
-PG_FUNCTION_INFO_V1(withPoints_dd);
-PGDLLEXPORT Datum
-withPoints_dd(PG_FUNCTION_ARGS) {
- FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
- TupleDesc tuple_desc;
-
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
- size_t result_count = 0;
- /* */
- /*******************************************************************************/
-
- if (SRF_IS_FIRSTCALL()) {
- MemoryContext oldcontext;
- funcctx = SRF_FIRSTCALL_INIT();
- oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
-
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- // CREATE OR REPLACE FUNCTION pgr_withPoint(
- // edges_sql TEXT,
- // points_sql TEXT,
- // start_pid BIGINT,
- // distance FLOAT,
- //
- // directed BOOLEAN -- DEFAULT true,
- // driving_side CHAR -- DEFAULT 'b',
- // details BOOLEAN -- DEFAULT false,
-
- PGR_DBG("Calling process");
- process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
- PG_GETARG_INT64(2),
- PG_GETARG_FLOAT8(3),
-
- PG_GETARG_BOOL(4),
- pgr_text2char(PG_GETARG_TEXT_P(5)),
- PG_GETARG_BOOL(6),
- &result_tuples,
- &result_count);
-
- /* */
- /*******************************************************************************/
-
- funcctx->max_calls = (uint32_t) result_count;
- funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
-
- funcctx->tuple_desc = tuple_desc;
- MemoryContextSwitchTo(oldcontext);
- }
-
- funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
- tuple_desc = funcctx->tuple_desc;
- result_tuples = (General_path_element_t*) funcctx->user_fctx;
-
- if (call_cntr < max_calls) {
- HeapTuple tuple;
- Datum result;
- Datum *values;
- bool* nulls;
-
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- // OUT seq BIGINT,
- // OUT node BIGINT,
- // OUT edge BIGINT,
- // OUT cost FLOAT,
- // OUT agg_cost FLOAT)
-
-
- values = palloc(5 * sizeof(Datum));
- nulls = palloc(5 * sizeof(bool));
-
- size_t i;
- for(i = 0; i < 6; ++i) {
- nulls[i] = false;
- }
-
-
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(result_tuples[call_cntr].node);
- values[2] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[3] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[4] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
-
- tuple = heap_form_tuple(tuple_desc, values, nulls);
- result = HeapTupleGetDatum(tuple);
- SRF_RETURN_NEXT(funcctx, result);
- } else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
- SRF_RETURN_DONE(funcctx);
- }
-}
-
diff --git a/src/driving_distance/src/withPoints_dd_driver.cpp b/src/driving_distance/src/withPoints_dd_driver.cpp
index 69eb709..05cd363 100644
--- a/src/driving_distance/src/withPoints_dd_driver.cpp
+++ b/src/driving_distance/src/withPoints_dd_driver.cpp
@@ -28,30 +28,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#endif
+#include "./withPoints_dd_driver.h"
#include <sstream>
#include <deque>
#include <vector>
#include <algorithm>
-#include <set>
#include "./../../dijkstra/src/pgr_dijkstra.hpp"
#include "./../../withPoints/src/pgr_withPoints.hpp"
-#include "./withPoints_dd_driver.h"
-#include "./../../common/src/pgr_types.h"
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_types.h"
-/*******************************************************************************/
+/**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPointsDD(
// edges_sql TEXT,
// points_sql TEXT,
@@ -64,13 +56,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// equicost BOOLEAN -- DEFAULT false,
-int
+void
do_pgr_many_withPointsDD(
pgr_edge_t *edges, size_t total_edges,
Point_on_edge_t *points_p, size_t total_points,
pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t *start_pids_arr, size_t s_len,
+ int64_t *start_pidsArr, size_t s_len,
double distance,
bool directed,
@@ -79,30 +71,49 @@ do_pgr_many_withPointsDD(
bool equiCost,
General_path_element_t **return_tuples, size_t *return_count,
- char ** err_msg) {
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg) {
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert((*return_count) == 0);
+ pgassert(edges);
+ pgassert(points_p);
+ pgassert(edges_of_points);
+ pgassert(start_pidsArr);
+
/*
- * This is the original state
+ * storing on C++ containers
*/
- if (*err_msg) free(err_msg);
- if (*return_tuples) free(return_tuples);
- (*return_count) = 0;
+ std::vector<int64_t> start_vids(
+ start_pidsArr, start_pidsArr + s_len);
- std::vector< Point_on_edge_t >
+ std::vector<Point_on_edge_t>
points(points_p, points_p + total_points);
+ std::vector<pgr_edge_t> edges_to_modify(
+ edges_of_points, edges_of_points + total_edges_of_points);
+
+ log << "start_vids :";
+ for (const auto v : start_vids) log << v << ", ";
/*
* checking here is easier than on the C code
*/
int errcode = check_points(points, log);
if (errcode) {
- return errcode;
+ *log_msg = strdup(log.str().c_str());
+ err << "Unexpected point(s) with same pid"
+ << " but different edge/fraction/side combination found.";
+ *err_msg = pgr_msg(err.str().c_str());
+ return;
}
- std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
-
std::vector< pgr_edge_t > new_edges;
create_new_edges(
points,
@@ -111,36 +122,22 @@ do_pgr_many_withPointsDD(
new_edges,
log);
- std::set< int64_t > s_start_vids(start_pids_arr, start_pids_arr + s_len);
- std::vector< int64_t > start_vids(s_start_vids.begin(), s_start_vids.end());
-#if 0
- std::set< int64_t > start_vids;
-
- for (const auto start_pid : start_pids) {
- for (const auto point : points) {
- if (point.pid == start_pid) {
- start_vids.insert(point.vertex_id);
- break;
- }
- }
- }
-#endif
-
-
graphType gType = directed? DIRECTED: UNDIRECTED;
std::deque< Path >paths;
if (directed) {
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
- pgr_drivingDistance(digraph, paths, start_vids, distance, equiCost);
+ digraph.insert_edges(edges, total_edges);
+ digraph.insert_edges(new_edges);
+ paths = pgr_drivingDistance(
+ digraph, start_vids, distance, equiCost);
} else {
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
- pgr_drivingDistance(undigraph, paths, start_vids, distance, equiCost);
+ undigraph.insert_edges(edges, total_edges);
+ undigraph.insert_edges(new_edges);
+ paths = pgr_drivingDistance(
+ undigraph, start_vids, distance, equiCost);
}
for (auto &path : paths) {
@@ -163,157 +160,36 @@ do_pgr_many_withPointsDD(
if (count == 0) {
- *err_msg = strdup("NOTICE: No return values was found");
- return 0;
+ *notice_msg = pgr_msg("No return values was found");
+ return;
}
*return_tuples = pgr_alloc(count, (*return_tuples));
*return_count = collapse_paths(return_tuples, paths);
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- return 0;
- } catch ( ... ) {
- *err_msg = strdup("Caught unknown exception!");
- return 1000;
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
-// CREATE OR REPLACE FUNCTION pgr_withPointsDD(
-// edges_sql TEXT,
-// points_sql TEXT,
-// start_pid BIGINT,
-// end_pid BIGINT,
-//
-// driving_side CHAR -- DEFAULT 'b',
-// details BOOLEAN -- DEFAULT false,
-// directed BOOLEAN -- DEFAULT true,
-// equicost BOOLEAN -- DEFAULT false,
-
-int
-do_pgr_withPointsDD(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points_p, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
-
- int64_t start_vid,
- double distance,
-
- char driving_side,
- bool details,
- bool directed,
-
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- /*
- * This is the original state
- */
- if (*err_msg) free(err_msg);
- if (*return_tuples) free(return_tuples);
- (*return_count) = 0;
-
- std::vector< Point_on_edge_t >
- points(points_p, points_p + total_points);
-
- /*
- * checking here is easier than on the C code
- */
- int errcode = check_points(points, log);
- if (errcode) {
- return errcode;
- }
-
-
- std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
-
- std::vector< pgr_edge_t > new_edges;
- create_new_edges(
- points,
- edges_to_modify,
- driving_side,
- new_edges,
- log);
-
-#if 0
- int64_t start_vid = 0;
- for (const auto point : points) {
- if (point.pid == start_pid) {
- start_vid = point.vertex_id;
- }
- }
-#endif
-
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- Path path;
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
- pgr_drivingDistance(digraph, path, start_vid, distance);
- } else {
- log << "Working with undirected Graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
- pgr_drivingDistance(undigraph, path, start_vid, distance);
- }
-
-
-#if 0
- path.print_path(log);
- adjust_pids(points, path);
- path.print_path(log);
-#endif
-
- if (!details) {
- eliminate_details_dd(path);
- }
- std::sort(path.begin(), path.end(),
- [](const Path_t &l, const Path_t &r)
- {return l.node < r.node;});
- std::stable_sort(path.begin(), path.end(),
- [](const Path_t &l, const Path_t &r)
- {return l.agg_cost < r.agg_cost;});
-
-
- auto count(path.size());
-
- if (count == 0) {
- return 0;
- }
-
-
- *return_tuples = NULL;
- *return_tuples = pgr_alloc(count, (*return_tuples));
-
- size_t sequence = 0;
- path.get_pg_dd_path(return_tuples, sequence);
-
- if (count != sequence) {
- return 2;
- }
- (*return_count) = sequence;
-
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- return 0;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- }
- return 1000;
-}
diff --git a/src/driving_distance/src/withPoints_dd_driver.h b/src/driving_distance/src/withPoints_dd_driver.h
index 322a838..4738109 100644
--- a/src/driving_distance/src/withPoints_dd_driver.h
+++ b/src/driving_distance/src/withPoints_dd_driver.h
@@ -26,6 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_DRIVING_DISTANCE_SRC_WITHPOINTS_DD_DRIVER_H_
+#define SRC_DRIVING_DISTANCE_SRC_WITHPOINTS_DD_DRIVER_H_
#pragma once
#include "./../../common/src/pgr_types.h"
@@ -35,7 +37,7 @@ extern "C" {
#endif
- int do_pgr_many_withPointsDD(
+ void do_pgr_many_withPointsDD(
pgr_edge_t *edges, size_t total_edges,
Point_on_edge_t *points_p, size_t total_points,
pgr_edge_t *edges_of_points, size_t total_edges_of_points,
@@ -49,32 +51,13 @@ extern "C" {
bool equiCost,
General_path_element_t **return_tuples, size_t *return_count,
+ char** log_msg,
+ char** notice_msg,
char ** err_msg);
- // CREATE OR REPLACE FUNCTION pgr_withPointKsp(
- // edges_sql TEXT,
- // points_sql TEXT,
- // start_pid BIGINT,
- // end_pid BIGINT,
- // directed BOOLEAN DEFAULT true,
- int do_pgr_withPointsDD(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
-
- int64_t start_pid,
- double distance,
-
- char driving_side,
- bool details,
- bool directed,
-
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg);
-
#ifdef __cplusplus
}
#endif
+#endif // SRC_DRIVING_DISTANCE_SRC_WITHPOINTS_DD_DRIVER_H_
diff --git a/src/driving_distance/test/doc-pgr_drivingDistance.test.sql b/src/driving_distance/test/doc-pgr_drivingDistance.test.sql
index fd9f488..4d61eb3 100644
--- a/src/driving_distance/test/doc-pgr_drivingDistance.test.sql
+++ b/src/driving_distance/test/doc-pgr_drivingDistance.test.sql
@@ -25,8 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-- PGR_drivingDistance V3
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-BEGIN;
- SET client_min_messages TO NOTICE;
\echo --q1
SELECT * FROM pgr_drivingDistance(
@@ -116,4 +114,3 @@ SELECT * FROM pgr_drivingDistance(
\echo --q5
-ROLLBACK;
diff --git a/src/driving_distance/test/doc-pgr_drivingdistance-v2.test.sql b/src/driving_distance/test/doc-pgr_drivingdistance-v2.test.sql
index 9294643..285c5e5 100644
--- a/src/driving_distance/test/doc-pgr_drivingdistance-v2.test.sql
+++ b/src/driving_distance/test/doc-pgr_drivingdistance-v2.test.sql
@@ -3,8 +3,9 @@
-- PGR_drivingDistance
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-BEGIN;
- SET client_min_messages TO NOTICE;
+
+SET client_min_messages TO NOTICE;
+
\echo --q1
SELECT * FROM pgr_drivingDistance(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
@@ -16,4 +17,3 @@ SELECT * FROM pgr_drivingDistance(
7, 1.5, true, true
) ;
\echo --q2
-ROLLBACK;
diff --git a/src/driving_distance/test/drivingdistance-any-00.test.sql b/src/driving_distance/test/drivingdistance-any-00.test.sql
index cb6db0a..4d7e890 100644
--- a/src/driving_distance/test/drivingdistance-any-00.test.sql
+++ b/src/driving_distance/test/drivingdistance-any-00.test.sql
@@ -1,8 +1,6 @@
-- each ring will increase by 4 because it is on a square grid
-- to find the start node number
--- select *, st_distance(st_makepoint(25,25), the_geom) from vertices_tmp where st_dwithin(st_makepoint(25,25), the_geom, 1.0) order by st_distance(st_makepoint(25,25), the_geom) limit 1;
-BEGIN;
- SET client_min_messages TO NOTICE;
+-- SELECT *, st_distance(st_makepoint(25,25), the_geom) from vertices_tmp where st_dwithin(st_makepoint(25,25), the_geom, 1.0) order by st_distance(st_makepoint(25,25), the_geom) limit 1;
-- create 50x50 grid of overlapping lines horizontal and vertical
@@ -21,9 +19,9 @@ BEGIN;
PERFORM addgeometrycolumn('ddunnoded', 'the_geom', ST_SRID('POINT(0 0)'::geometry), 'LINESTRING', 2);
INSERT into ddunnoded (the_geom)
- select st_astext(st_makeline(st_makepoint(0,s1), st_makepoint(51,s1))) from (select generate_series(1,50) as s1) as foo
+ SELECT st_astext(st_makeline(st_makepoint(0,s1), st_makepoint(51,s1))) from (SELECT generate_series(1,50) as s1) as foo
union all
- select st_astext(st_makeline(st_makepoint(s1,0), st_makepoint(s1,51))) from (select generate_series(1,50) as s1) as foo;
+ SELECT st_astext(st_makeline(st_makepoint(s1,0), st_makepoint(s1,51))) from (SELECT generate_series(1,50) as s1) as foo;
-- node the grid so we can use it
PERFORM pgr_nodenetwork('ddunnoded',0.000001);
@@ -43,7 +41,7 @@ BEGIN;
PERFORM addgeometrycolumn('ddnoded2', 'the_geom', ST_SRID('POINT(0 0)'::geometry), 'LINESTRING', 2);
insert into ddnoded2 (id, cost, the_geom)
- select a.id, 1.0::float8 as cost, a.the_geom
+ SELECT a.id, 1.0::float8 as cost, a.the_geom
from ddunnoded_noded a order by id, sub_id;
-- now create a topology
@@ -56,13 +54,12 @@ BEGIN;
END $$;
--this are equivalent
- select seq, id1, id2, round(cost::numeric, 2) from pgr_drivingdistance('select id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, false, false);
- select seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('select id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, false);
+ SELECT seq, id1, id2, round(cost::numeric, 2) from pgr_drivingdistance('SELECT id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, false, false);
+ SELECT seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('SELECT id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, false);
--- this ones are equivalent
- select seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('select id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, true);
- select seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('select id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10);
+ SELECT seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('SELECT id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10, true);
+ SELECT seq, node, edge, round(cost::numeric, 2), round(agg_cost::numeric,2) from pgr_drivingdistance('SELECT id, source, target, 1.0::float8 as cost from ddnoded2', 1274, 10);
- ROLLBACK;
diff --git a/src/driving_distance/test/issue729.result b/src/driving_distance/test/issue729.result
new file mode 100644
index 0000000..61e6d74
--- /dev/null
+++ b/src/driving_distance/test/issue729.result
@@ -0,0 +1,5 @@
+NOTICE: column "node_count" of relation "edge_table" does not exist, skipping
+NOTICE: column "another_column" of relation "edge_table" does not exist, skipping
+NOTICE: table "network" does not exist, skipping
+NOTICE: column "node_count" of relation "network" does not exist, skipping
+NOTICE: column "another_column" of relation "network" does not exist, skipping
diff --git a/src/driving_distance/test/issue729.test.sql b/src/driving_distance/test/issue729.test.sql
new file mode 100644
index 0000000..79e2f7d
--- /dev/null
+++ b/src/driving_distance/test/issue729.test.sql
@@ -0,0 +1,61 @@
+ALTER TABLE edge_table
+DROP COLUMN IF EXISTS node_count,
+ADD COLUMN node_count INTEGER;
+
+UPDATE edge_table AS edge_table
+SET node_count=count.sum
+FROM
+ (SELECT
+ from_v,
+ sum(node) AS sum
+ FROM
+ pgr_drivingDistance(
+ 'SELECT id, source, target, ST_Length(the_geom) AS cost FROM edge_table',
+ ARRAY(SELECT DISTINCT source FROM edge_table),
+ 1,
+ false)
+ GROUP BY from_v) AS count
+ WHERE edge_table.source=count.from_v
+ ;
+
+ALTER TABLE edge_table
+DROP COLUMN IF EXISTS another_column,
+ADD COLUMN another_column INTEGER;
+
+
+DROP TABLE IF EXISTS network;
+CREATE TABLE network AS
+SELECT *
+from (
+ VALUES
+ (1::int, 1::int, 2::int, 100::int),
+ (2::int, 2::int, 3::int, 100::int),
+ (3::int, 3::int, 4::int, 100::int),
+ (4::int, 5::int, 6::int, 100::int)
+) as t (id, source,target,cost);
+
+ALTER TABLE network
+DROP COLUMN IF EXISTS node_count,
+ADD COLUMN node_count INTEGER;
+
+UPDATE network AS network
+SET node_count=count.sum
+FROM
+(SELECT
+ from_v,
+ sum(node) AS sum
+ FROM
+ pgr_drivingDistance(
+ 'SELECT id, source, target, cost FROM network',
+ ARRAY(SELECT DISTINCT source FROM network),
+ 1,
+ false)
+ GROUP BY from_v) AS count
+WHERE network.source=count.from_v
+;
+
+ALTER TABLE network
+DROP COLUMN IF EXISTS another_column,
+ADD COLUMN another_column INTEGER;
+
+
diff --git a/src/driving_distance/test/test.conf b/src/driving_distance/test/test.conf
index a633183..cd14af3 100644
--- a/src/driving_distance/test/test.conf
+++ b/src/driving_distance/test/test.conf
@@ -8,6 +8,7 @@
drivingdistance-any-00
doc-pgr_drivingDistance
doc-pgr_drivingdistance-v2
+ issue729
)],
'documentation' => [qw(
doc-pgr_drivingDistance
diff --git a/src/internalQueryTests/src/testXYedges.c b/src/internalQueryTests/src/testXYedges.c
index 9ba9154..57617c3 100644
--- a/src/internalQueryTests/src/testXYedges.c
+++ b/src/internalQueryTests/src/testXYedges.c
@@ -27,24 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- Uncomment when needed
-*/
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./testXYedges_driver.h"
@@ -98,6 +85,7 @@ process(char* edges_sql,
PGR_DBG("Returned error message = %s\n", err_msg);
if (err_msg) {
+ pgr_SPI_finish();
elog(ERROR, "%s", err_msg);
free(err_msg);
}
@@ -110,7 +98,7 @@ PGDLLEXPORT Datum
testXYedges(PG_FUNCTION_ARGS) {
bool result_bool = false;
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
&result_bool);
PG_RETURN_BOOL(result_bool);
diff --git a/src/internalQueryTests/src/testXYedges_driver.cpp b/src/internalQueryTests/src/testXYedges_driver.cpp
index 21527c4..c88241e 100644
--- a/src/internalQueryTests/src/testXYedges_driver.cpp
+++ b/src/internalQueryTests/src/testXYedges_driver.cpp
@@ -27,22 +27,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./testXYedges_driver.h"
#include <sstream>
#include <iomanip>
#include <vector>
-#include "./testXYedges_driver.h"
-
-#include "./../../common/src/pgr_types.h"
-#include "./../../dijkstra/src/pgr_dijkstra.hpp"
#include "./../../common/src/pgr_base_graph.hpp"
+#include "./../../dijkstra/src/pgr_dijkstra.hpp"
+
#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
/************************************************************
edges_sql TEXT
@@ -82,12 +77,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Directed , insertion using C array\n";
@@ -96,12 +90,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Directed , creating with vertices, insertion using vector\n";
@@ -110,12 +103,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Directed , creating with vertices, insertion using C array\n";
@@ -124,12 +116,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
@@ -139,12 +130,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Directed , insertion using C array\n";
@@ -153,12 +143,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Undirected , insertion using C array\n";
@@ -167,12 +156,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
{
log << "Testing Undirected , creating with vertices, insertion using vector\n";
@@ -181,12 +169,11 @@ do_pgr_testXYedges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
*err_msg = NULL;
diff --git a/src/internalQueryTests/src/test_c_edges.c b/src/internalQueryTests/src/test_c_edges.c
index 26f0f52..42db34c 100644
--- a/src/internalQueryTests/src/test_c_edges.c
+++ b/src/internalQueryTests/src/test_c_edges.c
@@ -27,19 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./test_c_edges_driver.h"
@@ -85,7 +77,7 @@ process(char *edges_sql,
&err_msg);
pfree(edges);
- elog(NOTICE, "Returned log message = %s\n", log_msg);
+ PGR_DBG("Returned log message = %s\n", log_msg);
if (log_msg) {
elog(DEBUG1, "%s", log_msg);
free(log_msg);
@@ -93,6 +85,7 @@ process(char *edges_sql,
PGR_DBG("Returned error message = %s\n", err_msg);
if (err_msg) {
+ pgr_SPI_finish();
elog(ERROR, "%s", err_msg);
free(err_msg);
}
@@ -105,7 +98,7 @@ PGDLLEXPORT Datum
test_c_edges(PG_FUNCTION_ARGS) {
bool result_bool = false;
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
&result_bool);
PG_RETURN_BOOL(result_bool);
diff --git a/src/internalQueryTests/src/test_c_edges_driver.cpp b/src/internalQueryTests/src/test_c_edges_driver.cpp
index 14566c1..617f919 100644
--- a/src/internalQueryTests/src/test_c_edges_driver.cpp
+++ b/src/internalQueryTests/src/test_c_edges_driver.cpp
@@ -27,27 +27,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./test_c_edges_driver.h"
#include <sstream>
#include <iomanip>
#include <vector>
-#include "./test_c_edges_driver.h"
-
-#include "./../../common/src/pgr_types.h"
-#include "./../../dijkstra/src/pgr_dijkstra.hpp"
-#if 0
-#include "./../../common/src/pgr_base_graph.hpp"
-#endif
#include "./../../contraction/src/pgr_contractionGraph.hpp"
-#include "./../../common/src/pgr_assert.h"
+#include "./../../dijkstra/src/pgr_dijkstra.hpp"
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
/************************************************************
edges_sql TEXT
@@ -64,9 +54,8 @@ do_pgr_test_c_edges(
pgassert(!(*log_msg));
pgassert(!(*err_msg));
- std::vector< pgr_edge_t > edges(data_edges, data_edges + total_edges);
- std::vector < pgrouting::contraction::Vertex > vertices(pgrouting::contraction::extract_vertices(edges));
-
+ std::vector<pgr_edge_t> edges(data_edges, data_edges + total_edges);
+ auto vertices(pgrouting::extract_vertices(edges));
log << "Original: \n" <<
std::setprecision(9);
@@ -78,8 +67,7 @@ do_pgr_test_c_edges(
<< "\treverse_cost = " << edge.reverse_cost
<< ")\n";
}
- // TODO(Rohith) make the graph work with pgr_dijkstra
- #if 0
+
{
log << "Testing Directed , insertion using vector\n";
pgrouting::CHDirectedGraph graph(DIRECTED);
@@ -87,12 +75,11 @@ do_pgr_test_c_edges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
@@ -103,42 +90,11 @@ do_pgr_test_c_edges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
- log << graph;
-
- log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
-
- }
- {
- log << "Testing Directed , creating with vertices, insertion using vector\n";
- pgrouting::CHDirectedGraph graph(vertices, DIRECTED);
- log << " - Created graph:\n";
- log << graph;
-
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
-
- }
- {
- log << "Testing Directed , creating with vertices, insertion using C array\n";
- pgrouting::CHDirectedGraph graph(vertices, DIRECTED);
- log << " - Created graph:\n";
- log << graph;
-
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
- log << graph;
-
- log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
+ pgr_dijkstra(graph, 2, 3, true);
}
@@ -149,29 +105,13 @@ do_pgr_test_c_edges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
+ graph.insert_edges(edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
-
+ pgr_dijkstra(graph, 2, 3, true);
}
- {
- log << "Testing Undirected , insertion using C array\n";
- pgrouting::CHUndirectedGraph graph(UNDIRECTED);
- log << " - Created graph:\n";
- log << graph;
-
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
- log << graph;
-
- log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
- }
{
log << "Testing Undirected , insertion using C array\n";
pgrouting::CHUndirectedGraph graph(UNDIRECTED);
@@ -179,187 +119,86 @@ do_pgr_test_c_edges(
log << graph;
log << " - Inserting Edges:\n";
- graph.graph_insert_data(data_edges, total_edges);
+ graph.insert_edges(data_edges, total_edges);
log << graph;
log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
-
- }
- {
- log << "Testing Undirected , creating with vertices, insertion using vector\n";
- pgrouting::CHUndirectedGraph graph(vertices, UNDIRECTED);
- log << " - Created graph:\n";
- log << graph;
-
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
- log << graph;
-
- log << " - Can do a dijKstra:\n";
- Path path;
- pgr_dijkstra(graph, path, 2, 3, true);
-
+ pgr_dijkstra(graph, 2, 3, true);
}
{
- log << "Testing Identifiers, creating with vertices, insertion using vector\n";
- log << " - Created graph:\n";
- pgrouting::CHUndirectedGraph graph(vertices, UNDIRECTED);
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
- log << " - All vertices:\n";
+ log << "Testing Identifiers\n";
+ pgrouting::CHUndirectedGraph graph(UNDIRECTED);
+ graph.insert_edges(edges);
+
Identifiers<int64_t> all_vertices, contracted_vertices, remaining_vertices;
+
for (const auto vertex: vertices) {
all_vertices.insert(graph.get_V(vertex.id));
- //log << vertex;
}
- log << " " << all_vertices;
- log << "\n";
- log << " - Contracted vertices:\n";
/*
- 1, 7, 8, 13, 14, 16
- */
+ Contracted vertices:
+ 1, 7, 8, 13, 14, 16
+ */
contracted_vertices.insert(graph.get_V(1));
contracted_vertices.insert(graph.get_V(7));
contracted_vertices.insert(graph.get_V(8));
contracted_vertices.insert(graph.get_V(13));
contracted_vertices.insert(graph.get_V(14));
contracted_vertices.insert(graph.get_V(16));
- log << " " << contracted_vertices;
- log << "\n";
- log << " - Remaining vertices:\n";
+
remaining_vertices = all_vertices - contracted_vertices;
- log << " " << remaining_vertices;
- log << "\n";
+
+ log << " - All vertices: "
+ << all_vertices
+ << "\n - Contracted vertices: "
+ << contracted_vertices
+ << "\n - Remaining vertices: "
+ << remaining_vertices
+ << "\n";
}
{
- log << "Testing Vertex class, creating graph with vertices, insertion using vector\n";
- log << " - Created graph:\n";
- pgrouting::CHDirectedGraph graph(vertices, UNDIRECTED);
- log << " - Inserting Edges:\n";
- graph.graph_insert_data(edges);
- int64_t vid1 = graph.get_V(1);
- int64_t vid2 = graph.get_V(2);
- int64_t vid5 = graph.get_V(5);
- int64_t vid4 = graph.get_V(4);
- int64_t vid7 = graph.get_V(7);
- int64_t vid8 = graph.get_V(8);
- int64_t vid10 = graph.get_V(10);
- int64_t vid12 = graph.get_V(12);
- int64_t vid13 = graph.get_V(13);
- int64_t vid14 = graph.get_V(14);
- int64_t vid15 = graph.get_V(15);
- int64_t vid16 = graph.get_V(16);
- int64_t vid17 = graph.get_V(17);
-
- log << " - id ----- V:\n";
- log << " " << 1 << " ----- " << vid1 << "\n";
- log << " " << 2 << " ----- " << vid2 << "\n";
- log << " " << 4 << " ----- " << vid4 << "\n";
- log << " " << 5 << " ----- " << vid5 << "\n";
- log << " " << 7 << " ----- " << vid7 << "\n";
- log << " " << 8 << " ----- " << vid8 << "\n";
- log << " " << 10 << " ----- " << vid10 << "\n";
- log << " " << 12 << " ----- " << vid12 << "\n";
- log << " " << 13 << " ----- " << vid13 << "\n";
- log << " " << 14 << " ----- " << vid14 << "\n";
- log << " " << 15 << " ----- " << vid15 << "\n";
- log << " " << 16 << " ----- " << vid16 << "\n";
- log << " " << 17 << " ----- " << vid17 << "\n";
- pgrouting::contraction::Vertex v1 = graph[vid1];
- pgrouting::contraction::Vertex v2 = graph[vid2];
- pgrouting::contraction::Vertex v4 = graph[vid4];
- pgrouting::contraction::Vertex v5 = graph[vid5];
- pgrouting::contraction::Vertex v7 = graph[vid7];
- pgrouting::contraction::Vertex v8 = graph[vid8];
- pgrouting::contraction::Vertex v10 = graph[vid10];
- pgrouting::contraction::Vertex v12 = graph[vid12];
- pgrouting::contraction::Vertex v13 = graph[vid13];
- pgrouting::contraction::Vertex v14 = graph[vid14];
- pgrouting::contraction::Vertex v15 = graph[vid15];
- pgrouting::contraction::Vertex v16 = graph[vid16];
- pgrouting::contraction::Vertex v17 = graph[vid17];
+ log << "Testing CH_vertex class\n";
+
+ pgrouting::CHUndirectedGraph graph(DIRECTED);
+ graph.insert_edges(edges);
+
+ log << "id ----- V\n";
+ for (int64_t i = 1; i < 18; ++i) {
+ log << " " << i << " ----- " << graph.get_V(i) << "\n";
+ }
+ auto vid1 = graph.get_V(1);
+ auto vid2 = graph.get_V(2);
+
+ auto v1 = graph[vid1];
+ auto v2 = graph[vid2];
+
log << " - Dead end contraction:\n";
// vertex 1 is contracted to vertex 2
v2.add_contracted_vertex(v1, vid1);
log << "Vertex 1 is contracted to Vertex 2:\n";
- log << v1;
- log << v2;
- // vertex 7 is contracted to vertex 8
- v8.add_contracted_vertex(v7, vid7);
- log << "Vertex 7 is contracted to Vertex 8:\n";
- log << v7;
- log << v8;
- // vertex 8 is contracted to vertex 5
- v5.add_contracted_vertex(v8, vid8);
- log << "Vertex 8 is contracted to Vertex 5:\n";
- log << v8;
- log << v5;
- // vertex 13 is contracted to vertex 10
- v10.add_contracted_vertex(v13, vid13);
- log << "Vertex 13 is contracted to Vertex 10:\n";
- log << v13;
- log << v10;
- // vertex 14 is contracted to vertex 15
- v15.add_contracted_vertex(v14, vid14);
- log << "Vertex 14 is contracted to Vertex 15:\n";
- log << v14;
- log << v15;
- // vertex 16 is contracted to vertex 17
- v17.add_contracted_vertex(v16, vid16);
- log << "Vertex 16 is contracted to Vertex 17:\n";
- log << v16;
- log << v17;
-
+ log << vid1 << v1 << "\n";
+ log << vid2 << v2 << "\n";
log << " - Linear contraction:\n";
- pgrouting::contraction::Edge e1;
- pgrouting::contraction::Edge e2;
- pgrouting::contraction::Edge e3;
- pgrouting::contraction::Edge e4;
+ pgrouting::CH_edge e1;
+ pgrouting::CH_edge e2;
+ pgrouting::CH_edge e3;
+ pgrouting::CH_edge e4;
+
// vertex 2 is contracted to edge -1
+ log << "Vertex 1 is contracted to edge -1:\n";
e1.id = -1;
+ e1.cost = 0;
e1.source = 3;
e1.target = 5;
- log << "Vertex 1 is contracted to edge -1:\n";
e1.add_contracted_vertex(v2, vid2);
- log << e1;
- // vertex 4 is contracted to edge -2
- e2.id = -2;
- e2.source = 3;
- e2.target = 9;
- log << "Vertex 4 is contracted to edge -2:\n";
- e2.add_contracted_vertex(v4, vid4);
- log << e2;
- // vertex 10 is contracted to edge -3
- e3.id = -3;
- e3.source = 5;
- e3.target = 11;
- log << "Vertex 10 is contracted to edge -3:\n";
- e3.add_contracted_vertex(v10, vid10);
- log << e3;
- // vertex 12 is contracted to edge -4
- e4.id = -4;
- e4.source = 9;
- e4.target = 11;
- log << "Vertex 12 is contracted to edge -4:\n";
- e4.add_contracted_vertex(v12, vid12);
- log << e4;
- #if 0
-
- Pgr_contract<pgrouting::CDirectedGraph> contractor;
- contractor.getDeadEndSet(graph);
- log << " - Dead end vertices:\n";
- contractor.print_dead_end_vertices(log);
-
- #endif
+ log << vid2 << v2 << "\n";
+ log << e1 << "\n";
+ log << vid2 << v2 << "\n";
}
- #endif
-
*err_msg = NULL;
*log_msg = strdup(log.str().c_str());
diff --git a/src/internalQueryTests/src/test_matrixRows.c b/src/internalQueryTests/src/test_matrixRows.c
index b0efbb8..97e172f 100644
--- a/src/internalQueryTests/src/test_matrixRows.c
+++ b/src/internalQueryTests/src/test_matrixRows.c
@@ -27,24 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- Uncomment when needed
-*/
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/matrixRows_input.h"
#include "./test_matrixRows_driver.h"
@@ -99,6 +86,7 @@ process(char* matrix_rows_sql,
PGR_DBG("Returned error message = %s\n", err_msg);
if (err_msg) {
+ pgr_SPI_finish();
elog(ERROR, "%s", err_msg);
free(err_msg);
}
@@ -113,7 +101,7 @@ test_matrixRows(PG_FUNCTION_ARGS) {
bool result_bool = false;
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
&result_bool);
PG_RETURN_BOOL(result_bool);
diff --git a/src/internalQueryTests/src/test_matrixRows_driver.cpp b/src/internalQueryTests/src/test_matrixRows_driver.cpp
index 4177913..b0b1bc4 100644
--- a/src/internalQueryTests/src/test_matrixRows_driver.cpp
+++ b/src/internalQueryTests/src/test_matrixRows_driver.cpp
@@ -27,17 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./test_matrixRows_driver.h"
#include <sstream>
#include <iomanip>
#include <vector>
#include <cstring>
-#include "./test_matrixRows_driver.h"
+
#include "./../../common/src/pgr_assert.h"
bool do_pgr_test_matrixRows(
diff --git a/src/internalQueryTests/test/test.conf b/src/internalQueryTests/test/test.conf
index 34e9094..416e03e 100644
--- a/src/internalQueryTests/test/test.conf
+++ b/src/internalQueryTests/test/test.conf
@@ -6,19 +6,15 @@
'data' => [ ],
'debugtests' => [qw(
XYedge
+ testCHedges
)],
'tests' => [qw(
)],
'documentation' => [qw(
)],
'nottested' => [qw(
- testCHedges
)]
},
-
-# 'vpg-vpgis' => {}, # for version specific tests
-# '8-1' => {}, # for pg 8.x and postgis 1.x
-# '9.2-2.1' => {}, # for pg 9.2 and postgis 2.1
);
1;
diff --git a/src/internalQueryTests/test/testCHedges.result b/src/internalQueryTests/test/testCHedges.result
index 0e11ecd..718f4d2 100644
--- a/src/internalQueryTests/test/testCHedges.result
+++ b/src/internalQueryTests/test/testCHedges.result
@@ -1,682 +1 @@
-NOTICE: Returned log message = Original:
-id = 1 source = 1 target = 2 cost = 1 reverse_cost = 1)
-id = 2 source = 2 target = 3 cost = -1 reverse_cost = 1)
-id = 3 source = 3 target = 4 cost = -1 reverse_cost = 1)
-id = 4 source = 2 target = 5 cost = 1 reverse_cost = 1)
-id = 5 source = 3 target = 6 cost = 1 reverse_cost = -1)
-id = 6 source = 7 target = 8 cost = 1 reverse_cost = 1)
-id = 7 source = 8 target = 5 cost = 1 reverse_cost = 1)
-id = 8 source = 5 target = 6 cost = 1 reverse_cost = 1)
-id = 9 source = 6 target = 9 cost = 1 reverse_cost = 1)
-id = 10 source = 5 target = 10 cost = 1 reverse_cost = 1)
-id = 11 source = 6 target = 11 cost = 1 reverse_cost = -1)
-id = 12 source = 10 target = 11 cost = 1 reverse_cost = -1)
-id = 13 source = 11 target = 12 cost = 1 reverse_cost = -1)
-id = 14 source = 10 target = 13 cost = 1 reverse_cost = 1)
-id = 15 source = 9 target = 12 cost = 1 reverse_cost = 1)
-id = 16 source = 4 target = 9 cost = 1 reverse_cost = 1)
-id = 17 source = 14 target = 15 cost = 1 reverse_cost = 1)
-id = 18 source = 16 target = 17 cost = 1 reverse_cost = 1)
-Testing Directed , insertion using vector
- - Created graph:
- - Inserting Edges:
- - Can do a dijKstra:
-Testing Directed , insertion using C array
- - Created graph:
- - Inserting Edges:
- - Can do a dijKstra:
-Testing Directed , creating with vertices, insertion using vector
- - Created graph:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-):
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-):
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-):
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-):
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-):
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-):
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-):
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-):
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-):
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-):
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-):
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-):
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-):
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-):
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-):
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-):
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-):
- - Inserting Edges:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-): 1=(1, 2) = 1 at t
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-): 1=(2, 1) = 1 at t 4=(2, 5) = 1 at t
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-): 2=(3, 2) = 1 at t 5=(3, 6) = 1 at t
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-): 3=(4, 3) = 1 at t 16=(4, 9) = 1 at t
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-): 4=(5, 2) = 1 at t 7=(5, 8) = 1 at t 8=(5, 6) = 1 at t 10=(5, 10) = 1 at t
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-): 8=(6, 5) = 1 at t 9=(6, 9) = 1 at t 11=(6, 11) = 1 at t
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-): 6=(7, 8) = 1 at t
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-): 6=(8, 7) = 1 at t 7=(8, 5) = 1 at t
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-): 9=(9, 6) = 1 at t 15=(9, 12) = 1 at t 16=(9, 4) = 1 at t
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-): 10=(10, 5) = 1 at t 12=(10, 11) = 1 at t 14=(10, 13) = 1 at t
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-): 13=(11, 12) = 1 at t
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-): 15=(12, 9) = 1 at t
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-): 14=(13, 10) = 1 at t
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-): 17=(14, 15) = 1 at t
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-): 17=(15, 14) = 1 at t
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-): 18=(16, 17) = 1 at t
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-): 18=(17, 16) = 1 at t
- - Can do a dijKstra:
-Testing Directed , creating with vertices, insertion using C array
- - Created graph:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-):
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-):
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-):
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-):
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-):
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-):
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-):
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-):
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-):
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-):
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-):
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-):
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-):
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-):
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-):
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-):
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-):
- - Inserting Edges:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-): 1=(1, 2) = 1 at t
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-): 1=(2, 1) = 1 at t 4=(2, 5) = 1 at t
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-): 2=(3, 2) = 1 at t 5=(3, 6) = 1 at t
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-): 3=(4, 3) = 1 at t 16=(4, 9) = 1 at t
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-): 4=(5, 2) = 1 at t 7=(5, 8) = 1 at t 8=(5, 6) = 1 at t 10=(5, 10) = 1 at t
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-): 8=(6, 5) = 1 at t 9=(6, 9) = 1 at t 11=(6, 11) = 1 at t
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-): 6=(7, 8) = 1 at t
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-): 6=(8, 7) = 1 at t 7=(8, 5) = 1 at t
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-): 9=(9, 6) = 1 at t 15=(9, 12) = 1 at t 16=(9, 4) = 1 at t
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-): 10=(10, 5) = 1 at t 12=(10, 11) = 1 at t 14=(10, 13) = 1 at t
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-): 13=(11, 12) = 1 at t
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-): 15=(12, 9) = 1 at t
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-): 14=(13, 10) = 1 at t
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-): 17=(14, 15) = 1 at t
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-): 17=(15, 14) = 1 at t
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-): 18=(16, 17) = 1 at t
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-): 18=(17, 16) = 1 at t
- - Can do a dijKstra:
-Testing Undirected , insertion using vector
- - Created graph:
- - Inserting Edges:
- - Can do a dijKstra:
-Testing Directed , insertion using C array
- - Created graph:
- - Inserting Edges:
- - Can do a dijKstra:
-Testing Undirected , insertion using C array
- - Created graph:
- - Inserting Edges:
- - Can do a dijKstra:
-Testing Undirected , creating with vertices, insertion using vector
- - Created graph:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-):
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-):
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-):
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-):
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-):
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-):
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-):
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-):
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-):
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-):
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-):
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-):
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-):
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-):
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-):
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-):
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-):
- - Inserting Edges:
-0: out_edges_of({
- id: 1,
- contracted vertices: {}
-}
-): 1=(1, 2) = 1 at t
-1: out_edges_of({
- id: 2,
- contracted vertices: {}
-}
-): 1=(2, 1) = 1 at t 4=(2, 5) = 1 at t
-2: out_edges_of({
- id: 3,
- contracted vertices: {}
-}
-): 2=(3, 2) = 1 at t 5=(3, 6) = 1 at t
-3: out_edges_of({
- id: 4,
- contracted vertices: {}
-}
-): 3=(4, 3) = 1 at t 16=(4, 9) = 1 at t
-4: out_edges_of({
- id: 5,
- contracted vertices: {}
-}
-): 4=(5, 2) = 1 at t 7=(5, 8) = 1 at t 8=(5, 6) = 1 at t 10=(5, 10) = 1 at t
-5: out_edges_of({
- id: 6,
- contracted vertices: {}
-}
-): 8=(6, 5) = 1 at t 9=(6, 9) = 1 at t 11=(6, 11) = 1 at t
-6: out_edges_of({
- id: 7,
- contracted vertices: {}
-}
-): 6=(7, 8) = 1 at t
-7: out_edges_of({
- id: 8,
- contracted vertices: {}
-}
-): 6=(8, 7) = 1 at t 7=(8, 5) = 1 at t
-8: out_edges_of({
- id: 9,
- contracted vertices: {}
-}
-): 9=(9, 6) = 1 at t 15=(9, 12) = 1 at t 16=(9, 4) = 1 at t
-9: out_edges_of({
- id: 10,
- contracted vertices: {}
-}
-): 10=(10, 5) = 1 at t 12=(10, 11) = 1 at t 14=(10, 13) = 1 at t
-10: out_edges_of({
- id: 11,
- contracted vertices: {}
-}
-): 13=(11, 12) = 1 at t
-11: out_edges_of({
- id: 12,
- contracted vertices: {}
-}
-): 15=(12, 9) = 1 at t
-12: out_edges_of({
- id: 13,
- contracted vertices: {}
-}
-): 14=(13, 10) = 1 at t
-13: out_edges_of({
- id: 14,
- contracted vertices: {}
-}
-): 17=(14, 15) = 1 at t
-14: out_edges_of({
- id: 15,
- contracted vertices: {}
-}
-): 17=(15, 14) = 1 at t
-15: out_edges_of({
- id: 16,
- contracted vertices: {}
-}
-): 18=(16, 17) = 1 at t
-16: out_edges_of({
- id: 17,
- contracted vertices: {}
-}
-): 18=(17, 16) = 1 at t
- - Can do a dijKstra:
-Testing Identifiers, creating with vertices, insertion using vector
- - Created graph:
- - Inserting Edges:
- - All vertices:
- {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, }
- - Contracted vertices:
- {0, 6, 7, 12, 13, 15, }
- - Remaining vertices:
- {1, 2, 3, 4, 5, 8, 9, 10, 11, 14, 16, }
-Testing Vertex class, creating graph with vertices, insertion using vector
- - Created graph:
- - Inserting Edges:
- - id ----- V:
- 1 ----- 0
- 2 ----- 1
- 4 ----- 3
- 5 ----- 4
- 7 ----- 6
- 8 ----- 7
- 10 ----- 9
- 12 ----- 11
- 13 ----- 12
- 14 ----- 13
- 15 ----- 14
- 16 ----- 15
- 17 ----- 16
- - Dead end contraction:
-Vertex 1 is contracted to Vertex 2:
-{
- id: 1,
- contracted vertices: {}
-}
-{
- id: 2,
- contracted vertices: {0, }
-}
-Vertex 7 is contracted to Vertex 8:
-{
- id: 7,
- contracted vertices: {}
-}
-{
- id: 8,
- contracted vertices: {6, }
-}
-Vertex 8 is contracted to Vertex 5:
-{
- id: 8,
- contracted vertices: {}
-}
-{
- id: 5,
- contracted vertices: {6, 7, }
-}
-Vertex 13 is contracted to Vertex 10:
-{
- id: 13,
- contracted vertices: {}
-}
-{
- id: 10,
- contracted vertices: {12, }
-}
-Vertex 14 is contracted to Vertex 15:
-{
- id: 14,
- contracted vertices: {}
-}
-{
- id: 15,
- contracted vertices: {13, }
-}
-Vertex 16 is contracted to Vertex 17:
-{
- id: 16,
- contracted vertices: {}
-}
-{
- id: 17,
- contracted vertices: {15, }
-}
- - Linear contraction:
-Vertex 1 is contracted to edge -1:
-{
- id: -1,
- source: 3,
- target: 5,
- cost: 6.90898356e-310,
- first: 64,
- contracted vertices: {0, 1, }
-}
-Vertex 4 is contracted to edge -2:
-{
- id: -2,
- source: 3,
- target: 9,
- cost: 6.90898356e-310,
- first: 96,
- contracted vertices: {3, }
-}
-Vertex 10 is contracted to edge -3:
-{
- id: -3,
- source: 5,
- target: 11,
- cost: 6.90898356e-310,
- first: 144,
- contracted vertices: {9, 12, }
-}
-Vertex 12 is contracted to edge -4:
-{
- id: -4,
- source: 9,
- target: 11,
- cost: 6.95276435e-310,
- first: 200,
- contracted vertices: {11, }
-}
-
-
t
diff --git a/src/internalQueryTests/test/testCHedges.test.sql b/src/internalQueryTests/test/testCHedges.test.sql
index 73a0584..ae50891 100644
--- a/src/internalQueryTests/test/testCHedges.test.sql
+++ b/src/internalQueryTests/test/testCHedges.test.sql
@@ -1,5 +1,3 @@
--- SET client_min_messages TO DEBUG;
-
SELECT * FROM _pgr_test_c_edges(
'SELECT id, source, target, cost, reverse_cost FROM edge_table'
);
diff --git a/src/kdijkstra/doc/pgr_kDijkstra.rst b/src/kdijkstra/doc/pgr_kDijkstra.rst
deleted file mode 100644
index fbec1f5..0000000
--- a/src/kdijkstra/doc/pgr_kDijkstra.rst
+++ /dev/null
@@ -1,128 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-
-.. _pgr_kdijkstra:
-
-pgr_kDijkstra - Deprecated Functions
-===============================================================================
-
-.. warning:: These functions are deprecated!!!
-
- * It has been replaced by a new functions, are no longer supported, and may be removed from future versions.
- * All code that uses the functions should be converted to use its replacement.
-
-
-Name
--------------------------------------------------------------------------------
-
-* ``pgr_kdijkstraCost`` - Returns the costs for K shortest paths using Dijkstra algorithm.
-
-.. warning:: Use :ref:`pgr_dijkstraCost` (One To Many) instead.
-
-* ``pgr_kdijkstraPath`` - Returns the paths for K shortest paths using Dijkstra algorithm.
-
-.. warning:: Use :ref:`pgr_dijkstra` (One To Many) instead.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-These functions allow you to have a single start node and multiple destination nodes and will compute the routes to all the destinations from the source node. Returns a set of :ref:`pgr_costResult <type_cost_result>` or :ref:`pgr_costResult3 <type_cost_result3>`. ``pgr_kdijkstraCost`` returns one record for each destination node and the cost is the total code of the route to that node. ``pgr_kdijkstraPath`` returns one record for every edge in that path from source to destination and the [...]
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_kdijkstraCost(text sql, integer source,
- integer[] targets, boolean directed, boolean has_rcost);
-
- pgr_costResult3[] pgr_kdijkstraPath(text sql, integer source,
- integer[] targets, boolean directed, boolean has_rcost);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :reverse_cost: (optional) the cost for the reverse traversal of the edge. This is only used when the ``directed`` and ``has_rcost`` parameters are ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:targets: ``int4[]`` an array of ids of the end points
-:directed: ``true`` if the graph is directed
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-
-``pgr_kdijkstraCost`` returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: path vertex source id (this will always be source start point in the query).
-:id2: path vertex target id
-:cost: cost to traverse the path from ``id1`` to ``id2``. Cost will be -1.0 if there is no path to that target vertex id.
-
-
-``pgr_kdijkstraPath`` returns set of :ref:`type_cost_result3`:
-
-:seq: row sequence
-:id1: path target id (identifies the target path).
-:id2: path edge source node id
-:id3: path edge id (``-1`` for the last row)
-:cost: cost to traverse this edge or -1.0 if there is no path to this target
-
-
-.. rubric:: History
-
-* Deprecated in version 2.0.0
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Returning a ``cost`` result
-
-
-.. literalinclude:: doc-kdijkstra.queries
- :start-after: -- q1
- :end-before: -- q2
-
-
-.. literalinclude:: doc-kdijkstra.queries
- :start-after: -- q2
- :end-before: -- q3
-
-
-* Returning a ``path`` result
-
-.. literalinclude:: doc-kdijkstra.queries
- :start-after: -- q3
- :end-before: -- q4
-
-There is no assurance that the result above will be ordered in the direction
-of flow of the route, ie: it might be reversed. You will need to check if
-``st_startPoint()`` of the route is the same as the start node location and
-if it is not then call ``st_reverse()`` to reverse the direction of the route.
-This behavior is a function of PostGIS functions ``st_linemerge()`` and
-``st_union()`` and not pgRouting.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_dijkstraCost`, :ref:`pgr_dijkstra`
-* :ref:`type_cost_result`
-* http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
diff --git a/src/kdijkstra/test/doc-kdijkstra.test.sql b/src/kdijkstra/test/doc-kdijkstra.test.sql
index 86241cc..8604973 100644
--- a/src/kdijkstra/test/doc-kdijkstra.test.sql
+++ b/src/kdijkstra/test/doc-kdijkstra.test.sql
@@ -1,10 +1,8 @@
-BEGIN;
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-- PGR_kdijkstraPath
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
\echo -- q1
SELECT * FROM pgr_kdijkstraCost(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
@@ -24,4 +22,3 @@ WHERE a.id3=b.id
GROUP by id1
ORDER by id1;
\echo -- q4
-ROLLBACK;
diff --git a/src/ksp/doc/ksp.rst.back b/src/ksp/doc/KSP-category.rst
similarity index 62%
rename from src/ksp/doc/ksp.rst.back
rename to src/ksp/doc/KSP-category.rst
index 0eec12f..ba23ad9 100644
--- a/src/ksp/doc/ksp.rst.back
+++ b/src/ksp/doc/KSP-category.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -7,18 +7,17 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
-.. _ksp:
-pgr_ksp - Multiple shortest Paths based on Dijkstra
-===============================================================================
+.. _KSP:
+KSP Category
+===============================================================================
+.. index from here
- - :ref:`pgr_ksp<pgr_ksp>` - Multiple shortest Paths based on Dijkstra
- - :ref:`pgr_withPointsKSP<pgr_withPointsKSP>` - Multiple shortest Paths based on Dijkstra
+* :ref:`pgr_KSP` - Driving Distance based on pgr_dijkstra
+* :ref:`pgr_withPointsKSP` - Driving Distance based on pgr_dijkstra
-.. toctree::
- :hidden:
+.. index to here
- ./pgr_ksp
diff --git a/src/ksp/doc/doc-ksp-v2.queries b/src/ksp/doc/doc-ksp-v2.queries
index f09ee8e..d6885b1 100644
--- a/src/ksp/doc/doc-ksp-v2.queries
+++ b/src/ksp/doc/doc-ksp-v2.queries
@@ -1,3 +1,5 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
--q1
@@ -45,3 +47,5 @@ NOTICE: Deprecated function
(12 rows)
--q3
+ROLLBACK;
+ROLLBACK
diff --git a/src/ksp/doc/doc-ksp.queries b/src/ksp/doc/doc-ksp.queries
index 1667b58..c24eeb1 100644
--- a/src/ksp/doc/doc-ksp.queries
+++ b/src/ksp/doc/doc-ksp.queries
@@ -1,7 +1,9 @@
+BEGIN;
+BEGIN
SET client_min_messages TO NOTICE;
SET
--q1
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2,
true
@@ -21,7 +23,7 @@ NOTICE: Deprecated function
9 | 1 | 12 | -1 | 0
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2,
directed:=true
@@ -40,7 +42,7 @@ SELECT * FROM pgr_ksp(
10 | 2 | 5 | 12 | -1 | 0 | 4
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2
);
@@ -59,7 +61,7 @@ SELECT * FROM pgr_ksp(
(10 rows)
--q2
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2
);
@@ -77,7 +79,7 @@ SELECT * FROM pgr_ksp(
10 | 2 | 5 | 12 | -1 | 0 | 4
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, heap_paths:=true
);
@@ -100,7 +102,7 @@ SELECT * FROM pgr_ksp(
15 | 3 | 5 | 12 | -1 | 0 | 4
(15 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, true, true
);
@@ -124,7 +126,7 @@ SELECT * FROM pgr_ksp(
(15 rows)
--q3
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, directed:=false
);
@@ -142,7 +144,7 @@ SELECT * FROM pgr_ksp(
10 | 2 | 5 | 12 | -1 | 0 | 4
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, false, true
);
@@ -173,7 +175,7 @@ SELECT * FROM pgr_ksp(
(22 rows)
--q4
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 3, 2
);
@@ -181,7 +183,7 @@ SELECT * FROM pgr_ksp(
-----+---------+----------+------+------+------+----------
(0 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2
);
@@ -199,7 +201,7 @@ SELECT * FROM pgr_ksp(
10 | 2 | 5 | 12 | -1 | 0 | 4
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, heap_paths:=true
);
@@ -222,7 +224,7 @@ SELECT * FROM pgr_ksp(
15 | 3 | 5 | 12 | -1 | 0 | 4
(15 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, true, true
);
@@ -246,7 +248,7 @@ SELECT * FROM pgr_ksp(
(15 rows)
--q5
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, directed:=false
);
@@ -264,7 +266,7 @@ SELECT * FROM pgr_ksp(
10 | 2 | 5 | 12 | -1 | 0 | 4
(10 rows)
-SELECT * FROM pgr_ksp(
+SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, directed:=false, heap_paths:=true
);
@@ -288,3 +290,5 @@ SELECT * FROM pgr_ksp(
(15 rows)
--q6
+ROLLBACK;
+ROLLBACK
diff --git a/src/ksp/doc/pgr_ksp.rst b/src/ksp/doc/pgr_KSP.rst
similarity index 87%
rename from src/ksp/doc/pgr_ksp.rst
rename to src/ksp/doc/pgr_KSP.rst
index 57498f1..5b0d2b0 100644
--- a/src/ksp/doc/pgr_ksp.rst
+++ b/src/ksp/doc/pgr_KSP.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,20 +9,24 @@
.. _pgr_ksp:
-pgr_ksp
+pgr_KSP
===============================================================================
Name
-------------------------------------------------------------------------------
-``pgr_ksp`` — Returns the "K" shortest paths.
+``pgr_KSP`` — Returns the "K" shortest paths.
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.0.0
+
+* Signature change 2.1.0
+
Synopsis
-------------------------------------------------------------------------------
@@ -34,15 +38,15 @@ Signature Summary
.. code-block:: sql
- pgr_ksp(edges_sql, start_vid, end_vid, K);
- pgr_ksp(edges_sql, start_vid, end_vid, k, directed, heap_paths)
+ pgr_KSP(edges_sql, start_vid, end_vid, K);
+ pgr_KSP(edges_sql, start_vid, end_vid, k, directed, heap_paths)
RETURNS SET OF (seq, path_id, path_seq, node, edge, cost, agg_cost) or EMPTY SET
Signatures
-------------------------------------------------------------------------------
-.. index::
- single: ksp(Minimal Signature)
+.. index::
+ single: KSP(Minimal Signature)
Minimal Signature
..................
@@ -53,7 +57,7 @@ Minimal Signature
RETURNS SET OF (seq, path_id, path_seq, node, edge, cost, agg_cost) or EMPTY SET
-.. index::
+.. index::
single: ksp(Complete Signature)
Complete Signature
@@ -61,27 +65,29 @@ Complete Signature
.. code-block:: sql
- pgr_ksp(edges_sql, start_vid, end_vid, k, directed, heap_paths)
+ pgr_KSP(edges_sql, start_vid, end_vid, k, directed, heap_paths)
RETURNS SET OF (seq, path_id, path_seq, node, edge, cost, agg_cost) or EMPTY SET
Description of the Signatures
-------------------------------------------------------------------------------
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
+Description of the parameters of the signatures
+..................................................
-============== ============ =================================================
-Column Type Description
+============== ============ =================================================
+Column Type Description
============== ============ =================================================
**edges_sql** ``TEXT`` SQL query as described above.
**start_vid** ``BIGINT`` Identifier of the starting vertex.
**end_vid** ``BIGINT`` Identifier of the ending vertex.
**k** ``INTEGER`` The desiered number of paths.
**directed** ``BOOLEAN`` (optional). When ``false`` the graph is considered as Undirected. Default is ``true`` which considers the graph as Directed.
-**heap_paths** ``BOOLEAN`` (optional). When ``true`` returns all the paths stored in the process heap. Default is ``false`` which only returns ``k`` pahts.
+**heap_paths** ``BOOLEAN`` (optional). When ``true`` returns all the paths stored in the process heap. Default is ``false`` which only returns ``k`` pahts.
============== ============ =================================================
Roughly, if the shortest path has ``N`` edges, the heap will contain about than ``N * k`` paths for small value of ``k`` and ``k > 1``.
diff --git a/src/ksp/doc/pgr_ksp_v2.rst b/src/ksp/doc/pgr_ksp_v2.rst
deleted file mode 100644
index d5f96d7..0000000
--- a/src/ksp/doc/pgr_ksp_v2.rst
+++ /dev/null
@@ -1,102 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_ksp_v2:
-
-pgr_ksp - Deprecated Signature
-===============================================================================
-
-.. warning:: This function signature is deprecated!!!
-
- * That means it has been replaced by new signature(s)
- * This signature is no longer supported, and may be removed from future versions.
- * All code that use this function signature should be converted to use its replacement :ref:`pgr_ksp`.
-
-
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_ksp`` — Returns the "K" shortest paths.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-The K shortest path routing algorithm based on Yen's algorithm. "K" is the number of shortest paths desired. Returns a set of :ref:`pgr_costResult3 <type_cost_result3>` (seq, id1, id2, id3, cost) rows, that make up a path.
-
-.. code-block:: sql
-
- pgr_costResult3[] pgr_ksp(sql text, source integer, target integer,
- paths integer, has_rcost boolean);
-
-
-Description
--------------------------------------------------------------------------------
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, source, target, cost, [,reverse_cost] FROM edge_table
-
-
- :id: ``int4`` identifier of the edge
- :source: ``int4`` identifier of the source vertex
- :target: ``int4`` identifier of the target vertex
- :cost: ``float8`` value, of the edge traversal cost. A negative cost will prevent the edge from being inserted in the graph.
- :reverse_cost: (optional) the cost for the reverse traversal of the edge. This is only used when ``has_rcost`` the parameter is ``true`` (see the above remark about negative costs).
-
-:source: ``int4`` id of the start point
-:target: ``int4`` id of the end point
-:paths: ``int4`` number of alternative routes
-:has_rcost: if ``true``, the ``reverse_cost`` column of the SQL generated set of rows will be used for the cost of the traversal of the edge in the opposite direction.
-
-Returns set of :ref:`type_cost_result`:
-
-:seq: sequence for ording the results
-:id1: route ID
-:id2: node ID
-:id3: edge ID (``0`` for the last row)
-:cost: cost to traverse from ``id2`` using ``id3``
-
-KSP code base taken from http://code.google.com/p/k-shortest-paths/source.
-
-
-.. rubric:: History
-
-* New in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Without ``reverse_cost``
-
-.. literalinclude:: doc-ksp-v2.queries
- :start-after: --q1
- :end-before: --q2
-
-
-* With ``reverse_cost``
-
-.. literalinclude:: doc-ksp-v2.queries
- :start-after: --q2
- :end-before: --q3
-
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`pgr_ksp`
-* :ref:`type_cost_result3`
-* http://en.wikipedia.org/wiki/K_shortest_path_routing
diff --git a/src/ksp/src/ksp.c b/src/ksp/src/ksp.c
index 403dbe9..b62b6a3 100644
--- a/src/ksp/src/ksp.c
+++ b/src/ksp/src/ksp.c
@@ -22,179 +22,173 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#include "fmgr.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
+#include "./../../common/src/postgres_connection.h"
-#include "./../../common/src/pgr_types.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
+#include "./../../common/src/pgr_types.h"
#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
+
#include "./ksp_driver.h"
PGDLLEXPORT Datum kshortest_path(PG_FUNCTION_ARGS);
-
+PG_FUNCTION_INFO_V1(kshortest_path);
static
-void compute(char* sql, int64_t start_vertex,
- int64_t end_vertex, int k,
- bool directed,
- bool heap_paths,
- General_path_element_t **ksp_path, size_t *path_count) {
- pgr_SPI_connect();
- pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
-
- char *err_msg = NULL;
-
- if (start_vertex == end_vertex) {
- (*path_count) = 0;
- *ksp_path = NULL;
- pgr_SPI_finish();
- return;
- }
-
- PGR_DBG("Load data");
- pgr_get_edges(sql, &edges, &total_tuples);
-
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Calling do_pgr_ksp\n");
- PGR_DBG("heap_paths = %i\n", heap_paths);
-
- clock_t start_t = clock();
- int errcode = do_pgr_ksp(edges, total_tuples,
- start_vertex, end_vertex,
- k, directed, heap_paths,
- ksp_path, path_count, &err_msg);
- time_msg(" processing KSP", start_t, clock());
+void compute(
+ char* edges_sql,
+ int64_t start_vertex,
+ int64_t end_vertex,
+ int k,
+ bool directed,
+ bool heap_paths,
+ General_path_element_t **ksp_path, size_t *path_count) {
+ pgr_SPI_connect();
+
+ PGR_DBG("Load data");
+ pgr_edge_t *edges = NULL;
+ size_t total_edges = 0;
+
+
+ if (start_vertex == end_vertex) {
+ pgr_SPI_finish();
+ return;
+ }
- PGR_DBG("total tuples found %ld\n", *path_count);
- PGR_DBG("Exit Status = %i\n", errcode);
- PGR_DBG("Returned message = %s\n", err_msg);
+ pgr_get_edges(edges_sql, &edges, &total_edges);
+ PGR_DBG("Total %ld edges in query:", total_edges);
+ if (total_edges == 0) {
+ PGR_DBG("No edges found");
+ pgr_SPI_finish();
+ return;
+ }
- if (err_msg) free(err_msg);
- pfree(edges);
- pgr_SPI_finish();
+ PGR_DBG("Calling do_pgr_ksp\n");
+ PGR_DBG("heap_paths = %i\n", heap_paths);
+
+ clock_t start_t = clock();
+ char *log_msg = NULL;
+ char *notice_msg = NULL;
+ char *err_msg = NULL;
+
+ do_pgr_ksp(
+ edges,
+ total_edges,
+ start_vertex,
+ end_vertex,
+ k,
+ directed,
+ heap_paths,
+ ksp_path,
+ path_count,
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+ time_msg(" processing KSP", start_t, clock());
+ PGR_DBG("total tuples found %ld\n", *path_count);
+
+ if (err_msg) {
+ if (*ksp_path) free(*ksp_path);
+ }
+ pgr_global_report(log_msg, notice_msg, err_msg);
- if (errcode) {
- pgr_send_error(errcode);
- }
+ pfree(edges);
+ pgr_SPI_finish();
}
-PG_FUNCTION_INFO_V1(kshortest_path);
PGDLLEXPORT Datum
kshortest_path(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- General_path_element_t *path;
- // void * toDel;
+ General_path_element_t *path = NULL;
+ size_t result_count = 0;
/* stuff done only on the first call of the function */
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
- size_t path_count = 0;
- path = NULL;
-
- /* create a function context for cross-call persistence */
funcctx = SRF_FIRSTCALL_INIT();
-
- /* switch to memory context appropriate for multiple function calls */
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- // CREATE OR REPLACE FUNCTION _pgr_ksp(sql text, start_vid bigint, end_vid bigint, k integer, directed boolean, heap_paths boolean...
+ /*
+ CREATE OR REPLACE FUNCTION _pgr_ksp(
+ sql text,
+ start_vid bigint,
+ end_vid bigint,
+ k integer,
+ directed boolean,
+ heap_paths boolean
+ */
+ PGR_DBG("Calling process");
compute(
- pgr_text2char(PG_GETARG_TEXT_P(0)), /* SQL */
+ text_to_cstring(PG_GETARG_TEXT_P(0)), /* SQL */
PG_GETARG_INT64(1), /* start_vid */
PG_GETARG_INT64(2), /* end_vid */
PG_GETARG_INT32(3), /* k */
PG_GETARG_BOOL(4), /* directed */
PG_GETARG_BOOL(5), /* heap_paths */
&path,
- &path_count);
- // toDel = path;
+ &result_count);
+ PGR_DBG("Total number of tuples to be returned %ld \n", result_count);
- PGR_DBG("Total number of tuples to be returned %ld \n", path_count);
+ /* */
+ /**********************************************************************/
- /* total number of tuples to be returned */
- funcctx->max_calls = (uint32_t)path_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = path;
-
- /* Build a tuple descriptor for our result type */
if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
"that cannot accept type record\n")));
- // funcctx->tuple_desc = BlessTupleDesc(RelationNameGetTupleDesc("__pgr_2i3b2f"));
funcctx->tuple_desc = tuple_desc;
MemoryContextSwitchTo(oldcontext);
}
- /* stuff done on every call of the function */
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
+
tuple_desc = funcctx->tuple_desc;
path = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) { /* do when there is more left to send */
- PGR_DBG("returning %u \n", call_cntr);
+ if (funcctx->call_cntr < funcctx->max_calls) { /* do when there is more left to send */
HeapTuple tuple;
Datum result;
- /* //Datum values[4];
- //bool nulls[4]; */
-
Datum *values;
bool* nulls;
- values = (Datum *)palloc(7 * sizeof(Datum));
- nulls = (bool *) palloc(7 * sizeof(bool));
-
- nulls[0] = false;
- nulls[1] = false;
- nulls[2] = false;
- nulls[3] = false;
- nulls[4] = false;
- nulls[5] = false;
- nulls[6] = false;
-
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(path[call_cntr].start_id + 1);
- values[2] = Int32GetDatum(path[call_cntr].seq);
- values[3] = Int64GetDatum(path[call_cntr].node);
- values[4] = Int64GetDatum(path[call_cntr].edge);
- values[5] = Float8GetDatum(path[call_cntr].cost);
- values[6] = Float8GetDatum(path[call_cntr].agg_cost);
+ values = palloc(7 * sizeof(Datum));
+ nulls = palloc(7 * sizeof(bool));
- tuple = heap_form_tuple(tuple_desc, values, nulls);
- /* make the tuple into a datum */
- result = HeapTupleGetDatum(tuple);
+ size_t i;
+ for (i = 0; i < 7; ++i) {
+ nulls[i] = false;
+ }
- /* clean up (this is not really necessary) */
- pfree(values);
- pfree(nulls);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(path[funcctx->call_cntr].start_id + 1);
+ values[2] = Int32GetDatum(path[funcctx->call_cntr].seq);
+ values[3] = Int64GetDatum(path[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(path[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(path[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(path[funcctx->call_cntr].agg_cost);
+ tuple = heap_form_tuple(tuple_desc, values, nulls);
+ result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else { /* do when there is no more left */
- if (path == (General_path_element_t *) NULL) free(path);
SRF_RETURN_DONE(funcctx);
}
}
-
-
diff --git a/src/ksp/src/ksp_driver.cpp b/src/ksp/src/ksp_driver.cpp
index 9cc911e..0e845c8 100644
--- a/src/ksp/src/ksp_driver.cpp
+++ b/src/ksp/src/ksp_driver.cpp
@@ -22,92 +22,106 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef open
-#undef open
-#endif
-#ifdef unlink
-#undef unlink
-#endif
-#endif
-#include <deque>
-#include <sstream>
+#include "./ksp_driver.h"
+#include <sstream>
+#include <deque>
+#include <vector>
-#include "./ksp_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
#include "./pgr_ksp.hpp"
+#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
+
+#include "./../../common/src/pgr_base_graph.hpp"
-int do_pgr_ksp(
- pgr_edge_t *data_edges, size_t total_tuples,
- int64_t start_vertex, int64_t end_vertex,
- int k, bool directedFlag, bool heap_paths,
- General_path_element_t **ksp_path, size_t *path_count,
+
+void do_pgr_ksp(
+ pgr_edge_t *data_edges,
+ size_t total_edges,
+ int64_t start_vid,
+ int64_t end_vid,
+ int k,
+ bool directed,
+ bool heap_paths,
+ General_path_element_t **return_tuples,
+ size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg) {
+ std::ostringstream err;
+ std::ostringstream log;
+ std::ostringstream notice;
try {
- *ksp_path = NULL;
- *path_count = 0;
- std::ostringstream log;
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
+ pgassert(total_edges != 0);
+ log << "buuu";
- graphType gType = directedFlag? DIRECTED: UNDIRECTED;
+ graphType gType = directed? DIRECTED: UNDIRECTED;
std::deque< Path > paths;
- if (directedFlag) {
+ if (directed) {
pgrouting::DirectedGraph digraph(gType);
Pgr_ksp< pgrouting::DirectedGraph > fn_yen;
- digraph.graph_insert_data(data_edges, total_tuples);
- paths = fn_yen.Yen(digraph, start_vertex, end_vertex, k, heap_paths);
+ digraph.insert_edges(data_edges, total_edges);
+ paths = fn_yen.Yen(digraph, start_vid, end_vid, k, heap_paths);
} else {
pgrouting::UndirectedGraph undigraph(gType);
Pgr_ksp< pgrouting::UndirectedGraph > fn_yen;
- undigraph.graph_insert_data(data_edges, total_tuples);
- paths = fn_yen.Yen(undigraph, start_vertex, end_vertex, k, heap_paths);
+ undigraph.insert_edges(data_edges, total_edges);
+ paths = fn_yen.Yen(undigraph, start_vid, end_vid, k, heap_paths);
}
auto count(count_tuples(paths));
- if (count == 0) {
- *err_msg = strdup(
- "NOTICE: No paths found between Starting and Ending vertices");
- return 0;
- }
-
- // get the space required to store all the paths
- *ksp_path = NULL;
- *ksp_path = pgr_alloc(count, (*ksp_path));
-
- size_t sequence = 0;
- int route_id = 0;
- for (const auto &path : paths) {
- if (path.size() > 0)
- path.get_pg_ksp_path(ksp_path, sequence, route_id);
- ++route_id;
+ if (!(count == 0)) {
+ // get the space required to store all the paths
+ *return_tuples = NULL;
+ *return_tuples = pgr_alloc(count, (*return_tuples));
+
+ size_t sequence = 0;
+ int route_id = 0;
+ for (const auto &path : paths) {
+ if (path.size() > 0)
+ path.get_pg_ksp_path(return_tuples, sequence, route_id);
+ ++route_id;
+ }
}
-
- if (count != sequence) {
- *err_msg = NULL;
- return 2;
- }
- *path_count = count;
-
-#if 1
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- return EXIT_SUCCESS;
- } catch ( ... ) {
- *err_msg = strdup("Caught unknown exception!");
- if (ksp_path) free(ksp_path);
- *path_count = 0;
- return -1;
+ *return_count = count;
+
+ pgassert(*err_msg == NULL);
+ *log_msg = log.str().empty()?
+ nullptr :
+ strdup(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ nullptr :
+ strdup(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
+ } catch (std::exception& except) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
+ } catch(...) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
}
}
-
diff --git a/src/ksp/src/ksp_driver.h b/src/ksp/src/ksp_driver.h
index 62dac5e..cfc85ce 100644
--- a/src/ksp/src/ksp_driver.h
+++ b/src/ksp/src/ksp_driver.h
@@ -22,6 +22,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_KSP_SRC_KSP_DRIVER_H_
+#define SRC_KSP_SRC_KSP_DRIVER_H_
+
#pragma once
#include "./../../common/src/pgr_types.h"
@@ -30,13 +33,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
extern "C" {
#endif
- int do_pgr_ksp(pgr_edge_t * edges, size_t total_tuples,
- int64_t start_vertex, int64_t end_vertex,
- int no_paths, bool directed, bool heap_paths,
- General_path_element_t **ksp_path, size_t *path_count,
+ void do_pgr_ksp(
+ pgr_edge_t *data_edges,
+ size_t total_edges,
+ int64_t start_vid,
+ int64_t end_vid,
+ int no_paths,
+ bool directed,
+ bool heap_paths,
+ General_path_element_t **return_tuples,
+ size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg);
#ifdef __cplusplus
}
#endif
+#endif // SRC_KSP_SRC_KSP_DRIVER_H_
diff --git a/src/ksp/src/pgr_ksp.cpp b/src/ksp/src/pgr_ksp.cpp
index ddae481..ed692a9 100644
--- a/src/ksp/src/pgr_ksp.cpp
+++ b/src/ksp/src/pgr_ksp.cpp
@@ -21,17 +21,12 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef unlink
-#undef unlink
-#endif
-#endif
#include <deque>
#include <set>
+
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/basePath_SSEC.hpp"
template < class G >
@@ -44,7 +39,7 @@ void Pgr_ksp< G >::getFirstSolution(G &graph) {
Path path;
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, path, m_start, m_end);
+ path = fn_dijkstra.dijkstra(graph, m_start, m_end);
if (path.empty()) return;
curr_result_path = path;
@@ -55,29 +50,50 @@ template < class G>
std::deque<Path>
Pgr_ksp< G >::Yen(G &graph,
int64_t start_vertex, int64_t end_vertex, int K, bool heap_paths) {
+ /*
+ * No path: already in destination
+ */
+ if ((start_vertex == end_vertex) || (K == 0)) {
+ return std::deque<Path>();
+ }
+ /*
+ * no path: disconnected vertices
+ */
+ if (!graph.has_vertex(start_vertex)
+ || !graph.has_vertex(end_vertex)) {
+ return std::deque<Path>();
+ }
m_ResultSet.clear();
m_Heap.clear();
- if ((start_vertex != end_vertex) && (K > 0)) {
- if (!graph.has_vertex(start_vertex)
- || !graph.has_vertex(end_vertex)) {
- std::deque<Path> l_ResultList;
- return l_ResultList;
- }
- v_source = graph.get_V(start_vertex);
- v_target = graph.get_V(end_vertex);
- m_start = start_vertex;
- m_end = end_vertex;
- executeYen(graph, K);
- }
+ v_source = graph.get_V(start_vertex);
+ v_target = graph.get_V(end_vertex);
+ m_start = start_vertex;
+ m_end = end_vertex;
+ executeYen(graph, K);
while (!m_ResultSet.empty()) {
m_Heap.insert(*m_ResultSet.begin());
m_ResultSet.erase(m_ResultSet.begin());
}
std::deque<Path> l_ResultList(m_Heap.begin(), m_Heap.end());
+
+ std::stable_sort(l_ResultList.begin(), l_ResultList.end(),
+ [](const Path &left, const Path &right) -> bool {
+ for (size_t i = 0 ; i < (std::min)(left.size(), right.size()); ++i) {
+ if (left[i].node < right[i].node) return true;
+ if (left[i].node > right[i].node) return false;
+ }
+ return false;
+ });
+
+ std::stable_sort(l_ResultList.begin(), l_ResultList.end(),
+ [](const Path &left, const Path &right) {
+ return left.size() < right.size();});
+
if (!heap_paths && l_ResultList.size() > (size_t) K)
l_ResultList.resize(K);
+
return l_ResultList;
}
@@ -90,17 +106,16 @@ void Pgr_ksp< G >::removeVertices(G &graph, const Path &subpath) {
template < class G >
void Pgr_ksp< G >::doNextCycle(G &graph) {
- // REG_SIGINT
int64_t spurNodeId;
- Path rootPath;
- Path spurPath;
- for (unsigned int i = 0; i < curr_result_path.size() ; ++i) {
+
+ for (unsigned int i = 0; i < curr_result_path.size(); ++i) {
+
spurNodeId = curr_result_path[i].node;
- rootPath = curr_result_path.getSubpath(i);
+ auto rootPath = curr_result_path.getSubpath(i);
for (const auto &path : m_ResultSet) {
if (path.isEqual(rootPath)) {
@@ -110,14 +125,11 @@ void Pgr_ksp< G >::doNextCycle(G &graph) {
}
}
}
- removeVertices(graph, rootPath);
+ removeVertices(graph, rootPath);
- // THROW_ON_SIGINT
Pgr_dijkstra< G > fn_dijkstra;
- fn_dijkstra.dijkstra(graph, spurPath, spurNodeId, m_end);
- // this->dijkstra(spurPath, spurNodeId , m_end);
- // THROW_ON_SIGINT
+ auto spurPath = fn_dijkstra.dijkstra(graph, spurNodeId, m_end);
if (spurPath.size() > 0) {
rootPath.appendPath(spurPath);
@@ -125,8 +137,6 @@ void Pgr_ksp< G >::doNextCycle(G &graph) {
}
graph.restore_graph();
- rootPath.clear();
- spurPath.clear();
}
}
@@ -137,11 +147,19 @@ void Pgr_ksp< G >::executeYen(G &graph, int K) {
if (m_ResultSet.size() == 0) return; // no path found
- while ( m_ResultSet.size() < (unsigned int) K ) {
+ while (m_ResultSet.size() < (unsigned int) K) {
doNextCycle(graph);
- if ( m_Heap.empty() ) break;
+ if (m_Heap.empty()) break;
curr_result_path = *m_Heap.begin();
m_ResultSet.insert(curr_result_path);
m_Heap.erase(m_Heap.begin());
+ /*
+ * without the next line withpointsKSP hungs with:
+ * c++ 4.6
+ * Debug mode
+ */
+#ifndef NDEBUG
+ log << "end of while heap size" << m_Heap.size();
+#endif
}
}
diff --git a/src/ksp/src/pgr_ksp.hpp b/src/ksp/src/pgr_ksp.hpp
index 2b9effe..88cf202 100644
--- a/src/ksp/src/pgr_ksp.hpp
+++ b/src/ksp/src/pgr_ksp.hpp
@@ -24,19 +24,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef unlink
-#undef unlink
-#endif
-#endif
+#include "./../../dijkstra/src/pgr_dijkstra.hpp"
#include <sstream>
#include <deque>
#include <vector>
#include <set>
-#include "./../../dijkstra/src/pgr_dijkstra.hpp"
+#include <limits>
+
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/basePath_SSEC.hpp"
template < class G >
@@ -49,19 +45,41 @@ class Pgr_ksp {
class compPaths {
public:
bool operator()(const Path &p1, const Path &p2) const {
- if (p1.tot_cost() != p2.tot_cost())
- return (p1.tot_cost() < p2.tot_cost());
-
- // paths costs are equal now we check by length
+ /*
+ * less cost is best
+ */
+ if (p1.tot_cost() > p2.tot_cost())
+ return false;
+ if (p1.tot_cost() < p2.tot_cost())
+ return true;
+
+ pgassert(p1.tot_cost() == p2.tot_cost());
+
+ // paths costs are equal now check by length
+ if (p1.size() > p2.size())
+ return false;
if (p1.size() < p2.size())
- return (p1.size() < p2.size());
+ return true;
- // paths weights & lengths are equal now we check by ID
+ pgassert(p1.tot_cost() == p2.tot_cost());
+ pgassert(p1.size() == p2.size());
+
+ // paths weights & lengths are equal now check by node ID
unsigned int i;
for (i = 0; i < p1.size(); i++) {
- if (p1[i].node != p2[i].node)
- return (p1[i].node < p2[i].node);
+ if (p1[i].node > p2[i].node)
+ return false;
+ if (p1[i].node < p2[i].node)
+ return true;
+ }
+
+ pgassert(p1.tot_cost() == p2.tot_cost());
+ pgassert(p1.size() == p2.size());
+#ifdef NDEBUG
+ for (i = 0; i < p1.size(); i++) {
+ pgassert(p1[i].node == p2[i].node);
}
+#endif
// we got here and everything is equal
return false;
@@ -96,6 +114,8 @@ class Pgr_ksp {
typedef std::set<Path, compPaths> pSet;
pSet m_ResultSet; //!< ordered set of shortest paths
pSet m_Heap; //!< the heap
+
+ std::ostringstream log;
};
#include "./pgr_ksp.cpp"
diff --git a/src/ksp/src/withPoints_ksp.c b/src/ksp/src/withPoints_ksp.c
index 540c62c..12ae5db 100644
--- a/src/ksp/src/withPoints_ksp.c
+++ b/src/ksp/src/withPoints_ksp.c
@@ -27,20 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
#include "./../../common/src/pgr_types.h"
#include "./../../common/src/time_msg.h"
-#include "./../../common/src/postgres_connection.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/points_input.h"
#include "./../../withPoints/src/get_new_queries.h"
@@ -48,6 +40,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./../../common/src/debug_macro.h"
PGDLLEXPORT Datum withPoints_ksp(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(withPoints_ksp);
/*******************************************************************************/
@@ -111,9 +104,12 @@ process(
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
clock_t start_t = clock();
- int errcode = do_pgr_withPointsKsp(
+
+ char *log_msg = NULL;
+ char *notice_msg = NULL;
+ char *err_msg = NULL;
+ do_pgr_withPointsKsp(
edges,
total_edges,
points,
@@ -131,12 +127,18 @@ process(
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
time_msg(" processing withPointsKSP", start_t, clock());
PGR_DBG("Returned message = %s\n", err_msg);
- if (!err_msg) free(err_msg);
+ if (err_msg) {
+ if (*result_tuples) free(*result_tuples);
+ }
+ pgr_global_report(log_msg, notice_msg, err_msg);
pfree(edges);
pfree(edges_of_points);
@@ -144,10 +146,6 @@ process(
pgr_SPI_finish();
- if (errcode) {
- pgr_send_error(errcode);
- }
-
}
/* */
@@ -155,12 +153,8 @@ process(
-PG_FUNCTION_INFO_V1(withPoints_ksp);
-PGDLLEXPORT Datum
-withPoints_ksp(PG_FUNCTION_ARGS) {
+PGDLLEXPORT Datum withPoints_ksp(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/*******************************************************************************/
@@ -192,16 +186,16 @@ withPoints_ksp(PG_FUNCTION_ARGS) {
// details BOOLEAN -- DEFAULT false,
PGR_DBG("Calling process");
- PGR_DBG("initial driving side:%s", pgr_text2char(PG_GETARG_TEXT_P(7)));
+ PGR_DBG("initial driving side:%s", text_to_cstring(PG_GETARG_TEXT_P(7)));
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
PG_GETARG_INT64(2),
PG_GETARG_INT64(3),
PG_GETARG_INT32(4),
PG_GETARG_BOOL(5),
PG_GETARG_BOOL(6),
- pgr_text2char(PG_GETARG_TEXT_P(7)),
+ text_to_cstring(PG_GETARG_TEXT_P(7)),
PG_GETARG_BOOL(8),
&result_tuples,
&result_count);
@@ -209,7 +203,11 @@ withPoints_ksp(PG_FUNCTION_ARGS) {
/* */
/*******************************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
ereport(ERROR,
@@ -222,12 +220,10 @@ withPoints_ksp(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -247,26 +243,23 @@ withPoints_ksp(PG_FUNCTION_ARGS) {
OUT seq INTEGER, OUT path_id INTEGER, OUT path_seq INTEGER,
OUT node BIGINT, OUT edge BIGINT,
OUT cost FLOAT, OUT agg_cost FLOAT)
- */
+ */
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum((int)(result_tuples[call_cntr].start_id + 1));
- values[2] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum((int)(result_tuples[funcctx->call_cntr].start_id + 1));
+ values[2] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
/*******************************************************************************/
tuple =heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/ksp/src/withPoints_ksp_driver.cpp b/src/ksp/src/withPoints_ksp_driver.cpp
index c2e478a..a42d099 100644
--- a/src/ksp/src/withPoints_ksp_driver.cpp
+++ b/src/ksp/src/withPoints_ksp_driver.cpp
@@ -27,19 +27,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#include "./withPoints_ksp_driver.h"
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
#include <sstream>
#include <deque>
#include <vector>
+
#include "./pgr_ksp.hpp"
-#include "./withPoints_ksp_driver.h"
+
#include "./../../withPoints/src/pgr_withPoints.hpp"
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
// CREATE OR REPLACE FUNCTION pgr_withPointsKSP(
@@ -55,8 +54,8 @@ do_pgr_withPointsKsp(
pgr_edge_t *edges, size_t total_edges,
Point_on_edge_t *points_p, size_t total_points,
pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t start_vid,
- int64_t end_vid,
+ int64_t start_pid,
+ int64_t end_pid,
int k,
bool directed,
bool heap_paths,
@@ -64,29 +63,41 @@ do_pgr_withPointsKsp(
bool details,
General_path_element_t **return_tuples,
size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg) {
+
std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
try {
- /*
- * This is the original state
- */
- if (*err_msg) free(err_msg);
- if (*return_tuples) free(return_tuples);
- (*return_count) = 0;
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert(*return_count == 0);
+ pgassert(total_edges != 0);
+
+ log << "entering do_pgr_withPointsKsp\n";
std::vector< Point_on_edge_t >
points(points_p, points_p + total_points);
- int errcode = check_points(points, log);
+ log << "total points" << points.size() << "\n";
+
+ auto errcode = check_points(points, log);
if (errcode) {
- return errcode;
+ *log_msg = strdup(log.str().c_str());
+ err << "Unexpected point(s) with same pid but different edge/fraction/side combination found.";
+ *err_msg = strdup(err.str().c_str());
+ return -1;
}
-
std::vector< pgr_edge_t >
edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
std::vector< pgr_edge_t > new_edges;
+
create_new_edges(
points,
edges_to_modify,
@@ -95,33 +106,51 @@ do_pgr_withPointsKsp(
log);
+
+ int64_t start_vid(start_pid);
+ int64_t end_vid(end_pid);
+
+ log << "start_pid" << start_pid << "\n";
+ log << "end_pid" << end_pid << "\n";
+ log << "driving_side" << driving_side << "\n";
+ log << "start_vid" << start_vid << "\n";
+ log << "end_vid" << end_vid << "\n";
graphType gType = directed? DIRECTED: UNDIRECTED;
std::deque< Path > paths;
+ auto vertices(pgrouting::extract_vertices(edges, total_edges));
+ vertices = pgrouting::extract_vertices(vertices, new_edges);
+
+ log << "extracted vertices: ";
+ for (const auto v : vertices) {
+ log << v.id << ", ";
+ }
+ log << "\n";
+
if (directed) {
log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
+ pgrouting::DirectedGraph digraph(vertices, gType);
+ digraph.insert_edges(edges, total_edges);
+ log << "graph after inserting edges\n";
+ log << digraph << "\n";
+
+ digraph.insert_edges(new_edges);
+ log << "graph after inserting new edges\n";
+ log << digraph << "\n";
+
Pgr_ksp< pgrouting::DirectedGraph > fn_yen;
paths = fn_yen.Yen(digraph, start_vid, end_vid, k, heap_paths);
+ // pgassert(true==false);
} else {
log << "Working with undirected Graph\n";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
+ undigraph.insert_edges(edges, total_edges);
+ undigraph.insert_edges(new_edges);
Pgr_ksp< pgrouting::UndirectedGraph > fn_yen;
paths = fn_yen.Yen(undigraph, start_vid, end_vid, k, heap_paths);
}
-#if 0
- for (auto &path : paths) {
- path.print_path(log);
- adjust_pids(points, path);
- path.print_path(log);
- }
-#endif
if (!details) {
for (auto &path : paths) {
@@ -153,15 +182,26 @@ do_pgr_withPointsKsp(
(*return_count) = sequence;
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
+ *log_msg = strdup(log.str().c_str());
return 0;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
+ } catch (AssertFailedException &except) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
+ } catch (std::exception &except) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
+ } catch(...) {
+ if (*return_tuples) free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = strdup(err.str().c_str());
+ *log_msg = strdup(log.str().c_str());
}
return 1000;
}
diff --git a/src/ksp/src/withPoints_ksp_driver.h b/src/ksp/src/withPoints_ksp_driver.h
index fb09eec..2d95c2a 100644
--- a/src/ksp/src/withPoints_ksp_driver.h
+++ b/src/ksp/src/withPoints_ksp_driver.h
@@ -54,9 +54,12 @@ extern "C" {
General_path_element_t **return_tuples,
size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
char ** err_msg);
+
#ifdef __cplusplus
-}
+ }
#endif
diff --git a/src/ksp/test/doc-ksp-v2.test.sql b/src/ksp/test/doc-ksp-v2.test.sql
index 15beb93..55f8e64 100644
--- a/src/ksp/test/doc-ksp-v2.test.sql
+++ b/src/ksp/test/doc-ksp-v2.test.sql
@@ -1,4 +1,3 @@
-SET client_min_messages TO NOTICE;
\echo --q1
diff --git a/src/ksp/test/doc-ksp.test.sql b/src/ksp/test/doc-ksp.test.sql
index 81d6b79..e68f2c1 100644
--- a/src/ksp/test/doc-ksp.test.sql
+++ b/src/ksp/test/doc-ksp.test.sql
@@ -1,42 +1,41 @@
--------------------------------------------------------------------------------
--- PGR_ksp V3
+-- PGR_KSP V3
--------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
\echo --q1
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2,
true -- takes the (V2.0) signature (has_rcost = true and works on directed graph)
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2,
directed:=true -- takes the new signature
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2
);
\echo --q2
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, heap_paths:=true
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, true, true
);
@@ -44,12 +43,12 @@ SET client_min_messages TO NOTICE;
\echo --q3
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, directed:=false
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
2, 12, 2, false, true
);
@@ -57,23 +56,23 @@ SET client_min_messages TO NOTICE;
\echo --q4
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 3, 2
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, heap_paths:=true
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, true, true
);
@@ -81,12 +80,12 @@ SET client_min_messages TO NOTICE;
\echo --q5
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, directed:=false
);
- SELECT * FROM pgr_ksp(
+ SELECT * FROM pgr_KSP(
'SELECT id, source, target, cost FROM edge_table',
2, 12, 2, directed:=false, heap_paths:=true
);
diff --git a/src/ksp/test/ksp-network.result b/src/ksp/test/ksp-network.result
index d5b5a80..9620cb7 100644
--- a/src/ksp/test/ksp-network.result
+++ b/src/ksp/test/ksp-network.result
@@ -1,184 +1,2 @@
t|t|t
t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
-t|t|t
diff --git a/src/ksp/test/ksp-network.test.sql b/src/ksp/test/ksp-network.test.sql
index c102968..223e7ea 100644
--- a/src/ksp/test/ksp-network.test.sql
+++ b/src/ksp/test/ksp-network.test.sql
@@ -1,5 +1,3 @@
-BEGIN;
-SET client_min_messages TO NOTICE;
--
-- Generate 15 shortest paths between nodes 4 and 5
-- with auto detection
@@ -102,42 +100,17 @@ END $$;
-- TESTS START
-/*
-SELECT seq, path_id, node, edge, round(cost::numeric, 4) from pgr_ksp(
- 'SELECT id, source, target, cost from network order by id',
- 4, 5::BIGINT,
- 15);
-
-SELECT path_id, round(sum(cost)::numeric,4) from pgr_ksp(
- 'SELECT id, source, target, cost from network order by id',
- 4, 5::BIGINT,
- 15) group by path_id order by path_id;
-*/
--- the equality conditions
-SELECT node = network.source, edge = network.id, round(network.cost::numeric,4) = round(result.cost::numeric, 4) from pgr_ksp(
+SELECT DISTINCT node = network.source AS e1, edge = network.id AS e2, round(network.cost::numeric,4) = round(result.cost::numeric, 4) AS e3
+FROM pgr_ksp(
'SELECT id, source, target, cost from network order by id',
4, 5::BIGINT,
- 15) result, network where id = edge order by seq;
-
+ 15) result, network where id = edge order by e1, e2, e3;
---VERSION 2.0
-/*
-SELECT seq, path_id, node, edge, round(cost::numeric, 4), round(agg_cost::numeric,4) from pgr_ksp(
- 'SELECT id, source, target, cost from network order by id',
- 4, 5,
- 15);
-
-SELECT path_id, round(agg_cost::numeric,4) from pgr_ksp(
- 'SELECT id, source, target, cost from network order by id',
- 4, 5,
- 15) WHERE edge = -1;
-*/
--- the equality conditions
-SELECT node = network.source, edge = network.id, round(network.cost::numeric,4) = round(result.cost::numeric, 4) from pgr_ksp(
+SELECT DISTINCT node = network.source AS e1, edge = network.id AS e2, round(network.cost::numeric,4) = round(result.cost::numeric, 4) AS e3
+FROM pgr_ksp(
'SELECT id, source, target, cost from network order by id',
4, 5,
- 15) AS result, network WHERE id = edge ORDER BY seq;
+ 15) result, network where id = edge order by e1, e2, e3;
-ROLLBACK;
diff --git a/src/ksp/test/test.conf b/src/ksp/test/test.conf
index a0541bc..7c69560 100644
--- a/src/ksp/test/test.conf
+++ b/src/ksp/test/test.conf
@@ -5,10 +5,9 @@
'comment' => 'KSP',
'data' => [''],
'tests' => [qw(
- ksp-network
-
- doc-ksp
doc-ksp-v2
+ doc-ksp
+ ksp-network
)],
'documentation' => [qw(
doc-ksp
@@ -16,6 +15,7 @@
)]
},
# 'vpg-vpgis' => {}, # for version specific tests
+ # doc-ksp-v2
# '8-1' => {}, # for pg 8.x and postgis 1.x
# '9.2-2.1' => {}, # for pg 9.2 and postgis 2.1
);
diff --git a/src/label_graph/doc/doc-pgr_labelGraph.queries b/src/label_graph/doc/doc-pgr_labelGraph.queries
index 245a3dc..5162e5f 100644
--- a/src/label_graph/doc/doc-pgr_labelGraph.queries
+++ b/src/label_graph/doc/doc-pgr_labelGraph.queries
@@ -1,8 +1,10 @@
BEGIN;
BEGIN
-SET client_min_messages TO ERROR;
+SET client_min_messages TO NOTICE;
SET
--q1
+SET client_min_messages TO WARNING;
+SET
SELECT pgr_labelGraph('edge_table', 'id', 'source', 'target', 'subgraph');
pgr_labelgraph
----------------
@@ -18,7 +20,5 @@ SELECT subgraph, count(*) FROM edge_table group by subgraph;
(3 rows)
--q2
-SET client_min_messages TO DEBUG;
-SET
ROLLBACK;
ROLLBACK
diff --git a/src/label_graph/doc/pgr_labelGraph.rst b/src/label_graph/doc/pgr_labelGraph.rst
index 721bdc3..2464588 100644
--- a/src/label_graph/doc/pgr_labelGraph.rst
+++ b/src/label_graph/doc/pgr_labelGraph.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
****************************************************************************
pgRouting Manual
@@ -19,9 +19,9 @@ Name
``pgr_labelGraph`` — Locates and labels sub-networks within a network which are not topologically connected.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
Synopsis
@@ -33,9 +33,9 @@ The function returns:
- ``OK`` when a column with provided name has been generated and populated successfully. All connected edges will have unique similar integer values. In case of ``rows_where`` condition, non participating rows will have -1 integer values.
- ``FAIL`` when the processing cannot be finished due to some error. Notice will be thrown accordingly.
- - ``rows_where condition generated 0 rows`` when passed SQL condition has not been fulfilled by any row.
+ - ``rows_where condition generated 0 rows`` when passed SQL condition has not been fulfilled by any row.
-.. index::
+.. index::
single: labelGraph(Complete Signature) - Proposed
.. code-block:: sql
@@ -52,7 +52,7 @@ A network behind any routing query may consist of sub-networks completely isolat
- An island with no bridge connecting to the mainland.
- An edge or mesh of edges failed to connect to other networks because of human negligence during data generation.
- The data is not properly noded.
-- Topology creation failed to succeed.
+- Topology creation failed to succeed.
pgr_labelGraph() will create an integer column (with the name provided by the user) and will assign same integer values to all those edges in the network which are connected topologically. Thus better analysis regarding network structure is possible. In case of ``rows_where`` condition, non participating rows will have -1 integer values.
@@ -66,7 +66,7 @@ Function accepts the following parameters:
:source: ``text`` Source column name generated after ``pgr_createTopology()``. Default is ``source``.
:target: ``text`` Target column name generated after ``pgr_createTopology()``. Default is ``target``.
:subgraph: ``text`` Column name which will hold the integer labels for each sub-graph. Default is ``subgraph``.
-:rows_where: ``text`` The SQL where condition. Default is ``true``, means the processing will be done on the whole table.
+:rows_where: ``text`` The SQL where condition. Default is ``true``, means the processing will be done on the whole table.
diff --git a/src/label_graph/test/CMakeLists.txt b/src/label_graph/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/label_graph/test/doc-pgr_labelGraph.test.sql b/src/label_graph/test/doc-pgr_labelGraph.test.sql
index b539e81..3d8d7af 100644
--- a/src/label_graph/test/doc-pgr_labelGraph.test.sql
+++ b/src/label_graph/test/doc-pgr_labelGraph.test.sql
@@ -1,8 +1,5 @@
-BEGIN;
-SET client_min_messages TO ERROR;
\echo --q1
+SET client_min_messages TO WARNING;
SELECT pgr_labelGraph('edge_table', 'id', 'source', 'target', 'subgraph');
SELECT subgraph, count(*) FROM edge_table group by subgraph;
\echo --q2
-SET client_min_messages TO DEBUG;
-ROLLBACK;
diff --git a/src/label_graph/test/pgrouting_labelgraph.test.sql b/src/label_graph/test/pgrouting_labelgraph.test.sql
index 5160957..76b810d 100644
--- a/src/label_graph/test/pgrouting_labelgraph.test.sql
+++ b/src/label_graph/test/pgrouting_labelgraph.test.sql
@@ -20,8 +20,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-set client_min_messages to warning;
-SET search_path TO public;
drop table if exists "ways";
-- The following should be OK
diff --git a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql b/src/max_flow/doc/doc-pgr_maxFlow.queries
similarity index 72%
copy from src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
copy to src/max_flow/doc/doc-pgr_maxFlow.queries
index f8c5056..7957e35 100644
--- a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
+++ b/src/max_flow/doc/doc-pgr_maxFlow.queries
@@ -1,62 +1,75 @@
---These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
---The edge in the edge table are augmented with road-like categories for capacity values.
-
-BEGIN;
-
-SET client_min_messages TO NOTICE;
-
-\echo -- q1
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, 11
-);
-
-\echo -- q2
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, ARRAY[11, 1, 13]
-);
-
-\echo -- q3
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], 11
-);
-
-\echo -- q4
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
-);
-
-\echo -- q5
-
-ROLLBACK;
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
+-- q1
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, 11
+);
+ pgr_maxflow
+-------------
+ 280
+(1 row)
+
+-- q2
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, ARRAY[11, 1, 13]
+);
+ pgr_maxflow
+-------------
+ 410
+(1 row)
+
+-- q3
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], 11
+);
+ pgr_maxflow
+-------------
+ 280
+(1 row)
+
+-- q4
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
+);
+ pgr_maxflow
+-------------
+ 460
+(1 row)
+
+-- q5
+ROLLBACK;
+ROLLBACK
diff --git a/src/max_flow/doc/maxFlow.rst b/src/max_flow/doc/flow-family.rst
similarity index 74%
rename from src/max_flow/doc/maxFlow.rst
rename to src/max_flow/doc/flow-family.rst
index 2e03328..3286af8 100644
--- a/src/max_flow/doc/maxFlow.rst
+++ b/src/max_flow/doc/flow-family.rst
@@ -9,27 +9,36 @@
.. _maxFlow:
-Maximum Flow
+Flow - Family of functions
===================================
- - :ref:`pgr_maxFlowPushRelabel` - Push and relabel algorithm implementation for maximum flow.
- - :ref:`pgr_maxFlowEdmondsKarp` - Edmonds and Karp algorithm implementation for maximum flow.
- - :ref:`pgr_maxFlowBoykovKolmogorov` - Boykov and Kolmogorov algorithm implementation for maximum flow.
+.. index from here
-The maximum flow through the graph is guaranteed to be the same with all implementations,
-but the actual flow through each edge may vary.
+* :ref:`pgr_maxFlow` - Only the Max flow calculation using Push and Relabel algorithm.
+* :ref:`pgr_maxFlowBoykovKolmogorov` - Boykov and Kolmogorov with details of flow on edges.
+* :ref:`pgr_maxFlowEdmondsKarp` - Edmonds and Karp algorithm with details of flow on edges.
+* :ref:`pgr_maxFlowPushRelabel` - Push and relabel algorithm with details of flow on edges.
+* Applications
+
+ * :ref:`pgr_edgeDisjointPaths` - Calculates edge disjoint paths between two groups of vertices.
+ * :ref:`pgr_maximumCardinalityMatching` - Calculates a maximum cardinality matching in a graph.
+.. index to here
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
.. toctree::
- :hidden:
+ :hidden:
- ./pgr_maxFlowPushRelabel
- ./pgr_maxFlowEdmondsKarp
- ./pgr_maxFlowBoykovKolmogorov
+ pgr_maxFlow
+ pgr_maxFlowBoykovKolmogorov
+ pgr_maxFlowEdmondsKarp
+ pgr_maxFlowPushRelabel
+ pgr_edgeDisjointPaths
+ pgr_maximumCardinalityMatching
Problem definition
@@ -41,6 +50,8 @@ Additionally, the incoming and outgoing flow of a node must be equal except the
Maximum flow algorithms calculate the maximum flow through the graph and the flow of each edge.
+The maximum flow through the graph is guaranteed to be the same with all implementations,
+but the actual flow through each edge may vary.
Given the following query:
pgr_maxFlow :math:`(edges\_sql, source\_vertex, sink\_vertex)`
diff --git a/src/max_flow/doc/maxFlowApplications.rst b/src/max_flow/doc/maxFlowApplications.rst
index 2af0a2f..620b2c5 100644
--- a/src/max_flow/doc/maxFlowApplications.rst
+++ b/src/max_flow/doc/maxFlowApplications.rst
@@ -18,9 +18,9 @@ Applications of Maximum Flow
Maximum flow algorithms provide solutions to other graph problems.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
.. toctree::
diff --git a/src/max_flow/doc/pgr_edgeDisjointPaths.rst b/src/max_flow/doc/pgr_edgeDisjointPaths.rst
index c914dd4..ae9f8ff 100644
--- a/src/max_flow/doc/pgr_edgeDisjointPaths.rst
+++ b/src/max_flow/doc/pgr_edgeDisjointPaths.rst
@@ -18,12 +18,12 @@ Name
``pgr_edgeDisjointPaths`` — Calculates edge disjoint paths between two groups of vertices.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/boykov_kolmogorov_max_flow.html
Boost Graph Inside
diff --git a/src/max_flow/doc/pgr_maxFlowPushRelabel.rst b/src/max_flow/doc/pgr_maxFlow.rst
similarity index 57%
copy from src/max_flow/doc/pgr_maxFlowPushRelabel.rst
copy to src/max_flow/doc/pgr_maxFlow.rst
index b56ff46..327e1cb 100644
--- a/src/max_flow/doc/pgr_maxFlowPushRelabel.rst
+++ b/src/max_flow/doc/pgr_maxFlow.rst
@@ -7,30 +7,25 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
- INSTRUCTIONS
- - if section consists of only one value then use this file as index.rst
- - change [...] (including the square braquets) to appropriate values
- - one file / function, may signatures of the same function go in the same file
+.. _pgr_maxFlow:
-.. _pgr_maxFlowPushRelabel:
-
-pgr_maxFlowPushRelabel Proposed
+pgr_maxFlow Proposed
============================================
Name
----
-``pgr_maxFlowPushRelabel`` — Calculates the maximum flow in a directed graph given a source and a destination.
+``pgr_maxFlow`` — Calculates the maximum flow in a directed graph given source(s) and sink(s).
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
- :target: http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
+.. figure:: images/boost-inside.jpeg
+ :target: http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
Boost Graph Inside
@@ -39,7 +34,6 @@ Synopsis
-------------------------------------------------------------------------------
Calculates the maximum flow in a directed graph from a source node to a sink node.
-Edges must be weighted with non-negative capacities.
Characteristics:
----------------
@@ -47,7 +41,8 @@ Characteristics:
The main characterics are:
- Calculates the flow/residual capacity for each edge. In the output, edges with zero flow are omitted.
- The maximum flow through the graph can be calculated by aggregation on source/sink.
- - Returns nothing if source and sink are the same.
+ - Edges must be weighted with non-negative capacities.
+ - Returns 0 if source and sink are the same.
- Allows multiple sources and sinks.
- Running time: :math:`O( V ^ 3)`
@@ -56,19 +51,18 @@ Signature Summary
.. code-block:: none
- pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertex)
- pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertex)
- pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertices)
- pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
- OR EMPTY SET
+ pgr_maxFlow(edges_sql, source_vertex, sink_vertex)
+ pgr_maxFlow(edges_sql, source_vertices, sink_vertex)
+ pgr_maxFlow(edges_sql, source_vertex, sink_vertices)
+ pgr_maxFlow(edges_sql, source_vertices, sink_vertices)
+ RETURNS BIGINT
Signatures
-----------------------
.. index::
- single: maxFlowPushRelabel(One to One) - Proposed
+ single: maxFlow(One to One) - Proposed
One to One
.....................................................................
@@ -77,19 +71,18 @@ Calculates the maximum flow from one source vertex to one sink vertex in a direc
.. code-block:: none
- pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
- OR EMPTY SET
+ pgr_maxFlow(edges_sql, source_vertex, sink_vertex)
+ RETURNS BIGINT
:Example:
-.. literalinclude:: doc-pgr_maxFlowPushRelabel.queries
+.. literalinclude:: doc-pgr_maxFlow.queries
:start-after: -- q1
:end-before: -- q2
.. index::
- single: maxFlowPushRelabel(One to Many) - Proposed
+ single: maxFlow(One to Many) - Proposed
One to Many
.....................................................................
@@ -98,19 +91,18 @@ Ccalculates the maximum flow from one source vertex to many sink vertices in a d
.. code-block:: none
- pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
- OR EMPTY SET
+ pgr_maxFlow(edges_sql, source_vertex, sink_vertices)
+ RETURNS BIGINT
:Example:
-.. literalinclude:: doc-pgr_maxFlowPushRelabel.queries
+.. literalinclude:: doc-pgr_maxFlow.queries
:start-after: -- q2
:end-before: -- q3
.. index::
- single: maxFlowPushRelabel(Many to One) - Proposed
+ single: maxFlow(Many to One) - Proposed
Many to One
.....................................................................
@@ -119,19 +111,18 @@ Calculates the maximum flow from many source vertices to one sink vertex in a di
.. code-block:: none
- pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
- OR EMPTY SET
+ pgr_maxFlow(edges_sql, source_vertices, sink_vertex)
+ RETURNS BIGINT
:Example:
-.. literalinclude:: doc-pgr_maxFlowPushRelabel.queries
+.. literalinclude:: doc-pgr_maxFlow.queries
:start-after: -- q3
:end-before: -- q4
.. index::
- single: maxFlowPushRelabel(Many to Many) - Proposed
+ single: maxFlow(Many to Many) - Proposed
Many to Many
.....................................................................
@@ -140,13 +131,12 @@ Calculates the maximum flow from many sources to many sinks in a directed graph.
.. code-block:: none
- pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
- OR EMPTY SET
+ pgr_maxFlow(edges_sql, source_vertices, sink_vertices)
+ RETURNS BIGINT
:Example:
-.. literalinclude:: doc-pgr_maxFlowPushRelabel.queries
+.. literalinclude:: doc-pgr_maxFlow.queries
:start-after: -- q4
:end-before: -- q5
@@ -185,25 +175,12 @@ Column Type Description
**sink_vertex** ``BIGINT`` Identifier of the sink vertex(or vertices).
================= ====================== =================================================
-Description of the Return Values
-.....................................................................
-
-===================== ==================== =================================================
-Column Type Description
-===================== ==================== =================================================
-**seq** ``INT`` Sequential value starting from **1**.
-**edge_id** ``BIGINT`` Identifier of the edge in the original query(edges_sql).
-**source** ``BIGINT`` Identifier of the first end point vertex of the edge.
-**target** ``BIGINT`` Identifier of the second end point vertex of the edge.
-**flow** ``BIGINT`` Flow through the edge in the direction (source, target).
-**residual_capacity** ``BIGINT`` Residual capacity of the edge in the direction (source, target).
-===================== ==================== =================================================
See Also
--------
* :ref:`maxFlow`
-* http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
+* http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
* https://en.wikipedia.org/wiki/Push%E2%80%93relabel_maximum_flow_algorithm
.. rubric:: Indices and tables
diff --git a/src/max_flow/doc/pgr_maxFlowBoykovKolmogorov.rst b/src/max_flow/doc/pgr_maxFlowBoykovKolmogorov.rst
index 435d12e..31d1f2b 100644
--- a/src/max_flow/doc/pgr_maxFlowBoykovKolmogorov.rst
+++ b/src/max_flow/doc/pgr_maxFlowBoykovKolmogorov.rst
@@ -25,13 +25,13 @@ Name
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/boykov_kolmogorov_max_flow.html
Boost Graph Inside
@@ -65,7 +65,7 @@ Signature Summary
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertices, sink_vertex)
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertex, sink_vertices)
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
@@ -83,7 +83,7 @@ The available signature calculates the maximum flow from one source vertex to on
.. code-block:: none
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertex, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -125,7 +125,7 @@ The available signature calculates the maximum flow from many source vertices to
.. code-block:: none
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertices, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -146,7 +146,7 @@ The available signature calculates the maximum flow from many sources to many si
.. code-block:: none
pgr_maxFlowBoykovKolmogorov(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
diff --git a/src/max_flow/doc/pgr_maxFlowEdmondsKarp.rst b/src/max_flow/doc/pgr_maxFlowEdmondsKarp.rst
index b7a46aa..7bcf50b 100644
--- a/src/max_flow/doc/pgr_maxFlowEdmondsKarp.rst
+++ b/src/max_flow/doc/pgr_maxFlowEdmondsKarp.rst
@@ -20,12 +20,12 @@ Name
``pgr_maxFlowEdmondsKarp`` — Calculates the maximum flow in a directed graph given a source and a destination. Implemented by Boost Graph Library.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/edmonds_karp_max_flow.html
Boost Graph Inside
@@ -76,7 +76,7 @@ Calculates the maximum flow from one source vertex to one sink vertex on a `dire
.. code-block:: none
pgr_maxFlowEdmondsKarp(edges_sql, source_vertex, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -96,7 +96,7 @@ Calculates the maximum flow from one source vertex to many sink vertices on a `d
.. code-block:: none
pgr_maxFlowEdmondsKarp(edges_sql, source_vertex, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -116,7 +116,7 @@ Calculates the maximum flow from many source vertices to one sink vertex on a `d
.. code-block:: none
pgr_maxFlowEdmondsKarp(edges_sql, source_vertices, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -136,7 +136,7 @@ Calculates the maximum flow from many sources to many sinks on a `directed` grap
.. code-block:: none
pgr_maxFlowEdmondsKarp(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
diff --git a/src/max_flow/doc/pgr_maxFlowPushRelabel.rst b/src/max_flow/doc/pgr_maxFlowPushRelabel.rst
index b56ff46..0516895 100644
--- a/src/max_flow/doc/pgr_maxFlowPushRelabel.rst
+++ b/src/max_flow/doc/pgr_maxFlowPushRelabel.rst
@@ -24,13 +24,13 @@ Name
``pgr_maxFlowPushRelabel`` — Calculates the maximum flow in a directed graph given a source and a destination.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
- :target: http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
+.. figure:: images/boost-inside.jpeg
+ :target: http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
Boost Graph Inside
@@ -60,7 +60,7 @@ Signature Summary
pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertex)
pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertices)
pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
@@ -78,7 +78,7 @@ Calculates the maximum flow from one source vertex to one sink vertex in a direc
.. code-block:: none
pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -99,7 +99,7 @@ Ccalculates the maximum flow from one source vertex to many sink vertices in a d
.. code-block:: none
pgr_maxFlowPushRelabel(edges_sql, source_vertex, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -120,7 +120,7 @@ Calculates the maximum flow from many source vertices to one sink vertex in a di
.. code-block:: none
pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertex)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -141,7 +141,7 @@ Calculates the maximum flow from many sources to many sinks in a directed graph.
.. code-block:: none
pgr_maxFlowPushRelabel(edges_sql, source_vertices, sink_vertices)
- RETURNS SET OF (id, edge_id, source, target, flow, residual_capacity)
+ RETURNS SET OF (seq, edge_id, source, target, flow, residual_capacity)
OR EMPTY SET
:Example:
@@ -203,7 +203,7 @@ See Also
--------
* :ref:`maxFlow`
-* http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
+* http://www.boost.org/libs/graph/doc/push_relabel_max_flow.html
* https://en.wikipedia.org/wiki/Push%E2%80%93relabel_maximum_flow_algorithm
.. rubric:: Indices and tables
diff --git a/src/max_flow/doc/pgr_maximumCardinalityMatching.rst b/src/max_flow/doc/pgr_maximumCardinalityMatching.rst
index 4c86c5d..da642ff 100644
--- a/src/max_flow/doc/pgr_maximumCardinalityMatching.rst
+++ b/src/max_flow/doc/pgr_maximumCardinalityMatching.rst
@@ -19,12 +19,12 @@ Name
``pgr_maximumCardinalityMatching`` — Calculates a maximum cardinality matching in a graph.
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph/doc/maximum_matching.html
Boost Graph Inside
@@ -60,7 +60,7 @@ Signature Summary
pgr_MaximumCardinalityMatching(edges_sql)
pgr_MaximumCardinalityMatching(edges_sql, directed)
- RETURNS SET OF (id, edge_id, source, target)
+ RETURNS SET OF (seq, edge_id, source, target)
OR EMPTY SET
@@ -78,7 +78,7 @@ Minimal signature
.. code-block:: none
pgr_MaximumCardinalityMatching(edges_sql)
- RETURNS SET OF (id, edge_id, source, target) OR EMPTY SET
+ RETURNS SET OF (seq, edge_id, source, target) OR EMPTY SET
The minimal signature calculates one possible maximum cardinality matching on a `directed` graph.
@@ -97,7 +97,7 @@ Complete signature
.. code-block:: none
pgr_MaximumCardinalityMatching(edges_sql, directed)
- RETURNS SET OF (id, edge_id, source, target) OR EMPTY SET
+ RETURNS SET OF (seq, edge_id, source, target) OR EMPTY SET
The complete signature calculates one possible maximum cardinality matching.
@@ -159,7 +159,7 @@ Column Type Description
See Also
--------
-* :ref:`maxFlowApplications`
+* :ref:`maxFlow`
* http://www.boost.org/libs/graph/doc/maximum_matching.html
* https://en.wikipedia.org/wiki/Matching_%28graph_theory%29
* https://en.wikipedia.org/wiki/Ackermann_function
diff --git a/src/max_flow/sql/CMakeLists.txt b/src/max_flow/sql/CMakeLists.txt
index f134c84..c20d006 100644
--- a/src/max_flow/sql/CMakeLists.txt
+++ b/src/max_flow/sql/CMakeLists.txt
@@ -1,6 +1,7 @@
# Append in local scope
LIST(APPEND PACKAGE_SQL_FILES
${CMAKE_CURRENT_SOURCE_DIR}/max_flow.sql
+ ${CMAKE_CURRENT_SOURCE_DIR}/only_flow.sql
${CMAKE_CURRENT_SOURCE_DIR}/maximum_cardinality_matching.sql
${CMAKE_CURRENT_SOURCE_DIR}/edge_disjoint_paths.sql
)
diff --git a/src/max_flow/sql/max_flow.sql b/src/max_flow/sql/max_flow.sql
index b9f9423..3e17829 100644
--- a/src/max_flow/sql/max_flow.sql
+++ b/src/max_flow/sql/max_flow.sql
@@ -35,6 +35,7 @@ CREATE OR REPLACE FUNCTION _pgr_maxflow(
source_vertex BIGINT,
sink_vertex BIGINT,
algorithm TEXT DEFAULT 'push_relabel',
+ only_flow BOOLEAN DEFAULT false,
OUT seq INTEGER,
OUT edge_id BIGINT,
OUT source BIGINT,
@@ -119,6 +120,7 @@ CREATE OR REPLACE FUNCTION _pgr_maxflow(
source_vertex BIGINT,
sink_vertices ANYARRAY,
algorithm TEXT DEFAULT 'push_relabel',
+ only_flow BOOLEAN DEFAULT false,
OUT seq INTEGER,
OUT edge_id BIGINT,
OUT source BIGINT,
@@ -203,6 +205,7 @@ CREATE OR REPLACE FUNCTION _pgr_maxflow(
source_vertices ANYARRAY,
sink_vertex BIGINT,
algorithm TEXT DEFAULT 'push_relabel',
+ only_flow BOOLEAN DEFAULT false,
OUT seq INTEGER,
OUT edge_id BIGINT,
OUT source BIGINT,
@@ -287,6 +290,7 @@ CREATE OR REPLACE FUNCTION _pgr_maxflow(
source_vertices ANYARRAY,
sink_vertices ANYARRAY,
algorithm TEXT DEFAULT 'push_relabel',
+ only_flow BOOLEAN DEFAULT false,
OUT seq INTEGER,
OUT edge_id BIGINT,
OUT source BIGINT,
@@ -359,3 +363,4 @@ CREATE OR REPLACE FUNCTION pgr_maxFlowEdmondsKarp(
END
$BODY$
LANGUAGE plpgsql VOLATILE;
+
diff --git a/src/max_flow/sql/only_flow.sql b/src/max_flow/sql/only_flow.sql
new file mode 100644
index 0000000..c71cdb5
--- /dev/null
+++ b/src/max_flow/sql/only_flow.sql
@@ -0,0 +1,86 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2015 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+/***********************************
+ ONE TO ONE
+***********************************/
+
+CREATE OR REPLACE FUNCTION pgr_maxFlow(
+ edges_sql TEXT,
+ source_vertices BIGINT,
+ sink_vertices BIGINT
+ )
+ RETURNS BIGINT AS
+ $BODY$
+ SELECT coalesce(sum(flow), 0)::BIGINT
+ FROM _pgr_maxflow(_pgr_get_statement($1), $2, $3, algorithm := 'push_relabel', only_flow := true);
+ $BODY$
+ LANGUAGE SQL VOLATILE;
+
+/***********************************
+ ONE TO MANY
+***********************************/
+
+CREATE OR REPLACE FUNCTION pgr_maxFlow(
+ edges_sql TEXT,
+ source_vertices BIGINT,
+ sink_vertices ANYARRAY
+ )
+ RETURNS BIGINT AS
+ $BODY$
+ SELECT flow
+ FROM _pgr_maxflow(_pgr_get_statement($1), $2, $3, algorithm := 'push_relabel', only_flow := true);
+ $BODY$
+ LANGUAGE SQL VOLATILE;
+
+/***********************************
+ MANY TO ONE
+***********************************/
+
+CREATE OR REPLACE FUNCTION pgr_maxFlow(
+ edges_sql TEXT,
+ source_vertices ANYARRAY,
+ sink_vertices BIGINT
+ )
+ RETURNS BIGINT AS
+ $BODY$
+ SELECT flow
+ FROM _pgr_maxflow(_pgr_get_statement($1), $2, $3, algorithm := 'push_relabel', only_flow := true);
+ $BODY$
+ LANGUAGE SQL VOLATILE;
+
+/***********************************
+ MANY TO MANY
+***********************************/
+
+CREATE OR REPLACE FUNCTION pgr_maxFlow(
+ edges_sql TEXT,
+ source_vertices ANYARRAY,
+ sink_vertices ANYARRAY
+ )
+ RETURNS BIGINT AS
+ $BODY$
+ SELECT flow
+ FROM _pgr_maxflow(_pgr_get_statement($1), $2, $3, algorithm := 'push_relabel', only_flow := true);
+ $BODY$
+ LANGUAGE SQL VOLATILE;
diff --git a/src/max_flow/src/CMakeLists.txt b/src/max_flow/src/CMakeLists.txt
index aa26d81..483741b 100644
--- a/src/max_flow/src/CMakeLists.txt
+++ b/src/max_flow/src/CMakeLists.txt
@@ -11,15 +11,7 @@ ADD_LIBRARY(max_flow OBJECT
edge_disjoint_paths_many_to_many.c
edge_disjoint_paths_many_to_one.c
- max_flow_one_to_one_driver.cpp
- max_flow_many_to_many_driver.cpp
- max_flow_one_to_many_driver.cpp
- max_flow_many_to_one_driver.cpp
-
+ max_flow_driver.cpp
maximum_cardinality_matching_driver.cpp
-
- edge_disjoint_paths_one_to_one_driver.cpp
- edge_disjoint_paths_one_to_many_driver.cpp
- edge_disjoint_paths_many_to_many_driver.cpp
- edge_disjoint_paths_many_to_one_driver.cpp
+ edge_disjoint_paths_driver.cpp
)
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_many_driver.cpp b/src/max_flow/src/edge_disjoint_paths_driver.cpp
similarity index 58%
rename from src/max_flow/src/edge_disjoint_paths_many_to_many_driver.cpp
rename to src/max_flow/src/edge_disjoint_paths_driver.cpp
index 172ead6..00f3c4c 100644
--- a/src/max_flow/src/edge_disjoint_paths_many_to_many_driver.cpp
+++ b/src/max_flow/src/edge_disjoint_paths_driver.cpp
@@ -27,29 +27,22 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./pgr_edgedisjointpaths.hpp"
#include <sstream>
#include <vector>
#include <set>
-#include "./pgr_edgedisjointpaths.hpp"
-#include "./edge_disjoint_paths_many_to_many_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
+#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
-}
+
+#include "./edge_disjoint_paths_driver.h"
void
-do_pgr_edge_disjoint_paths_many_to_many(
+do_pgr_edge_disjoint_paths(
pgr_basic_edge_t *data_edges,
- size_t total_tuples,
+ size_t total_edges,
int64_t *source_vertices,
size_t size_source_verticesArr,
int64_t *sink_vertices,
@@ -57,9 +50,12 @@ do_pgr_edge_disjoint_paths_many_to_many(
bool directed,
General_path_element_t **return_tuples,
size_t *return_count,
+ char** log_msg,
+ char** notice_msg,
char **err_msg) {
std::ostringstream log;
-
+ std::ostringstream notice;
+ std::ostringstream err;
try {
std::vector<General_path_element_t> path_elements;
std::set<int64_t> set_source_vertices;
@@ -70,14 +66,17 @@ do_pgr_edge_disjoint_paths_many_to_many(
for (size_t i = 0; i < size_sink_verticesArr; ++i) {
set_sink_vertices.insert(sink_vertices[i]);
}
- PgrEdgeDisjointPathsGraph<FlowGraph> G;
- // I use a directed graph since I'm dependent on directed graphs
+ pgrouting::flow::PgrEdgeDisjointPathsGraph<pgrouting::FlowGraph> G;
- G.create_edge_disjoint_paths_graph(data_edges, total_tuples,
- set_source_vertices,
- set_sink_vertices, directed);
- int64_t flow = G.boykov_kolmogorov();
+ /*
+ * boykov_kolmogorov is only for directed graphs
+ */
+
+ G.create_edge_disjoint_paths_graph(data_edges, total_edges,
+ set_source_vertices,
+ set_sink_vertices, directed);
+ auto flow = G.boykov_kolmogorov();
G.get_edge_disjoint_paths(path_elements, flow);
(*return_tuples) = pgr_alloc(path_elements.size(), (*return_tuples));
@@ -86,21 +85,30 @@ do_pgr_edge_disjoint_paths_many_to_many(
}
*return_count = path_elements.size();
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
+
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
-
-
-
-
-
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_many_driver.h b/src/max_flow/src/edge_disjoint_paths_driver.h
similarity index 84%
rename from src/max_flow/src/edge_disjoint_paths_many_to_many_driver.h
rename to src/max_flow/src/edge_disjoint_paths_driver.h
index 3c86396..f25dfe6 100644
--- a/src/max_flow/src/edge_disjoint_paths_many_to_many_driver.h
+++ b/src/max_flow/src/edge_disjoint_paths_driver.h
@@ -27,8 +27,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_MANY_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_MANY_DRIVER_H_
+#ifndef SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_DRIVER_H_
+#define SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_DRIVER_H_
#include "./../../common/src/pgr_types.h"
@@ -37,7 +37,7 @@ extern "C" {
#endif
void
- do_pgr_edge_disjoint_paths_many_to_many(
+ do_pgr_edge_disjoint_paths(
pgr_basic_edge_t *data_edges,
size_t total_tuples,
int64_t *source_vertices,
@@ -47,11 +47,13 @@ extern "C" {
bool directed,
General_path_element_t **return_tuples,
size_t *return_count,
- char **err_msg);
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
}
#endif
-#endif // SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_MANY_DRIVER_H_
+#endif // SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_DRIVER_H_
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_many.c b/src/max_flow/src/edge_disjoint_paths_many_to_many.c
index 84c60bc..93c01ee 100644
--- a/src/max_flow/src/edge_disjoint_paths_many_to_many.c
+++ b/src/max_flow/src/edge_disjoint_paths_many_to_many.c
@@ -27,102 +27,101 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./edge_disjoint_paths_many_to_many_driver.h"
+#include "./edge_disjoint_paths_driver.h"
PGDLLEXPORT Datum
edge_disjoint_paths_many_to_many(PG_FUNCTION_ARGS);
-/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char *edges_sql,
- int64_t *source_vertices, size_t size_source_verticesArr,
- int64_t *sink_vertices, size_t size_sink_verticesArr,
+ ArrayType *starts,
+ ArrayType *ends,
+
bool directed,
General_path_element_t **result_tuples,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
- pgr_basic_edge_t *edges = NULL;
+ size_t size_source_verticesArr = 0;
+ int64_t* source_vertices =
+ pgr_get_bigIntArray(&size_source_verticesArr, starts);
- size_t total_tuples = 0;
+ size_t size_sink_verticesArr = 0;
+ int64_t* sink_vertices =
+ pgr_get_bigIntArray(&size_sink_verticesArr, ends);
- pgr_get_basic_edges(edges_sql, &edges, &total_tuples);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ pgr_basic_edge_t *edges = NULL;
+ size_t total_edges = 0;
+
+ pgr_get_basic_edges(edges_sql, &edges, &total_edges);
+
+ if (total_edges == 0) {
+ if (source_vertices) pfree(source_vertices);
+ if (sink_vertices) pfree(sink_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- char *err_msg = NULL;
- do_pgr_edge_disjoint_paths_many_to_many(
- edges,
- total_tuples,
- source_vertices,
- size_source_verticesArr,
- sink_vertices,
- size_sink_verticesArr,
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
+ do_pgr_edge_disjoint_paths(
+ edges, total_edges,
+ source_vertices, size_source_verticesArr,
+ sink_vertices, size_sink_verticesArr,
directed,
- result_tuples,
- result_count,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg("processing edge disjoint paths", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ time_msg("pgr_edgeDisjointPaths(many to many)", start_t, clock());
+
+ if (edges) pfree(edges);
+ if (source_vertices) pfree(source_vertices);
+ if (sink_vertices) pfree(sink_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
- free(err_msg);
- pfree(edges);
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
PG_FUNCTION_INFO_V1(edge_disjoint_paths_many_to_many);
PGDLLEXPORT Datum
edge_disjoint_paths_many_to_many(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -132,45 +131,29 @@ edge_disjoint_paths_many_to_many(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
- int64_t *sink_vertices;
- size_t size_sink_verticesArr;
- sink_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_sink_verticesArr,
- PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("sink_verticesArr size %ld ", size_sink_verticesArr);
-
- int64_t *source_vertices;
- size_t size_source_verticesArr;
- source_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_source_verticesArr,
- PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("source_verticesArr size %ld ", size_source_verticesArr);
-
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- source_vertices, size_source_verticesArr,
- sink_vertices, size_sink_verticesArr,
- PG_GETARG_BOOL(3),
- &result_tuples,
- &result_count);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_ARRAYTYPE_P(2),
+ PG_GETARG_BOOL(3),
+ &result_tuples,
+ &result_count);
- free(source_vertices);
- free(sink_vertices);
-
- /* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -178,12 +161,10 @@ edge_disjoint_paths_many_to_many(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -200,22 +181,18 @@ edge_disjoint_paths_many_to_many(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[4] = Int64GetDatum(result_tuples[call_cntr].node);
- values[5] = Int64GetDatum(result_tuples[call_cntr].edge);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[5] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_one.c b/src/max_flow/src/edge_disjoint_paths_many_to_one.c
index a7919ff..bf2b8a6 100644
--- a/src/max_flow/src/edge_disjoint_paths_many_to_one.c
+++ b/src/max_flow/src/edge_disjoint_paths_many_to_one.c
@@ -28,29 +28,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./edge_disjoint_paths_many_to_one_driver.h"
+
+#include "./edge_disjoint_paths_driver.h"
PGDLLEXPORT Datum
edge_disjoint_paths_many_to_one(PG_FUNCTION_ARGS);
@@ -61,68 +49,72 @@ static
void
process(
char *edges_sql,
- int64_t *source_vertices, size_t size_source_verticesArr,
+ ArrayType *starts,
int64_t sink_vertex,
bool directed,
General_path_element_t **result_tuples,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
- pgr_basic_edge_t *edges = NULL;
-
- size_t total_tuples = 0;
+ size_t size_source_verticesArr = 0;
+ int64_t* source_vertices =
+ pgr_get_bigIntArray(&size_source_verticesArr, starts);
- pgr_get_basic_edges(edges_sql, &edges, &total_tuples);
+ pgr_basic_edge_t *edges = NULL;
+ size_t total_edges = 0;
+ pgr_get_basic_edges(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
+ if (source_vertices) pfree(source_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- char *err_msg = NULL;
- do_pgr_edge_disjoint_paths_many_to_one(
- edges,
- total_tuples,
- source_vertices,
- size_source_verticesArr,
- sink_vertex,
- directed,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing edge disjoint paths", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
+ do_pgr_edge_disjoint_paths(
+ edges, total_edges,
+ source_vertices, size_source_verticesArr,
+ &sink_vertex, 1,
+ directed,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ time_msg("pgr_edgeDisjointPaths(many_to_one)", start_t, clock());
+ if (edges) pfree(edges);
+ if (source_vertices) pfree(source_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
PG_FUNCTION_INFO_V1(edge_disjoint_paths_many_to_one);
PGDLLEXPORT Datum
edge_disjoint_paths_many_to_one(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -132,37 +124,29 @@ edge_disjoint_paths_many_to_one(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
-
- int64_t *source_vertices;
- size_t size_source_verticesArr;
- source_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_source_verticesArr,
- PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("source_verticesArr size %ld ", size_source_verticesArr);
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- source_vertices, size_source_verticesArr,
- PG_GETARG_INT64(2),
- PG_GETARG_BOOL(3),
- &result_tuples,
- &result_count);
-
- free(source_vertices);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_INT64(2),
+ PG_GETARG_BOOL(3),
+ &result_tuples,
+ &result_count);
- /* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -170,43 +154,38 @@ edge_disjoint_paths_many_to_one(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
/**********************************************************************/
- /* MODIFY AS NEEDED */
- values = palloc(5 * sizeof(Datum));
- nulls = palloc(5 * sizeof(bool));
+ size_t numb = 5;
+ values = palloc(numb * sizeof(Datum));
+ nulls = palloc(numb * sizeof(bool));
size_t i;
- for (i = 0; i < 5; ++i) {
+ for (i = 0; i < numb; ++i) {
nulls[i] = false;
}
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.cpp b/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.cpp
deleted file mode 100644
index d1d637b..0000000
--- a/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.cpp
+++ /dev/null
@@ -1,103 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_many_to_one_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_edgedisjointpaths.hpp"
-#include "./edge_disjoint_paths_many_to_one_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_edge_disjoint_paths_many_to_one(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t *source_vertices,
- size_t size_source_verticesArr,
- int64_t sink_vertex,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- std::vector<General_path_element_t> path_elements;
- std::set<int64_t> set_source_vertices;
- std::set<int64_t> set_sink_vertices;
- for (size_t i = 0; i < size_source_verticesArr; ++i) {
- set_source_vertices.insert(source_vertices[i]);
- }
- set_sink_vertices.insert(sink_vertex);
- PgrEdgeDisjointPathsGraph<FlowGraph> G;
-
- // I use a directed graph since I'm dependent on directed graphs
-
- G.create_edge_disjoint_paths_graph(data_edges, total_tuples,
- set_source_vertices,
- set_sink_vertices, directed);
- int64_t flow = G.boykov_kolmogorov();
- G.get_edge_disjoint_paths(path_elements, flow);
-
- (*return_tuples) = pgr_alloc(path_elements.size(), (*return_tuples));
- for (size_t i = 0; i < path_elements.size(); ++i) {
- (*return_tuples)[i] = path_elements[i];
- }
- *return_count = path_elements.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.h b/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.h
deleted file mode 100644
index 9c07464..0000000
--- a/src/max_flow/src/edge_disjoint_paths_many_to_one_driver.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_many_to_one_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_ONE_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_ONE_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void
- do_pgr_edge_disjoint_paths_many_to_one(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t *source_vertices,
- size_t size_source_verticesArr,
- int64_t sink_vertex,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_MANY_TO_ONE_DRIVER_H_
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_many.c b/src/max_flow/src/edge_disjoint_paths_one_to_many.c
index f7f89c1..5b9ebed 100644
--- a/src/max_flow/src/edge_disjoint_paths_one_to_many.c
+++ b/src/max_flow/src/edge_disjoint_paths_one_to_many.c
@@ -27,29 +27,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./edge_disjoint_paths_one_to_many_driver.h"
+#include "./edge_disjoint_paths_driver.h"
PGDLLEXPORT Datum
edge_disjoint_paths_one_to_many(PG_FUNCTION_ARGS);
@@ -61,48 +48,62 @@ void
process(
char *edges_sql,
int64_t source_vertex,
- int64_t *sink_vertices, size_t size_sink_verticesArr,
+ ArrayType *ends,
bool directed,
General_path_element_t **result_tuples,
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
- pgr_basic_edge_t *edges = NULL;
+ size_t size_sink_verticesArr = 0;
+ int64_t* sink_vertices =
+ pgr_get_bigIntArray(&size_sink_verticesArr, ends);
- size_t total_tuples = 0;
+ size_t total_tuples = 0;
+ pgr_basic_edge_t *edges = NULL;
pgr_get_basic_edges(edges_sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (sink_vertices) pfree(sink_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
char *err_msg = NULL;
- do_pgr_edge_disjoint_paths_one_to_many(
- edges,
- total_tuples,
- source_vertex,
- sink_vertices,
- size_sink_verticesArr,
+ do_pgr_edge_disjoint_paths(
+
+ edges, total_tuples,
+ &source_vertex, 1,
+ sink_vertices, size_sink_verticesArr,
directed,
- result_tuples,
- result_count,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg("processing edge disjoint paths", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ time_msg("pgr_edgeDisjointPaths(one to many)", start_t, clock());
+
+
+ if (edges) pfree(edges);
+ if (sink_vertices) pfree(sink_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
- free(err_msg);
- pfree(edges);
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
pgr_SPI_finish();
}
/* */
@@ -112,14 +113,12 @@ PG_FUNCTION_INFO_V1(edge_disjoint_paths_one_to_many);
PGDLLEXPORT Datum
edge_disjoint_paths_one_to_many(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
/* MODIFY AS NEEDED */
/* */
- General_path_element_t *result_tuples = 0;
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -133,28 +132,22 @@ edge_disjoint_paths_one_to_many(PG_FUNCTION_ARGS) {
/**********************************************************************/
/* MODIFY AS NEEDED */
- int64_t *sink_vertices;
- size_t size_sink_verticesArr;
- sink_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_sink_verticesArr,
- PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("sink_verticesArr size %ld ", size_sink_verticesArr);
-
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
- sink_vertices, size_sink_verticesArr,
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_BOOL(3),
&result_tuples,
&result_count);
- free(sink_vertices);
-
/* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -169,12 +162,10 @@ edge_disjoint_paths_one_to_many(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -192,20 +183,17 @@ edge_disjoint_paths_one_to_many(PG_FUNCTION_ARGS) {
}
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.cpp b/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.cpp
deleted file mode 100644
index dd15e64..0000000
--- a/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.cpp
+++ /dev/null
@@ -1,104 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_one_to_many_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_edgedisjointpaths.hpp"
-#include "./edge_disjoint_paths_one_to_many_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-
-void
-do_pgr_edge_disjoint_paths_one_to_many(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t *sink_vertices,
- size_t size_sink_verticesArr,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- std::vector<General_path_element_t> path_elements;
- std::set<int64_t> set_source_vertices;
- set_source_vertices.insert(source_vertex);
- std::set<int64_t> set_sink_vertices;
- for (size_t i = 0; i < size_sink_verticesArr; ++i) {
- set_sink_vertices.insert(sink_vertices[i]);
- }
- PgrEdgeDisjointPathsGraph<FlowGraph> G;
-
- // I use a directed graph since I'm dependent on directed graphs
-
- G.create_edge_disjoint_paths_graph(data_edges, total_tuples,
- set_source_vertices,
- set_sink_vertices, directed);
- int64_t flow = G.boykov_kolmogorov();
- G.get_edge_disjoint_paths(path_elements, flow);
-
- (*return_tuples) = pgr_alloc(path_elements.size(), (*return_tuples));
- for (size_t i = 0; i < path_elements.size(); ++i) {
- (*return_tuples)[i] = path_elements[i];
- }
- *return_count = path_elements.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.h b/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.h
deleted file mode 100644
index d17e1c3..0000000
--- a/src/max_flow/src/edge_disjoint_paths_one_to_many_driver.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_one_to_many_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_MANY_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_MANY_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void
- do_pgr_edge_disjoint_paths_one_to_many(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t *sink_vertices,
- size_t size_sink_verticesArr,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_MANY_DRIVER_H_
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_one.c b/src/max_flow/src/edge_disjoint_paths_one_to_one.c
index 9d6687c..c6536e6 100644
--- a/src/max_flow/src/edge_disjoint_paths_one_to_one.c
+++ b/src/max_flow/src/edge_disjoint_paths_one_to_one.c
@@ -27,27 +27,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
+#include "./../../common/src/postgres_connection.h"
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
-#include "./edge_disjoint_paths_one_to_one_driver.h"
+#include "./edge_disjoint_paths_driver.h"
PGDLLEXPORT Datum
edge_disjoint_paths_one_to_one(PG_FUNCTION_ARGS);
@@ -65,48 +52,54 @@ process(
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
- pgr_basic_edge_t *edges = NULL;
if (source_vertex == sink_vertex) {
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
size_t total_tuples = 0;
-
+ pgr_basic_edge_t *edges = NULL;
pgr_get_basic_edges(edges_sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
char *err_msg = NULL;
- do_pgr_edge_disjoint_paths_one_to_one(
- edges,
- total_tuples,
- source_vertex,
- sink_vertex,
+
+ do_pgr_edge_disjoint_paths(
+ edges, total_tuples,
+ &source_vertex, 1,
+ &sink_vertex, 1,
directed,
result_tuples,
result_count,
+
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg("processing edge disjoint paths", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
+ time_msg("pgr_edgeDisjointPaths(one to one)", start_t, clock());
- free(err_msg);
- pfree(edges);
+ if (edges) pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
pgr_SPI_finish();
}
/* */
@@ -116,14 +109,12 @@ PG_FUNCTION_INFO_V1(edge_disjoint_paths_one_to_one);
PGDLLEXPORT Datum
edge_disjoint_paths_one_to_one(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
/* MODIFY AS NEEDED */
/* */
- General_path_element_t *result_tuples = 0;
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -139,24 +130,28 @@ edge_disjoint_paths_one_to_one(PG_FUNCTION_ARGS) {
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- PG_GETARG_INT64(1),
- PG_GETARG_INT64(2),
- PG_GETARG_BOOL(3),
- &result_tuples,
- &result_count);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_INT64(1),
+ PG_GETARG_INT64(2),
+ PG_GETARG_BOOL(3),
+ &result_tuples,
+ &result_count);
/* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -164,12 +159,10 @@ edge_disjoint_paths_one_to_one(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -187,19 +180,16 @@ edge_disjoint_paths_one_to_one(PG_FUNCTION_ARGS) {
}
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].node);
- values[3] = Int64GetDatum(result_tuples[call_cntr].edge);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.cpp b/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.cpp
deleted file mode 100644
index f121616..0000000
--- a/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_one_to_one_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_edgedisjointpaths.hpp"
-#include "./edge_disjoint_paths_one_to_one_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_edge_disjoint_paths_one_to_one(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t sink_vertex,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- std::vector<General_path_element_t> path_elements;
- std::set<int64_t> set_source_vertices;
- set_source_vertices.insert(source_vertex);
- std::set<int64_t> set_sink_vertices;
- set_sink_vertices.insert(sink_vertex);
- PgrEdgeDisjointPathsGraph<FlowGraph> G;
-
- // I use a directed graph since I'm dependent on directed graphs
-
- G.create_edge_disjoint_paths_graph(data_edges, total_tuples,
- set_source_vertices,
- set_sink_vertices, directed);
- int64_t flow = G.boykov_kolmogorov();
- G.get_edge_disjoint_paths(path_elements, flow);
-
- (*return_tuples) = pgr_alloc(path_elements.size(), (*return_tuples));
- for (size_t i = 0; i < path_elements.size(); ++i) {
- (*return_tuples)[i] = path_elements[i];
- }
- *return_count = path_elements.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.h b/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.h
deleted file mode 100644
index 1544995..0000000
--- a/src/max_flow/src/edge_disjoint_paths_one_to_one_driver.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: edge_disjoint_paths_one_to_one_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_ONE_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_ONE_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void
- do_pgr_edge_disjoint_paths_one_to_one(
- pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t sink_vertex,
- bool directed,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_MAX_FLOW_SRC_EDGE_DISJOINT_PATHS_ONE_TO_ONE_DRIVER_H_
diff --git a/src/max_flow/src/max_flow_driver.cpp b/src/max_flow/src/max_flow_driver.cpp
new file mode 100644
index 0000000..add4b2a
--- /dev/null
+++ b/src/max_flow/src/max_flow_driver.cpp
@@ -0,0 +1,152 @@
+/*PGR-GNU*****************************************************************
+File: max_flow_many_to_many_driver.cpp
+
+Generated with Template by:
+Copyright (c) 2015 pgRouting developers
+Mail: project at pgrouting.org
+
+Function's developer:
+Copyright (c) 2016 Andrea Nardelli
+Mail: nrd.nardelli at gmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+#include "./pgr_maxflow.hpp"
+
+#include <sstream>
+#include <vector>
+#include <set>
+
+#include "./max_flow_driver.h"
+
+#include "../../common/src/pgr_assert.h"
+#include "../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_types.h"
+
+
+void
+do_pgr_max_flow(
+ pgr_edge_t *data_edges,
+ size_t total_tuples,
+ int64_t *source_vertices,
+ size_t size_source_verticesArr,
+ int64_t *sink_vertices,
+ size_t size_sink_verticesArr,
+ char *algorithm,
+ bool only_flow,
+ pgr_flow_t **return_tuples,
+ size_t *return_count,
+ char** log_msg,
+ char** notice_msg,
+ char **err_msg) {
+ std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
+
+ try {
+ pgassert(data_edges);
+ pgassert(source_vertices);
+ pgassert(sink_vertices);
+
+ pgrouting::graph::PgrFlowGraph<pgrouting::FlowGraph> G;
+ std::set<int64_t> set_source_vertices;
+ std::set<int64_t> set_sink_vertices;
+ for (size_t i = 0; i < size_source_verticesArr; ++i) {
+ set_source_vertices.insert(source_vertices[i]);
+ }
+ for (size_t i = 0; i < size_sink_verticesArr; ++i) {
+ set_sink_vertices.insert(sink_vertices[i]);
+ }
+ std::set<int64_t> vertices(set_source_vertices);
+ vertices.insert(set_sink_vertices.begin(), set_sink_vertices.end());
+ if (vertices.size()
+ != (set_source_vertices.size() + set_sink_vertices.size())) {
+ *err_msg = pgr_msg("A source found as sink");
+ // TODO(vicky) return as hint the sources that are also sinks
+ return;
+ }
+
+
+
+ G.create_flow_graph(data_edges, total_tuples, set_source_vertices,
+ set_sink_vertices, algorithm);
+
+ int64_t max_flow;
+ if (strcmp(algorithm, "push_relabel") == 0) {
+ max_flow = G.push_relabel();
+ } else if (strcmp(algorithm, "edmonds_karp") == 0) {
+ max_flow = G.edmonds_karp();
+ } else if (strcmp(algorithm, "boykov_kolmogorov") == 0) {
+ max_flow = G.boykov_kolmogorov();
+ } else {
+ log << "Unspecified algorithm!\n";
+ *err_msg = pgr_msg(log.str().c_str());
+ (*return_tuples) = NULL;
+ (*return_count) = 0;
+ return;
+ }
+
+
+ std::vector<pgr_flow_t> flow_edges;
+
+ if (only_flow) {
+ pgr_flow_t edge;
+ edge.edge = -1;
+ edge.source = -1;
+ edge.target = -1;
+ edge.flow = max_flow;
+ edge.residual_capacity = -1;
+ flow_edges.push_back(edge);
+ } else {
+ G.get_flow_edges(flow_edges);
+ }
+ (*return_tuples) = pgr_alloc(flow_edges.size(), (*return_tuples));
+ for (size_t i = 0; i < flow_edges.size(); ++i) {
+ (*return_tuples)[i] = flow_edges[i];
+ }
+ *return_count = flow_edges.size();
+
+
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ }
+}
+
diff --git a/src/max_flow/src/max_flow_many_to_many_driver.h b/src/max_flow/src/max_flow_driver.h
similarity index 84%
rename from src/max_flow/src/max_flow_many_to_many_driver.h
rename to src/max_flow/src/max_flow_driver.h
index 397f74e..7706863 100644
--- a/src/max_flow/src/max_flow_many_to_many_driver.h
+++ b/src/max_flow/src/max_flow_driver.h
@@ -27,8 +27,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#ifndef SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_MANY_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_MANY_DRIVER_H_
+#ifndef SRC_MAX_FLOW_SRC_MAX_FLOW_DRIVER_H_
+#define SRC_MAX_FLOW_SRC_MAX_FLOW_DRIVER_H_
#include "./../../common/src/pgr_types.h"
@@ -37,7 +37,7 @@ extern "C" {
#endif
void
- do_pgr_max_flow_many_to_many(
+ do_pgr_max_flow(
pgr_edge_t *data_edges,
size_t total_tuples,
int64_t* source_vertices,
@@ -45,13 +45,16 @@ extern "C" {
int64_t* sink_vertices,
size_t size_sink_verticesArr,
char* algorithm,
+ bool only_flow,
pgr_flow_t **return_tuples,
size_t *return_count,
- char **err_msg);
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
}
#endif
-#endif // SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_MANY_DRIVER_H_
+#endif // SRC_MAX_FLOW_SRC_MAX_FLOW_DRIVER_H_
diff --git a/src/max_flow/src/max_flow_many_to_many.c b/src/max_flow/src/max_flow_many_to_many.c
index ec73b73..729b2a2 100644
--- a/src/max_flow/src/max_flow_many_to_many.c
+++ b/src/max_flow/src/max_flow_many_to_many.c
@@ -27,109 +27,127 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./max_flow_many_to_many_driver.h"
+#include "./max_flow_driver.h"
PGDLLEXPORT Datum
max_flow_many_to_many(PG_FUNCTION_ARGS);
-/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char *edges_sql,
- int64_t *source_vertices, size_t size_source_verticesArr,
- int64_t *sink_vertices, size_t size_sink_verticesArr,
+ ArrayType *starts,
+ ArrayType *ends,
char *algorithm,
+ bool only_flow,
pgr_flow_t **result_tuples,
size_t *result_count) {
- pgr_SPI_connect();
-
if (!(strcmp(algorithm, "push_relabel") == 0
- || strcmp(algorithm, "edmonds_karp") == 0
- || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
+ || strcmp(algorithm, "edmonds_karp") == 0
+ || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
elog(ERROR, "Unknown algorithm");
}
- PGR_DBG("Load data");
+ pgr_SPI_connect();
+
+ size_t size_source_verticesArr = 0;
+ int64_t* source_vertices =
+ pgr_get_bigIntArray(&size_source_verticesArr, starts);
+
+ size_t size_sink_verticesArr = 0;
+ int64_t* sink_vertices =
+ pgr_get_bigIntArray(&size_sink_verticesArr, ends);
+
pgr_edge_t *edges = NULL;
- size_t total_tuples = 0;
+ size_t total_edges = 0;
/* NOTE:
* For flow, cost and reverse_cost are really capacity and reverse_capacity
*/
- pgr_get_flow_edges(edges_sql, &edges, &total_tuples);
+ pgr_get_flow_edges(edges_sql, &edges, &total_edges);
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
+ if (source_vertices) pfree(source_vertices);
+ if (sink_vertices) pfree(sink_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
char *err_msg = NULL;
- do_pgr_max_flow_many_to_many(
- edges,
- total_tuples,
- source_vertices, size_source_verticesArr,
- sink_vertices, size_sink_verticesArr,
- algorithm,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing max flow", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+
+ do_pgr_max_flow(
+ edges, total_edges,
+ source_vertices, size_source_verticesArr,
+ sink_vertices, size_sink_verticesArr,
+ algorithm,
+ only_flow,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_flow) {
+ time_msg("pgr_maxFlow(many to many)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "push_relabel") == 0) {
+ time_msg("pgr_maxFlowPushRelabel(many to many)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "edmonds_karp") == 0) {
+ time_msg("pgr_maxFlowEdmondsKarp(many to many)",
+ start_t, clock());
+ } else {
+ time_msg("pgr_maxFlowBoykovKolmogorov(many to many)",
+ start_t, clock());
+ }
+
+
+ if (edges) pfree(edges);
+ if (source_vertices) pfree(source_vertices);
+ if (sink_vertices) pfree(sink_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
+
PG_FUNCTION_INFO_V1(max_flow_many_to_many);
PGDLLEXPORT Datum
max_flow_many_to_many(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
pgr_flow_t *result_tuples = 0;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -139,45 +157,31 @@ max_flow_many_to_many(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
- PGR_DBG("Initializing arrays");
- int64_t *source_vertices;
- size_t size_source_verticesArr;
- source_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_source_verticesArr,
- PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("source_verticesArr size %ld ", size_source_verticesArr);
-
- int64_t *sink_vertices;
- size_t size_sink_verticesArr;
- sink_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_sink_verticesArr,
- PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("sink_verticesArr size %ld ", size_sink_verticesArr);
-
- PGR_DBG("Calling process");
- process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- source_vertices, size_source_verticesArr,
- sink_vertices, size_sink_verticesArr,
- pgr_text2char(PG_GETARG_TEXT_P(3)),
- &result_tuples,
- &result_count);
- free(source_vertices);
- free(sink_vertices);
+ process(
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_ARRAYTYPE_P(2),
+ text_to_cstring(PG_GETARG_TEXT_P(3)),
+ PG_GETARG_BOOL(4),
+ &result_tuples,
+ &result_count);
/* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -185,16 +189,15 @@ max_flow_many_to_many(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_flow_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
+ size_t call_cntr = funcctx->call_cntr;
/**********************************************************************/
/* MODIFY AS NEEDED */
@@ -206,7 +209,6 @@ max_flow_many_to_many(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int64GetDatum(result_tuples[call_cntr].edge);
values[2] = Int64GetDatum(result_tuples[call_cntr].source);
@@ -219,9 +221,6 @@ max_flow_many_to_many(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/max_flow_many_to_many_driver.cpp b/src/max_flow/src/max_flow_many_to_many_driver.cpp
deleted file mode 100644
index 1e9ad42..0000000
--- a/src/max_flow/src/max_flow_many_to_many_driver.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_many_to_many_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_maxflow.hpp"
-#include "./max_flow_many_to_many_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_max_flow_many_to_many(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t *source_vertices,
- size_t size_source_verticesArr,
- int64_t *sink_vertices,
- size_t size_sink_verticesArr,
- char *algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- PgrFlowGraph<FlowGraph> G;
- std::set<int64_t> set_source_vertices;
- std::set<int64_t> set_sink_vertices;
- for (size_t i = 0; i < size_source_verticesArr; ++i) {
- set_source_vertices.insert(source_vertices[i]);
- }
- for (size_t i = 0; i < size_sink_verticesArr; ++i) {
- set_sink_vertices.insert(sink_vertices[i]);
- }
-
- G.create_flow_graph(data_edges, total_tuples, set_source_vertices,
- set_sink_vertices, algorithm);
-
- if (strcmp(algorithm, "push_relabel") == 0) {
- G.push_relabel();
- } else if (strcmp(algorithm, "edmonds_karp") == 0) {
- G.edmonds_karp();
- } else if (strcmp(algorithm, "boykov_kolmogorov") == 0) {
- G.boykov_kolmogorov();
- } else {
- log << "Unspecified algorithm!\n";
- *err_msg = strdup(log.str().c_str());
- (*return_tuples) = NULL;
- (*return_count) = 0;
- return;
- }
-
- std::vector<pgr_flow_t> flow_edges;
- G.get_flow_edges(flow_edges);
-
- (*return_tuples) = pgr_alloc(flow_edges.size(), (*return_tuples));
- for (size_t i = 0; i < flow_edges.size(); ++i) {
- (*return_tuples)[i] = flow_edges[i];
- }
- *return_count = flow_edges.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/max_flow_many_to_one.c b/src/max_flow/src/max_flow_many_to_one.c
index 7f02628..ccbef09 100644
--- a/src/max_flow/src/max_flow_many_to_one.c
+++ b/src/max_flow/src/max_flow_many_to_one.c
@@ -27,29 +27,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./max_flow_many_to_one_driver.h"
+#include "./max_flow_driver.h"
PGDLLEXPORT Datum
max_flow_many_to_one(PG_FUNCTION_ARGS);
@@ -60,57 +47,84 @@ static
void
process(
char *edges_sql,
- int64_t *source_vertices, size_t size_source_verticesArr,
+ ArrayType *starts,
int64_t sink_vertex,
char *algorithm,
+ bool only_flow,
pgr_flow_t **result_tuples,
size_t *result_count) {
- pgr_SPI_connect();
-
if (!(strcmp(algorithm, "push_relabel") == 0
|| strcmp(algorithm, "edmonds_karp") == 0
|| strcmp(algorithm, "boykov_kolmogorov") == 0)) {
elog(ERROR, "Unknown algorithm");
}
- PGR_DBG("Load data");
- pgr_edge_t *edges = NULL;
+ pgr_SPI_connect();
- size_t total_tuples = 0;
+ size_t size_source_verticesArr = 0;
+ int64_t* source_vertices =
+ pgr_get_bigIntArray(&size_source_verticesArr, starts);
/* NOTE:
* For flow, cost and reverse_cost are really capacity and reverse_capacity
*/
+ pgr_edge_t *edges = NULL;
+ size_t total_tuples = 0;
pgr_get_flow_edges(edges_sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (source_vertices) pfree(source_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
char *err_msg = NULL;
- do_pgr_max_flow_many_to_one(
- edges,
- total_tuples,
- source_vertices, size_source_verticesArr,
- sink_vertex,
- algorithm,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing max flow", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+ do_pgr_max_flow(
+ edges, total_tuples,
+ source_vertices, size_source_verticesArr,
+ &sink_vertex, 1,
+ algorithm,
+ only_flow,
+
+ result_tuples, result_count,
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_flow) {
+ time_msg("pgr_maxFlow(many to many)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "push_relabel") == 0) {
+ time_msg("pgr_maxFlowPushRelabel(many to one)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "edmonds_karp") == 0) {
+ time_msg("pgr_maxFlowEdmondsKarp(many to one)",
+ start_t, clock());
+ } else {
+ time_msg("pgr_maxFlowBoykovKolmogorov(many to one)",
+ start_t, clock());
+ }
+
+ if (edges) pfree(edges);
+ if (source_vertices) pfree(source_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+
+
pgr_SPI_finish();
}
/* */
@@ -120,16 +134,11 @@ PG_FUNCTION_INFO_V1(max_flow_many_to_one);
PGDLLEXPORT Datum
max_flow_many_to_one(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
pgr_flow_t *result_tuples = 0;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -139,37 +148,30 @@ max_flow_many_to_one(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
-
-
- int64_t *source_vertices;
- size_t size_source_verticesArr;
- source_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_source_verticesArr,
- PG_GETARG_ARRAYTYPE_P(1));
- PGR_DBG("source_verticesArr size %ld ", size_source_verticesArr);
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- source_vertices, size_source_verticesArr,
- PG_GETARG_INT64(2),
- pgr_text2char(PG_GETARG_TEXT_P(3)),
- &result_tuples,
- &result_count);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_INT64(2),
+ text_to_cstring(PG_GETARG_TEXT_P(3)),
+ PG_GETARG_BOOL(4),
+ &result_tuples,
+ &result_count);
- free(source_vertices);
- /* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -177,19 +179,17 @@ max_flow_many_to_one(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_flow_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
+ size_t call_cntr = funcctx->call_cntr;
/**********************************************************************/
- /* MODIFY AS NEEDED */
values = palloc(6 * sizeof(Datum));
nulls = palloc(6 * sizeof(bool));
@@ -198,7 +198,6 @@ max_flow_many_to_one(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int64GetDatum(result_tuples[call_cntr].edge);
values[2] = Int64GetDatum(result_tuples[call_cntr].source);
@@ -211,9 +210,6 @@ max_flow_many_to_one(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/max_flow_many_to_one_driver.cpp b/src/max_flow/src/max_flow_many_to_one_driver.cpp
deleted file mode 100644
index ec81d36..0000000
--- a/src/max_flow/src/max_flow_many_to_one_driver.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_many_to_one_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_maxflow.hpp"
-#include "./max_flow_many_to_one_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_max_flow_many_to_one(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t *source_vertices,
- size_t size_source_verticesArr,
- int64_t sink_vertex,
- char *algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- PgrFlowGraph<FlowGraph> G;
- std::set<int64_t> set_source_vertices;
- std::set<int64_t> set_sink_vertices;
- for (size_t i = 0; i < size_source_verticesArr; ++i) {
- set_source_vertices.insert(source_vertices[i]);
- }
- set_sink_vertices.insert(sink_vertex);
-
- G.create_flow_graph(data_edges,
- total_tuples,
- set_source_vertices,
- set_sink_vertices,
- algorithm);
-
- if (strcmp(algorithm, "push_relabel") == 0) {
- G.push_relabel();
- } else if (strcmp(algorithm, "edmonds_karp") == 0) {
- G.edmonds_karp();
- } else if (strcmp(algorithm, "boykov_kolmogorov") == 0) {
- G.boykov_kolmogorov();
- } else {
- log << "Unspecified algorithm!\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- std::vector<pgr_flow_t> flow_edges;
- G.get_flow_edges(flow_edges);
-
- (*return_tuples) = pgr_alloc(flow_edges.size(), (*return_tuples));
- for (size_t i = 0; i < flow_edges.size(); ++i) {
- (*return_tuples)[i] = flow_edges[i];
- }
- *return_count = flow_edges.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/max_flow_many_to_one_driver.h b/src/max_flow/src/max_flow_many_to_one_driver.h
deleted file mode 100644
index 116fa2b..0000000
--- a/src/max_flow/src/max_flow_many_to_one_driver.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_many_to_one_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_ONE_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_ONE_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void
- do_pgr_max_flow_many_to_one(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t* source_vertices,
- size_t size_source_verticesArr,
- int64_t sink_vertex,
- char* algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_MAX_FLOW_SRC_MAX_FLOW_MANY_TO_ONE_DRIVER_H_
diff --git a/src/max_flow/src/max_flow_one_to_many.c b/src/max_flow/src/max_flow_one_to_many.c
index 1e8cadf..e74bb33 100644
--- a/src/max_flow/src/max_flow_one_to_many.c
+++ b/src/max_flow/src/max_flow_one_to_many.c
@@ -27,109 +27,119 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-// #define DEBUG
-
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
-#include "./max_flow_one_to_many_driver.h"
+#include "./max_flow_driver.h"
PGDLLEXPORT Datum
max_flow_one_to_many(PG_FUNCTION_ARGS);
/******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
- char *edges_sql,
- int64_t source_vertex,
- int64_t *sink_vertices, size_t size_sink_verticesArr,
- char *algorithm,
- pgr_flow_t **result_tuples,
- size_t *result_count) {
- pgr_SPI_connect();
-
+ char *edges_sql,
+ int64_t source_vertex,
+ ArrayType *ends,
+ char *algorithm,
+ bool only_flow,
+ pgr_flow_t **result_tuples,
+ size_t *result_count) {
if (!(strcmp(algorithm, "push_relabel") == 0
- || strcmp(algorithm, "edmonds_karp") == 0
- || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
+ || strcmp(algorithm, "edmonds_karp") == 0
+ || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
elog(ERROR, "Unknown algorithm");
}
- PGR_DBG("Load data");
- pgr_edge_t *edges = NULL;
+ pgr_SPI_connect();
+
+ size_t size_sink_verticesArr = 0;
+ int64_t* sink_vertices =
+ pgr_get_bigIntArray(&size_sink_verticesArr, ends);
+
- size_t total_tuples = 0;
/* NOTE:
* For flow, cost and reverse_cost are really capacity and reverse_capacity
*/
+ size_t total_tuples = 0;
+ pgr_edge_t *edges = NULL;
pgr_get_flow_edges(edges_sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (sink_vertices) pfree(sink_vertices);
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
PGR_DBG("Starting processing");
clock_t start_t = clock();
- char *err_msg = NULL;
- do_pgr_max_flow_one_to_many(
- edges,
- total_tuples,
- source_vertex,
- sink_vertices, size_sink_verticesArr,
- algorithm,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing max flow", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
+ do_pgr_max_flow(
+ edges, total_tuples,
+ &source_vertex, 1,
+ sink_vertices, size_sink_verticesArr,
+ algorithm,
+ only_flow,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_flow) {
+ time_msg("pgr_maxFlow(many to many)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "push_relabel") == 0) {
+ time_msg("pgr_maxFlowPushRelabel(one to many)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "edmonds_karp") == 0) {
+ time_msg("pgr_maxFlowEdmondsKarp(one to many)",
+ start_t, clock());
+ } else {
+ time_msg("pgr_maxFlowBoykovKolmogorov(one to many)",
+ start_t, clock());
+ }
+
+
+ if (edges) pfree(edges);
+ if (sink_vertices) pfree(sink_vertices);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
PG_FUNCTION_INFO_V1(max_flow_one_to_many);
PGDLLEXPORT Datum
max_flow_one_to_many(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
pgr_flow_t *result_tuples = 0;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -139,37 +149,30 @@ max_flow_one_to_many(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
-
- int64_t *sink_vertices;
- size_t size_sink_verticesArr;
- sink_vertices = (int64_t *)
- pgr_get_bigIntArray(&size_sink_verticesArr,
- PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("sink_verticesArr size %ld ", size_sink_verticesArr);
-
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- PG_GETARG_INT64(1),
- sink_vertices, size_sink_verticesArr,
- pgr_text2char(PG_GETARG_TEXT_P(3)),
- &result_tuples,
- &result_count);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_INT64(1),
+ PG_GETARG_ARRAYTYPE_P(2),
+ text_to_cstring(PG_GETARG_TEXT_P(3)),
+ PG_GETARG_BOOL(4),
+ &result_tuples,
+ &result_count);
- free(sink_vertices);
- /* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -177,19 +180,18 @@ max_flow_one_to_many(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_flow_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
+ size_t call_cntr = funcctx->call_cntr;
/**********************************************************************/
- /* MODIFY AS NEEDED */
+
values = palloc(6 * sizeof(Datum));
nulls = palloc(6 * sizeof(bool));
@@ -198,22 +200,19 @@ max_flow_one_to_many(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int64GetDatum(result_tuples[call_cntr].edge);
values[2] = Int64GetDatum(result_tuples[call_cntr].source);
values[3] = Int64GetDatum(result_tuples[call_cntr].target);
values[4] = Int64GetDatum(result_tuples[call_cntr].flow);
values[5] = Int64GetDatum(result_tuples[call_cntr].residual_capacity);
+
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/max_flow_one_to_many_driver.cpp b/src/max_flow/src/max_flow_one_to_many_driver.cpp
deleted file mode 100644
index ce2f2a9..0000000
--- a/src/max_flow/src/max_flow_one_to_many_driver.cpp
+++ /dev/null
@@ -1,117 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_one_to_many_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_maxflow.hpp"
-#include "./max_flow_one_to_many_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_max_flow_one_to_many(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t *sink_vertices,
- size_t size_sink_verticesArr,
- char *algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- PgrFlowGraph<FlowGraph> G;
- std::set<int64_t> set_source_vertices;
- std::set<int64_t> set_sink_vertices;
- set_source_vertices.insert(source_vertex);
- for (size_t i = 0; i < size_sink_verticesArr; ++i) {
- set_sink_vertices.insert(sink_vertices[i]);
- }
-
- G.create_flow_graph(data_edges,
- total_tuples,
- set_source_vertices,
- set_sink_vertices,
- algorithm);
-
- if (strcmp(algorithm, "push_relabel") == 0) {
- G.push_relabel();
- } else if (strcmp(algorithm, "edmonds_karp") == 0) {
- G.edmonds_karp();
- } else if (strcmp(algorithm, "boykov_kolmogorov") == 0) {
- G.boykov_kolmogorov();
- } else {
- log << "Unspecified algorithm!\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- std::vector<pgr_flow_t> flow_edges;
- G.get_flow_edges(flow_edges);
-
- (*return_tuples) = pgr_alloc(flow_edges.size(), (*return_tuples));
- for (size_t i = 0; i < flow_edges.size(); ++i) {
- (*return_tuples)[i] = flow_edges[i];
- }
- *return_count = flow_edges.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/max_flow_one_to_many_driver.h b/src/max_flow/src/max_flow_one_to_many_driver.h
deleted file mode 100644
index 415700d..0000000
--- a/src/max_flow/src/max_flow_one_to_many_driver.h
+++ /dev/null
@@ -1,56 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_one_to_many_driver.h
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_MANY_DRIVER_H_
-#define SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_MANY_DRIVER_H_
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- void
- do_pgr_max_flow_one_to_many(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t* sink_vertices,
- size_t size_sink_verticesArr,
- char* algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg);
-
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_MAX_FLOW_SRC_MAX_FLOW_ONE_TO_MANY_DRIVER_H_
diff --git a/src/max_flow/src/max_flow_one_to_one.c b/src/max_flow/src/max_flow_one_to_one.c
index 6356331..427cc00 100644
--- a/src/max_flow/src/max_flow_one_to_one.c
+++ b/src/max_flow/src/max_flow_one_to_one.c
@@ -27,27 +27,14 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
+#include "./../../common/src/postgres_connection.h"
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
-#include "./max_flow_one_to_one_driver.h"
+#include "./max_flow_driver.h"
PGDLLEXPORT Datum
max_flow_one_to_one(PG_FUNCTION_ARGS);
@@ -57,65 +44,86 @@ max_flow_one_to_one(PG_FUNCTION_ARGS);
static
void
process(
- char *edges_sql,
- int64_t source_vertex,
- int64_t sink_vertex,
- char *algorithm,
- pgr_flow_t **result_tuples,
- size_t *result_count) {
- pgr_SPI_connect();
-
+ char *edges_sql,
+ int64_t source_vertex,
+ int64_t sink_vertex,
+ char *algorithm,
+ bool only_flow,
+ pgr_flow_t **result_tuples,
+ size_t *result_count) {
if (!(strcmp(algorithm, "push_relabel") == 0
- || strcmp(algorithm, "edmonds_karp") == 0
- || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
+ || strcmp(algorithm, "edmonds_karp") == 0
+ || strcmp(algorithm, "boykov_kolmogorov") == 0)) {
elog(ERROR, "Unknown algorithm");
}
- PGR_DBG("Load data");
- pgr_edge_t *edges = NULL;
-
if (source_vertex == sink_vertex) {
- (*result_count) = 0;
- (*result_tuples) = NULL;
- pgr_SPI_finish();
return;
}
- size_t total_tuples = 0;
+ pgr_SPI_connect();
/* NOTE:
* For flow, cost and reverse_cost are really capacity and reverse_capacity
*/
+ size_t total_tuples = 0;
+ pgr_edge_t *edges = NULL;
pgr_get_flow_edges(edges_sql, &edges, &total_tuples);
if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- char *err_msg = NULL;
- do_pgr_max_flow_one_to_one(
- edges,
- total_tuples,
- source_vertex,
- sink_vertex,
- algorithm,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing max flow", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
+ do_pgr_max_flow(
+ edges,
+ total_tuples,
+ &source_vertex, 1,
+ &sink_vertex, 1,
+ algorithm,
+ only_flow,
+
+ result_tuples, result_count,
+
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ if (only_flow) {
+ time_msg("pgr_maxFlow(one to one)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "push_relabel") == 0) {
+ time_msg("pgr_maxFlowPushRelabel(one to one)",
+ start_t, clock());
+ } else if (strcmp(algorithm, "edmonds_karp") == 0) {
+ time_msg("pgr_maxFlowEdmondsKarp(one to one)",
+ start_t, clock());
+ } else {
+ time_msg("pgr_maxFlowBoykovKolmogorov(one to one)",
+ start_t, clock());
+ }
+
+
+ if (edges) pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+
pgr_SPI_finish();
}
/* */
@@ -125,16 +133,11 @@ PG_FUNCTION_INFO_V1(max_flow_one_to_one);
PGDLLEXPORT Datum
max_flow_one_to_one(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
pgr_flow_t *result_tuples = 0;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -144,28 +147,30 @@ max_flow_one_to_one(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
- PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- PG_GETARG_INT64(1),
- PG_GETARG_INT64(2),
- pgr_text2char(PG_GETARG_TEXT_P(3)),
- &result_tuples,
- &result_count);
-
- /* */
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_INT64(1),
+ PG_GETARG_INT64(2),
+ text_to_cstring(PG_GETARG_TEXT_P(3)),
+ PG_GETARG_BOOL(4),
+ &result_tuples,
+ &result_count);
+
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -173,19 +178,17 @@ max_flow_one_to_one(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_flow_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
+ size_t call_cntr = funcctx->call_cntr;
/**********************************************************************/
- /* MODIFY AS NEEDED */
values = palloc(6 * sizeof(Datum));
nulls = palloc(6 * sizeof(bool));
@@ -195,7 +198,6 @@ max_flow_one_to_one(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
values[0] = Int32GetDatum(call_cntr + 1);
values[1] = Int64GetDatum(result_tuples[call_cntr].edge);
values[2] = Int64GetDatum(result_tuples[call_cntr].source);
@@ -208,9 +210,6 @@ max_flow_one_to_one(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/max_flow_one_to_one_driver.cpp b/src/max_flow/src/max_flow_one_to_one_driver.cpp
deleted file mode 100644
index 9140e5c..0000000
--- a/src/max_flow/src/max_flow_one_to_one_driver.cpp
+++ /dev/null
@@ -1,114 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: max_flow_one_to_one_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2016 Andrea Nardelli
-Mail: nrd.nardelli at gmail.com
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <vector>
-#include <set>
-
-#include "./pgr_maxflow.hpp"
-#include "./max_flow_one_to_one_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-
-// #define DEBUG
-extern "C" {
-#include "./../../common/src/pgr_types.h"
-}
-
-void
-do_pgr_max_flow_one_to_one(
- pgr_edge_t *data_edges,
- size_t total_tuples,
- int64_t source_vertex,
- int64_t sink_vertex,
- char *algorithm,
- pgr_flow_t **return_tuples,
- size_t *return_count,
- char **err_msg) {
- std::ostringstream log;
-
- try {
- PgrFlowGraph<FlowGraph> G;
- std::set<int64_t> set_source_vertices;
- set_source_vertices.insert(source_vertex);
- std::set<int64_t> set_sink_vertices;
- set_sink_vertices.insert(sink_vertex);
-
- G.create_flow_graph(data_edges,
- total_tuples,
- set_source_vertices,
- set_sink_vertices,
- algorithm);
-
- if (strcmp(algorithm, "push_relabel") == 0) {
- G.push_relabel();
- } else if (strcmp(algorithm, "edmonds_karp") == 0) {
- G.edmonds_karp();
- } else if (strcmp(algorithm, "boykov_kolmogorov") == 0) {
- G.boykov_kolmogorov();
- } else {
- log << "Unspecified algorithm!\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(log.str().c_str());
- return;
- }
-
- std::vector<pgr_flow_t> flow_edges;
- G.get_flow_edges(flow_edges);
-
- (*return_tuples) = pgr_alloc(flow_edges.size(), (*return_tuples));
- for (size_t i = 0; i < flow_edges.size(); ++i) {
- (*return_tuples)[i] = flow_edges[i];
- }
- *return_count = flow_edges.size();
-
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
- }
-}
-
-
-
-
-
diff --git a/src/max_flow/src/maximum_cardinality_matching.c b/src/max_flow/src/maximum_cardinality_matching.c
index 5290ff3..5125abc 100644
--- a/src/max_flow/src/maximum_cardinality_matching.c
+++ b/src/max_flow/src/maximum_cardinality_matching.c
@@ -27,25 +27,12 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-/*
- * Uncomment when needed
- */
-
-// #define DEBUG
+#include "./../../common/src/postgres_connection.h"
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./maximum_cardinality_matching_driver.h"
@@ -64,58 +51,60 @@ process(
size_t *result_count) {
pgr_SPI_connect();
- PGR_DBG("Load data");
pgr_basic_edge_t *edges = NULL;
+ size_t total_edges = 0;
+ pgr_get_basic_edges(edges_sql, &edges, &total_edges);
- size_t total_tuples = 0;
-
- pgr_get_basic_edges(edges_sql, &edges, &total_tuples);
-
- if (total_tuples == 0) {
- PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
+ if (total_edges == 0) {
pgr_SPI_finish();
return;
}
- PGR_DBG("Total %ld tuples in query:", total_tuples);
- PGR_DBG("Starting processing");
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
char *err_msg = NULL;
+
do_pgr_maximum_cardinality_matching(
- edges,
- directed,
- total_tuples,
- result_tuples,
- result_count,
- &err_msg);
-
- time_msg("processing max flow", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
-
- free(err_msg);
- pfree(edges);
+ edges, total_edges,
+ directed,
+ result_tuples,
+ result_count,
+
+ &log_msg,
+ ¬ice_msg,
+ &err_msg);
+
+ time_msg("pgr_maximumCardinalityMatching()", start_t, clock());
+
+ if (edges) pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+
+
pgr_SPI_finish();
}
-/* */
-/******************************************************************************/
PG_FUNCTION_INFO_V1(maximum_cardinality_matching);
PGDLLEXPORT Datum
maximum_cardinality_matching(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- pgr_basic_edge_t *result_tuples = 0;
+ pgr_basic_edge_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
/**************************************************************************/
if (SRF_IS_FIRSTCALL()) {
@@ -125,25 +114,27 @@ maximum_cardinality_matching(PG_FUNCTION_ARGS) {
/**********************************************************************/
- /* MODIFY AS NEEDED */
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- PG_GETARG_BOOL(1),
- &result_tuples,
- &result_count);
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ PG_GETARG_BOOL(1),
+ &result_tuples,
+ &result_count);
- /* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
- != TYPEFUNC_COMPOSITE) {
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
+ errmsg("function returning record called in context "
+ "that cannot accept type record")));
}
funcctx->tuple_desc = tuple_desc;
@@ -151,19 +142,16 @@ maximum_cardinality_matching(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (pgr_basic_edge_t *) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool *nulls;
/**********************************************************************/
- /* MODIFY AS NEEDED */
values = palloc(4 * sizeof(Datum));
nulls = palloc(4 * sizeof(bool));
@@ -174,20 +162,17 @@ maximum_cardinality_matching(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(result_tuples[call_cntr].edge_id);
- values[2] = Int64GetDatum(result_tuples[call_cntr].source);
- values[3] = Int64GetDatum(result_tuples[call_cntr].target);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge_id);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].source);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].target);
+
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/max_flow/src/maximum_cardinality_matching_driver.cpp b/src/max_flow/src/maximum_cardinality_matching_driver.cpp
index 9dc41f4..d4cb75e 100644
--- a/src/max_flow/src/maximum_cardinality_matching_driver.cpp
+++ b/src/max_flow/src/maximum_cardinality_matching_driver.cpp
@@ -27,45 +27,47 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./maximum_cardinality_matching_driver.h"
#include <sstream>
#include <vector>
#include "./pgr_maximumcardinalitymatching.hpp"
-#include "./maximum_cardinality_matching_driver.h"
-#include "../../common/src/pgr_alloc.hpp"
-// #define DEBUG
-extern "C" {
+#include "./../../common/src/pgr_alloc.hpp"
+#include "../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
-}
+
void
do_pgr_maximum_cardinality_matching(
pgr_basic_edge_t *data_edges,
- bool directed,
size_t total_tuples,
+ bool directed,
+
pgr_basic_edge_t **return_tuples,
size_t *return_count,
+
+ char** log_msg,
+ char** notice_msg,
char **err_msg) {
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
std::vector<pgr_basic_edge_t> matched_vertices;
if (directed) {
- PgrCardinalityGraph<BasicDirectedGraph> G;
+ pgrouting::flow::PgrCardinalityGraph<
+ pgrouting::BasicDirectedGraph> G;
G.create_max_cardinality_graph(data_edges, total_tuples);
std::vector<int64_t> mate_map(boost::num_vertices(G.boost_graph));
G.maximum_cardinality_matching(mate_map);
G.get_matched_vertices(matched_vertices, mate_map);
} else {
- PgrCardinalityGraph<BasicUndirectedGraph> G;
+ pgrouting::flow::PgrCardinalityGraph<
+ pgrouting::BasicUndirectedGraph> G;
G.create_max_cardinality_graph(data_edges, total_tuples);
std::vector<int64_t> mate_map(boost::num_vertices(G.boost_graph));
G.maximum_cardinality_matching(mate_map);
@@ -78,21 +80,30 @@ do_pgr_maximum_cardinality_matching(
}
*return_count = matched_vertices.size();
-#ifndef DEBUG
- *err_msg = strdup("OK");
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
-
- return;
- } catch (...) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return;
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
+ } catch (AssertFailedException &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch(...) {
+ (*return_tuples) = pgr_free(*return_tuples);
+ (*return_count) = 0;
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
-
-
-
-
diff --git a/src/max_flow/src/maximum_cardinality_matching_driver.h b/src/max_flow/src/maximum_cardinality_matching_driver.h
index 958019d..a02fb74 100644
--- a/src/max_flow/src/maximum_cardinality_matching_driver.h
+++ b/src/max_flow/src/maximum_cardinality_matching_driver.h
@@ -39,10 +39,14 @@ extern "C" {
void
do_pgr_maximum_cardinality_matching(
pgr_basic_edge_t *data_edges,
+ size_t total_edges,
bool directed,
- size_t total_tuples,
+
pgr_basic_edge_t **return_tuples,
size_t *return_count,
+
+ char** log_msg,
+ char** notice_msg,
char **err_msg);
diff --git a/src/max_flow/src/pgr_edgedisjointpaths.hpp b/src/max_flow/src/pgr_edgedisjointpaths.hpp
index a3a8d73..c00b314 100644
--- a/src/max_flow/src/pgr_edgedisjointpaths.hpp
+++ b/src/max_flow/src/pgr_edgedisjointpaths.hpp
@@ -24,34 +24,26 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_MAX_FLOW_SRC_PGR_EDGEDISJOINTPATHS_HPP_
+#define SRC_MAX_FLOW_SRC_PGR_EDGEDISJOINTPATHS_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#ifdef unlink
-#undef unlink
-#endif
-#endif
-
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/assert.hpp>
-#if 0
-#include "./../../common/src/signalhandler.h"
-#endif
-#include "./../../common/src/pgr_types.h"
#include <map>
#include <utility>
#include <vector>
#include <set>
+#include <limits>
+#include "./../../common/src/pgr_types.h"
#include "pgr_maxflow.hpp"
-// user's functions
-// for development
+namespace pgrouting {
+namespace flow {
template<class G>
class PgrEdgeDisjointPathsGraph {
@@ -98,10 +90,10 @@ class PgrEdgeDisjointPathsGraph {
}
void create_edge_disjoint_paths_graph(pgr_basic_edge_t *data_edges,
- size_t total_tuples,
- const std::set<int64_t> &source_vertices,
- const std::set<int64_t> &sink_vertices,
- bool directed) {
+ size_t total_tuples,
+ const std::set<int64_t> &source_vertices,
+ const std::set<int64_t> &sink_vertices,
+ bool directed) {
std::set<int64_t> vertices;
for (int64_t source : source_vertices) {
vertices.insert(source);
@@ -128,7 +120,7 @@ class PgrEdgeDisjointPathsGraph {
boost::add_edge(supersource, source, boost_graph);
boost::tie(e_rev, added) =
boost::add_edge(source, supersource, boost_graph);
- capacity[e] = 999999999;
+ capacity[e] = (std::numeric_limits<int32_t>::max)();
capacity[e_rev] = 0;
rev[e] = e_rev;
rev[e_rev] = e;
@@ -142,7 +134,7 @@ class PgrEdgeDisjointPathsGraph {
boost::add_edge(sink, supersink, boost_graph);
boost::tie(e1_rev, added) =
boost::add_edge(supersink, sink, boost_graph);
- capacity[e1] = 999999999;
+ capacity[e1] = (std::numeric_limits<int32_t>::max)();
capacity[e1_rev] = 0;
rev[e1] = e1_rev;
rev[e1_rev] = e1;
@@ -246,7 +238,7 @@ class PgrEdgeDisjointPathsGraph {
size_t j;
for (j = 0; j < size - 1; j++) {
General_path_element_t edge;
- edge.seq = (int) (j + 1);
+ edge.seq = static_cast<int>(j + 1);
edge.start_id = paths[i][0];
edge.end_id = paths[i][size - 1];
edge.node = paths[i][j];
@@ -258,7 +250,7 @@ class PgrEdgeDisjointPathsGraph {
path_elements.push_back(edge);
}
General_path_element_t edge;
- edge.seq = (int) (j + 1);
+ edge.seq = static_cast<int>(j + 1);
edge.start_id = paths[i][0];
edge.end_id = paths[i][size - 1];
edge.node = paths[i][j];
@@ -267,3 +259,8 @@ class PgrEdgeDisjointPathsGraph {
}
}
};
+
+} // namespace flow
+} // namespace pgrouting
+
+#endif // SRC_MAX_FLOW_SRC_PGR_EDGEDISJOINTPATHS_HPP_
diff --git a/src/max_flow/src/pgr_maxflow.hpp b/src/max_flow/src/pgr_maxflow.hpp
index 4342c9a..231c54c 100644
--- a/src/max_flow/src/pgr_maxflow.hpp
+++ b/src/max_flow/src/pgr_maxflow.hpp
@@ -24,15 +24,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_MAX_FLOW_SRC_PGR_MAXFLOW_HPP_
+#define SRC_MAX_FLOW_SRC_PGR_MAXFLOW_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
#ifdef unlink
#undef unlink
#endif
-#endif
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
@@ -40,20 +38,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <boost/graph/edmonds_karp_max_flow.hpp>
#include <boost/graph/boykov_kolmogorov_max_flow.hpp>
-#if 0
-#include "./../../common/src/signalhandler.h"
-#endif
-#include "./../../common/src/pgr_types.h"
#include <map>
#include <string>
#include <utility>
#include <vector>
#include <set>
+#include <limits>
+
+#include "./../../common/src/pgr_types.h"
-// user's functions
-// for development
+namespace pgrouting {
typedef boost::adjacency_list_traits<boost::vecS, boost::vecS, boost::directedS>
Traits;
@@ -63,13 +59,16 @@ typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS,
boost::property<boost::vertex_index_t, int64_t,
boost::property<boost::vertex_color_t, boost::default_color_type,
boost::property<boost::vertex_distance_t, int64_t,
- boost::property<boost::vertex_predecessor_t, Traits::edge_descriptor> > > > >,
+ boost::property<boost::vertex_predecessor_t, Traits::edge_descriptor>
+ > > > >,
// Edge properties
boost::property<boost::edge_capacity_t, int64_t,
boost::property<boost::edge_residual_capacity_t, int64_t,
boost::property<boost::edge_reverse_t, Traits::edge_descriptor> > > >
FlowGraph;
+namespace graph {
+
template<class G>
class PgrFlowGraph {
public:
@@ -135,17 +134,18 @@ class PgrFlowGraph {
* The same applies for sinks.
* To avoid code repetition, a supersource/sink is used even in the one to one signature.
*/
- std::set<int64_t> vertices;
- for (int64_t source : source_vertices) {
- vertices.insert(source);
- }
- for (int64_t sink : sink_vertices) {
- vertices.insert(sink);
- }
+
+ /*
+ * vertices = {sources} U {sink} U {edges.source} U {edge.target}
+ */
+ std::set<int64_t> vertices(source_vertices);
+ vertices.insert(sink_vertices.begin(), sink_vertices.end());
+
for (size_t i = 0; i < total_tuples; ++i) {
vertices.insert(data_edges[i].source);
vertices.insert(data_edges[i].target);
}
+
for (int64_t id : vertices) {
V v = add_vertex(boost_graph);
id_to_V.insert(std::pair<int64_t, V>(id, v));
@@ -154,31 +154,7 @@ class PgrFlowGraph {
bool added;
V supersource = add_vertex(boost_graph);
- for (int64_t source_id : source_vertices) {
- V source = get_boost_vertex(source_id);
- E e, e_rev;
- boost::tie(e, added) =
- boost::add_edge(supersource, source, boost_graph);
- boost::tie(e_rev, added) =
- boost::add_edge(source, supersource, boost_graph);
- capacity[e] = 999999999;
- capacity[e_rev] = 0;
- rev[e] = e_rev;
- rev[e_rev] = e;
- }
-
V supersink = add_vertex(boost_graph);
- for (int64_t sink_id : sink_vertices) {
- V sink = get_boost_vertex(sink_id);
- E e, e_rev;
- boost::tie(e, added) = boost::add_edge(sink, supersink, boost_graph);
- boost::tie(e_rev, added) =
- boost::add_edge(supersink, sink, boost_graph);
- capacity[e] = 999999999;
- capacity[e_rev] = 0;
- rev[e] = e_rev;
- rev[e_rev] = e;
- }
source_vertex = supersource;
sink_vertex = supersink;
@@ -187,9 +163,9 @@ class PgrFlowGraph {
rev = get(boost::edge_reverse, boost_graph);
residual_capacity = get(boost::edge_residual_capacity, boost_graph);
- /*
+ /* Inserting edges
* Push-relabel requires each edge to be mapped to its reverse with capacity 0.
- * The other algorithms have no such requirement. (I can have half as many edges)
+ * The other algorithms have no such requirement. (can have have as many edges)
*/
if (strcmp(algorithm, "push_relabel") == 0) {
for (size_t i = 0; i < total_tuples; ++i) {
@@ -239,6 +215,43 @@ class PgrFlowGraph {
rev[e_rev] = e;
}
}
+ for (int64_t source_id : source_vertices) {
+ V source = get_boost_vertex(source_id);
+ int64_t total = 0;
+ for (auto edge = out_edges(source, boost_graph).first;
+ edge != out_edges(source, boost_graph).second;
+ ++edge) {
+ total += capacity[*edge];
+ }
+ E e, e_rev;
+ boost::tie(e, added) =
+ boost::add_edge(supersource, source, boost_graph);
+ boost::tie(e_rev, added) =
+ boost::add_edge(source, supersource, boost_graph);
+
+ capacity[e] = total;
+ /* From sources to supersource has 0 capacity*/
+ capacity[e_rev] = 0;
+ rev[e] = e_rev;
+ rev[e_rev] = e;
+ }
+ for (int64_t sink_id : sink_vertices) {
+ V sink = get_boost_vertex(sink_id);
+ E e, e_rev;
+ boost::tie(e, added) = boost::add_edge(sink, supersink, boost_graph);
+ boost::tie(e_rev, added) =
+ boost::add_edge(supersink, sink, boost_graph);
+ /*
+ * NOTE: int64_t crashes the server
+ */
+ /* From sinks to supersink has maximum capacity*/
+ capacity[e] = (std::numeric_limits<int32_t>::max)();
+ /* From supersink to sinks has 0 capacity*/
+ capacity[e_rev] = 0;
+ rev[e] = e_rev;
+ rev[e_rev] = e;
+ }
+
}
void get_flow_edges(std::vector<pgr_flow_t> &flow_edges) {
@@ -260,3 +273,8 @@ class PgrFlowGraph {
}
}
};
+
+} // namespace graph
+} // namespace pgrouting
+
+#endif // SRC_MAX_FLOW_SRC_PGR_MAXFLOW_HPP_
diff --git a/src/max_flow/src/pgr_maximumcardinalitymatching.hpp b/src/max_flow/src/pgr_maximumcardinalitymatching.hpp
index 5999533..405880b 100644
--- a/src/max_flow/src/pgr_maximumcardinalitymatching.hpp
+++ b/src/max_flow/src/pgr_maximumcardinalitymatching.hpp
@@ -24,24 +24,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_MAX_FLOW_SRC_PGR_MAXIMUMCARDINALITYMATCHING_HPP_
+#define SRC_MAX_FLOW_SRC_PGR_MAXIMUMCARDINALITYMATCHING_HPP_
#pragma once
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
+#include "./../../common/src/pgr_types.h"
#ifdef unlink
#undef unlink
#endif
-#endif
#include <boost/config.hpp>
#include <boost/graph/adjacency_list.hpp>
#include <boost/graph/max_cardinality_matching.hpp>
-#if 0
-#include "./../../common/src/signalhandler.h"
-#endif
-#include "./../../common/src/pgr_types.h"
#include <map>
#include <vector>
@@ -49,14 +44,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <set>
-// user's functions
-// for development
+
+
+namespace pgrouting {
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::undirectedS>
BasicUndirectedGraph;
typedef boost::adjacency_list<boost::listS, boost::vecS, boost::directedS>
BasicDirectedGraph;
+namespace flow {
+
template<class G>
class PgrCardinalityGraph {
public:
@@ -133,7 +131,8 @@ class PgrCardinalityGraph {
*/
boost::tie(e, exists) =
boost::edge(*vi, mate_map[*vi], boost_graph);
- if (((uint64_t)mate_map[*vi] != boost::graph_traits<G>::null_vertex())
+ if (((uint64_t)mate_map[*vi]
+ != boost::graph_traits<G>::null_vertex())
&& exists && !already_matched[*vi]
&& !already_matched[mate_map[*vi]]) {
already_matched[*vi] = true;
@@ -151,7 +150,8 @@ class PgrCardinalityGraph {
++vi) {
boost::tie(e, exists) =
boost::edge(*vi, mate_map[*vi], boost_graph);
- if (((uint64_t)mate_map[*vi] != boost::graph_traits<G>::null_vertex())
+ if (((uint64_t)mate_map[*vi]
+ != boost::graph_traits<G>::null_vertex())
&& (*vi < (uint64_t)mate_map[*vi])) {
pgr_basic_edge_t matched_couple;
matched_couple.source = get_vertex_id(*vi);
@@ -168,3 +168,8 @@ class PgrCardinalityGraph {
&mate_map[0]);
}
};
+
+} // namespace flow
+} // namespace pgrouting
+
+#endif // SRC_MAX_FLOW_SRC_PGR_MAXIMUMCARDINALITYMATCHING_HPP_
diff --git a/src/max_flow/test/CMakeLists.txt b/src/max_flow/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/max_flow/test/doc-pgr_edgeDisjointPaths.test.sql b/src/max_flow/test/doc-pgr_edgeDisjointPaths.test.sql
index 74a1d35..db2e395 100644
--- a/src/max_flow/test/doc-pgr_edgeDisjointPaths.test.sql
+++ b/src/max_flow/test/doc-pgr_edgeDisjointPaths.test.sql
@@ -1,7 +1,5 @@
--These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
-BEGIN;
-SET client_min_messages TO NOTICE;
\echo -- q1
SELECT * FROM pgr_edgeDisjointPaths(
@@ -35,4 +33,3 @@ SELECT * FROM pgr_edgeDisjointPaths(
);
\echo -- q6
-ROLLBACK;
diff --git a/src/max_flow/test/doc-pgr_maxFlow.result b/src/max_flow/test/doc-pgr_maxFlow.result
new file mode 100644
index 0000000..5e29fdb
--- /dev/null
+++ b/src/max_flow/test/doc-pgr_maxFlow.result
@@ -0,0 +1,9 @@
+-- q1
+280
+-- q2
+410
+-- q3
+280
+-- q4
+460
+-- q5
diff --git a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql b/src/max_flow/test/doc-pgr_maxFlow.test.sql
similarity index 85%
copy from src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
copy to src/max_flow/test/doc-pgr_maxFlow.test.sql
index f8c5056..e4af301 100644
--- a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
+++ b/src/max_flow/test/doc-pgr_maxFlow.test.sql
@@ -1,62 +1,59 @@
---These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
---The edge in the edge table are augmented with road-like categories for capacity values.
-
-BEGIN;
-
-SET client_min_messages TO NOTICE;
-
-\echo -- q1
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, 11
-);
-
-\echo -- q2
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, ARRAY[11, 1, 13]
-);
-
-\echo -- q3
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], 11
-);
-
-\echo -- q4
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
-);
-
-\echo -- q5
-
-ROLLBACK;
+--These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
+--The edge in the edge table are augmented with road-like categories for capacity values.
+
+
+
+\echo -- q1
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, 11
+);
+
+\echo -- q2
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, ARRAY[11, 1, 13]
+);
+
+\echo -- q3
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], 11
+);
+
+\echo -- q4
+SELECT * FROM pgr_maxFlow(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
+);
+
+\echo -- q5
+
diff --git a/src/max_flow/test/doc-pgr_maxFlowBoykovKolmogorov.test.sql b/src/max_flow/test/doc-pgr_maxFlowBoykovKolmogorov.test.sql
index 314acb5..9a3630c 100644
--- a/src/max_flow/test/doc-pgr_maxFlowBoykovKolmogorov.test.sql
+++ b/src/max_flow/test/doc-pgr_maxFlowBoykovKolmogorov.test.sql
@@ -1,60 +1,54 @@
---These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
---The edge in the edge table are augmented with road-like categories for capacity values.
-
-BEGIN;
-SET client_min_messages TO NOTICE;
-
-\echo -- q1
-SELECT * FROM pgr_maxFlowBoykovKolmogorov(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, 11
-);
-
-\echo -- q2
-SELECT * FROM pgr_maxFlowBoykovKolmogorov(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, ARRAY[1, 3, 11]
-);
-
-\echo -- q3
-SELECT * FROM pgr_maxFlowBoykovKolmogorov(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], 11
-);
-
-\echo -- q4
-SELECT * FROM pgr_maxFlowBoykovKolmogorov(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
-);
-
-\echo -- q5
-ROLLBACK;
+
+\echo -- q1
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, 11
+);
+
+\echo -- q2
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, ARRAY[1, 3, 11]
+);
+
+\echo -- q3
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], 11
+);
+
+\echo -- q4
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
+);
+
+\echo -- q5
diff --git a/src/max_flow/test/doc-pgr_maxFlowEdmondsKarp.test.sql b/src/max_flow/test/doc-pgr_maxFlowEdmondsKarp.test.sql
index 0be2d91..3de82bc 100644
--- a/src/max_flow/test/doc-pgr_maxFlowEdmondsKarp.test.sql
+++ b/src/max_flow/test/doc-pgr_maxFlowEdmondsKarp.test.sql
@@ -1,60 +1,57 @@
---These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
---The edge in the edge table are augmented with road-like categories for capacity values.
-
-BEGIN;
-SET client_min_messages TO NOTICE;
-
-\echo -- q1
-SELECT * FROM pgr_maxFlowEdmondsKarp(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, 11
-);
-
-\echo -- q2
-SELECT * FROM pgr_maxFlowEdmondsKarp(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, ARRAY[1, 3, 11]
-);
-
-\echo -- q3
-SELECT * FROM pgr_maxFlowEdmondsKarp(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], 11
-);
-
-\echo -- q4
-SELECT * FROM pgr_maxFlowEdmondsKarp(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
-);
-
-\echo -- q5
-ROLLBACK;
+--These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
+--The edge in the edge table are augmented with road-like categories for capacity values.
+
+
+\echo -- q1
+SELECT * FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, 11
+);
+
+\echo -- q2
+SELECT * FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, ARRAY[1, 3, 11]
+);
+
+\echo -- q3
+SELECT * FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], 11
+);
+
+\echo -- q4
+SELECT * FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
+);
+
+\echo -- q5
diff --git a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql b/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
index f8c5056..1de13e3 100644
--- a/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
+++ b/src/max_flow/test/doc-pgr_maxFlowPushRelabel.test.sql
@@ -1,62 +1,59 @@
---These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
---The edge in the edge table are augmented with road-like categories for capacity values.
-
-BEGIN;
-
-SET client_min_messages TO NOTICE;
-
-\echo -- q1
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, 11
-);
-
-\echo -- q2
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , 6, ARRAY[11, 1, 13]
-);
-
-\echo -- q3
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], 11
-);
-
-\echo -- q4
-SELECT * FROM pgr_maxFlowPushRelabel(
- 'SELECT id,
- source,
- target,
- c1.capacity as capacity,
- c2.capacity as reverse_capacity
- FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
- WHERE edge_table.reverse_category_id = c2.category_id
- ORDER BY id'
- , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
-);
-
-\echo -- q5
-
-ROLLBACK;
+--These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
+--The edge in the edge table are augmented with road-like categories for capacity values.
+
+
+
+\echo -- q1
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, 11
+);
+
+\echo -- q2
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , 6, ARRAY[11, 1, 13]
+);
+
+\echo -- q3
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], 11
+);
+
+\echo -- q4
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id,
+ source,
+ target,
+ c1.capacity as capacity,
+ c2.capacity as reverse_capacity
+ FROM edge_table JOIN categories AS c1 USING(category_id), categories AS c2
+ WHERE edge_table.reverse_category_id = c2.category_id
+ ORDER BY id'
+ , ARRAY[6, 8, 12], ARRAY[1, 3, 11]
+);
+
+\echo -- q5
+
diff --git a/src/max_flow/test/doc-pgr_maximumCardinalityMatching.test.sql b/src/max_flow/test/doc-pgr_maximumCardinalityMatching.test.sql
index bb887f4..200ae9d 100644
--- a/src/max_flow/test/doc-pgr_maximumCardinalityMatching.test.sql
+++ b/src/max_flow/test/doc-pgr_maximumCardinalityMatching.test.sql
@@ -1,7 +1,5 @@
--These tests used the sample data provided here: http://docs.pgrouting.org/2.2/en/doc/src/developer/sampledata.html#sampledata
-BEGIN;
-SET client_min_messages TO NOTICE;
\echo -- q1
SELECT * FROM pgr_maximumCardinalityMatching(
@@ -15,4 +13,3 @@ SELECT * FROM pgr_maximumCardinalityMatching(
);
\echo -- q3
-ROLLBACK;
diff --git a/src/max_flow/test/pgtap/flow-types-check.sql b/src/max_flow/test/pgtap/flow-types-check.sql
index 6b96ce6..31bd991 100644
--- a/src/max_flow/test/pgtap/flow-types-check.sql
+++ b/src/max_flow/test/pgtap/flow-types-check.sql
@@ -1,7 +1,7 @@
\i setup.sql
SET client_min_messages TO WARNING;
-SELECT plan(114);
+SELECT plan(123);
--Boykov-Kolmogorov
SELECT has_function('pgr_maxflowboykovkolmogorov');
@@ -90,6 +90,36 @@ SELECT function_returns('pgr_maxflowpushrelabel', ARRAY[
'text', 'anyarray', 'anyarray'
], 'setof record');
+--pgr_max_flow
+SELECT has_function('pgr_maxflow');
+
+SELECT has_function('pgr_maxflow', ARRAY[
+ 'text', 'bigint', 'bigint'
+ ]);
+SELECT has_function('pgr_maxflow', ARRAY[
+ 'text', 'anyarray', 'bigint'
+ ]);
+SELECT has_function('pgr_maxflow', ARRAY[
+ 'text', 'bigint', 'anyarray'
+ ]);
+SELECT has_function('pgr_maxflow', ARRAY[
+ 'text', 'anyarray', 'anyarray'
+ ]);
+
+
+SELECT function_returns('pgr_maxflow', ARRAY[
+ 'text', 'bigint', 'bigint'
+ ], 'bigint');
+SELECT function_returns('pgr_maxflow', ARRAY[
+ 'text', 'bigint', 'anyarray'
+ ], 'bigint');
+SELECT function_returns('pgr_maxflow', ARRAY[
+ 'text', 'anyarray', 'bigint'
+ ], 'bigint');
+SELECT function_returns('pgr_maxflow', ARRAY[
+ 'text', 'anyarray', 'anyarray'
+ ], 'bigint');
+
-- Push-relabel
PREPARE pl_q_o2o AS
SELECT pg_typeof(seq)::text AS t1, pg_typeof(edge_id)::text AS t2,
@@ -1365,4 +1395,4 @@ SELECT throws_ok('bk_rc5',
'throws because reverse_capacity is TEXT');
SELECT * FROM finish();
-ROLLBACK;
\ No newline at end of file
+ROLLBACK;
diff --git a/src/max_flow/test/pgtap/internet_example.sql b/src/max_flow/test/pgtap/internet_example.sql
new file mode 100644
index 0000000..661634f
--- /dev/null
+++ b/src/max_flow/test/pgtap/internet_example.sql
@@ -0,0 +1,144 @@
+\i setup.sql
+
+SELECT plan(3);
+
+
+/**************************** BOOST EXAMPLE ****************/
+
+CREATE TABLE boost_example(
+ id SERIAL PRIMARY KEY,
+ source BIGINT,
+ target BIGINT,
+ capacity INTEGER
+);
+
+INSERT INTO boost_example (source, target, capacity)
+VALUES
+(1, 7,3),
+(1, 2, 20),
+(1, 3, 20),
+(2, 6,1),
+(2, 1, 20),
+(2, 4, 20),
+(3, 5,4),
+(3, 4, 20),
+(3, 1, 20),
+(4, 8,5),
+(4, 3, 20),
+(4, 2, 20),
+(5, 6, 20),
+(5, 7, 20),
+(6, 5, 20),
+(6, 8, 20),
+(7, 8, 20),
+(7, 5, 20),
+(8, 7, 20),
+(8, 6, 20)
+;
+
+
+/* NOTE: what is equal between the three algorithms is the maximum flow achieved */
+
+PREPARE boostSample1 AS
+SELECT sum(flow) FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE source = 1;
+
+PREPARE boostSample2 AS
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE source = 1;
+
+PREPARE boostSample3 AS
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE source = 1;
+
+PREPARE boostSample4 AS
+SELECT sum(flow) FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE target = 8;
+
+PREPARE boostSample5 AS
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE target = 8;
+
+PREPARE boostSample6 AS
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id, source, target,capacity
+ FROM boost_example'
+ ,1, 8) WHERE target = 8;
+
+SELECT ('boostSample1',13, 'BOOST: pgr_maxFlowEdmondsKarp, flow from source is 13');
+SELECT ('boostSample4',13, 'BOOST: pgr_maxFlowEdmondsKarp, flow from source is 13');
+SELECT ('boostSample2',13, 'BOOST: pgr_maxFlowBoykovKolmogorov, flow from source is 13');
+SELECT ('boostSample5',13, 'BOOST: pgr_maxFlowBoykovKolmogorov, flow from source is 13');
+SELECT ('boostSample3',13, 'BOOST: pgr_maxFlowPushRelabel, flow from source is 13');
+SELECT ('boostSample6',13, 'BOOST: pgr_maxFlowPushRelabel, flow from source is 13');
+
+/**************************** WIKI EXAMPLE ****************/
+
+CREATE TABLE wiki_example(
+ id SERIAL PRIMARY KEY,
+ source BIGINT,
+ target BIGINT,
+ capacity INTEGER
+);
+
+/*
+S = 1, O = 2, P = 3, Q = 4, R = 5, T = 6
+*/
+INSERT INTO wiki_example(source, target, capacity)
+VALUES
+(1, 2, 3),
+(1, 3, 3),
+(2, 3, 2),
+(2, 4, 3),
+(3, 5, 2),
+(4, 5, 4),
+(4, 6, 2),
+(5, 6, 3)
+;
+
+
+PREPARE wikiSample1 AS
+SELECT * FROM pgr_maxFlowEdmondsKarp(
+ 'SELECT id, source, target,capacity
+ FROM wiki_example'
+ ,1, 6);
+
+PREPARE wikiSample2 AS
+SELECT * FROM pgr_maxFlowBoykovKolmogorov(
+ 'SELECT id, source, target,capacity
+ FROM wiki_example'
+ ,1, 6);
+
+PREPARE wikiSample3 AS
+SELECT * FROM pgr_maxFlowPushRelabel(
+ 'SELECT id, source, target,capacity
+ FROM wiki_example'
+ ,1, 6);
+
+PREPARE wikiresult AS
+SELECT *
+FROM (VALUES
+ (1, 1, 1, 2, 3, 0),
+ (2, 2, 1, 3, 2, 1),
+ (3, 4, 2, 4, 3, 0),
+ (4, 5, 3, 5, 2, 0),
+ (5, 6, 4, 5, 1, 3),
+ (6, 7, 4, 6, 2, 0),
+ (7, 8, 5, 6, 3, 0)
+) AS t(seq, edge_id, source, target, flow, residual_capacity);
+
+SELECT set_eq('wikiSample1', 'wikiresult', 'WIKI: pgr_maxFlowEdmondsKarp');
+SELECT set_eq('wikiSample2', 'wikiresult', 'WIKI: pgr_maxFlowBoykovKolmogorov');
+SELECT set_eq('wikiSample3', 'wikiresult', 'WIKI: pgr_maxFlowPushRelabel');
+
+ROLLBACK;
diff --git a/src/max_flow/test/test.conf b/src/max_flow/test/test.conf
index d22d99f..b765345 100644
--- a/src/max_flow/test/test.conf
+++ b/src/max_flow/test/test.conf
@@ -5,6 +5,7 @@
'comment' => 'Max flow and applications test for any versions.',
'data' => [ ],
'tests' => [qw(
+ doc-pgr_maxFlow
doc-pgr_maxFlowBoykovKolmogorov
doc-pgr_maxFlowPushRelabel
doc-pgr_maxFlowEdmondsKarp
@@ -12,6 +13,7 @@
doc-pgr_edgeDisjointPaths
)],
'documentation' => [qw(
+ doc-pgr_maxFlow
doc-pgr_maxFlowBoykovKolmogorov
doc-pgr_maxFlowPushRelabel
doc-pgr_maxFlowEdmondsKarp
diff --git a/src/pickDeliver/doc/CMakeLists.txt b/src/pickDeliver/doc/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/pickDeliver/doc/doc-pickDeliver.queries b/src/pickDeliver/doc/doc-pickDeliver.queries
index 313cfa3..f4544d4 100644
--- a/src/pickDeliver/doc/doc-pickDeliver.queries
+++ b/src/pickDeliver/doc/doc-pickDeliver.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM _pgr_pickDeliver(
'select * from customer order by id', 25, 200, 1, 30);
@@ -267,3 +271,5 @@ SELECT * FROM _pgr_pickDeliver(
(127 rows)
--q3
+ROLLBACK;
+ROLLBACK
diff --git a/src/pickDeliver/src/customers_input.c b/src/pickDeliver/src/customers_input.c
index e94c1e6..389484e 100644
--- a/src/pickDeliver/src/customers_input.c
+++ b/src/pickDeliver/src/customers_input.c
@@ -22,12 +22,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
+#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/get_check_data.h"
#include "./customers_input.h"
@@ -148,6 +146,8 @@ pgr_get_customers_data(
}
}
+ SPI_cursor_close(SPIportal);
+
if (total_tuples == 0) {
(*total_customers) = 0;
PGR_DBG("NO customers");
diff --git a/src/pickDeliver/src/optimize.cpp b/src/pickDeliver/src/optimize.cpp
index c0e187c..6ae2732 100644
--- a/src/pickDeliver/src/optimize.cpp
+++ b/src/pickDeliver/src/optimize.cpp
@@ -27,8 +27,10 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <algorithm>
#include <limits>
#include <set>
-#include "./solution.h"
+
#include "./../../common/src/pgr_assert.h"
+
+#include "./solution.h"
#include "./optimize.h"
#include "./pgr_pickDeliver.h"
diff --git a/src/pickDeliver/src/order.cpp b/src/pickDeliver/src/order.cpp
index 0bd5cb6..101edd3 100644
--- a/src/pickDeliver/src/order.cpp
+++ b/src/pickDeliver/src/order.cpp
@@ -27,7 +27,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <set>
#include "./../../common/src/pgr_assert.h"
-#include "pgr_pickDeliver.h"
+#include "./pgr_pickDeliver.h"
#include "./order.h"
namespace pgrouting {
diff --git a/src/pickDeliver/src/pgr_pickDeliver.cpp b/src/pickDeliver/src/pgr_pickDeliver.cpp
index 26849fc..dab1044 100644
--- a/src/pickDeliver/src/pgr_pickDeliver.cpp
+++ b/src/pickDeliver/src/pgr_pickDeliver.cpp
@@ -23,12 +23,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./pgr_pickDeliver.h"
#include <sstream>
#include <string>
@@ -44,7 +39,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./solution.h"
#include "./initial_solution.h"
#include "./optimize.h"
-#include "./pgr_pickDeliver.h"
namespace pgrouting {
namespace vrp {
@@ -65,18 +59,20 @@ void
Pgr_pickDeliver::solve() {
#if 0
solutions.push_back(Initial_solution(0, this));
-#endif
solutions.push_back(Initial_solution(1, this));
solutions.push_back(solve(solutions.back()));
+#endif
-#if 1
+#if 0
solutions.push_back(Initial_solution(2, this));
solutions.push_back(solve(solutions.back()));
solutions.push_back(Initial_solution(3, this));
solutions.push_back(solve(solutions.back()));
+#endif
solutions.push_back(Initial_solution(4, this));
solutions.push_back(solve(solutions.back()));
+#if 0
solutions.push_back(Initial_solution(5, this));
solutions.push_back(solve(solutions.back()));
solutions.push_back(Initial_solution(6, this));
diff --git a/src/pickDeliver/src/pgr_pickDeliver.h b/src/pickDeliver/src/pgr_pickDeliver.h
index 9941a4e..8a72137 100644
--- a/src/pickDeliver/src/pgr_pickDeliver.h
+++ b/src/pickDeliver/src/pgr_pickDeliver.h
@@ -24,10 +24,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
#pragma once
-#ifdef __MINGW32__
-#include <winsock2.h>
-#include <windows.h>
-#endif
#include "./../../common/src/pgr_types.h"
diff --git a/src/pickDeliver/src/pickDeliver.c b/src/pickDeliver/src/pickDeliver.c
index 31be79d..8e10609 100644
--- a/src/pickDeliver/src/pickDeliver.c
+++ b/src/pickDeliver/src/pickDeliver.c
@@ -27,21 +27,11 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
-
-// #define DEBUG
#include "./../../common/src/debug_macro.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./customers_input.h"
#include "./pickDeliver_driver.h"
@@ -138,8 +128,6 @@ PG_FUNCTION_INFO_V1(pickDeliver);
PGDLLEXPORT Datum
pickDeliver(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
@@ -167,7 +155,7 @@ pickDeliver(PG_FUNCTION_ARGS) {
PGR_DBG("Calling process");
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT32(1),
PG_GETARG_FLOAT8(2),
PG_GETARG_FLOAT8(3),
@@ -178,7 +166,11 @@ pickDeliver(PG_FUNCTION_ARGS) {
/* */
/*********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -193,12 +185,10 @@ pickDeliver(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_vehicle_orders_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -227,15 +217,15 @@ pickDeliver(PG_FUNCTION_ARGS) {
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].vehicle_id);
- values[2] = Int32GetDatum(result_tuples[call_cntr].vehicle_seq);
- values[3] = Int64GetDatum(result_tuples[call_cntr].order_id);
- values[4] = Float8GetDatum(result_tuples[call_cntr].travelTime);
- values[5] = Float8GetDatum(result_tuples[call_cntr].arrivalTime);
- values[6] = Float8GetDatum(result_tuples[call_cntr].waitTime);
- values[7] = Float8GetDatum(result_tuples[call_cntr].serviceTime);
- values[8] = Float8GetDatum(result_tuples[call_cntr].departureTime);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].vehicle_id);
+ values[2] = Int32GetDatum(result_tuples[funcctx->call_cntr].vehicle_seq);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].order_id);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].travelTime);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].arrivalTime);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].waitTime);
+ values[7] = Float8GetDatum(result_tuples[funcctx->call_cntr].serviceTime);
+ values[8] = Float8GetDatum(result_tuples[funcctx->call_cntr].departureTime);
/*********************************************************************/
@@ -243,9 +233,6 @@ pickDeliver(PG_FUNCTION_ARGS) {
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/pickDeliver/src/pickDeliver_driver.cpp b/src/pickDeliver/src/pickDeliver_driver.cpp
index 72c8379..209d64e 100644
--- a/src/pickDeliver/src/pickDeliver_driver.cpp
+++ b/src/pickDeliver/src/pickDeliver_driver.cpp
@@ -28,21 +28,18 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
#include "./pickDeliver_driver.h"
+
#include <string.h>
#include <sstream>
#include <string>
#include <deque>
#include <vector>
+
+#include "./pgr_pickDeliver.h"
+
#include "./../../common/src/pgr_assert.h"
-#include "./../../common/src/pgr_types.h"
#include "./../../common/src/pgr_alloc.hpp"
-#include "./pgr_pickDeliver.h"
/************************************************************
customers_sql TEXT,
diff --git a/src/pickDeliver/src/pickDeliver_driver.h b/src/pickDeliver/src/pickDeliver_driver.h
index babbc8b..037b69e 100644
--- a/src/pickDeliver/src/pickDeliver_driver.h
+++ b/src/pickDeliver/src/pickDeliver_driver.h
@@ -29,7 +29,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#ifndef SRC_PICKDELIVER_SRC_PICKDELIVER_DRIVER_H_
#define SRC_PICKDELIVER_SRC_PICKDELIVER_DRIVER_H_
-#include <stddef.h>
#include "./../../common/src/pgr_types.h"
#ifdef __cplusplus
diff --git a/src/pickDeliver/src/solution.cpp b/src/pickDeliver/src/solution.cpp
index c210701..9bb9557 100644
--- a/src/pickDeliver/src/solution.cpp
+++ b/src/pickDeliver/src/solution.cpp
@@ -24,7 +24,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
#include <string>
#include <vector>
diff --git a/src/pickDeliver/src/tw_node.cpp b/src/pickDeliver/src/tw_node.cpp
index 4a45521..af3cc4d 100644
--- a/src/pickDeliver/src/tw_node.cpp
+++ b/src/pickDeliver/src/tw_node.cpp
@@ -28,8 +28,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <limits>
#include <string>
-
#include "./../../common/src/pgr_assert.h"
+
#include "./pgr_pickDeliver.h"
namespace pgrouting {
diff --git a/src/pickDeliver/src/vehicle.cpp b/src/pickDeliver/src/vehicle.cpp
index 8755e46..edc6908 100644
--- a/src/pickDeliver/src/vehicle.cpp
+++ b/src/pickDeliver/src/vehicle.cpp
@@ -23,6 +23,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#include "./vehicle.h"
+
#include <deque>
#include <iostream>
#include <algorithm>
@@ -34,9 +36,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "../../common/src/pgr_assert.h"
-
#include "./pgr_pickDeliver.h"
-#include "./vehicle.h"
namespace pgrouting {
diff --git a/src/pickDeliver/src/vehicle.h b/src/pickDeliver/src/vehicle.h
index d09a351..f8f24f7 100644
--- a/src/pickDeliver/src/vehicle.h
+++ b/src/pickDeliver/src/vehicle.h
@@ -51,7 +51,7 @@ namespace vrp {
* Class my_vehicle : public vechicle
* ~~~~
*
- * @note All members return @b true when the operation is succesfull
+ * @note All members return @b true when the operation is successful
*
* A vehicle is a sequence of @ref Vehicle_node
* from @b starting site to @b ending site.
diff --git a/src/pickDeliver/src/vehicle_node.cpp b/src/pickDeliver/src/vehicle_node.cpp
index 68caea3..b904490 100644
--- a/src/pickDeliver/src/vehicle_node.cpp
+++ b/src/pickDeliver/src/vehicle_node.cpp
@@ -24,10 +24,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#include <cassert>
#include "./vehicle_node.h"
+
namespace pgrouting {
namespace vrp {
diff --git a/src/pickDeliver/src/vehicle_pickDeliver.cpp b/src/pickDeliver/src/vehicle_pickDeliver.cpp
index 0cb64f5..5a0176e 100644
--- a/src/pickDeliver/src/vehicle_pickDeliver.cpp
+++ b/src/pickDeliver/src/vehicle_pickDeliver.cpp
@@ -22,6 +22,9 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+
+#include "./vehicle_pickDeliver.h"
+
#include <iostream>
#include <deque>
#include <set>
@@ -33,7 +36,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./../../common/src/pgr_assert.h"
#include "./order.h"
#include "./vehicle.h"
-#include "./vehicle_pickDeliver.h"
#include "./pgr_pickDeliver.h"
@@ -223,7 +225,9 @@ Vehicle_pickDeliver::push_back(const Order &order) {
evaluate(m_path.size() - 3);
pgassert(has_order(order));
+#if 0
pgassert(!has_cv());
+#endif
invariant();
}
@@ -238,7 +242,9 @@ Vehicle_pickDeliver::push_front(const Order &order) {
evaluate(1);
pgassert(has_order(order));
+#if 0
pgassert(!has_cv());
+#endif
invariant();
}
diff --git a/src/pickDeliver/test/jet_customers.result b/src/pickDeliver/test/jet_customers.result
index 346e1d5..b701e82 100644
--- a/src/pickDeliver/test/jet_customers.result
+++ b/src/pickDeliver/test/jet_customers.result
@@ -1,31 +1,31 @@
1|1|1|0|0|0.|0|0|0.
-2|1|2|15|0.305203210992283|0.31|0|30|30.31
-3|1|3|13|0|30.31|0|30|60.31
-4|1|4|11|0|60.31|0|30|90.31
-5|1|5|9|0|90.31|0|30|120.31
-6|1|6|25|0.328105166067223|120.63|0|30|150.63
-7|1|7|23|0|150.63|0|30|180.63
-8|1|8|18|0|180.63|0|30|210.63
-9|1|9|10|0|210.63|0|30|240.63
-10|1|10|2|0|240.63|0|30|270.63
-11|1|11|27|0|270.63|0|30|300.63
-12|1|12|22|0.414019323220547|301.05|0|30|331.05
-13|1|13|16|0|331.05|0|30|361.05
-14|1|14|8|0|361.05|0|30|391.05
-15|1|15|28|0|391.05|0|30|421.05
-16|1|16|26|0.409882910109704|421.46|0|30|451.46
-17|1|17|21|0|451.46|0|30|481.46
-18|1|18|19|0|481.46|0|30|511.46
-19|1|19|17|0|511.46|0|30|541.46
-20|1|20|14|0|541.46|0|30|571.46
-21|1|21|6|0|571.46|0|30|601.46
-22|1|22|7|0.587132864009502|602.04|0|30|632.04
-23|1|23|5|0|632.04|0|30|662.04
-24|1|24|3|0|662.04|0|30|692.04
-25|1|25|1|0|692.04|0|30|722.04
-26|1|26|24|1.33232503541741|723.38|0|30|753.38
-27|1|27|20|0|753.38|0|30|783.38
-28|1|28|12|0|783.38|0|30|813.38
-29|1|29|4|0|813.38|0|30|843.38
-30|1|30|0|1.79089502763283|845.17|0|0|845.17
-31|-1|0|0|5.1675635374495|0.|0|840|845.17
+2|1|2|27|0.617668195716762|0.62|0|30|30.62
+3|1|3|25|0|30.62|0|30|60.62
+4|1|4|2|0|60.62|0|30|90.62
+5|1|5|23|0|90.62|0|30|120.62
+6|1|6|26|0.714478831037001|121.33|0|30|151.33
+7|1|7|19|0|151.33|0|30|181.33
+8|1|8|7|0.587132864009502|181.92|0|30|211.92
+9|1|9|5|0|211.92|0|30|241.92
+10|1|10|3|0|241.92|0|30|271.92
+11|1|11|1|0|271.92|0|30|301.92
+12|1|12|12|1.33232503541741|303.25|0|30|333.25
+13|1|13|4|0|333.25|0|30|363.25
+14|1|14|24|0|363.25|0|30|393.25
+15|1|15|20|0|393.25|0|30|423.25
+16|1|16|21|1.7278440323131|424.98|0|30|454.98
+17|1|17|6|0|454.98|0|30|484.98
+18|1|18|17|0|484.98|0|30|514.98
+19|1|19|14|0|514.98|0|30|544.98
+20|1|20|13|0.415245710393256|545.39|0|30|575.39
+21|1|21|11|0|575.39|0|30|605.39
+22|1|22|9|0|605.39|0|30|635.39
+23|1|23|15|0|635.39|0|30|665.39
+24|1|24|10|0.328105166067223|665.72|0|30|695.72
+25|1|25|18|0|695.72|0|30|725.72
+26|1|26|8|0.414019323220547|726.14|0|30|756.14
+27|1|27|28|0|756.14|0|30|786.14
+28|1|28|22|0|786.14|0|30|816.14
+29|1|29|16|0|816.14|0|30|846.14
+30|1|30|0|0.292249893070981|846.43|0|0|846.43
+31|-1|0|0|6.42906905124578|0.|0|840|846.43
diff --git a/src/pickDeliver/test/pickDeliver.data b/src/pickDeliver/test/pickDeliver.data
index aecce0d..ba2018e 100644
--- a/src/pickDeliver/test/pickDeliver.data
+++ b/src/pickDeliver/test/pickDeliver.data
@@ -1,120 +1,120 @@
-DROP TABLE IF EXISTS customer CASCADE;
-CREATE TABLE customer (
- id INTEGER NOT NULL PRIMARY KEY,
- x INTEGER,
- y INTEGER,
- demand INTEGER,
- openTime INTEGER,
- closeTime INTEGER,
- serviceTime INTEGER,
- pindex INTEGER,
- dindex INTEGER
- );
-copy customer (id, x, y, demand, openTime, closeTime, serviceTime, pindex, dindex) from stdin;
-0 40 50 0 0 1236 0 0 0
-1 45 68 -10 912 967 90 11 0
-2 45 70 -20 825 870 90 6 0
-3 42 66 10 65 146 90 0 75
-4 42 68 -10 727 782 90 9 0
-5 42 65 10 15 67 90 0 7
-6 40 69 20 621 702 90 0 2
-7 40 66 -10 170 225 90 5 0
-8 38 68 20 255 324 90 0 10
-9 38 70 10 534 605 90 0 4
-10 35 66 -20 357 410 90 8 0
-11 35 69 10 448 505 90 0 1
-12 25 85 -20 652 721 90 18 0
-13 22 75 30 30 92 90 0 17
-14 22 85 -40 567 620 90 16 0
-15 20 80 -10 384 429 90 19 0
-16 20 85 40 475 528 90 0 14
-17 18 75 -30 99 148 90 13 0
-18 15 75 20 179 254 90 0 12
-19 15 80 10 278 345 90 0 15
-20 30 50 10 10 73 90 0 24
-21 30 52 -10 914 965 90 30 0
-22 28 52 -20 812 883 90 28 0
-23 28 55 10 732 777 0 0 103
-24 25 50 -10 65 144 90 20 0
-25 25 52 40 169 224 90 0 27
-26 25 55 -10 622 701 90 29 0
-27 23 52 -40 261 316 90 25 0
-28 23 55 20 546 593 90 0 22
-29 20 50 10 358 405 90 0 26
-30 20 55 10 449 504 90 0 21
-31 10 35 -30 200 237 90 32 0
-32 10 40 30 31 100 90 0 31
-33 8 40 40 87 158 90 0 37
-34 8 45 -30 751 816 90 38 0
-35 5 35 10 283 344 90 0 39
-36 5 45 10 665 716 0 0 105
-37 2 40 -40 383 434 90 33 0
-38 0 40 30 479 522 90 0 34
-39 0 45 -10 567 624 90 35 0
-40 35 30 -20 264 321 90 42 0
-41 35 32 -10 166 235 90 43 0
-42 33 32 20 68 149 90 0 40
-43 33 35 10 16 80 90 0 41
-44 32 30 10 359 412 90 0 46
-45 30 30 10 541 600 90 0 48
-46 30 32 -10 448 509 90 44 0
-47 30 35 -10 1054 1127 90 49 0
-48 28 30 -10 632 693 90 45 0
-49 28 35 10 1001 1066 90 0 47
-50 26 32 10 815 880 90 0 52
-51 25 30 10 725 786 0 0 101
-52 25 35 -10 912 969 90 50 0
-53 44 5 20 286 347 90 0 58
-54 42 10 40 186 257 90 0 60
-55 42 15 -40 95 158 90 57 0
-56 40 5 30 385 436 90 0 59
-57 40 15 40 35 87 90 0 55
-58 38 5 -20 471 534 90 53 0
-59 38 15 -30 651 740 90 56 0
-60 35 5 -40 562 629 90 54 0
-61 50 30 -10 531 610 90 67 0
-62 50 35 20 262 317 90 0 68
-63 50 40 50 171 218 90 0 74
-64 48 30 10 632 693 0 0 102
-65 48 40 10 76 129 90 0 72
-66 47 35 10 826 875 90 0 69
-67 47 40 10 12 77 90 0 61
-68 45 30 -20 734 777 90 62 0
-69 45 35 -10 916 969 90 66 0
-70 95 30 -30 387 456 90 81 0
-71 95 35 20 293 360 90 0 77
-72 53 30 -10 450 505 90 65 0
-73 92 30 -10 478 551 90 76 0
-74 53 35 -50 353 412 90 63 0
-75 45 65 -10 997 1068 90 3 0
-76 90 35 10 203 260 90 0 73
-77 88 30 -20 574 643 90 71 0
-78 88 35 20 109 170 0 0 104
-79 87 30 10 668 731 90 0 80
-80 85 25 -10 769 820 90 79 0
-81 85 35 30 47 124 90 0 70
-82 75 55 20 369 420 90 0 85
-83 72 55 -20 265 338 90 87 0
-84 70 58 20 458 523 90 0 89
-85 68 60 -20 555 612 90 82 0
-86 66 55 10 173 238 90 0 91
-87 65 55 20 85 144 90 0 83
-88 65 60 -10 645 708 90 90 0
-89 63 58 -20 737 802 90 84 0
-90 60 55 10 20 84 90 0 88
-91 60 60 -10 836 889 90 86 0
-92 67 85 20 368 441 90 0 93
-93 65 85 -20 475 518 90 92 0
-94 65 82 -10 285 336 90 96 0
-95 62 80 -20 196 239 90 98 0
-96 60 80 10 95 156 90 0 94
-97 60 85 30 561 622 0 0 106
-98 58 75 20 30 84 90 0 95
-99 55 80 -20 743 820 90 100 0
-100 55 85 20 647 726 90 0 99
-101 25 30 -10 725 786 90 51 0
-102 48 30 -10 632 693 90 64 0
-103 28 55 -10 732 777 90 23 0
-104 88 35 -20 109 170 90 78 0
-105 5 45 -10 665 716 90 36 0
-106 60 85 -30 561 622 90 97 0
+DROP TABLE IF EXISTS customer CASCADE;
+CREATE TABLE customer (
+ id INTEGER NOT NULL PRIMARY KEY,
+ x INTEGER,
+ y INTEGER,
+ demand INTEGER,
+ openTime INTEGER,
+ closeTime INTEGER,
+ serviceTime INTEGER,
+ pindex INTEGER,
+ dindex INTEGER
+ );
+copy customer (id, x, y, demand, openTime, closeTime, serviceTime, pindex, dindex) from stdin;
+0 40 50 0 0 1236 0 0 0
+1 45 68 -10 912 967 90 11 0
+2 45 70 -20 825 870 90 6 0
+3 42 66 10 65 146 90 0 75
+4 42 68 -10 727 782 90 9 0
+5 42 65 10 15 67 90 0 7
+6 40 69 20 621 702 90 0 2
+7 40 66 -10 170 225 90 5 0
+8 38 68 20 255 324 90 0 10
+9 38 70 10 534 605 90 0 4
+10 35 66 -20 357 410 90 8 0
+11 35 69 10 448 505 90 0 1
+12 25 85 -20 652 721 90 18 0
+13 22 75 30 30 92 90 0 17
+14 22 85 -40 567 620 90 16 0
+15 20 80 -10 384 429 90 19 0
+16 20 85 40 475 528 90 0 14
+17 18 75 -30 99 148 90 13 0
+18 15 75 20 179 254 90 0 12
+19 15 80 10 278 345 90 0 15
+20 30 50 10 10 73 90 0 24
+21 30 52 -10 914 965 90 30 0
+22 28 52 -20 812 883 90 28 0
+23 28 55 10 732 777 0 0 103
+24 25 50 -10 65 144 90 20 0
+25 25 52 40 169 224 90 0 27
+26 25 55 -10 622 701 90 29 0
+27 23 52 -40 261 316 90 25 0
+28 23 55 20 546 593 90 0 22
+29 20 50 10 358 405 90 0 26
+30 20 55 10 449 504 90 0 21
+31 10 35 -30 200 237 90 32 0
+32 10 40 30 31 100 90 0 31
+33 8 40 40 87 158 90 0 37
+34 8 45 -30 751 816 90 38 0
+35 5 35 10 283 344 90 0 39
+36 5 45 10 665 716 0 0 105
+37 2 40 -40 383 434 90 33 0
+38 0 40 30 479 522 90 0 34
+39 0 45 -10 567 624 90 35 0
+40 35 30 -20 264 321 90 42 0
+41 35 32 -10 166 235 90 43 0
+42 33 32 20 68 149 90 0 40
+43 33 35 10 16 80 90 0 41
+44 32 30 10 359 412 90 0 46
+45 30 30 10 541 600 90 0 48
+46 30 32 -10 448 509 90 44 0
+47 30 35 -10 1054 1127 90 49 0
+48 28 30 -10 632 693 90 45 0
+49 28 35 10 1001 1066 90 0 47
+50 26 32 10 815 880 90 0 52
+51 25 30 10 725 786 0 0 101
+52 25 35 -10 912 969 90 50 0
+53 44 5 20 286 347 90 0 58
+54 42 10 40 186 257 90 0 60
+55 42 15 -40 95 158 90 57 0
+56 40 5 30 385 436 90 0 59
+57 40 15 40 35 87 90 0 55
+58 38 5 -20 471 534 90 53 0
+59 38 15 -30 651 740 90 56 0
+60 35 5 -40 562 629 90 54 0
+61 50 30 -10 531 610 90 67 0
+62 50 35 20 262 317 90 0 68
+63 50 40 50 171 218 90 0 74
+64 48 30 10 632 693 0 0 102
+65 48 40 10 76 129 90 0 72
+66 47 35 10 826 875 90 0 69
+67 47 40 10 12 77 90 0 61
+68 45 30 -20 734 777 90 62 0
+69 45 35 -10 916 969 90 66 0
+70 95 30 -30 387 456 90 81 0
+71 95 35 20 293 360 90 0 77
+72 53 30 -10 450 505 90 65 0
+73 92 30 -10 478 551 90 76 0
+74 53 35 -50 353 412 90 63 0
+75 45 65 -10 997 1068 90 3 0
+76 90 35 10 203 260 90 0 73
+77 88 30 -20 574 643 90 71 0
+78 88 35 20 109 170 0 0 104
+79 87 30 10 668 731 90 0 80
+80 85 25 -10 769 820 90 79 0
+81 85 35 30 47 124 90 0 70
+82 75 55 20 369 420 90 0 85
+83 72 55 -20 265 338 90 87 0
+84 70 58 20 458 523 90 0 89
+85 68 60 -20 555 612 90 82 0
+86 66 55 10 173 238 90 0 91
+87 65 55 20 85 144 90 0 83
+88 65 60 -10 645 708 90 90 0
+89 63 58 -20 737 802 90 84 0
+90 60 55 10 20 84 90 0 88
+91 60 60 -10 836 889 90 86 0
+92 67 85 20 368 441 90 0 93
+93 65 85 -20 475 518 90 92 0
+94 65 82 -10 285 336 90 96 0
+95 62 80 -20 196 239 90 98 0
+96 60 80 10 95 156 90 0 94
+97 60 85 30 561 622 0 0 106
+98 58 75 20 30 84 90 0 95
+99 55 80 -20 743 820 90 100 0
+100 55 85 20 647 726 90 0 99
+101 25 30 -10 725 786 90 51 0
+102 48 30 -10 632 693 90 64 0
+103 28 55 -10 732 777 90 23 0
+104 88 35 -20 109 170 90 78 0
+105 5 45 -10 665 716 90 36 0
+106 60 85 -30 561 622 90 97 0
diff --git a/src/proposed.rst b/src/proposed.rst
deleted file mode 100644
index b02566e..0000000
--- a/src/proposed.rst
+++ /dev/null
@@ -1,104 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _proposed:
-
-Experimental and Proposed functions
-===============================================================================
-
-:ref:`proposed`
-
-
-..
- begin-warning
-
-.. warning:: These are proposed functions
-
- - They are not officially of the current release.
- - They likely will not be officially be part of the next release:
-
- - The functions might not make use of ANY-INTEGER and ANY-NUMERICAL
- - Name might change.
- - Signature might change.
- - Functionality might change.
- - pgTap tests might be missing.
- - Might need c/c++ coding.
- - May lack documentation.
- - Documentation if any might need to be rewritten.
- - Documentation examples might need to be automatically generated.
- - Might need a lot of feedback from the comunity.
- - Might depend on a proposed function of pgRouting
- - Might depend on a deprecated function of pgRouting
-
-..
- end-warning
-
-
-Proposed functions
-------------------------------------------------
-
-- :ref:`contraction` - Reduce network size using contraction techniques
-
- - :ref:`pgr_contractgraph` - Reduce network size using contraction techniques
-
-- :ref:`maxFlow`
-
- - :ref:`pgr_maxFlowPushRelabel` - Maximum flow using push&relabel algorithm.
- - :ref:`pgr_maxFlowEdmondsKarp` - Maximum flow using Edmonds&Karp algorithm.
- - :ref:`pgr_maxFlowBoykovKolmogorov` - Maximum flow using Boykov&Kolmogorov algorithm.
-
-- :ref:`maxFlowApplications`
-
- - :ref:`pgr_maximumCardinalityMatching` - Calculates a maximum cardinality matching.
- - :ref:`pgr_edgeDisjointPaths` - Calculates edge disjoint paths.
-
-- convenience
-
- - :ref:`pgr_point_to_edgenode` - convert a point geometry to a ``vertex_id`` based on closest edge.
- - :ref:`pgr_points_to_vids` - convert an array of point geometries into vertex ids.
-
-- graph analysis
-
- - :ref:`pgr_labelGraph` - Analyze / label subgraphs within a network
-
-- Vehicle Routing Problems
-
- - :ref:`pgr_gsocvrppdtw` - VRP Pickup & Delivery (Euclidean)
- - :ref:`pgr_vrp_basic` - VRP One Depot
-
-
-.. toctree::
- :hidden:
-
- ../src/contraction/doc/contraction
- ../src/contraction/doc/pgr_contractGraph
- ../src/max_flow/doc/maxFlow
- ../src/max_flow/doc/maxFlowApplications
-
- ../src/convenience/doc/pgr_pointToEdgeNode
- ../src/convenience/doc/pgr_pointsToVids
- ../src/label_graph/doc/pgr_labelGraph
- ../src/vrppdtw/doc/pgr_gsoc_vrppdtw
- ../src/vrp_basic/doc/pgr_vrpOneDepot
-
-
-
-
-
-
-
-..
- The template
- ------------
- - :ref:`pgr_funnyDijkstra`
- .. toctree::
- :hidden:
- ..
- ../src/funnyDijkstra/doc/pgr_funnyDijkstra.rst
-
diff --git a/src/proposedNext.rst b/src/proposedNext.rst
deleted file mode 100644
index 68200e2..0000000
--- a/src/proposedNext.rst
+++ /dev/null
@@ -1,71 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _proposedNext:
-
-Stable proposed Functions
-==================================
-
-..
- from-here
- :ref:`proposedNext`
-
-..
- begin-warning
-
-.. warning::
-
- These are proposed functions for next mayor release.
-
- - They are not officially in the current release.
- - They will likely officially be part of the next mayor release:
-
- - The functions make use of ANY-INTEGER and ANY-NUMERICAL
- - Name might not change. (But still can)
- - Signature might not change. (But still can)
- - Functionality might not change. (But still can)
- - pgTap tests have being done. But might need more.
- - Documentation might need refinement.
-
-..
- end-warning
-
-
-- As part of the :ref:`dijkstra`
-
- - :ref:`pgr_dijkstraCostMatrix` Use pgr_dijkstra to calculate a cost matrix.
- - :ref:`pgr_dijkstraVia` - Use pgr_dijkstra to make a route via vertices.
-
-- A new :ref:`withPoints`
-
- - :ref:`pgr_withPoints` - Route from/to points anywhere on the graph.
- - :ref:`pgr_withPointsCost` - Costs of the shortest paths.
- - :ref:`pgr_withPointsCostMatrix` - Use pgr_withPoints to calculate a cost matrix.
- - :ref:`pgr_withPointsKSP` - K shortest paths with points.
- - :ref:`pgr_withPointsDD` - Driving distance.
-
-
-- A new Section
-
- - :ref:`CostMatrix`
-
-
-..
- to-here
-
-.. toctree::
- :hidden:
-
- ../src/costMatrix/doc/pgr_dijkstraCostMatrix
- ../src/dijkstra/doc/pgr_dijkstraVia
-
- ../src/withPoints/doc/withPoints
-
- ../src/costMatrix/doc/costMatrix
-
diff --git a/src/routingFunctions.rst b/src/routingFunctions.rst
deleted file mode 100644
index 828ce75..0000000
--- a/src/routingFunctions.rst
+++ /dev/null
@@ -1,65 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-
-.. _routing_functions:
-
-*******************************************************************************
-Routing Functions
-*******************************************************************************
-
-..
- from-here
-
-
-- :ref:`All pairs<all_pairs>` - All pair of vertices.
-
- - :ref:`pgr_floydWarshall<pgr_floydWarshall>` - Floyd-Warshall's Algorithm
- - :ref:`pgr_johnson<pgr_johnson>`- Johnson’s Algorithm
-
-- :ref:`pgr_astar<pgr_astar>` - Shortest Path A*
-- :ref:`pgr_bdAstar<bd_astar>` - Bi-directional A* Shortest Path
-- :ref:`pgr_bdDijkstra<bd_dijkstra>` - Bi-directional Dijkstra Shortest Path
-- :ref:`dijkstra<dijkstra>` - Dijkstra family functions
-
- - :ref:`pgr_dijkstra` - Dijkstra's shortest path algorithm.
- - :ref:`pgr_dijkstraCost` - Use pgr_dijkstra to calculate the costs of the shortest paths.
-
-- :ref:`Driving Distance<drivingDistance>` - Driving Distance
-
- - :ref:`pgr_drivingDistance<pgr_drivingDistance>` - Driving Distance
-
- - Post processing
-
- - :ref:`pgr_alphaShape` - Alpha shape computation
- - :ref:`pgr_points_as_polygon` - Polygon around set of points
-
-- :ref:`pgr_ksp<pgr_ksp>` - K-Shortest Path
-- :ref:`pgr_trsp<trsp>` - Turn Restriction Shortest Path (TRSP)
-- :ref:`tsp`
-
- - :ref:`pgr_TSP<pgr_TSP>` - When input is a cost matrix.
- - :ref:`pgr_eucledianTSP<pgr_eucledianTSP>` - When input are coordinates.
-
-..
- to-here
-
-.. toctree::
- :hidden:
-
- ../src/allpairs/doc/allpairs
- ../src/astar/doc/pgr_astar
- ../src/bd_astar/doc/pgr_bdAstar
- ../src/bd_dijkstra/doc/pgr_bdDijkstra
- ../src/dijkstra/doc/dijkstra
- ../src/driving_distance/doc/drivingDistance
- ../src/ksp/doc/pgr_ksp
- ../src/tsp/doc/tsp
- ../src/trsp/doc/pgr_trsp
-
diff --git a/src/topology/doc/doc-pgr_analyzeGraph.queries b/src/topology/doc/doc-pgr_analyzeGraph.queries
index ca91813..b98fe3c 100644
--- a/src/topology/doc/doc-pgr_analyzeGraph.queries
+++ b/src/topology/doc/doc-pgr_analyzeGraph.queries
@@ -317,7 +317,7 @@ NOTICE: Ring geometries: 0
(1 row)
SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
- rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
+ rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
NOTICE: PROCESSING:
NOTICE: pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt','mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)')
NOTICE: Performing checks, please wait ...
@@ -338,7 +338,7 @@ NOTICE: Ring geometries: 0
(1 row)
SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
+ rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
NOTICE: PROCESSING:
NOTICE: pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt','mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)')
NOTICE: Performing checks, please wait ...
@@ -363,7 +363,7 @@ DROP TABLE
CREATE TABLE otherTable AS (SELECT 'myhouse'::text AS place, st_point(2.5,2.5) AS other_geom) ;
SELECT 1
SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
- rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
+ rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
NOTICE: PROCESSING:
NOTICE: pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt','mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='myhouse')')
NOTICE: Performing checks, please wait ...
@@ -384,7 +384,7 @@ NOTICE: Ring geometries: 0
(1 row)
SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
+ rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
NOTICE: PROCESSING:
NOTICE: pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt','mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='myhouse')')
NOTICE: Performing checks, please wait ...
diff --git a/src/topology/doc/doc-pgr_createTopology.queries b/src/topology/doc/doc-pgr_createTopology.queries
index 04a87d7..a20f5f9 100644
--- a/src/topology/doc/doc-pgr_createTopology.queries
+++ b/src/topology/doc/doc-pgr_createTopology.queries
@@ -28,7 +28,7 @@ UPDATE edge_table SET source = NULL, target = NULL;
UPDATE 18
--q2
SELECT pgr_createTopology('edge_table', 0.001,
- 'the_geom', 'id', 'source', 'target');
+ 'the_geom', 'id', 'source', 'target');
NOTICE: PROCESSING:
NOTICE: pgr_createTopology('edge_table', 0.001, 'the_geom', 'id', 'source', 'target', rows_where := 'true', clean := f)
NOTICE: Performing checks, please wait .....
@@ -47,7 +47,7 @@ SET client_min_messages TO NOTICE;
SET
--q3
SELECT pgr_createTopology('edge_table', 0.001,
- 'id', 'the_geom');
+ 'id', 'the_geom');
NOTICE: PROCESSING:
NOTICE: pgr_createTopology('edge_table', 0.001, 'id', 'the_geom', 'source', 'target', rows_where := 'true', clean := f)
NOTICE: Performing checks, please wait .....
@@ -67,7 +67,7 @@ UPDATE edge_table SET source = NULL, target = NULL;
UPDATE 18
--q4
SELECT pgr_createTopology('edge_table', 0.001,
- the_geom:='the_geom', id:='id', source:='source', target:='target');
+ the_geom:='the_geom', id:='id', source:='source', target:='target');
pgr_createtopology
--------------------
OK
@@ -80,7 +80,7 @@ UPDATE edge_table SET source = NULL, target = NULL;
UPDATE 18
--q5
SELECT pgr_createTopology('edge_table', 0.001,
- source:='source', id:='id', target:='target', the_geom:='the_geom');
+ source:='source', id:='id', target:='target', the_geom:='the_geom');
pgr_createtopology
--------------------
OK
@@ -109,7 +109,7 @@ SELECT pgr_createTopology('edge_table', 0.001, rows_where:='id < 10');
--q7.1
--q8
SELECT pgr_createTopology('edge_table', 0.001,
- rows_where:='the_geom && (SELECT st_buffer(the_geom, 0.05) FROM edge_table WHERE id=5)');
+ rows_where:='the_geom && (SELECT st_buffer(the_geom, 0.05) FROM edge_table WHERE id=5)');
pgr_createtopology
--------------------
OK
@@ -120,7 +120,7 @@ SELECT pgr_createTopology('edge_table', 0.001,
CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5, 2.5) AS other_geom);
SELECT 1
SELECT pgr_createTopology('edge_table', 0.001,
- rows_where:='the_geom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+ rows_where:='the_geom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
pgr_createtopology
--------------------
OK
@@ -194,14 +194,14 @@ SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='
(1 row)
SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
- rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
+ rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
+ rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
pgr_createtopology
--------------------
OK
@@ -210,14 +210,14 @@ SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='
--q15.1
--q16
SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
- rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+ rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
pgr_createtopology
--------------------
OK
(1 row)
SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+ rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
pgr_createtopology
--------------------
OK
diff --git a/src/topology/doc/pgr_analyzeGraph.rst b/src/topology/doc/pgr_analyzeGraph.rst
index 9b8ae88..e8feffe 100644
--- a/src/topology/doc/pgr_analyzeGraph.rst
+++ b/src/topology/doc/pgr_analyzeGraph.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -25,14 +25,14 @@ Synopsis
The function returns:
- ``OK`` after the analysis has finished.
- - ``FAIL`` when the analysis was not completed due to an error.
+ - ``FAIL`` when the analysis was not completed due to an error.
-.. index::
+.. index::
single: analyzeGraph(Complete Signature)
.. code-block:: sql
- varchar pgr_analyzeGraph(text edge_table, double precision tolerance,
+ varchar pgr_analyzeGraph(text edge_table, double precision tolerance,
text the_geom:='the_geom', text id:='id',
text source:='source',text target:='target',text rows_where:='true')
@@ -44,7 +44,7 @@ Description
The edge table to be analyzed must contain a source column and a target column filled with id's of the vertices of the segments and the corresponding vertices table <edge_table>_vertices_pgr that stores the vertices information.
- Use :ref:`pgr_createVerticesTable <pgr_create_vert_table>` to create the vertices table.
- - Use :ref:`pgr_createTopology <pgr_create_topology>` to create the topology and the vertices table.
+ - Use :ref:`pgr_createTopology <pgr_create_topology>` to create the topology and the vertices table.
.. rubric:: Parameters
@@ -52,10 +52,10 @@ The analyze graph function accepts the following parameters:
:edge_table: ``text`` Network table name. (may contain the schema name as well)
:tolerance: ``float8`` Snapping tolerance of disconnected edges. (in projection unit)
-:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
-:id: ``text`` Primary key column name of the network table. Default value is ``id``.
+:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
+:id: ``text`` Primary key column name of the network table. Default value is ``id``.
:source: ``text`` Source column name of the network table. Default value is ``source``.
-:target: ``text`` Target column name of the network table. Default value is ``target``.
+:target: ``text`` Target column name of the network table. Default value is ``target``.
:rows_where: ``text`` Condition to select a subset or rows. Default value is ``true`` to indicate all rows.
The function returns:
@@ -66,7 +66,7 @@ The function returns:
* Fills completely the ``cnt`` and ``chk`` columns of the vertices table.
* Returns the analysis of the section of the network defined by ``rows_where``
- - ``FAIL`` when the analysis was not completed due to an error.
+ - ``FAIL`` when the analysis was not completed due to an error.
* The vertices table is not found.
* A required column of the Network table is not found or is not of the appropriate type.
@@ -82,10 +82,10 @@ The vertices table can be created with :ref:`pgr_createVerticesTable <pgr_create
The structure of the vertices table is:
:id: ``bigint`` Identifier of the vertex.
-:cnt: ``integer`` Number of vertices in the edge_table that reference this vertex.
-:chk: ``integer`` Indicator that the vertex might have a problem.
+:cnt: ``integer`` Number of vertices in the edge_table that reference this vertex.
+:chk: ``integer`` Indicator that the vertex might have a problem.
:ein: ``integer`` Number of vertices in the edge_table that reference this vertex as incoming. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
-:eout: ``integer`` Number of vertices in the edge_table that reference this vertex as outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
+:eout: ``integer`` Number of vertices in the edge_table that reference this vertex as outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
:the_geom: ``geometry`` Point geometry of the vertex.
.. rubric:: History
@@ -94,8 +94,8 @@ The structure of the vertices table is:
Usage when the edge table's columns MATCH the default values:
-------------------------------------------------------------------------------
-
-.. rubric:: The simplest way to use pgr_analyzeGraph is:
+
+.. rubric:: The simplest way to use pgr_analyzeGraph is:
.. code-block:: sql
@@ -110,7 +110,7 @@ Usage when the edge table's columns MATCH the default values:
We get the same result as the simplest way to use the function.
-.. warning:: | An error would occur when the arguments are not given in the appropriate order: In this example, the column ``id`` of the table ``mytable`` is passed to the function as the geometry column, and the geometry column ``the_geom`` is passed to the function as the id column.
+.. warning:: | An error would occur when the arguments are not given in the appropriate order: In this example, the column ``id`` of the table ``mytable`` is passed to the function as the geometry column, and the geometry column ``the_geom`` is passed to the function as the id column.
| ``SELECT pgr_analyzeGraph('edge_table',0.001,'id','the_geom','source','target');``
| ERROR: Can not determine the srid of the geometry "id" in table public.edge_table
@@ -158,7 +158,7 @@ Selecting the rows where the geometry is near the geometry of the row with ``gid
Usage when the edge table's columns DO NOT MATCH the default values:
-------------------------------------------------------------------------------
-
+
For the following table
.. code-block:: sql
@@ -167,7 +167,7 @@ For the following table
CREATE TABLE mytable AS (SELECT id AS gid, source AS src ,target AS tgt , the_geom AS mygeom FROM edge_table);
SELECT pgr_createTopology('mytable',0.001,'mygeom','gid','src','tgt');
-.. rubric:: Using positional notation:
+.. rubric:: Using positional notation:
The arguments need to be given in the order described in the parameters:
@@ -256,7 +256,7 @@ Examples
NOTICE: Potential gaps found near dead ends: 1
NOTICE: Intersections detected: 1
NOTICE: Ring geometries: 0
-
+
pgr_analyzeGraph
--------------------
OK
@@ -298,7 +298,7 @@ Examples
NOTICE: Potential gaps found near dead ends: 1
NOTICE: Intersections detected: 1
NOTICE: Ring geometries: 0
-
+
pgr_analyzeGraph
--------------------
OK
@@ -321,7 +321,7 @@ Examples
NOTICE: Potential gaps found near dead ends: 0
NOTICE: Intersections detected: 0
NOTICE: Ring geometries: 0
-
+
pgr_analyzeGraph
--------------------
OK
@@ -335,7 +335,7 @@ Examples
NOTICE: Rows with NULL geometry or NULL id: 0
NOTICE: Vertices table for table public.edge_table is: public.edge_table_vertices_pgr
NOTICE: ----------------------------------------------
-
+
pgr_analyzeGraph
--------------------
OK
@@ -356,12 +356,12 @@ Examples
NOTICE: Potential gaps found near dead ends: 0
NOTICE: Intersections detected: 0
NOTICE: Ring geometries: 0
-
+
pgr_analyzeGraph
--------------------
OK
(1 row)
-
+
The examples use the :ref:`sampledata` network.
diff --git a/src/topology/doc/pgr_analyzeOneWay.rst b/src/topology/doc/pgr_analyzeOneWay.rst
index 8e344f7..8ed5716 100644
--- a/src/topology/doc/pgr_analyzeOneWay.rst
+++ b/src/topology/doc/pgr_analyzeOneWay.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -22,16 +22,16 @@ Name
Synopsis
-------------------------------------------------------------------------------
-This function analyzes oneway streets in a graph and identifies any flipped segments.
+This function analyzes oneway streets in a graph and identifies any flipped segments.
-.. index::
+.. index::
single: analyzeOneway(Complete Signature)
.. code-block:: sql
- text pgr_analyzeOneway(geom_table text,
- text[] s_in_rules, text[] s_out_rules,
- text[] t_in_rules, text[] t_out_rules,
+ text pgr_analyzeOneway(geom_table text,
+ text[] s_in_rules, text[] s_out_rules,
+ text[] t_in_rules, text[] t_out_rules,
text oneway='oneway', text source='source', text target='target',
boolean two_way_if_null=true);
@@ -50,7 +50,7 @@ So by counting the number of edges entering and exiting each node we can identif
The edge table to be analyzed must contain a source column and a target column filled with id's of the vertices of the segments and the corresponding vertices table <edge_table>_vertices_pgr that stores the vertices information.
- Use :ref:`pgr_createVerticesTable <pgr_create_vert_table>` to create the vertices table.
- - Use :ref:`pgr_createTopology <pgr_create_topology>` to create the topology and the vertices table.
+ - Use :ref:`pgr_createTopology <pgr_create_topology>` to create the topology and the vertices table.
.. rubric:: Parameters
@@ -61,7 +61,7 @@ The edge table to be analyzed must contain a source column and a target column
:t_out_rules: ``text[]`` target node **out** rules
:oneway: ``text`` oneway column name name of the network table. Default value is ``oneway``.
:source: ``text`` Source column name of the network table. Default value is ``source``.
-:target: ``text`` Target column name of the network table. Default value is ``target``.
+:target: ``text`` Target column name of the network table. Default value is ``target``.
:two_way_if_null: ``boolean`` flag to treat oneway NULL values as bi-directional. Default value is ``true``.
.. note:: It is strongly recommended to use the named notation. See :ref:`pgr_createVerticesTable <pgr_create_vert_table>` or :ref:`pgr_createTopology <pgr_create_topology>` for examples.
@@ -74,7 +74,7 @@ The function returns:
* Uses the vertices table: <edge_table>_vertices_pgr.
* Fills completely the ``ein`` and ``eout`` columns of the vertices table.
- - ``FAIL`` when the analysis was not completed due to an error.
+ - ``FAIL`` when the analysis was not completed due to an error.
* The vertices table is not found.
* A required column of the Network table is not found or is not of the appropriate type.
@@ -91,7 +91,7 @@ The structure of the vertices table is:
:id: ``bigint`` Identifier of the vertex.
:cnt: ``integer`` Number of vertices in the edge_table that reference this vertex. See :ref:`pgr_analyzeGgraph <pgr_analyze_graph>`.
:chk: ``integer`` Indicator that the vertex might have a problem. See :ref:`pgr_analyzeGraph <pgr_analyze_graph>`.
-:ein: ``integer`` Number of vertices in the edge_table that reference this vertex as incoming.
+:ein: ``integer`` Number of vertices in the edge_table that reference this vertex as incoming.
:eout: ``integer`` Number of vertices in the edge_table that reference this vertex as outgoing.
:the_geom: ``geometry`` Point geometry of the vertex.
@@ -106,7 +106,7 @@ Examples
.. code-block:: sql
- SELECT pgr_analyzeOneway('edge_table',
+ SELECT pgr_analyzeOneway('edge_table',
ARRAY['', 'B', 'TF'],
ARRAY['', 'B', 'FT'],
ARRAY['', 'B', 'FT'],
@@ -121,7 +121,7 @@ Examples
NOTICE: Analysis 100% complete ...
NOTICE: Found 0 potential problems in directionality
- pgr_analyzeoneway
+ pgr_analyzeoneway
-------------------
OK
(1 row)
diff --git a/src/topology/doc/pgr_createTopology.rst b/src/topology/doc/pgr_createTopology.rst
index 7f2c4c5..17a5b02 100644
--- a/src/topology/doc/pgr_createTopology.rst
+++ b/src/topology/doc/pgr_createTopology.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -24,14 +24,14 @@ Synopsis
The function returns:
- ``OK`` after the network topology has been built and the vertices table created.
- - ``FAIL`` when the network topology was not built due to an error.
+ - ``FAIL`` when the network topology was not built due to an error.
-.. index::
+.. index::
single: createTopology(Complete Signature)
.. code-block:: none
- varchar pgr_createTopology(text edge_table, double precision tolerance,
+ varchar pgr_createTopology(text edge_table, double precision tolerance,
text the_geom:='the_geom', text id:='id',
text source:='source',text target:='target',
text rows_where:='true', boolean clean:=false)
@@ -47,10 +47,10 @@ The topology creation function accepts the following parameters:
:edge_table: ``text`` Network table name. (may contain the schema name AS well)
:tolerance: ``float8`` Snapping tolerance of disconnected edges. (in projection unit)
-:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
-:id: ``text`` Primary key column name of the network table. Default value is ``id``.
+:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
+:id: ``text`` Primary key column name of the network table. Default value is ``id``.
:source: ``text`` Source column name of the network table. Default value is ``source``.
-:target: ``text`` Target column name of the network table. Default value is ``target``.
+:target: ``text`` Target column name of the network table. Default value is ``target``.
:rows_where: ``text`` Condition to SELECT a subset or rows. Default value is ``true`` to indicate
all rows that where ``source`` or ``target`` have a null value, otherwise the condition is used.
:clean: ``boolean`` Clean any previous topology. Default value is ``false``.
@@ -95,7 +95,7 @@ The structure of the vertices table is:
:cnt: ``integer`` Number of vertices in the edge_table that reference this vertex. See :ref:`pgr_analyzeGraph <pgr_analyze_graph>`.
:chk: ``integer`` Indicator that the vertex might have a problem. See :ref:`pgr_analyzeGraph <pgr_analyze_graph>`.
:ein: ``integer`` Number of vertices in the edge_table that reference this vertex AS incoming. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
-:eout: ``integer`` Number of vertices in the edge_table that reference this vertex AS outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
+:eout: ``integer`` Number of vertices in the edge_table that reference this vertex AS outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
:the_geom: ``geometry`` Point geometry of the vertex.
.. rubric:: History
@@ -104,8 +104,8 @@ The structure of the vertices table is:
Usage when the edge table's columns MATCH the default values:
-------------------------------------------------------------------------------
-
-.. rubric:: The simplest way to use pgr_createTopology is:
+
+.. rubric:: The simplest way to use pgr_createTopology is:
.. literalinclude:: doc-pgr_createTopology.queries
:start-after: --q1
@@ -124,7 +124,7 @@ We get the same result AS the simplest way to use the function.
.. warning:: | An error would occur when the arguments are not given in the appropriate order:
| In this example, the column ``id`` of the table ``ege_table`` is passed to the function as the geometry column,
- | and the geometry column ``the_geom`` is passed to the function as the id column.
+ | and the geometry column ``the_geom`` is passed to the function as the id column.
.. literalinclude:: doc-pgr_createTopology.queries
:start-after: --q3
@@ -173,14 +173,14 @@ Selecting the rows where the geometry is near the geometry of the row with ``gid
Usage when the edge table's columns DO NOT MATCH the default values:
-------------------------------------------------------------------------------
-
+
For the following table
.. literalinclude:: doc-pgr_createTopology.queries
:start-after: --q10
:end-before: --q10.1
-.. rubric:: Using positional notation:
+.. rubric:: Using positional notation:
The arguments need to be given in the order described in the parameters.
diff --git a/src/topology/doc/pgr_createVerticesTable.rst b/src/topology/doc/pgr_createVerticesTable.rst
index 8872b01..d7ffa04 100644
--- a/src/topology/doc/pgr_createVerticesTable.rst
+++ b/src/topology/doc/pgr_createVerticesTable.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,7 +9,7 @@
.. _pgr_create_vert_table:
-pgr_createVerticesTable
+pgr_createVerticesTable
===============================================================================
Name
@@ -24,9 +24,9 @@ Synopsis
The function returns:
- ``OK`` after the vertices table has been reconstructed.
- - ``FAIL`` when the vertices table was not reconstructed due to an error.
+ - ``FAIL`` when the vertices table was not reconstructed due to an error.
-.. index::
+.. index::
single: createVerticesTable(Complete Signature)
.. code-block:: sql
@@ -44,9 +44,9 @@ Description
The reconstruction of the vertices table function accepts the following parameters:
:edge_table: ``text`` Network table name. (may contain the schema name as well)
-:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
+:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
:source: ``text`` Source column name of the network table. Default value is ``source``.
-:target: ``text`` Target column name of the network table. Default value is ``target``.
+:target: ``text`` Target column name of the network table. Default value is ``target``.
:rows_where: ``text`` Condition to SELECT a subset or rows. Default value is ``true`` to indicate all rows.
.. warning::
@@ -66,7 +66,7 @@ The function returns:
* Creates a vertices table: <edge_table>_vertices_pgr.
* Fills ``id`` and ``the_geom`` columns of the vertices table based on the source and target columns of the edge table.
- - ``FAIL`` when the vertices table was not reconstructed due to an error.
+ - ``FAIL`` when the vertices table was not reconstructed due to an error.
* A required column of the Network table is not found or is not of the appropriate type.
* The condition is not well formed.
@@ -83,7 +83,7 @@ The structure of the vertices table is:
:cnt: ``integer`` Number of vertices in the edge_table that reference this vertex. See :ref:`pgr_analyzeGraph <pgr_analyze_graph>`.
:chk: ``integer`` Indicator that the vertex might have a problem. See :ref:`pgr_analyzeGraph <pgr_analyze_graph>`.
:ein: ``integer`` Number of vertices in the edge_table that reference this vertex as incoming. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
-:eout: ``integer`` Number of vertices in the edge_table that reference this vertex as outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
+:eout: ``integer`` Number of vertices in the edge_table that reference this vertex as outgoing. See :ref:`pgr_analyzeOneway <pgr_analyze_oneway>`.
:the_geom: ``geometry`` Point geometry of the vertex.
.. rubric:: History
@@ -92,8 +92,8 @@ The structure of the vertices table is:
Usage when the edge table's columns MATCH the default values:
-------------------------------------------------------------------------------
-
-.. rubric:: The simplest way to use pgr_createVerticesTable is:
+
+.. rubric:: The simplest way to use pgr_createVerticesTable is:
.. code-block:: sql
@@ -108,7 +108,7 @@ Usage when the edge table's columns MATCH the default values:
We get the same result as the simplest way to use the function.
-.. warning:: | An error would occur when the arguments are not given in the appropriate order: In this example, the column source column ``source`` of the table ``mytable`` is passed to the function as the geometry column, and the geometry column ``the_geom`` is passed to the function as the source column.
+.. warning:: | An error would occur when the arguments are not given in the appropriate order: In this example, the column source column ``source`` of the table ``mytable`` is passed to the function as the geometry column, and the geometry column ``the_geom`` is passed to the function as the source column.
| ``SELECT pgr_createVerticesTable('edge_table','source','the_geom','target');``
@@ -149,14 +149,14 @@ Selecting the rows where the geometry is near the geometry of the row with ``gid
.. code-block:: sql
DROP TABLE IF EXISTS otherTable;
- CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
+ CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
SELECT pgr_createVerticesTable('edge_table',rows_where:='the_geom && (select st_buffer(othergeom,0.5) FROM otherTable WHERE gid=100)');
Usage when the edge table's columns DO NOT MATCH the default values:
-------------------------------------------------------------------------------
-
+
For the following table
.. code-block:: sql
@@ -164,7 +164,7 @@ For the following table
DROP TABLE IF EXISTS mytable;
CREATE TABLE mytable AS (SELECT id AS gid, the_geom AS mygeom,source AS src ,target AS tgt FROM edge_table) ;
-.. rubric:: Using positional notation:
+.. rubric:: Using positional notation:
The arguments need to be given in the order described in the parameters:
@@ -220,7 +220,7 @@ Selecting the rows where the geometry is near the geometry of the row with ``gid
.. code-block:: sql
DROP TABLE IF EXISTS otherTable;
- CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
+ CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
SELECT pgr_createVerticesTable('mytable','mygeom','src','tgt',
rows_where:='the_geom && (SELECT st_buffer(othergeom,0.5) FROM otherTable WHERE gid=100)');
@@ -247,8 +247,8 @@ Examples
NOTICE: Edges processed: 18
NOTICE: Vertices table for table public.edge_table is: public.edge_table_vertices_pgr
NOTICE: ----------------------------------------------
-
- pgr_createVerticesTable
+
+ pgr_createVerticesTable
--------------------
OK
(1 row)
diff --git a/src/topology/doc/pgr_nodeNetwork.rst b/src/topology/doc/pgr_nodeNetwork.rst
index 918608c..712316f 100644
--- a/src/topology/doc/pgr_nodeNetwork.rst
+++ b/src/topology/doc/pgr_nodeNetwork.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -26,14 +26,14 @@ Synopsis
The function reads edges from a not "noded" network table and writes the "noded" edges into a new table.
-.. index::
+.. index::
single: pgr_NodeNetwork(Complete Signature)
.. code-block:: sql
pgr_nodenetwork(edge_table, tolerance, id, text the_geom, table_ending, rows_where, outall)
RETURNS TEXT
-
+
Description
-------------------------------------------------------------------------------
@@ -42,7 +42,7 @@ A common problem associated with bringing GIS data into pgRouting is the fact th
What we mean by "noded" is that at every intersection in the road network all the edges will be broken into separate road segments. There are cases like an over-pass and under-pass intersection where you can not traverse from the over-pass to the under-pass, but this function does not have the ability to detect and accommodate those situations.
-This function reads the ``edge_table`` table, that has a primary key column ``id`` and geometry column named ``the_geom`` and intersect all the segments in it against all the other segments and then creates a table ``edge_table_noded``. It uses the ``tolerance`` for deciding that multiple nodes within the tolerance are considered the same node.
+This function reads the ``edge_table`` table, that has a primary key column ``id`` and geometry column named ``the_geom`` and intersect all the segments in it against all the other segments and then creates a table ``edge_table_noded``. It uses the ``tolerance`` for deciding that multiple nodes within the tolerance are considered the same node.
Parameters
@@ -52,7 +52,7 @@ Parameters
:the_geom: ``text`` Geometry column name of the network table. Default value is ``the_geom``.
:table_ending: ``text`` Suffix for the new table's. Default value is ``noded``.
-The output table will have for ``edge_table_noded``
+The output table will have for ``edge_table_noded``
:id: ``bigint`` Unique identifier for the table
:old_id: ``bigint`` Identifier of the edge in original table
@@ -82,11 +82,11 @@ Let's create the topology for the data in :ref:`sampledata`
NOTICE: Rows with NULL geometry or NULL id: 0
NOTICE: Vertices table for table public.edge_table is: public.edge_table_vertices_pgr
NOTICE: ----------------------------------------------
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
-
+
Now we can analyze the network.
.. code-block:: sql
@@ -106,7 +106,7 @@ Now we can analyze the network.
NOTICE: Potential gaps found near dead ends: 1
NOTICE: Intersections detected: 1
NOTICE: Ring geometries: 0
- pgr_analyzegraph
+ pgr_analyzegraph
------------------
OK
(1 row)
@@ -128,17 +128,17 @@ The analysis tell us that the network has a gap and and an intersection. We try
NOTICE: Total New segments: 21
NOTICE: New Table: public.edge_table_noded
NOTICE: ----------------------------------
- pgr_nodenetwork
+ pgr_nodenetwork
-----------------
OK
(1 row)
-
+
Inspecting the generated table, we can see that edges 13,14 and 18 has been segmented
.. code-block:: sql
SELECT old_id,sub_id FROM edge_table_noded ORDER BY old_id,sub_id;
- old_id | sub_id
+ old_id | sub_id
--------+--------
1 | 1
2 | 1
@@ -162,7 +162,7 @@ Inspecting the generated table, we can see that edges 13,14 and 18 has been segm
18 | 1
18 | 2
(21 rows)
-
+
We can create the topology of the new network
.. code-block:: sql
@@ -176,16 +176,16 @@ We can create the topology of the new network
NOTICE: Rows with NULL geometry or NULL id: 0
NOTICE: Vertices table for table public.edge_table_noded is: public.edge_table_noded_vertices_pgr
NOTICE: ----------------------------------------------
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
-
+
Now let's analyze the new topology
.. code-block:: sql
- SELECT pgr_analyzegraph('edge_table_noded', 0.001);
+ SELECT pgr_analyzegraph('edge_table_noded', 0.001);
NOTICE: PROCESSING:
NOTICE: pgr_analyzeGraph('edge_table_noded',0.001,'the_geom','id','source','target','true')
NOTICE: Performing checks, pelase wait...
@@ -200,7 +200,7 @@ Now let's analyze the new topology
NOTICE: Potential gaps found near dead ends: 0
NOTICE: Intersections detected: 0
NOTICE: Ring geometries: 0
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
@@ -225,24 +225,24 @@ Images
.. Rubric:: Before Image
- .. image:: images/before_node_net.png
+ .. image:: images/before_node_net.png
:scale: 60%
- :alt: before image
+ :alt: before image
:align: left
.. Rubric:: After Image
- .. image:: images/after_node_net.png
+ .. image:: images/after_node_net.png
:scale: 60%
- :alt: after image
+ :alt: after image
:align: left
Comparing the results
-------------------------------------------------------------------------------
-Comparing with the Analysis in the original edge_table, we see that.
+Comparing with the Analysis in the original edge_table, we see that.
+------------------+-----------------------------------------+--------------------------------------------------------------+
| | Before | After |
@@ -275,7 +275,7 @@ Now, we are going to include the segments 13-1, 13-2 14-1, 14-2 ,18-1 and 18-2 i
- Add a column old_id into edge_table, this column is going to keep track the id of the original edge
- Insert only the segmented edges, that is, the ones whose max(sub_id) >1
-
+
.. code-block:: sql
alter table edge_table drop column if exists old_id;
@@ -284,7 +284,7 @@ Now, we are going to include the segments 13-1, 13-2 14-1, 14-2 ,18-1 and 18-2 i
(with
segmented as (select old_id,count(*) as i from edge_table_noded group by old_id)
select segments.old_id,dir,cost,reverse_cost,segments.the_geom
- from edge_table as edges join edge_table_noded as segments on (edges.id = segments.old_id)
+ from edge_table as edges join edge_table_noded as segments on (edges.id = segments.old_id)
where edges.id in (select old_id from segmented where i>1) );
We recreate the topology:
@@ -301,7 +301,7 @@ We recreate the topology:
NOTICE: Rows with NULL geometry or NULL id: 0
NOTICE: Vertices table for table public.edge_table is: public.edge_table_vertices_pgr
NOTICE: ----------------------------------------------
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
@@ -328,7 +328,7 @@ To get the same analysis results as the topology of edge_table_noded, we do the
NOTICE: Potential gaps found near dead ends: 0
NOTICE: Intersections detected: 0
NOTICE: Ring geometries: 0
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
@@ -354,7 +354,7 @@ To get the same analysis results as the original edge_table, we do the following
NOTICE: Potential gaps found near dead ends: 1
NOTICE: Intersections detected: 1
NOTICE: Ring geometries: 0
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
@@ -379,7 +379,7 @@ Or we can analyze everything because, maybe edge 18 is an overpass, edge 14 is a
NOTICE: Potential gaps found near dead ends: 0
NOTICE: Intersections detected: 5
NOTICE: Ring geometries: 0
- pgr_createtopology
+ pgr_createtopology
--------------------
OK
(1 row)
diff --git a/src/topology/doc/topology.rst b/src/topology/doc/topology-functions.rst
similarity index 82%
rename from src/topology/doc/topology.rst
rename to src/topology/doc/topology-functions.rst
index a3aefbb..67e78e0 100644
--- a/src/topology/doc/topology.rst
+++ b/src/topology/doc/topology-functions.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,25 +9,25 @@
.. _topology_functions:
-Topology Functions
+Topology - Family of Functions
===============================================================================
-The pgRouting's topology of a network, represented with an edge table with source and target attributes and a vertices table associated with it.
-Depending on the algorithm, you can create a topology or just reconstruct the vertices table, You can analyze the topology,
+The pgRouting's topology of a network, represented with an edge table with source and target attributes and a vertices table associated with it.
+Depending on the algorithm, you can create a topology or just reconstruct the vertices table, You can analyze the topology,
We also provide a function to node an unoded network.
- - :ref:`pgr_create_topology` - to create a topology based on the geometry.
+ - :ref:`pgr_create_topology` - to create a topology based on the geometry.
- :ref:`pgr_create_vert_table` - to reconstruct the vertices table based on the source and target information.
- :ref:`pgr_analyze_graph` - to analyze the edges and vertices of the edge table.
- :ref:`pgr_analyze_oneway` - to analyze directionality of the edges.
- :ref:`pgr_node_network` -to create nodes to a not noded edge table.
.. toctree::
- :hidden:
+ :hidden:
- ./pgr_createTopology
- ./pgr_createVerticesTable
- ./pgr_analyzeGraph
- ./pgr_analyzeOneWay
- ./pgr_nodeNetwork
+ pgr_createTopology
+ pgr_createVerticesTable
+ pgr_analyzeGraph
+ pgr_analyzeOneWay
+ pgr_nodeNetwork
diff --git a/src/topology/test/analyzeOneway-any.test.sql b/src/topology/test/analyzeOneway-any.test.sql
index 3c08288..36123e8 100644
--- a/src/topology/test/analyzeOneway-any.test.sql
+++ b/src/topology/test/analyzeOneway-any.test.sql
@@ -1,9 +1,7 @@
-BEGIN;
---------------------------------------------------------------------------------------
-- pgr_analyzeOneway
---------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
SELECT pgr_analyzeOneway('edge_table',
ARRAY['', 'B', 'TF'],
@@ -11,4 +9,3 @@ ARRAY['', 'B', 'FT'],
ARRAY['', 'B', 'FT'],
ARRAY['', 'B', 'TF'],
oneway:='dir');
-ROLLBACK;
diff --git a/src/topology/test/createVertTab-any.test.sql b/src/topology/test/createVertTab-any.test.sql
index 8fa90c7..2fbbc3f 100644
--- a/src/topology/test/createVertTab-any.test.sql
+++ b/src/topology/test/createVertTab-any.test.sql
@@ -1,10 +1,8 @@
-BEGIN;
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-- PGR_createVerticesTable
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
-- SELECT pgr_createTopology('edge_table',0.001);
SELECT pgr_createVerticesTable('edge_table');
@@ -38,4 +36,3 @@ SET client_min_messages TO NOTICE;
-------------------------------------
SELECT pgr_createVerticesTable('edge_table');
-ROLLBACK;
diff --git a/src/topology/test/doc-pgr_analyzeGraph.test.sql b/src/topology/test/doc-pgr_analyzeGraph.test.sql
index 21514cc..24fd1e3 100644
--- a/src/topology/test/doc-pgr_analyzeGraph.test.sql
+++ b/src/topology/test/doc-pgr_analyzeGraph.test.sql
@@ -1,52 +1,49 @@
-BEGIN;
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
- -- PGR_analyzegraph
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
- SET client_min_messages TO NOTICE;
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+-- PGR_analyzegraph
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
- SELECT pgr_createTopology('edge_table',0.001, clean := true);
- SELECT pgr_analyzeGraph('edge_table',0.001);
- SELECT pgr_analyzeGraph('edge_table',0.001,'the_geom','id','source','target');
- SELECT pgr_analyzeGraph('edge_table',0.001,'id','the_geom','source','target');
- SELECT pgr_analyzeGraph('edge_table',0.001,the_geom:='the_geom',id:='id',source:='source',target:='target');
- SELECT pgr_analyzeGraph('edge_table',0.001,source:='source',id:='id',target:='target',the_geom:='the_geom');
- SELECT pgr_analyzeGraph('edge_table',0.001,source:='source');
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 10');
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='the_geom && (SELECT st_buffer(the_geom,0.05) FROM edge_table WHERE id=5)');
- CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='the_geom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE gid=100)');
- CREATE TABLE mytable AS (SELECT id AS gid, source AS src ,target AS tgt , the_geom AS mygeom FROM edge_table);
- SELECT pgr_createTopology('mytable',0.001,'mygeom','gid','src','tgt', clean := true);
- SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt');
- SELECT pgr_analyzeGraph('mytable',0.0001,'gid','mygeom','src','tgt');
- SELECT pgr_analyzeGraph('mytable',0.001,the_geom:='mygeom',id:='gid',source:='src',target:='tgt');
- SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom');
- SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',rows_where:='gid < 10');
- SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',rows_where:='gid < 10');
- SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
- rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
- SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
- DROP TABLE IF EXISTS otherTable;
- CREATE TABLE otherTable AS (SELECT 'myhouse'::text AS place, st_point(2.5,2.5) AS other_geom) ;
- SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
- rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
- SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
- --------------------
- SELECT pgr_createTopology('edge_table',0.001, clean := true);
- SELECT pgr_analyzeGraph('edge_table', 0.001);
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 10');
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id >= 10');
- SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 17');
+SELECT pgr_createTopology('edge_table',0.001, clean := true);
+SELECT pgr_analyzeGraph('edge_table',0.001);
+SELECT pgr_analyzeGraph('edge_table',0.001,'the_geom','id','source','target');
+SELECT pgr_analyzeGraph('edge_table',0.001,'id','the_geom','source','target');
+SELECT pgr_analyzeGraph('edge_table',0.001,the_geom:='the_geom',id:='id',source:='source',target:='target');
+SELECT pgr_analyzeGraph('edge_table',0.001,source:='source',id:='id',target:='target',the_geom:='the_geom');
+SELECT pgr_analyzeGraph('edge_table',0.001,source:='source');
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 10');
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='the_geom && (SELECT st_buffer(the_geom,0.05) FROM edge_table WHERE id=5)');
+CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5,2.5) AS other_geom) ;
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='the_geom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE gid=100)');
+CREATE TABLE mytable AS (SELECT id AS gid, source AS src ,target AS tgt , the_geom AS mygeom FROM edge_table);
+SELECT pgr_createTopology('mytable',0.001,'mygeom','gid','src','tgt', clean := true);
+SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt');
+SELECT pgr_analyzeGraph('mytable',0.0001,'gid','mygeom','src','tgt');
+SELECT pgr_analyzeGraph('mytable',0.001,the_geom:='mygeom',id:='gid',source:='src',target:='tgt');
+SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom');
+SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',rows_where:='gid < 10');
+SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',rows_where:='gid < 10');
+SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
+ rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
+SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
+ rows_where:='mygeom && (SELECT st_buffer(mygeom,1) FROM mytable WHERE gid=5)');
+DROP TABLE IF EXISTS otherTable;
+CREATE TABLE otherTable AS (SELECT 'myhouse'::text AS place, st_point(2.5,2.5) AS other_geom) ;
+SELECT pgr_analyzeGraph('mytable',0.001,'mygeom','gid','src','tgt',
+ rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
+SELECT pgr_analyzeGraph('mytable',0.001,source:='src',id:='gid',target:='tgt',the_geom:='mygeom',
+ rows_where:='mygeom && (SELECT st_buffer(other_geom,1) FROM otherTable WHERE place='||quote_literal('myhouse')||')');
+--------------------
+SELECT pgr_createTopology('edge_table',0.001, clean := true);
+SELECT pgr_analyzeGraph('edge_table', 0.001);
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 10');
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id >= 10');
+SELECT pgr_analyzeGraph('edge_table',0.001,rows_where:='id < 17');
- -- Simulate removal of edges
- SELECT pgr_createTopology('edge_table', 0.001,rows_where:='id <17', clean := true);
- SELECT pgr_analyzeGraph('edge_table', 0.001);
+-- Simulate removal of edges
+SELECT pgr_createTopology('edge_table', 0.001,rows_where:='id <17', clean := true);
+SELECT pgr_analyzeGraph('edge_table', 0.001);
- ROLLBACK;
diff --git a/src/topology/test/doc-pgr_createTopology.test.sql b/src/topology/test/doc-pgr_createTopology.test.sql
index 4fb8fd2..b7db2d2 100644
--- a/src/topology/test/doc-pgr_createTopology.test.sql
+++ b/src/topology/test/doc-pgr_createTopology.test.sql
@@ -1,119 +1,117 @@
-BEGIN;
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
- -- pgr_createTopology
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
- ------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+-- pgr_createTopology
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+------------------------------------------------------------------------------------------------------
+
\set VERBOSITY terse
- SET client_min_messages TO NOTICE;
- DROP TABLE edge_table_vertices_pgr;
- UPDATE edge_table SET source = NULL, target = NULL;
- \echo --q1
- SELECT pgr_createTopology('edge_table', 0.001);
- \echo --q1.1
-
- DROP TABLE edge_table_vertices_pgr;
- UPDATE edge_table SET source = NULL, target = NULL;
- \echo --q2
- SELECT pgr_createTopology('edge_table', 0.001,
- 'the_geom', 'id', 'source', 'target');
- \echo --q2.1
-
- SET client_min_messages TO NOTICE;
- \echo --q3
- SELECT pgr_createTopology('edge_table', 0.001,
- 'id', 'the_geom');
- \echo --q3.1
-
- SET client_min_messages TO WARNING;
- DROP TABLE edge_table_vertices_pgr;
- UPDATE edge_table SET source = NULL, target = NULL;
- \echo --q4
- SELECT pgr_createTopology('edge_table', 0.001,
- the_geom:='the_geom', id:='id', source:='source', target:='target');
- \echo --q4.1
-
- DROP TABLE edge_table_vertices_pgr;
- UPDATE edge_table SET source = NULL, target = NULL;
- \echo --q5
- SELECT pgr_createTopology('edge_table', 0.001,
- source:='source', id:='id', target:='target', the_geom:='the_geom');
- \echo --q5.1
-
- DROP TABLE edge_table_vertices_pgr;
- UPDATE edge_table SET source = NULL, target = NULL;
- \echo --q6
- SELECT pgr_createTopology('edge_table', 0.001, source:='source');
- \echo --q6.1
-
- \echo --q7
- SELECT pgr_createTopology('edge_table', 0.001, rows_where:='id < 10');
- \echo --q7.1
-
- \echo --q8
- SELECT pgr_createTopology('edge_table', 0.001,
- rows_where:='the_geom && (SELECT st_buffer(the_geom, 0.05) FROM edge_table WHERE id=5)');
- \echo --q8.1
-
- \echo --q9
- CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5, 2.5) AS other_geom);
- SELECT pgr_createTopology('edge_table', 0.001,
- rows_where:='the_geom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
- \echo --q9.1
-
- -- THE NEXT SECTION
-
- \echo --q10
- CREATE TABLE mytable AS (SELECT id AS gid, the_geom AS mygeom, source AS src , target AS tgt FROM edge_table) ;
- \echo --q10.1
-
- \echo --q11
- SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', clean := TRUE);
- \echo --q11.1
-
- DROP TABLE mytable_vertices_pgr;
- UPDATE mytable SET src = NULL, tgt = NULL;
- SET client_min_messages TO NOTICE;
- \echo --q12
- SELECT pgr_createTopology('mytable', 0.001, 'gid', 'mygeom', 'src', 'tgt');
- \echo --q12.1
- SET client_min_messages TO WARNING;
-
- \echo --q13
- SELECT pgr_createTopology('mytable', 0.001, the_geom:='mygeom', id:='gid', source:='src', target:='tgt');
- \echo --q13.1
-
- DROP TABLE mytable_vertices_pgr;
- UPDATE mytable SET src = NULL, tgt = NULL;
- \echo --q14
- SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom');
- \echo --q14.1
-
- \echo --q15
- SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', rows_where:='gid < 10');
- SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom', rows_where:='gid < 10');
- SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
- rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
- SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
- \echo --q15.1
-
- \echo --q16
- SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
- rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
- SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
- rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
- \echo --q16.1
-
- -------------------------------------------------------------------------------
- SET client_min_messages TO NOTICE;
- \echo --q17
- SELECT pgr_createTopology('edge_table', 0.001, rows_where:='id < 6', clean := true);
- SELECT pgr_createTopology('edge_table', 0.001);
- \echo --q17.1
-
- SET client_min_messages TO NOTICE;
- ROLLBACK;
+DROP TABLE edge_table_vertices_pgr;
+UPDATE edge_table SET source = NULL, target = NULL;
+\echo --q1
+SELECT pgr_createTopology('edge_table', 0.001);
+\echo --q1.1
+
+DROP TABLE edge_table_vertices_pgr;
+UPDATE edge_table SET source = NULL, target = NULL;
+\echo --q2
+SELECT pgr_createTopology('edge_table', 0.001,
+ 'the_geom', 'id', 'source', 'target');
+\echo --q2.1
+
+SET client_min_messages TO NOTICE;
+\echo --q3
+SELECT pgr_createTopology('edge_table', 0.001,
+ 'id', 'the_geom');
+\echo --q3.1
+
+SET client_min_messages TO WARNING;
+DROP TABLE edge_table_vertices_pgr;
+UPDATE edge_table SET source = NULL, target = NULL;
+\echo --q4
+SELECT pgr_createTopology('edge_table', 0.001,
+ the_geom:='the_geom', id:='id', source:='source', target:='target');
+\echo --q4.1
+
+DROP TABLE edge_table_vertices_pgr;
+UPDATE edge_table SET source = NULL, target = NULL;
+\echo --q5
+SELECT pgr_createTopology('edge_table', 0.001,
+ source:='source', id:='id', target:='target', the_geom:='the_geom');
+\echo --q5.1
+
+DROP TABLE edge_table_vertices_pgr;
+UPDATE edge_table SET source = NULL, target = NULL;
+\echo --q6
+SELECT pgr_createTopology('edge_table', 0.001, source:='source');
+\echo --q6.1
+
+\echo --q7
+SELECT pgr_createTopology('edge_table', 0.001, rows_where:='id < 10');
+\echo --q7.1
+
+\echo --q8
+SELECT pgr_createTopology('edge_table', 0.001,
+ rows_where:='the_geom && (SELECT st_buffer(the_geom, 0.05) FROM edge_table WHERE id=5)');
+\echo --q8.1
+
+\echo --q9
+CREATE TABLE otherTable AS (SELECT 100 AS gid, st_point(2.5, 2.5) AS other_geom);
+SELECT pgr_createTopology('edge_table', 0.001,
+ rows_where:='the_geom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+\echo --q9.1
+
+-- THE NEXT SECTION
+
+\echo --q10
+CREATE TABLE mytable AS (SELECT id AS gid, the_geom AS mygeom, source AS src , target AS tgt FROM edge_table) ;
+\echo --q10.1
+
+\echo --q11
+SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', clean := TRUE);
+\echo --q11.1
+
+DROP TABLE mytable_vertices_pgr;
+UPDATE mytable SET src = NULL, tgt = NULL;
+SET client_min_messages TO NOTICE;
+\echo --q12
+SELECT pgr_createTopology('mytable', 0.001, 'gid', 'mygeom', 'src', 'tgt');
+\echo --q12.1
+SET client_min_messages TO WARNING;
+
+\echo --q13
+SELECT pgr_createTopology('mytable', 0.001, the_geom:='mygeom', id:='gid', source:='src', target:='tgt');
+\echo --q13.1
+
+DROP TABLE mytable_vertices_pgr;
+UPDATE mytable SET src = NULL, tgt = NULL;
+\echo --q14
+SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom');
+\echo --q14.1
+
+\echo --q15
+SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt', rows_where:='gid < 10');
+SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom', rows_where:='gid < 10');
+SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
+ rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
+SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
+ rows_where:='mygeom && (SELECT st_buffer(mygeom, 1) FROM mytable WHERE gid=5)');
+\echo --q15.1
+
+\echo --q16
+SELECT pgr_createTopology('mytable', 0.001, 'mygeom', 'gid', 'src', 'tgt',
+ rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+SELECT pgr_createTopology('mytable', 0.001, source:='src', id:='gid', target:='tgt', the_geom:='mygeom',
+ rows_where:='mygeom && (SELECT st_buffer(other_geom, 1) FROM otherTable WHERE gid=100)');
+\echo --q16.1
+
+-------------------------------------------------------------------------------
+SET client_min_messages TO NOTICE;
+\echo --q17
+SELECT pgr_createTopology('edge_table', 0.001, rows_where:='id < 6', clean := true);
+SELECT pgr_createTopology('edge_table', 0.001);
+\echo --q17.1
+
+SET client_min_messages TO NOTICE;
diff --git a/src/topology/test/nodeNetwork-any.test.sql b/src/topology/test/nodeNetwork-any.test.sql
index ec894d2..0c272a4 100644
--- a/src/topology/test/nodeNetwork-any.test.sql
+++ b/src/topology/test/nodeNetwork-any.test.sql
@@ -1,8 +1,6 @@
-BEGIN;
-- pgr_nodeNetwork
--------------------------------------------------------------------------------
-SET client_min_messages TO NOTICE;
SELECT pgr_createTopology('edge_table', 0.001, clean := TRUE);
SELECT pgr_analyzegraph('edge_table', 0.001);
@@ -24,4 +22,3 @@ SELECT pgr_analyzegraph('edge_table', 0.001,rows_where:='id not in (select old_i
SELECT pgr_analyzegraph('edge_table', 0.001,rows_where:='old_id is null');
SELECT pgr_analyzegraph('edge_table', 0.001);
-ROLLBACK;
diff --git a/src/trsp/doc/README.md b/src/trsp/doc/README.md
index 8f42aeb..c2a6c5a 100644
--- a/src/trsp/doc/README.md
+++ b/src/trsp/doc/README.md
@@ -1,4 +1,10 @@
-# Notes on pgr_trsp for version 2.3.2
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
+ROLLBACK;
+ROLLBACK
+# Notes on pgr_trsp for version 2.4.0
Table of contents
* [Introduction](#introduction)
* [The restriction](#the-restriction)
@@ -46,17 +52,18 @@ $$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, 32, 33::TEXT AS via_pa
therefore the shortest path expected are as if there was no restriction involved
# The Vertices signature version
## (Vertices) No path representation differences
-Original code of pgr_trsp throws Error to represent no path found
-Sometimes it crasses the server
+Original function code
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
SELECT * FROM _pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 15, true, true
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 15, true, true
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
```
dijkstra returns EMPTY SET to represent no path found
```
@@ -83,17 +90,14 @@ SELECT * FROM pgr_TRSP(
```
pgr_trsp use the original code when there are restrictions
therefore throws Error to represent no path found
-Can get a server crash
```
SELECT * FROM pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 15, true, true,
-$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, 32, 33::TEXT AS via_path$$
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 15, true, true,
+ $$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function pgr_trsp(text,integer,integer,boolean,boolean,text) line 29 at RETURN QUERY
```
## routing from/to same location
using dijkstra to verify (1 to 1)
@@ -120,13 +124,12 @@ SELECT * FROM pgr_TRSP(
```
call forcing the use of the original code (1 to 1)
-therefore is expected to return Error to represent no path found
-but "finds" a path when there should be no path.
+* not longer allowed without restrictions
+
```
SELECT * FROM _pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
- 1, 1,
- true, true
+ 1, 1, true, true
);
seq | id1 | id2 | cost
-----+-----+-----+------
@@ -220,14 +223,14 @@ SELECT * FROM pgr_TRSP(
(2 rows)
```
-call to the original function (2 to 3)
-does not find the shortest path
+call forcing the use of the original code
+* not longer allowed without restrictions
+
```
SELECT * FROM _pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
2, 3,
- false,
- true
+ false, true
);
seq | id1 | id2 | cost
-----+-----+-----+------
@@ -246,8 +249,7 @@ does not find the shortest path
SELECT * FROM pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
2, 3,
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
seq | id1 | id2 | cost
@@ -284,17 +286,18 @@ SELECT * FROM _pgr_trsp(
```
# The Edges signature version
## (Edges) No path representation differences
-Original code of pgr_trsp throws Error to represent no path found
-Can get a server crash
+Original function code
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
SELECT * FROM _pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 0.5, 17, 0.5, true, true
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 0.5, 17, 0.5, true, true
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
```
pgr_withPoints returns EMPTY SET to represent no path found
```
@@ -316,9 +319,8 @@ Remember that one characteristic of a path is that for a path of N edges it has
For this example, suppose points, where the pid are different even if the edge and fraction are different.
One point might be on the left side other on the right side, pgr_trsp does not take into account
the side of the point
-Using the original code (with and without restrictions) it returns a path
-of N edge and N vertex instead of N edge and N+1 vertices
-* with out restrictions
+calls forcing the use of the original code
+* not longer allowed without restrictions
```
SELECT * FROM _pgr_trsp(
@@ -669,7 +671,7 @@ SELECT * FROM pgr_withPoints(
```
* Vertex 6 is on edge 8 at 1 fraction
* Vertex 6 is also edge 11 at 0 fraction
-* The *_pgr_trsp* is used because at least one of the "points" is an actual vertex
+* Undefined behaviour when at least one of the "points" is an actual vertex
```
SELECT * FROM pgr_trsp(
@@ -681,10 +683,7 @@ SELECT * FROM pgr_trsp(
);
seq | id1 | id2 | cost
-----+-----+-----+------
- 0 | 6 | 8 | 1
- 1 | 5 | 4 | 1
- 2 | 2 | 1 | 0.6
-(3 rows)
+(0 rows)
SELECT * FROM pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
@@ -695,41 +694,32 @@ SELECT * FROM pgr_trsp(
);
seq | id1 | id2 | cost
-----+-----+-----+------
- 0 | 6 | 8 | 1
- 1 | 5 | 4 | 1
- 2 | 2 | 1 | 0.6
-(3 rows)
+(0 rows)
```
# pgr_trspViaVertices
## pgr_trspViaVertices No path representation differences
-pgr_trspViaVertices throws error when a path on the route was not found
-this example no path is found (vertex 15 is disconnected) from the big graph
-can crash the server
+pgr_trspViaVertices uses _pgr_trsp which as mentioned before
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
SELECT * FROM _pgr_trspViaVertices(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 15, 2],
-false, true
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 15, 2],
+ false, true
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
-```
-In this example there exists a path from 2 to 1 but only complete routes are processed
-can crash the server
-```
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function _pgr_trspviavertices(text,integer[],boolean,boolean,text) line 23 at FOR over SELECT rows
SELECT * FROM _pgr_trspViaVertices(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 15, 2, 1],
-false,
-true
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 15, 2, 1],
+ false, true
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function _pgr_trspviavertices(text,integer[],boolean,boolean,text) line 23 at FOR over SELECT rows
```
**pgr_dijkstraVia** returning what paths of the route it finds or EMPTY SET when non is found
this case none is found
@@ -780,24 +770,19 @@ therefore the expected result is EMPTY SET to represent no route was found
SELECT * FROM pgr_TRSPViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true
+ false, true
);
seq | id1 | id2 | id3 | cost
-----+-----+-----+-----+------
(0 rows)
```
-Using the original code
-Because there is no path from 1 to 1 then there is no complete route 1 to 1 to 2
-therefore the expected result is Error to represent no route was found
-gives a result even that there is no path from 1 to 1
+Calls to the original function of is no longer allowed without restrictions
```
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true
+ false, true
);
seq | id1 | id2 | id3 | cost
-----+-----+-----+-----+------
@@ -819,8 +804,7 @@ with restrictions the original code is used
SELECT * FROM pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
seq | id1 | id2 | id3 | cost
@@ -843,8 +827,7 @@ Using explicitly the original code
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
seq | id1 | id2 | id3 | cost
@@ -895,7 +878,7 @@ SELECT * FROM pgr_TRSPViaVertices(
(3 rows)
```
-forcing to use the original code, it give not give the shortest path from 2 to 3
+Calls to the original function of is no longer allowed without restrictions
```
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
@@ -948,7 +931,8 @@ SELECT * FROM pgr_trspViaEdges(
```
A temporay wraper function is used when:
* There are no restrictions
-* No point is a vertex in disguise (with pcts value of 0)
+* Before: No point is a vertex in disguise (with pcts value of 0)
+* Now: c$Undefined behaviour when a point is a vertex in disguise (with pcts value of 0)
Internaly:
* builds a new graph and calls pgr_dijkstraVia
@@ -960,7 +944,7 @@ What it returns
* the points are renumbered to -1, -2 .. -N
* if a point is part of a path it will show on the path
-Note: I dont mention the wrapper name due to the fact that this is not official documentation
+Note: I do not mention the wrapper name due to the fact that this is not official documentation
Note: I will use *_pgr_withPointsVia* as the wrapper name just for sake of this notes
Example excution
```
@@ -983,20 +967,19 @@ SELECT * FROM _pgr_withPointsVia(
## pgr_trspViaEdges No path representation differences
This example no path is found (edge 17 is disconnected) from the big graph.
* There is a vertex in disguise (fraction 0 or 1)
-* *pgr_trspViaEdges* original code is used
-* throws error to represent no route was not found
-* sometimes crashes the server
+* Undefined behaviour
```
SELECT * FROM pgr_trspViaEdges(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 17, 1], ARRAY[0,0.5,0.5],
-false, true
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 17, 1], ARRAY[0,0.5,0.5],
+ false, true
);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ seq | id1 | id2 | id3 | cost
+-----+-----+-----+-----+------
+ 1 | | | |
+(1 row)
+
```
This example no path is found (edge 17 is disconnected) from the big graph.
* Has a restriction
@@ -1098,7 +1081,7 @@ SELECT * FROM pgr_trspViaEdges(
```
Routing points & vertices
* vertex 6 is on edge 11 with fraction 0
-original code is used
+* Undefined behavior
```
SELECT * FROM pgr_trspViaEdges(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
@@ -1119,11 +1102,11 @@ SELECT * FROM pgr_trspViaEdges(
2 | 1 | 2 | 4 | 1
3 | 1 | 5 | 10 | 1
4 | 1 | 10 | 12 | 0.6
- 5 | 2 | -1 | 12 | 0.4
- 6 | 2 | 11 | 13 | 1
- 7 | 2 | 12 | 15 | 1
- 8 | 2 | 9 | 9 | 1
- 9 | 2 | 6 | -1 | 0
-(9 rows)
+ 5 | 1 | -2 | -1 | 0
+(5 rows)
```
+BEGIN;
+BEGIN
+ROLLBACK;
+ROLLBACK
diff --git a/src/trsp/doc/doc-trsp.queries b/src/trsp/doc/doc-trsp.queries
index 78aaa01..df8cb9e 100644
--- a/src/trsp/doc/doc-trsp.queries
+++ b/src/trsp/doc/doc-trsp.queries
@@ -1,5 +1,7 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_trsp(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost FROM edge_table',
diff --git a/src/trsp/doc/pgr_trsp.rst b/src/trsp/doc/pgr_trsp.rst
index 1c82361..3d6a97a 100644
--- a/src/trsp/doc/pgr_trsp.rst
+++ b/src/trsp/doc/pgr_trsp.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -12,7 +12,7 @@
pgr_trsp - Turn Restriction Shortest Path (TRSP)
===============================================================================
-.. index::
+.. index::
single: trsp(text,integer,integer,boolean,boolean)
single: trsp(text,integer,integer,boolean,boolean,text)
single: trspViaVertices(text,integer,double precision,integer,double precision,boolean,boolean)
@@ -37,7 +37,7 @@ The turn restricted shorthest path (TRSP) is a shortest path algorithm that can
.. code-block:: sql
- pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos float8,
+ pgr_costResult[] pgr_trsp(sql text, source_edge integer, source_pos float8,
target_edge integer, target_pos float8,
directed boolean, has_rcost boolean [,restrict_sql text]);
@@ -56,7 +56,7 @@ The turn restricted shorthest path (TRSP) is a shortest path algorithm that can
Description
-------------------------------------------------------------------------------
-The Turn Restricted Shortest Path algorithm (TRSP) is similar to the :ref:`shooting_star` in that you can specify turn restrictions.
+The Turn Restricted Shortest Path algorithm (TRSP) is similar to the shooting star in that you can specify turn restrictions.
The TRSP setup is mostly the same as :ref:`Dijkstra shortest path <pgr_dijkstra>` with the addition of an optional turn restriction table. This provides an easy way of adding turn restrictions to a road network by placing them in a separate table.
@@ -93,7 +93,7 @@ Another variant of TRSP allows to specify **EDGE id** of source and target toget
:source_edge: ``int4`` **EDGE id** of the start edge
:source_pos: ``float8`` fraction of 1 defines the position on the start edge
-:target_edge: ``int4`` **EDGE id** of the end edge
+:target_edge: ``int4`` **EDGE id** of the end edge
:target_pos: ``float8`` fraction of 1 defines the position on the end edge
Returns set of :ref:`type_cost_result`:
diff --git a/src/trsp/sql/routing_trsp.sql b/src/trsp/sql/routing_trsp.sql
deleted file mode 100644
index 62e0088..0000000
--- a/src/trsp/sql/routing_trsp.sql
+++ /dev/null
@@ -1,31 +0,0 @@
------------------------------------------------------------------------
--- Core function for time_dependent_shortest_path computation
--- See README for description
------------------------------------------------------------------------
---TODO - Do we need to add another sql text for the query on time-dependent-weights table?
--- - For now just checking with static data, so the query is similar to shortest_paths.
-
-CREATE OR REPLACE FUNCTION pgr_trsp(
- sql text,
- source_vid integer,
- target_vid integer,
- directed boolean,
- has_reverse_cost boolean,
- turn_restrict_sql text DEFAULT null)
- RETURNS SETOF pgr_costResult
- AS '$libdir/librouting-2.1', 'turn_restrict_shortest_path_vertex'
- LANGUAGE 'c' IMMUTABLE;
-
-CREATE OR REPLACE FUNCTION pgr_trsp(
- sql text,
- source_eid integer,
- source_pos float8,
- target_eid integer,
- target_pos float8,
- directed boolean,
- has_reverse_cost boolean,
- turn_restrict_sql text DEFAULT null)
- RETURNS SETOF pgr_costResult
- AS '$libdir/librouting-2.1', 'turn_restrict_shortest_path_edge'
- LANGUAGE 'c' IMMUTABLE;
-
diff --git a/src/trsp/sql/routing_trsp_vias.sql b/src/trsp/sql/routing_trsp_vias.sql
index 76473c7..0a8982a 100644
--- a/src/trsp/sql/routing_trsp_vias.sql
+++ b/src/trsp/sql/routing_trsp_vias.sql
@@ -1,4 +1,27 @@
-create or replace function pgr_trspViaVertices(sql text, vids integer[], directed boolean, has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2013 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+create or replace function _pgr_trspViaVertices(sql text, vids integer[], directed boolean, has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)
RETURNS SETOF pgr_costresult3 AS
$body$
/*
@@ -55,7 +78,7 @@ $body$
----------------------------------------------------------------------------------------------------------
-create or replace function pgr_trspViaEdges(sql text, eids integer[], pcts float8[], directed boolean, has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)
+create or replace function _pgr_trspViaEdges(sql text, eids integer[], pcts float8[], directed boolean, has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)
RETURNS SETOF pgr_costresult3 AS
$body$
/*
@@ -84,7 +107,7 @@ begin
for i in 1 .. array_length(eids, 1)-1 loop
seq2 := seq2 + 1;
for rr in select a.seq, seq2 as id1, a.id1 as id2, a.id2 as id3, a.cost
- from pgr_trsp(sql,
+ from _pgr_trsp(sql,
eids[i], pcts[i],
eids[i+1], pcts[i+1],
directed,
@@ -141,7 +164,7 @@ $body$
----------------------------------------------------------------------------------------------------------
-/*this via functions are not documented they will be deleted on 2.2*/
+/*this via functions are not documented they will be deleted on 2.2
create or replace function pgr_trsp(sql text, vids integer[], directed boolean, has_reverse_cost boolean, turn_restrict_sql text DEFAULT NULL::text)
RETURNS SETOF pgr_costresult AS
@@ -166,3 +189,4 @@ $body$
language plpgsql stable
cost 100
rows 1000;
+*/
diff --git a/src/trsp/sql/trsp_V2.2.sql b/src/trsp/sql/trsp_V2.2.sql
index ccb2428..a6f868f 100644
--- a/src/trsp/sql/trsp_V2.2.sql
+++ b/src/trsp/sql/trsp_V2.2.sql
@@ -192,7 +192,7 @@ BEGIN
END IF;
END IF;
- IF (turn_restrict_sql IS NULL OR length(turn_restrict_sql) = 0) AND (source_pos NOT IN (0,1) AND target_pos NOT IN (0,1)) THEN
+ IF (turn_restrict_sql IS NULL OR length(turn_restrict_sql) = 0) THEN
-- no restrictions then its a with points
RETURN query SELECT a.seq-1 AS seq, node::INTEGER AS id1, edge::INTEGER AS id2, cost
FROM pgr_withpoints(new_sql,
diff --git a/src/trsp/sql/viaEdges_v2.2.sql b/src/trsp/sql/viaEdges_v2.2.sql
new file mode 100644
index 0000000..4a42b29
--- /dev/null
+++ b/src/trsp/sql/viaEdges_v2.2.sql
@@ -0,0 +1,85 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+/* trspViaEdges
+
+ - when contradiction (has rcost but does not want it):
+ - the call is made to trsp only with cost column
+
+ - When there are no restrictions:
+ a call to _pgr_withPointsVia
+ - Else
+ a call to _pgr_trspViaEdges
+ - which calls repetedly the original C/C++ code
+*/
+
+
+------------------------------
+-- pgr_trspViaEdges Wrapper
+------------------------------
+CREATE OR REPLACE FUNCTION pgr_trspViaEdges(
+ sql TEXT,
+ eids INTEGER[],
+ pcts float[],
+ directed BOOLEAN,
+ has_rcost BOOLEAN,
+ turn_restrict_sql text DEFAULT NULL::TEXT)
+ RETURNS SETOF pgr_costresult3 AS
+$BODY$
+DECLARE
+ i INTEGER;
+ rr pgr_costresult3;
+ lrr pgr_costresult3;
+ first BOOLEAN := true;
+ seq INTEGER := 0;
+ seq2 INTEGER :=0;
+ has_reverse BOOLEAN;
+ edges_sql TEXT;
+
+BEGIN
+ has_reverse =_pgr_parameter_check('dijkstra', sql, false);
+ edges_sql := sql;
+ IF (has_reverse != has_rcost) THEN
+ IF (has_reverse) THEN
+ edges_sql = 'SELECT id, source, target, cost FROM (' || sql || ') a';
+ ELSE
+ raise EXCEPTION 'has_rcost set to true but reverse_cost not found';
+ END IF;
+ END IF;
+
+ IF (turn_restrict_sql IS NULL OR length(turn_restrict_sql) = 0) THEN
+ -- no restrictions then its a _pgr_withPointsVia
+ RETURN query SELECT seq-1 AS seq, node::INTEGER AS id1, edge::INTEGER AS id2, cost
+ FROM _pgr_withPointsVia(edges_sql, eids, pcts, directed)
+ RETURN;
+ END IF;
+
+
+ -- make the call to the original code
+ RETURN query SELECT * FROM _pgr_trspViaEdges(edges_sql, eids, pcts, directed, has_rcost, turn_restrict_sql);
+
+END;
+$BODY$
+LANGUAGE plpgsql VOLATILE
+cost 100
+rows 1000;
diff --git a/src/trsp/sql/viaVertices_v2.2.sql b/src/trsp/sql/viaVertices_v2.2.sql
new file mode 100644
index 0000000..b1205f0
--- /dev/null
+++ b/src/trsp/sql/viaVertices_v2.2.sql
@@ -0,0 +1,82 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+/* trspViaVertices
+
+ - when contradiction (has rcost but does not want it):
+ - the call is made to trsp only with cost column
+
+ - When there are no restrictions:
+ a call to pgr_dijkstraVia
+ - Else
+ a call to _pgr_trspViaVertices
+ - which calls repetedly the original C/C++ code
+*/
+
+------------------------------
+-- pgr_trspViaVertices Wrapper
+------------------------------
+CREATE OR REPLACE FUNCTION pgr_trspViaVertices(
+ edges_sql TEXT,
+ via_vids ANYARRAY,
+ directed BOOLEAN,
+ has_rcost BOOLEAN,
+ restrictions_sql TEXT DEFAULT NULL)
+RETURNS SETOF pgr_costResult3 AS
+$BODY$
+DECLARE
+has_reverse BOOLEAN;
+new_sql TEXT;
+BEGIN
+
+ has_reverse =_pgr_parameter_check('dijkstra', edges_sql, false);
+
+ new_sql := edges_sql;
+ IF (has_reverse != has_rcost) THEN -- user contradiction
+ IF (has_reverse) THEN -- it has reverse_cost but user don't want it.
+ new_sql :=
+ 'WITH old_sql AS (' || edges_sql || ')' ||
+ ' SELECT id, source, target, cost FROM old_sql';
+ ELSE -- it does not have reverse_cost but user wants it
+ RAISE EXCEPTION 'Error, reverse_cost is used, but query did''t return ''reverse_cost'' column'
+ USING ERRCODE := 'XX000';
+ END IF;
+ END IF;
+
+ IF (restrictions_sql IS NULL OR length(restrictions_sql) = 0) THEN
+ RETURN query SELECT (row_number() over())::INTEGER, path_id:: INTEGER, node::INTEGER,
+ (CASE WHEN edge = -2 THEN -1 ELSE edge END)::INTEGER, cost
+ FROM pgr_dijkstraVia(new_sql, via_vids, directed, strict:=true) WHERE edge != -1;
+ RETURN;
+ END IF;
+
+
+ -- make the call without contradiction from part of the user
+ RETURN query SELECT * FROM _pgr_trspViaVertices(new_sql, via_vids::INTEGER[], directed, has_rcost, restrictions_sql);
+END
+$BODY$
+LANGUAGE plpgsql VOLATILE
+COST 100
+ROWS 1000;
+
+
diff --git a/src/trsp/src/GraphDefinition.cpp b/src/trsp/src/GraphDefinition.cpp
old mode 100644
new mode 100755
index 8e0c2b4..b8b3af5
--- a/src/trsp/src/GraphDefinition.cpp
+++ b/src/trsp/src/GraphDefinition.cpp
@@ -5,8 +5,8 @@
#endif
-#include "GraphDefinition.h"
#include <functional>
+#include "GraphDefinition.h"
// -------------------------------------------------------------------------
GraphDefinition::GraphDefinition(void)
@@ -104,30 +104,26 @@ double GraphDefinition::getRestrictionCost(
bool isStart)
{
double cost = 0.0;
- auto edge_id = new_edge.m_lEdgeID;
+ long edge_id = new_edge.m_lEdgeID;
if(m_ruleTable.find(edge_id) == m_ruleTable.end())
{
return(0.0);
}
std::vector<Rule> vecRules = m_ruleTable[edge_id];
- // int ruleIndex;
- auto totalRule = vecRules.size();
- auto st_edge_ind = edge_ind;
- for(size_t ruleIndex = 0; ruleIndex < totalRule; ruleIndex++)
+ long st_edge_ind = edge_ind;
+ for(const auto &rule : vecRules)
{
bool flag = true;
- auto total_edge = vecRules[ruleIndex].precedencelist.size();
- // int i;
int v_pos = (isStart?0:1);
edge_ind = st_edge_ind;
- for(size_t i = 0; i < total_edge; i++)
+ for(auto const &precedence : rule.precedencelist)
{
if(edge_ind == -1)
{
flag = false;
break;
}
- if(vecRules[ruleIndex].precedencelist[i] != m_vecEdgeVector[edge_ind]->m_lEdgeID)
+ if(precedence != m_vecEdgeVector[edge_ind]->m_lEdgeID)
{
flag = false;
break;
@@ -137,7 +133,7 @@ double GraphDefinition::getRestrictionCost(
edge_ind = parent_ind;
}
if(flag)
- cost += vecRules[ruleIndex].cost;
+ cost += rule.cost;
}
return cost;
}
@@ -152,14 +148,12 @@ void GraphDefinition::explore(
std::priority_queue<PDP, std::vector<PDP>,
std::greater<PDP> > &que)
{
- unsigned int i;
double extCost = 0.0;
GraphEdgeInfo* new_edge;
- // int new_node;
double totalCost;
- for(i = 0; i < vecIndex.size(); i++)
+ for(const auto &index : vecIndex)
{
- new_edge = m_vecEdgeVector[vecIndex[i]];
+ new_edge = m_vecEdgeVector[index];
extCost = 0.0;
if(m_bIsturnRestrictOn)
{
@@ -169,18 +163,16 @@ void GraphDefinition::explore(
{
if(new_edge->m_dCost >= 0.0)
{
- //new_node = new_edge->m_lEndNode;
-
if(isStart)
totalCost = m_dCost[cur_edge.m_lEdgeIndex].endCost + new_edge->m_dCost + extCost;
else
totalCost = m_dCost[cur_edge.m_lEdgeIndex].startCost + new_edge->m_dCost + extCost;
- if(totalCost < m_dCost[vecIndex[i]].endCost)
+ if(totalCost < m_dCost[index].endCost)
{
- m_dCost[vecIndex[i]].endCost = totalCost;
+ m_dCost[index].endCost = totalCost;
parent[new_edge->m_lEdgeIndex].v_pos[0] = (isStart?0:1);
parent[new_edge->m_lEdgeIndex].ed_ind[0] = cur_edge.m_lEdgeIndex;
- que.push(PDP((double)totalCost, PIB((int)new_edge->m_lEdgeIndex, (bool)true)));
+ que.push(std::make_pair(totalCost, std::make_pair(new_edge->m_lEdgeIndex, true)));
}
}
}
@@ -188,17 +180,16 @@ void GraphDefinition::explore(
{
if(new_edge->m_dReverseCost >= 0.0)
{
- // new_node = new_edge->m_lStartNode;
if(isStart)
totalCost = m_dCost[cur_edge.m_lEdgeIndex].endCost + new_edge->m_dReverseCost + extCost;
else
totalCost = m_dCost[cur_edge.m_lEdgeIndex].startCost + new_edge->m_dReverseCost + extCost;
- if(totalCost < m_dCost[vecIndex[i]].startCost)
+ if(totalCost < m_dCost[index].startCost)
{
- m_dCost[vecIndex[i]].startCost = totalCost;
+ m_dCost[index].startCost = totalCost;
parent[new_edge->m_lEdgeIndex].v_pos[1] = (isStart?0:1);
parent[new_edge->m_lEdgeIndex].ed_ind[1] = cur_edge.m_lEdgeIndex;
- que.push(PDP((double)totalCost, PIB((int)new_edge->m_lEdgeIndex, (bool)false)));
+ que.push(std::make_pair(totalCost, std::make_pair(new_edge->m_lEdgeIndex, false)));
}
}
}
@@ -214,7 +205,7 @@ int GraphDefinition::multi_dijkstra(
bool directed,
bool has_reverse_cost,
path_element_t **path,
- size_t *path_count,
+ int *path_count,
char **err_msg,
std::vector<PDVI> &ruleList)
{
@@ -222,44 +213,38 @@ int GraphDefinition::multi_dijkstra(
if(ruleList.size() > 0)
{
m_ruleTable.clear();
- auto total_rule = ruleList.size();
- // int i;
LongVector vecsource;
- // int kk;
- for(size_t i = 0; i < total_rule; i++)
- {
- Rule rule;
- rule.cost = ruleList[i].first;
- // int j;
- auto seq_cnt = ruleList[i].second.size();
- for(size_t j = 1; j < seq_cnt; j++)
- {
- rule.precedencelist.push_back(ruleList[i].second[j]);
- }
- auto dest_edge_id = ruleList[i].second[0];
- if(m_ruleTable.find(dest_edge_id) != m_ruleTable.end())
- {
- m_ruleTable[dest_edge_id].push_back(rule);
- }
- else
- {
- std::vector<Rule> temprules;
- temprules.clear();
- temprules.push_back(rule);
- m_ruleTable[dest_edge_id] = temprules;
- }
+ for(const auto &rule : ruleList)
+ {
+ std::vector<long> temp_precedencelist;
+ temp_precedencelist.clear();
+ for(auto const &seq : rule.second)
+ {
+ temp_precedencelist.push_back(seq);
+ }
+ int dest_edge_id = rule.second[0];
+ if(m_ruleTable.find(dest_edge_id) != m_ruleTable.end())
+ {
+ m_ruleTable[dest_edge_id].push_back(Rule(rule.first, temp_precedencelist));
+ }
+ else
+ {
+ std::vector<Rule> temprules;
+ temprules.clear();
+ temprules.push_back(Rule(rule.first, temp_precedencelist));
+ m_ruleTable.insert(std::make_pair(dest_edge_id, temprules));
+ }
}
-
m_bIsturnRestrictOn = true;
}
parent = new PARENT_PATH[edge_count + 1];
m_dCost = new CostHolder[edge_count + 1];
m_vecPath.clear();
- // int i;
- auto total_vertices = vertices.size();
- for(size_t i = 0; i < total_vertices - 1; i++)
+ size_t i;
+ size_t total_vertices = vertices.size();
+ for(i = 0; i < total_vertices - 1; i++)
{
- int ret = my_dijkstra1(vertices[i], vertices[i + 1], edge_count, err_msg);
+ int ret = my_dijkstra(vertices[i], vertices[i + 1], edge_count, err_msg);
if(ret < 0)
{
deleteall();
@@ -268,9 +253,9 @@ int GraphDefinition::multi_dijkstra(
}
*path = (path_element_t *) malloc(sizeof(path_element_t) * (m_vecPath.size() + 1));
- *path_count = m_vecPath.size();
+ *path_count = static_cast<int>(m_vecPath.size());
- for(size_t i = 0; i < *path_count; i++)
+ for(int i = 0; i < *path_count; i++)
{
(*path)[i].vertex_id = m_vecPath[i].vertex_id;
(*path)[i].edge_id = m_vecPath[i].edge_id;
@@ -282,7 +267,7 @@ int GraphDefinition::multi_dijkstra(
// -------------------------------------------------------------------------
-int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edge_count, char **err_msg)
+int GraphDefinition::my_dijkstra(long start_vertex, long end_vertex, unsigned int edge_count, char **err_msg)
{
if(!m_bIsGraphConstructed)
{
@@ -314,9 +299,9 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
LongVector vecsource = m_mapNodeId2Edge[start_vertex];
GraphEdgeInfo* cur_edge = NULL;
- for(i = 0; i < vecsource.size(); i++)
+ for(const auto &source : vecsource)
{
- cur_edge = m_vecEdgeVector[vecsource[i]];
+ cur_edge = m_vecEdgeVector[source];
if(cur_edge->m_lStartNode == start_vertex)
{
if(cur_edge->m_dCost >= 0.0)
@@ -324,8 +309,7 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
m_dCost[cur_edge->m_lEdgeIndex].endCost= cur_edge->m_dCost;
parent[cur_edge->m_lEdgeIndex].v_pos[0] = -1;
parent[cur_edge->m_lEdgeIndex].ed_ind[0] = -1;
- //que.push(std::make_pair(cur_edge->m_dCost, std::make_pair(cur_edge->m_lEdgeIndex, true)));
- que.push(PDP(cur_edge->m_dCost, PIB((int)cur_edge->m_lEdgeIndex, true)));
+ que.push(std::make_pair(cur_edge->m_dCost, std::make_pair(cur_edge->m_lEdgeIndex, true)));
}
}
else
@@ -335,13 +319,11 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
m_dCost[cur_edge->m_lEdgeIndex].startCost = cur_edge->m_dReverseCost;
parent[cur_edge->m_lEdgeIndex].v_pos[1] = -1;
parent[cur_edge->m_lEdgeIndex].ed_ind[1] = -1;
- //que.push(std::make_pair(cur_edge->m_dReverseCost, std::make_pair(cur_edge->m_lEdgeIndex, false)));
- que.push(PDP(cur_edge->m_dReverseCost, PIB((int)cur_edge->m_lEdgeIndex, false)));
+ que.push(std::make_pair(cur_edge->m_dReverseCost, std::make_pair(cur_edge->m_lEdgeIndex, false)));
}
}
}
- // int new_node;
long cur_node = -1;
while(!que.empty())
@@ -350,7 +332,6 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
que.pop();
int cured_index = cur_pos.second.first;
cur_edge = m_vecEdgeVector[cured_index];
- //GraphEdgeInfo* new_edge;
if(cur_pos.second.second) // explore edges connected to end node
{
@@ -379,15 +360,12 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
}
else
{
- // double total_cost; //set but not used
if(cur_node == cur_edge->m_lStartNode)
{
- // total_cost = m_dCost[cur_edge->m_lEdgeIndex].startCost;
construct_path(cur_edge->m_lEdgeIndex, 1);
}
else
{
- // total_cost = m_dCost[cur_edge->m_lEdgeIndex].endCost;
construct_path(cur_edge->m_lEdgeIndex, 0);
}
path_element_t pelement;
@@ -401,8 +379,8 @@ int GraphDefinition::my_dijkstra1(long start_vertex, long end_vertex, size_t edg
// -------------------------------------------------------------------------
-int GraphDefinition::my_dijkstra4(edge_t *edges, unsigned int edge_count, long start_edge_id, double start_part, long end_edge_id, double end_part, bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count, char **err_msg, std::vector<PDVI> &ruleList)
+int GraphDefinition::my_dijkstra(edge_t *edges, unsigned int edge_count, int start_edge_id, double start_part, int end_edge_id, double end_part, bool directed, bool has_reverse_cost,
+ path_element_t **path, int *path_count, char **err_msg, std::vector<PDVI> &ruleList)
{
if(!m_bIsGraphConstructed)
{
@@ -492,53 +470,49 @@ int GraphDefinition::my_dijkstra4(edge_t *edges, unsigned int edge_count, long s
}
}
- return(my_dijkstra3(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, path_count, err_msg, ruleList));
+ return(my_dijkstra(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, path_count, err_msg, ruleList));
}
// -------------------------------------------------------------------------
-int GraphDefinition:: my_dijkstra3(edge_t *edges, unsigned int edge_count, long start_vertex, long end_vertex, bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count, char **err_msg, std::vector<PDVI> &ruleList)
+int GraphDefinition:: my_dijkstra(edge_t *edges, unsigned int edge_count, long start_vertex, long end_vertex, bool directed, bool has_reverse_cost,
+ path_element_t **path, int *path_count, char **err_msg, std::vector<PDVI> &ruleList)
{
m_ruleTable.clear();
- auto total_rule = ruleList.size();
- // int i;
LongVector vecsource;
- unsigned int kk;
- for(size_t i = 0; i < total_rule; i++)
+ for (const auto &rule : ruleList)
{
- Rule rule;
- rule.cost = ruleList[i].first;
- // int j;
- auto seq_cnt = ruleList[i].second.size();
- for(size_t j = 1; j < seq_cnt; j++)
+ size_t j;
+ size_t seq_cnt = rule.second.size();
+ std::vector<long> temp_precedencelist;
+ temp_precedencelist.clear();
+ for(j = 1; j < seq_cnt; j++)
{
- rule.precedencelist.push_back(ruleList[i].second[j]);
+ temp_precedencelist.push_back(rule.second[j]);
}
- int dest_edge_id = ruleList[i].second[0];
+ int dest_edge_id = rule.second[0];
if(m_ruleTable.find(dest_edge_id) != m_ruleTable.end())
{
- m_ruleTable[dest_edge_id].push_back(rule);
+ m_ruleTable[dest_edge_id].push_back(Rule(rule.first, temp_precedencelist));
}
else
{
std::vector<Rule> temprules;
temprules.clear();
- temprules.push_back(rule);
- //m_ruleTable.insert(std::make_pair(dest_edge_id, temprules));
- m_ruleTable[dest_edge_id] = temprules;
+ temprules.push_back(Rule(rule.first, temp_precedencelist));
+ m_ruleTable.insert(std::make_pair(dest_edge_id, temprules));
}
if(isStartVirtual)
{
- if(seq_cnt == 2 && ruleList[i].second[1] == m_lStartEdgeId)
+ if(seq_cnt == 2 && rule.second[1] == m_lStartEdgeId)
{
vecsource = m_mapNodeId2Edge[start_vertex];
- for(kk = 0; kk < vecsource.size(); kk++)
+ for(const auto &source : vecsource)
{
- rule.precedencelist.clear();
- rule.precedencelist.push_back(m_vecEdgeVector[vecsource[kk]]->m_lEdgeID);
- m_ruleTable.at(dest_edge_id).push_back(rule);
+ temp_precedencelist.clear();
+ temp_precedencelist.push_back(m_vecEdgeVector[source]->m_lEdgeID);
+ m_ruleTable[dest_edge_id].push_back(Rule(rule.first, temp_precedencelist));
}
}
}
@@ -549,21 +523,20 @@ int GraphDefinition:: my_dijkstra3(edge_t *edges, unsigned int edge_count, long
{
std::vector<Rule> tmpRules = m_ruleTable[m_lEndEdgeId];
vecsource = m_mapNodeId2Edge[end_vertex];
- for(kk = 0; kk < vecsource.size(); kk++)
+ for(const auto &source : vecsource)
{
- //m_ruleTable.insert(std::make_pair(m_vecEdgeVector[vecsource[kk]]->m_lEdgeID, tmpRules));
- m_ruleTable[m_vecEdgeVector[vecsource[kk]]->m_lEdgeID] = tmpRules;
+ m_ruleTable.insert(std::make_pair(m_vecEdgeVector[source]->m_lEdgeID, tmpRules));
}
}
}
m_bIsturnRestrictOn = true;
- return(my_dijkstra2(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, path_count, err_msg));
+ return(my_dijkstra(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, path_count, err_msg));
}
// -------------------------------------------------------------------------
-int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long start_vertex, long end_vertex, bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count, char **err_msg)
+int GraphDefinition:: my_dijkstra(edge_t *edges, unsigned int edge_count, long start_vertex, long end_vertex, bool directed, bool has_reverse_cost,
+ path_element_t **path, int *path_count, char **err_msg)
{
if(!m_bIsGraphConstructed)
{
@@ -601,9 +574,9 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
LongVector vecsource = m_mapNodeId2Edge[start_vertex];
GraphEdgeInfo* cur_edge = NULL;
- for(i = 0; i < vecsource.size(); i++)
+ for(const auto &source: vecsource)
{
- cur_edge = m_vecEdgeVector[vecsource[i]];
+ cur_edge = m_vecEdgeVector[source];
if(cur_edge->m_lStartNode == start_vertex)
{
if(cur_edge->m_dCost >= 0.0)
@@ -611,8 +584,7 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
m_dCost[cur_edge->m_lEdgeIndex].endCost= cur_edge->m_dCost;
parent[cur_edge->m_lEdgeIndex].v_pos[0] = -1;
parent[cur_edge->m_lEdgeIndex].ed_ind[0] = -1;
- //que.push(std::make_pair(cur_edge->m_dCost, std::make_pair(cur_edge->m_lEdgeIndex, true)));
- que.push(PDP(cur_edge->m_dCost, PIB((int)cur_edge->m_lEdgeIndex, true)));
+ que.push(std::make_pair(cur_edge->m_dCost, std::make_pair(cur_edge->m_lEdgeIndex, true)));
}
}
else
@@ -622,16 +594,10 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
m_dCost[cur_edge->m_lEdgeIndex].startCost = cur_edge->m_dReverseCost;
parent[cur_edge->m_lEdgeIndex].v_pos[1] = -1;
parent[cur_edge->m_lEdgeIndex].ed_ind[1] = -1;
- //que.push(std::make_pair(cur_edge->m_dReverseCost, std::make_pair(cur_edge->m_lEdgeIndex, false)));
- que.push(PDP(cur_edge->m_dReverseCost, PIB((int)cur_edge->m_lEdgeIndex, false)));
+ que.push(std::make_pair(cur_edge->m_dReverseCost, std::make_pair(cur_edge->m_lEdgeIndex, false)));
}
}
}
- //parent[start_vertex].v_id = -1;
- //parent[start_vertex].ed_id = -1;
- //m_dCost[start_vertex] = 0.0;
-
- // int new_node;
long cur_node = -1;
while(!que.empty())
@@ -640,7 +606,6 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
que.pop();
int cured_index = cur_pos.second.first;
cur_edge = m_vecEdgeVector[cured_index];
- //GraphEdgeInfo* new_edge;
if(cur_pos.second.second) // explore edges connected to end node
{
@@ -702,9 +667,9 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
}
*path = (path_element_t *) malloc(sizeof(path_element_t) * (m_vecPath.size() + 1));
- *path_count = m_vecPath.size();
+ *path_count = static_cast<int>(m_vecPath.size());
- for(size_t i = 0; i < *path_count; i++)
+ for(int i = 0; i < *path_count; i++)
{
(*path)[i].vertex_id = m_vecPath[i].vertex_id;
(*path)[i].edge_id = m_vecPath[i].edge_id;
@@ -727,7 +692,7 @@ int GraphDefinition:: my_dijkstra2(edge_t *edges, unsigned int edge_count, long
// -------------------------------------------------------------------------
-bool GraphDefinition::get_single_cost(double total_cost, path_element_t **path, size_t *path_count)
+bool GraphDefinition::get_single_cost(double total_cost, path_element_t **path, int *path_count)
{
GraphEdgeInfo* start_edge_info = m_vecEdgeVector[m_mapEdgeId2Index[m_lStartEdgeId]];
if(m_dEndPart >= m_dStartpart)
@@ -837,7 +802,7 @@ bool GraphDefinition::addEdge(edge_t edgeIn)
newEdge->m_vecEndConnedtedEdge.clear();
newEdge->m_vecRestrictedEdge.clear();
newEdge->m_lEdgeID = edgeIn.id;
- newEdge->m_lEdgeIndex = (long)m_vecEdgeVector.size();
+ newEdge->m_lEdgeIndex = m_vecEdgeVector.size();
newEdge->m_lStartNode = edgeIn.source;
newEdge->m_lEndNode = edgeIn.target;
newEdge->m_dCost = edgeIn.cost;
@@ -863,7 +828,7 @@ bool GraphDefinition::addEdge(edge_t edgeIn)
{
//Connect current edge with existing edge with start node
//connectEdge(
- long lEdgeCount = (long)itNodeMap->second.size();
+ long lEdgeCount = itNodeMap->second.size();
long lEdgeIndex;
for(lEdgeIndex = 0; lEdgeIndex < lEdgeCount; lEdgeIndex++)
{
@@ -879,7 +844,7 @@ bool GraphDefinition::addEdge(edge_t edgeIn)
{
//Connect current edge with existing edge with end node
//connectEdge(
- long lEdgeCount = (long)itNodeMap->second.size();
+ long lEdgeCount = itNodeMap->second.size();
long lEdgeIndex;
for(lEdgeIndex = 0; lEdgeIndex < lEdgeCount; lEdgeIndex++)
{
@@ -896,8 +861,7 @@ bool GraphDefinition::addEdge(edge_t edgeIn)
//Adding edge to the list
- //m_mapEdgeId2Index.insert(std::make_pair(newEdge->m_lEdgeID, m_vecEdgeVector.size()));
- m_mapEdgeId2Index[newEdge->m_lEdgeID] = (long)m_vecEdgeVector.size();
+ m_mapEdgeId2Index.insert(std::make_pair(newEdge->m_lEdgeID, m_vecEdgeVector.size()));
m_vecEdgeVector.push_back(newEdge);
//
diff --git a/src/trsp/src/GraphDefinition.h b/src/trsp/src/GraphDefinition.h
index 2ea1944..41f35a9 100644
--- a/src/trsp/src/GraphDefinition.h
+++ b/src/trsp/src/GraphDefinition.h
@@ -9,7 +9,6 @@
#include <iostream>
#include <functional>
-
#include "trsp.h"
//using namespace std;
@@ -43,10 +42,11 @@ typedef struct{
int v_pos[2];
} PARENT_PATH;
-typedef struct{
+typedef struct Rule{
double cost;
std::vector<long> precedencelist;
-} Rule;
+ Rule(double c, std::vector<long> p) : cost(c), precedencelist(p) { }
+}Rule;
typedef struct{
double startCost, endCost;
@@ -90,34 +90,34 @@ public:
GraphDefinition(void);
~GraphDefinition(void);
- int my_dijkstra1(long start_vertex, long end_vertex,
- size_t edge_count, char** err_msg);
+ int my_dijkstra(long start_vertex, long end_vertex,
+ unsigned int edge_count, char** err_msg);
- int my_dijkstra2(edge_t *edges, unsigned int edge_count,
+ int my_dijkstra(edge_t *edges, unsigned int edge_count,
long start_vertex, long end_vertex,
bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count,
+ path_element_t **path, int *path_count,
char **err_msg);
- int my_dijkstra3(edge_t *edges, unsigned int edge_count,
+ int my_dijkstra(edge_t *edges, unsigned int edge_count,
long start_vertex, long end_vertex,
bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count,
+ path_element_t **path, int *path_count,
char **err_msg,
std::vector<PDVI> &ruleList);
- int my_dijkstra4(edge_t *edges, unsigned int edge_count,
- long start_edge, double start_part,
- long end_edge, double end_part,
+ int my_dijkstra(edge_t *edges, unsigned int edge_count,
+ int start_edge, double start_part,
+ int end_edge, double end_part,
bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count,
+ path_element_t **path, int *path_count,
char **err_msg,
std::vector<PDVI> &ruleList);
int multi_dijkstra(edge_t *edges, unsigned int edge_count,
std::vector<int> vertices,
bool directed, bool has_reverse_cost,
- path_element_t **path, size_t *path_count,
+ path_element_t **path, int *path_count,
char **err_msg,
std::vector<PDVI> &ruleList);
@@ -131,7 +131,7 @@ private:
double getRestrictionCost(long cur_node, GraphEdgeInfo& new_edge, bool isStart);
bool addEdge(edge edgeIn);
bool connectEdge(GraphEdgeInfo& firstEdge, GraphEdgeInfo& secondEdge, bool bIsStartNodeSame);
- bool get_single_cost(double total_cost, path_element_t **path, size_t *path_count);
+ bool get_single_cost(double total_cost, path_element_t **path, int *path_count);
void init();
void deleteall();
@@ -140,9 +140,9 @@ private:
Long2LongMap m_mapEdgeId2Index;
Long2LongVectorMap m_mapNodeId2Edge;
long max_node_id;
- long max_edge_id;
- long m_lStartEdgeId;
- long m_lEndEdgeId;
+ int max_edge_id;
+ int m_lStartEdgeId;
+ int m_lEndEdgeId;
double m_dStartpart;
double m_dEndPart;
bool isStartVirtual;
diff --git a/src/trsp/src/trsp.c b/src/trsp/src/trsp.c
index 7bb40c7..21e0bf1 100644
--- a/src/trsp/src/trsp.c
+++ b/src/trsp/src/trsp.c
@@ -1,26 +1,3 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
#include "postgres.h"
#include "executor/spi.h"
#include "funcapi.h"
@@ -32,21 +9,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "fmgr.h"
#include "trsp.h"
-#include "./../../common/src/debug_macro.h"
-
PGDLLEXPORT Datum turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS);
PGDLLEXPORT Datum turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS);
-#if 0
#undef DEBUG
//#define DEBUG 1
#ifdef DEBUG
-#define PGR_DBG(format, arg...) \
+#define DBG(format, arg...) \
elog(NOTICE, format , ## arg)
#else
-#define PGR_DBG(format, arg...) do { ; } while (0)
-#endif
+#define DBG(format,...) do { ; } while (0)
#endif
// The number of tuples to fetch from the SPI cursor at each iteration
@@ -87,7 +60,7 @@ text2char(text *in)
static int
finish(int code, int ret)
{
- PGR_DBG("In finish, trying to disconnect from spi %d",ret);
+ DBG("In finish, trying to disconnect from spi %d",ret);
code = SPI_finish();
if (code != SPI_OK_FINISH )
{
@@ -156,7 +129,7 @@ fetch_edge_columns(SPITupleTable *tuptable, edge_columns_t *edge_columns,
return -1;
}
- PGR_DBG("columns: id %i source %i target %i cost %i",
+ DBG("columns: id %i source %i target %i cost %i",
edge_columns->id, edge_columns->source,
edge_columns->target, edge_columns->cost);
@@ -179,7 +152,7 @@ fetch_edge_columns(SPITupleTable *tuptable, edge_columns_t *edge_columns,
return -1;
}
- PGR_DBG("columns: reverse_cost cost %i", edge_columns->reverse_cost);
+ DBG("columns: reverse_cost cost %i", edge_columns->reverse_cost);
}
return 0;
@@ -227,7 +200,7 @@ fetch_edge(HeapTuple *tuple, TupleDesc *tupdesc,
}
/*
- PGR_DBG("edge: %i, %i, %i, %f, %f", target_edge->id, target_edge->source,
+ DBG("edge: %i, %i, %i, %f, %f", target_edge->id, target_edge->source,
target_edge->target, target_edge->cost, target_edge->reverse_cost);
*/
}
@@ -260,7 +233,7 @@ fetch_restrict(HeapTuple *tuple, TupleDesc *tupdesc,
rest->to_cost = DatumGetFloat8(binval);
char *str = DatumGetCString(SPI_getvalue(*tuple, *tupdesc, restrict_columns->via_path));
- //PGR_DBG("restriction: %f, %i, %s", rest->to_cost, rest->target_id, str);
+ //DBG("restriction: %f, %i, %s", rest->to_cost, rest->target_id, str);
if (str != NULL) {
char* pch = NULL;
@@ -271,7 +244,7 @@ fetch_restrict(HeapTuple *tuple, TupleDesc *tupdesc,
while (pch != NULL && ci < MAX_RULE_LENGTH)
{
rest->via[ci] = atoi(pch);
- //PGR_DBG(" rest->via[%i]=%i", ci, rest->via[ci]);
+ //DBG(" rest->via[%i]=%i", ci, rest->via[ci]);
ci++;
pch = (char *)strtok (NULL, " ,");
}
@@ -284,25 +257,25 @@ fetch_restrict(HeapTuple *tuple, TupleDesc *tupdesc,
static int compute_trsp(
char* sql,
int dovertex,
- long start_id,
+ int start_id,
double start_pos,
- long end_id,
+ int end_id,
double end_pos,
bool directed,
bool has_reverse_cost,
char* restrict_sql,
path_element_t **path,
- uint32_t *path_count)
+ int *path_count)
{
int SPIcode;
SPIPlanPtr SPIplan;
Portal SPIportal;
bool moredata = TRUE;
- size_t ntuples;
+ int ntuples;
edge_t *edges = NULL;
- size_t total_tuples = 0;
+ int total_tuples = 0;
#ifndef _MSC_VER
edge_columns_t edge_columns = {.id= -1, .source= -1, .target= -1,
.cost= -1, .reverse_cost= -1};
@@ -310,17 +283,11 @@ static int compute_trsp(
edge_columns_t edge_columns = {-1, -1, -1, -1, -1};
#endif //_MSC_VER
restrict_t *restricts = NULL;
- size_t total_restrict_tuples = 0;
-
-#ifndef _MSC_VER
+ int total_restrict_tuples = 0;
restrict_columns_t restrict_columns = {.target_id= -1, .via_path= -1,
.to_cost= -1};
-#else // _MSC_VER
- restrict_columns_t restrict_columns = {-1, -1, -1};
-#endif //_MSC_VER
-
- long v_max_id=0;
- long v_min_id=INT_MAX;
+ int v_max_id=0;
+ int v_min_id=INT_MAX;
/* track if start and end are both in edge tuples */
int s_count = 0;
@@ -328,9 +295,9 @@ static int compute_trsp(
char *err_msg;
int ret = -1;
- uint32_t z;
+ register int z;
- PGR_DBG("start turn_restrict_shortest_path\n");
+ DBG("start turn_restrict_shortest_path\n");
SPIcode = SPI_connect();
if (SPIcode != SPI_OK_CONNECT) {
@@ -350,7 +317,7 @@ static int compute_trsp(
}
while (moredata == TRUE) {
- //PGR_DBG("calling SPI_cursor_fetch");
+ //DBG("calling SPI_cursor_fetch");
SPI_cursor_fetch(SPIportal, TRUE, TUPLIMIT);
if (SPI_tuptable == NULL) {
@@ -366,7 +333,7 @@ static int compute_trsp(
ntuples = SPI_processed;
- //PGR_DBG("Reading edges: %i - %i", total_tuples, total_tuples+ntuples);
+ //DBG("Reading edges: %i - %i", total_tuples, total_tuples+ntuples);
total_tuples += ntuples;
@@ -381,19 +348,19 @@ static int compute_trsp(
return finish(SPIcode, ret);
}
- uint32_t t;
+ int t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
for (t = 0; t < ntuples; t++) {
- //if (t%100 == 0) { PGR_DBG(" t: %i", t); }
+ //if (t%100 == 0) { DBG(" t: %i", t); }
HeapTuple tuple = tuptable->vals[t];
fetch_edge(&tuple, &tupdesc, &edge_columns,
&edges[total_tuples - ntuples + t]);
}
- //PGR_DBG("calling SPI_freetuptable");
+ //DBG("calling SPI_freetuptable");
SPI_freetuptable(tuptable);
- //PGR_DBG("back from SPI_freetuptable");
+ //DBG("back from SPI_freetuptable");
}
else {
moredata = FALSE;
@@ -403,7 +370,7 @@ static int compute_trsp(
//defining min and max vertex id
- //PGR_DBG("Total %i edge tuples", total_tuples);
+ //DBG("Total %i edge tuples", total_tuples);
for(z=0; z<total_tuples; z++) {
if(edges[z].source<v_min_id)
@@ -418,7 +385,7 @@ static int compute_trsp(
if(edges[z].target>v_max_id)
v_max_id=edges[z].target;
- //PGR_DBG("%i <-> %i", v_min_id, v_max_id);
+ //DBG("%i <-> %i", v_min_id, v_max_id);
}
@@ -443,12 +410,12 @@ static int compute_trsp(
edges[z].source-=v_min_id;
edges[z].target-=v_min_id;
edges[z].cost = edges[z].cost;
- //PGR_DBG("edgeID: %i SRc:%i - %i, cost: %f", edges[z].id,edges[z].source, edges[z].target,edges[z].cost);
+ //DBG("edgeID: %i SRc:%i - %i, cost: %f", edges[z].id,edges[z].source, edges[z].target,edges[z].cost);
}
- PGR_DBG("Min vertex id: %ld , Max vid: %ld",v_min_id,v_max_id);
- PGR_DBG("Total %ld edge tuples", total_tuples);
+ DBG("Min vertex id: %i , Max vid: %i",v_min_id,v_max_id);
+ DBG("Total %i edge tuples", total_tuples);
if(s_count == 0) {
elog(ERROR, "Start id was not found.");
@@ -465,10 +432,10 @@ static int compute_trsp(
end_id -= v_min_id;
}
- PGR_DBG("Fetching restriction tuples\n");
+ DBG("Fetching restriction tuples\n");
if (restrict_sql == NULL) {
- PGR_DBG("Sql for restrictions is null.");
+ DBG("Sql for restrictions is null.");
}
else {
SPIplan = SPI_prepare(restrict_sql, 0, NULL);
@@ -488,7 +455,7 @@ static int compute_trsp(
if (restrict_columns.target_id == -1) {
if (fetch_restrict_columns(SPI_tuptable, &restrict_columns) == -1) {
- PGR_DBG("fetch_restrict_columns failed!");
+ DBG("fetch_restrict_columns failed!");
return finish(SPIcode, ret);
}
}
@@ -496,7 +463,7 @@ static int compute_trsp(
ntuples = SPI_processed;
total_restrict_tuples += ntuples;
- //PGR_DBG("Reading Restrictions: %i", total_restrict_tuples);
+ //DBG("Reading Restrictions: %i", total_restrict_tuples);
if (ntuples > 0) {
if (!restricts)
@@ -509,7 +476,7 @@ static int compute_trsp(
return finish(SPIcode, ret);
}
- uint32_t t;
+ int t;
SPITupleTable *tuptable = SPI_tuptable;
TupleDesc tupdesc = SPI_tuptable->tupdesc;
@@ -531,50 +498,50 @@ static int compute_trsp(
#ifdef DEBUG_OFF
int t;
for (t=0; t<total_restrict_tuples; t++) {
- PGR_DBG("restricts: %.2f, %i, %i, %i, %i, %i, %i", restricts[t].to_cost, restricts[t].target_id, restricts[t].via[0], restricts[t].via[1], restricts[t].via[2], restricts[t].via[3], restricts[t].via[4]);
+ DBG("restricts: %.2f, %i, %i, %i, %i, %i, %i", restricts[t].to_cost, restricts[t].target_id, restricts[t].via[0], restricts[t].via[1], restricts[t].via[2], restricts[t].via[3], restricts[t].via[4]);
}
#endif
- PGR_DBG("Total %ld restriction tuples", total_restrict_tuples);
+ DBG("Total %i restriction tuples", total_restrict_tuples);
if (dovertex) {
- PGR_DBG("Calling trsp_node_wrapper\n");
+ DBG("Calling trsp_node_wrapper\n");
/** hack always returns 0 -1 when installed on EDB VC++ 64-bit without this **/
#if defined(__MINGW64__)
- // elog(NOTICE,"Calling trsp_node_wrapper\n");
+ // elog(NOTICE,"Calling trsp_node_wrapper\n");
#endif
- ret = trsp_node_wrapper(edges, (uint32_t)total_tuples,
- restricts, (uint32_t)total_restrict_tuples,
+ ret = trsp_node_wrapper(edges, total_tuples,
+ restricts, total_restrict_tuples,
start_id, end_id,
directed, has_reverse_cost,
path, path_count, &err_msg);
}
else {
- PGR_DBG("Calling trsp_edge_wrapper\n");
- ret = trsp_edge_wrapper(edges, (uint32_t)total_tuples,
- restricts, (uint32_t)total_restrict_tuples,
+ DBG("Calling trsp_edge_wrapper\n");
+ ret = trsp_edge_wrapper(edges, total_tuples,
+ restricts, total_restrict_tuples,
start_id, start_pos, end_id, end_pos,
directed, has_reverse_cost,
path, path_count, &err_msg);
}
- PGR_DBG("Message received from inside:");
- PGR_DBG("%s",err_msg);
+ DBG("Message received from inside:");
+ DBG("%s",err_msg);
- //PGR_DBG("SIZE %i\n",*path_count);
+ //DBG("SIZE %i\n",*path_count);
//::::::::::::::::::::::::::::::::
//:: restoring original vertex id
//::::::::::::::::::::::::::::::::
for(z=0;z<*path_count;z++) {
- //PGR_DBG("vetex %i\n",(*path)[z].vertex_id);
+ //DBG("vetex %i\n",(*path)[z].vertex_id);
if (z || (*path)[z].vertex_id != -1)
(*path)[z].vertex_id+=v_min_id;
}
- PGR_DBG("ret = %i\n", ret);
+ DBG("ret = %i\n", ret);
- PGR_DBG("*path_count = %i\n", *path_count);
+ DBG("*path_count = %i\n", *path_count);
if (ret < 0)
{
@@ -594,8 +561,8 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
{
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
+ int call_cntr;
+ int max_calls;
TupleDesc tuple_desc;
path_element_t *path;
char * sql;
@@ -604,7 +571,7 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
// stuff done only on the first call of the function
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
- uint32_t path_count = 0;
+ int path_count = 0;
int ret = -1;
if (ret == -1) {}; // to avoid warning set but not used
@@ -631,7 +598,7 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
sql = NULL;
}
- PGR_DBG("Calling compute_trsp");
+ DBG("Calling compute_trsp");
ret =
@@ -648,19 +615,19 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
&path, &path_count);
#ifdef DEBUG
double total_cost = 0;
- PGR_DBG("Ret is %i", ret);
+ DBG("Ret is %i", ret);
if (ret >= 0)
{
int i;
for (i = 0; i < path_count; i++)
{
- // PGR_DBG("Step %i vertex_id %i ", i, path[i].vertex_id);
- // PGR_DBG(" edge_id %i ", path[i].edge_id);
- // PGR_DBG(" cost %f ", path[i].cost);
+ // DBG("Step %i vertex_id %i ", i, path[i].vertex_id);
+ // DBG(" edge_id %i ", path[i].edge_id);
+ // DBG(" cost %f ", path[i].cost);
total_cost+=path[i].cost;
}
}
- PGR_DBG("Total cost is: %f",total_cost);
+ DBG("Total cost is: %f",total_cost);
#endif
// total number of tuples to be returned
@@ -676,8 +643,8 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
// stuff done on every call of the function
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
+ call_cntr = funcctx->call_cntr;
+ max_calls = funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
path = (path_element_t*) funcctx->user_fctx;
@@ -689,7 +656,7 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
bool* nulls;
values = palloc(4 * sizeof(Datum));
- nulls = palloc(4 * sizeof(bool));
+ nulls = palloc(4 * sizeof(char));
values[0] = Int32GetDatum(call_cntr);
nulls[0] = false;
@@ -713,7 +680,7 @@ turn_restrict_shortest_path_vertex(PG_FUNCTION_ARGS)
}
else // do when there is no more left
{
- PGR_DBG("Going to free path");
+ DBG("Going to free path");
if (path) free(path);
SRF_RETURN_DONE(funcctx);
}
@@ -725,8 +692,8 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
{
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
+ int call_cntr;
+ int max_calls;
TupleDesc tuple_desc;
path_element_t *path;
char * sql;
@@ -734,7 +701,7 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
// stuff done only on the first call of the function
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
- uint32_t path_count = 0;
+ int path_count = 0;
#ifdef DEBUG
int ret = -1;
#endif
@@ -780,7 +747,7 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
sql = NULL;
}
- PGR_DBG("Calling compute_trsp");
+ DBG("Calling compute_trsp");
#ifdef DEBUG
ret =
@@ -797,19 +764,19 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
&path, &path_count);
#ifdef DEBUG
double total_cost = 0;
- PGR_DBG("Ret is %i", ret);
+ DBG("Ret is %i", ret);
if (ret >= 0)
{
int i;
for (i = 0; i < path_count; i++)
{
- // PGR_DBG("Step %i vertex_id %i ", i, path[i].vertex_id);
- // PGR_DBG(" edge_id %i ", path[i].edge_id);
- // PGR_DBG(" cost %f ", path[i].cost);
+ // DBG("Step %i vertex_id %i ", i, path[i].vertex_id);
+ // DBG(" edge_id %i ", path[i].edge_id);
+ // DBG(" cost %f ", path[i].cost);
total_cost+=path[i].cost;
}
}
- PGR_DBG("Total cost is: %f",total_cost);
+ DBG("Total cost is: %f",total_cost);
#endif
// total number of tuples to be returned
@@ -825,8 +792,8 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
// stuff done on every call of the function
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
+ call_cntr = funcctx->call_cntr;
+ max_calls = funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
path = (path_element_t*) funcctx->user_fctx;
@@ -838,7 +805,7 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
bool* nulls;
values = palloc(4 * sizeof(Datum));
- nulls = palloc(4 * sizeof(bool));
+ nulls = palloc(4 * sizeof(char));
values[0] = Int32GetDatum(call_cntr);
nulls[0] = false;
@@ -862,7 +829,7 @@ turn_restrict_shortest_path_edge(PG_FUNCTION_ARGS)
}
else // do when there is no more left
{
- PGR_DBG("Going to free path");
+ DBG("Going to free path");
if (path) free(path);
SRF_RETURN_DONE(funcctx);
}
diff --git a/src/trsp/src/trsp.h b/src/trsp/src/trsp.h
index fa427ed..03961cc 100644
--- a/src/trsp/src/trsp.h
+++ b/src/trsp/src/trsp.h
@@ -24,21 +24,21 @@
#define MAX_RULE_LENGTH 5
-#include <stdint.h>
+#include "postgres.h"
typedef struct edge
{
- long id;
+ int id;
long source;
long target;
- double cost;
- double reverse_cost;
+ float8 cost;
+ float8 reverse_cost;
} edge_t;
typedef struct restrict_struct
{
int target_id;
- double to_cost;
+ float8 to_cost;
int via[MAX_RULE_LENGTH];
}
restrict_t;
@@ -47,45 +47,45 @@ typedef struct path_element
{
long vertex_id;
long edge_id;
- double cost;
+ float8 cost;
} path_element_t;
#ifdef __cplusplus
-extern "C" {
+extern "C"
#endif
int trsp_node_wrapper(
edge_t *edges,
- uint32_t edge_count,
+ unsigned int edge_count,
restrict_t *restricts,
- uint32_t restrict_count,
- long start_vertex,
- long end_vertex,
+ int restrict_count,
+ int start_vertex,
+ int end_vertex,
bool directed,
bool has_reverse_cost,
path_element_t **path,
- uint32_t *path_count,
+ int *path_count,
char **err_msg
);
+#ifdef __cplusplus
+extern "C"
+#endif
+
int trsp_edge_wrapper(
edge_t *edges,
- uint32_t edge_count,
+ unsigned int edge_count,
restrict_t *restricts,
- uint32_t restrict_count,
- long start_edge,
+ int restrict_count,
+ int start_edge,
double start_pos,
- long end_edge,
+ int end_edge,
double end_pos,
bool directed,
bool has_reverse_cost,
path_element_t **path,
- uint32_t *path_count,
+ int *path_count,
char **err_msg
);
-#ifdef __cplusplus
-}
-#endif
-
#endif
diff --git a/src/trsp/src/trsp_core.cpp b/src/trsp/src/trsp_core.cpp
index e237399..21801c5 100644
--- a/src/trsp/src/trsp_core.cpp
+++ b/src/trsp/src/trsp_core.cpp
@@ -1,27 +1,4 @@
-/*PGR-GNU*****************************************************************
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
+#ifdef __MINGW32__
#include <winsock2.h>
#include <windows.h>
#endif
@@ -32,15 +9,15 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
int trsp_node_wrapper(
edge_t *edges,
- uint32_t edge_count,
+ unsigned int edge_count,
restrict_t *restricts,
- uint32_t restrict_count,
- long start_vertex,
- long end_vertex,
+ int restrict_count,
+ int start_vertex,
+ int end_vertex,
bool directed,
bool has_reverse_cost,
path_element_t **path,
- uint32_t *path_count,
+ int *path_count,
char **err_msg
)
{
@@ -48,9 +25,9 @@ int trsp_node_wrapper(
std::vector<PDVI> ruleTable;
- int j;
+ int i, j;
ruleTable.clear();
- for (size_t i=0; i<restrict_count; i++) {
+ for (i=0; i<restrict_count; i++) {
std::vector<int> seq;
seq.clear();
seq.push_back(restricts[i].target_id);
@@ -61,10 +38,8 @@ int trsp_node_wrapper(
ruleTable.push_back(make_pair(restricts[i].to_cost, seq));
}
- size_t count;
GraphDefinition gdef;
- int res = gdef.my_dijkstra3(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, &count, err_msg, ruleTable);
- *path_count = static_cast<uint32_t> (count);
+ int res = gdef.my_dijkstra(edges, edge_count, start_vertex, end_vertex, directed, has_reverse_cost, path, path_count, err_msg, ruleTable);
if (res < 0)
@@ -84,17 +59,17 @@ int trsp_node_wrapper(
int trsp_edge_wrapper(
edge_t *edges,
- uint32_t edge_count,
+ unsigned int edge_count,
restrict_t *restricts,
- uint32_t restrict_count,
- long start_edge,
+ int restrict_count,
+ int start_edge,
double start_pos,
- long end_edge,
+ int end_edge,
double end_pos,
bool directed,
bool has_reverse_cost,
path_element_t **path,
- uint32_t *path_count,
+ int *path_count,
char **err_msg
)
{
@@ -102,9 +77,9 @@ int trsp_edge_wrapper(
std::vector<PDVI> ruleTable;
- int j;
+ int i, j;
ruleTable.clear();
- for (size_t i=0; i<restrict_count; i++) {
+ for (i=0; i<restrict_count; i++) {
std::vector<int> seq;
seq.clear();
seq.push_back(restricts[i].target_id);
@@ -116,9 +91,7 @@ int trsp_edge_wrapper(
}
GraphDefinition gdef;
- size_t count;
- int res = gdef.my_dijkstra4(edges, edge_count, start_edge, start_pos, end_edge, end_pos, directed, has_reverse_cost, path, &count, err_msg, ruleTable);
- *path_count = static_cast<uint32_t>(count);
+ int res = gdef.my_dijkstra(edges, edge_count, start_edge, start_pos, end_edge, end_pos, directed, has_reverse_cost, path, path_count, err_msg, ruleTable);
if (res < 0)
diff --git a/src/trsp/src/utils.h b/src/trsp/src/utils.h
index a6eb131..86d3b14 100644
--- a/src/trsp/src/utils.h
+++ b/src/trsp/src/utils.h
@@ -80,10 +80,10 @@ public:
return vecTokens.size();
}
- bool getToken(std::string& strToken, size_t iTokenIndex)
+ bool getToken(std::string& strToken, long iTokenIndex)
{
- auto lTokenCount = vecTokens.size();
- if(iTokenIndex < lTokenCount)
+ long lTokenCount = vecTokens.size();
+ if(iTokenIndex < 0 || iTokenIndex < lTokenCount)
{
strToken = vecTokens[iTokenIndex];
return true;
diff --git a/src/trsp/test/doc-trsp.test.sql b/src/trsp/test/doc-trsp.test.sql
index 68091c8..183de73 100644
--- a/src/trsp/test/doc-trsp.test.sql
+++ b/src/trsp/test/doc-trsp.test.sql
@@ -1,6 +1,5 @@
-BEGIN;
------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------
-- PGR_pgr_trsp
@@ -53,4 +52,3 @@ BEGIN;
coalesce('',''||via_path,'''') AS via_path FROM restrictions');
\echo --q6
- ROLLBACK;
diff --git a/src/trsp/test/issue693.test.sql b/src/trsp/test/issue693.test.sql
index 0f179c5..aae3fa1 100644
--- a/src/trsp/test/issue693.test.sql
+++ b/src/trsp/test/issue693.test.sql
@@ -1,5 +1,4 @@
-BEGIN;
CREATE TABLE routing (gid serial, length integer, source integer, target integer, reverse_cost integer);
INSERT INTO routing (length, source, target, reverse_cost) VALUES
@@ -13,4 +12,3 @@ BEGIN;
1, 0.1, 1, 0.9, false, true
);
- ROLLBACK;
diff --git a/src/trsp/test/issue704.result b/src/trsp/test/issue704.result
index 9cf304b..658e0f7 100644
--- a/src/trsp/test/issue704.result
+++ b/src/trsp/test/issue704.result
@@ -1,5 +1,4 @@
q1
-0|-1|582877|229.0450
q2
0|-1|582877|229.0450
1|-2|-1|0.0000
diff --git a/src/trsp/test/test.conf b/src/trsp/test/test.conf
index b5a35c2..b4d1d30 100644
--- a/src/trsp/test/test.conf
+++ b/src/trsp/test/test.conf
@@ -11,10 +11,11 @@
issue693
issue704
issue717
- trsp_notes_v2.3.2
+ trsp_notes_v2.4.0
)],
'documentation' => [qw(
- trsp_notes_v2.3.2
+ trsp_notes_v2.4.0
+ issue704
doc-trsp
)]
},
diff --git a/src/trsp/test/trsp-any-02.test.sql b/src/trsp/test/trsp-any-02.test.sql
index 2e611f5..7130d2d 100644
--- a/src/trsp/test/trsp-any-02.test.sql
+++ b/src/trsp/test/trsp-any-02.test.sql
@@ -1,4 +1,3 @@
-BEGIN;
CREATE TABLE restrictions2 (
rid integer NOT NULL,
@@ -27,4 +26,3 @@ select * from pgr_trsp(
-- include the turn restrictions
'select to_cost, teid as target_id, feid||coalesce('',''||via,'''') as via_path from restrictions2');
-ROLLBACK;
diff --git a/src/trsp/test/trsp_notes_v2.3.2.result b/src/trsp/test/trsp_notes_v2.4.0.result
similarity index 76%
rename from src/trsp/test/trsp_notes_v2.3.2.result
rename to src/trsp/test/trsp_notes_v2.4.0.result
index 505ee4e..e2db9c7 100644
--- a/src/trsp/test/trsp_notes_v2.3.2.result
+++ b/src/trsp/test/trsp_notes_v2.4.0.result
@@ -1,4 +1,4 @@
-# Notes on pgr_trsp for version 2.3.2
+# Notes on pgr_trsp for version 2.4.0
Table of contents
* [Introduction](#introduction)
* [The restriction](#the-restriction)
@@ -46,17 +46,14 @@ $$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, 32, 33::TEXT AS via_pa
therefore the shortest path expected are as if there was no restriction involved
# The Vertices signature version
## (Vertices) No path representation differences
-Original code of pgr_trsp throws Error to represent no path found
-Sometimes it crasses the server
+Original function code
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
-SELECT * FROM _pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 15, true, true
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
```
dijkstra returns EMPTY SET to represent no path found
```
@@ -67,17 +64,9 @@ therefore returns EMPTY SET to represent no path found
```
pgr_trsp use the original code when there are restrictions
therefore throws Error to represent no path found
-Can get a server crash
```
-SELECT * FROM pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 15, true, true,
-$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, 32, 33::TEXT AS via_path$$
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function pgr_trsp(text,integer,integer,boolean,boolean,text) line 29 at RETURN QUERY
```
## routing from/to same location
using dijkstra to verify (1 to 1)
@@ -88,8 +77,8 @@ therefore is expected to return EMPTY SET to represent no path found
```
```
call forcing the use of the original code (1 to 1)
-therefore is expected to return Error to represent no path found
-but "finds" a path when there should be no path.
+* not longer allowed without restrictions
+
```
0|1|1|1
1|2|4|1
@@ -139,8 +128,9 @@ using the replacement function because there are no restrictions (2 to 3)
0|2|2|1
1|3|-1|0
```
-call to the original function (2 to 3)
-does not find the shortest path
+call forcing the use of the original code
+* not longer allowed without restrictions
+
```
0|2|4|1
1|5|8|1
@@ -171,17 +161,14 @@ does not find the shortest path
```
# The Edges signature version
## (Edges) No path representation differences
-Original code of pgr_trsp throws Error to represent no path found
-Can get a server crash
+Original function code
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
-SELECT * FROM _pgr_trsp(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-1, 0.5, 17, 0.5, true, true
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
```
pgr_withPoints returns EMPTY SET to represent no path found
```
@@ -192,9 +179,8 @@ Remember that one characteristic of a path is that for a path of N edges it has
For this example, suppose points, where the pid are different even if the edge and fraction are different.
One point might be on the left side other on the right side, pgr_trsp does not take into account
the side of the point
-Using the original code (with and without restrictions) it returns a path
-of N edge and N vertex instead of N edge and N+1 vertices
-* with out restrictions
+calls forcing the use of the original code
+* not longer allowed without restrictions
```
0|-1|1|0
@@ -345,45 +331,23 @@ Showing *pgr_withPoints* results of the shortest path from vid 6 to pid 1
```
* Vertex 6 is on edge 8 at 1 fraction
* Vertex 6 is also edge 11 at 0 fraction
-* The *_pgr_trsp* is used because at least one of the "points" is an actual vertex
+* Undefined behaviour when at least one of the "points" is an actual vertex
```
-0|6|8|1
-1|5|4|1
-2|2|1|0.6
-0|6|8|1
-1|5|4|1
-2|2|1|0.6
```
# pgr_trspViaVertices
## pgr_trspViaVertices No path representation differences
-pgr_trspViaVertices throws error when a path on the route was not found
-this example no path is found (vertex 15 is disconnected) from the big graph
-can crash the server
-```
-SELECT * FROM _pgr_trspViaVertices(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 15, 2],
-false, true
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+pgr_trspViaVertices uses _pgr_trsp which as mentioned before
+* Sometimes it crasses the server when no path was found
+* Sometimes represents with Error a no path found
+* Forcing the user to use the wrapper or the replacement function
+
+Calls to the original function of is no longer allowed without restrictions
```
-In this example there exists a path from 2 to 1 but only complete routes are processed
-can crash the server
-```
-SELECT * FROM _pgr_trspViaVertices(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 15, 2, 1],
-false,
-true
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function _pgr_trspviavertices(text,integer[],boolean,boolean,text) line 23 at FOR over SELECT rows
+ERROR: Error computing path: Path Not Found
+CONTEXT: PL/pgSQL function _pgr_trspviavertices(text,integer[],boolean,boolean,text) line 23 at FOR over SELECT rows
```
**pgr_dijkstraVia** returning what paths of the route it finds or EMPTY SET when non is found
this case none is found
@@ -404,10 +368,7 @@ Because there is no path from 1 to 1 then there is no complete route 1 to 1 to 2
therefore the expected result is EMPTY SET to represent no route was found
```
```
-Using the original code
-Because there is no path from 1 to 1 then there is no complete route 1 to 1 to 2
-therefore the expected result is Error to represent no route was found
-gives a result even that there is no path from 1 to 1
+Calls to the original function of is no longer allowed without restrictions
```
1|1|1|1|1
2|1|2|4|1
@@ -460,7 +421,7 @@ the replacement function **pgr_dijkstraVia** is used because there are no restri
2|2|3|2|1
3|2|2|-1|0
```
-forcing to use the original code, it give not give the shortest path from 2 to 3
+Calls to the original function of is no longer allowed without restrictions
```
1|1|2|4|1
2|1|5|8|1
@@ -493,7 +454,8 @@ Exaple execution
```
A temporay wraper function is used when:
* There are no restrictions
-* No point is a vertex in disguise (with pcts value of 0)
+* Before: No point is a vertex in disguise (with pcts value of 0)
+* Now: c$Undefined behaviour when a point is a vertex in disguise (with pcts value of 0)
Internaly:
* builds a new graph and calls pgr_dijkstraVia
@@ -505,7 +467,7 @@ What it returns
* the points are renumbered to -1, -2 .. -N
* if a point is part of a path it will show on the path
-Note: I dont mention the wrapper name due to the fact that this is not official documentation
+Note: I do not mention the wrapper name due to the fact that this is not official documentation
Note: I will use *_pgr_withPointsVia* as the wrapper name just for sake of this notes
Example excution
```
@@ -519,20 +481,10 @@ Example excution
## pgr_trspViaEdges No path representation differences
This example no path is found (edge 17 is disconnected) from the big graph.
* There is a vertex in disguise (fraction 0 or 1)
-* *pgr_trspViaEdges* original code is used
-* throws error to represent no route was not found
-* sometimes crashes the server
+* Undefined behaviour
```
-SELECT * FROM pgr_trspViaEdges(
-$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-ARRAY[1, 17, 1], ARRAY[0,0.5,0.5],
-false, true
-);
-server closed the connection unexpectedly
-This probably means the server terminated abnormally
-before or while processing the request.
-The connection to the server was lost. Attempting reset: Failed.
+1||||
```
This example no path is found (edge 17 is disconnected) from the big graph.
* Has a restriction
@@ -590,15 +542,11 @@ when originalcode is used (because there is a restriction)
```
Routing points & vertices
* vertex 6 is on edge 11 with fraction 0
-original code is used
+* Undefined behavior
```
1|1|-1|1|0.6
2|1|2|4|1
3|1|5|10|1
4|1|10|12|0.6
-5|2|-1|12|0.4
-6|2|11|13|1
-7|2|12|15|1
-8|2|9|9|1
-9|2|6|-1|0
+5|1|-2|-1|0
```
diff --git a/src/trsp/test/trsp_notes_v2.3.2.test.sql b/src/trsp/test/trsp_notes_v2.4.0.test.sql
similarity index 84%
rename from src/trsp/test/trsp_notes_v2.3.2.test.sql
rename to src/trsp/test/trsp_notes_v2.4.0.test.sql
index a1e538a..e333de8 100644
--- a/src/trsp/test/trsp_notes_v2.3.2.test.sql
+++ b/src/trsp/test/trsp_notes_v2.4.0.test.sql
@@ -1,4 +1,5 @@
-\echo # Notes on pgr_trsp for version 2.3.2
+ROLLBACK;
+\echo # Notes on pgr_trsp for version 2.4.0
\echo Table of contents
@@ -58,17 +59,17 @@
\echo # The Vertices signature version
------------------
\echo ## (Vertices) No path representation differences
-\echo Original code of pgr_trsp throws Error to represent no path found
-\echo Sometimes it crasses the server
+\echo Original function code
+\echo * Sometimes it crasses the server when no path was found
+\echo * Sometimes represents with Error a no path found
+\echo * Forcing the user to use the wrapper or the replacement function
+\echo
+\echo Calls to the original function of is no longer allowed without restrictions
\echo '\`\`\`'
-\echo SELECT * FROM _pgr_trsp(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo 1, 15, true, true
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
+SELECT * FROM _pgr_trsp(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 15, true, true
+);
\echo '\`\`\`'
\echo dijkstra returns EMPTY SET to represent no path found
@@ -79,8 +80,6 @@ SELECT * FROM pgr_dijkstra(
);
\echo '\`\`\`'
-
-
\echo pgr_trsp use the pgr_dijkstra when there are no restrictions
\echo therefore returns EMPTY SET to represent no path found
\echo '\`\`\`'
@@ -92,17 +91,12 @@ SELECT * FROM pgr_TRSP(
\echo pgr_trsp use the original code when there are restrictions
\echo therefore throws Error to represent no path found
-\echo Can get a server crash
\echo '\`\`\`'
-\echo SELECT * FROM pgr_trsp(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo 1, 15, true, true,
-\echo $$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
+ SELECT * FROM pgr_trsp(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 15, true, true,
+ $$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
+);
\echo '\`\`\`'
@@ -129,13 +123,12 @@ SELECT * FROM pgr_TRSP(
\echo call forcing the use of the original code (1 to 1)
-\echo therefore is expected to return Error to represent no path found
-\echo but "finds" a path when there should be no path.
+\echo * not longer allowed without restrictions
+\echo
\echo '\`\`\`'
SELECT * FROM _pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
- 1, 1,
- true, true
+ 1, 1, true, true
);
\echo '\`\`\`'
@@ -187,14 +180,14 @@ SELECT * FROM pgr_TRSP(
);
\echo '\`\`\`'
-\echo call to the original function (2 to 3)
-\echo does not find the shortest path
+\echo call forcing the use of the original code
+\echo * not longer allowed without restrictions
+\echo
\echo '\`\`\`'
SELECT * FROM _pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
2, 3,
- false,
- true
+ false, true
);
\echo '\`\`\`'
@@ -204,8 +197,7 @@ SELECT * FROM _pgr_trsp(
SELECT * FROM pgr_trsp(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
2, 3,
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
\echo '\`\`\`'
@@ -227,17 +219,17 @@ SELECT * FROM _pgr_trsp(
------------------HERE
\echo ## (Edges) No path representation differences
-\echo Original code of pgr_trsp throws Error to represent no path found
-\echo Can get a server crash
+\echo Original function code
+\echo * Sometimes it crasses the server when no path was found
+\echo * Sometimes represents with Error a no path found
+\echo * Forcing the user to use the wrapper or the replacement function
+\echo
+\echo Calls to the original function of is no longer allowed without restrictions
\echo '\`\`\`'
-\echo SELECT * FROM _pgr_trsp(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo 1, 0.5, 17, 0.5, true, true
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
+SELECT * FROM _pgr_trsp(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ 1, 0.5, 17, 0.5, true, true
+);
\echo '\`\`\`'
\echo pgr_withPoints returns EMPTY SET to represent no path found
\echo '\`\`\`'
@@ -259,9 +251,8 @@ SELECT * FROM pgr_withPoints(
\echo One point might be on the left side other on the right side, pgr_trsp does not take into account
\echo the side of the point
-\echo Using the original code (with and without restrictions) it returns a path
-\echo of N edge and N vertex instead of N edge and N+1 vertices
-\echo * with out restrictions
+\echo calls forcing the use of the original code
+\echo * not longer allowed without restrictions
\echo
\echo '\`\`\`'
SELECT * FROM _pgr_trsp(
@@ -507,7 +498,7 @@ SELECT * FROM pgr_withPoints(
\echo * Vertex 6 is on edge 8 at 1 fraction
\echo * Vertex 6 is also edge 11 at 0 fraction
-\echo * The *_pgr_trsp* is used because at least one of the "points" is an actual vertex
+\echo * Undefined behaviour when at least one of the "points" is an actual vertex
\echo
\echo '\`\`\`'
SELECT * FROM pgr_trsp(
@@ -532,35 +523,23 @@ SELECT * FROM pgr_trsp(
------------------
\echo ## pgr_trspViaVertices No path representation differences
-\echo pgr_trspViaVertices throws error when a path on the route was not found
-\echo this example no path is found (vertex 15 is disconnected) from the big graph
-\echo can crash the server
-\echo '\`\`\`'
-\echo SELECT * FROM _pgr_trspViaVertices(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo ARRAY[1, 15, 2],
-\echo false, true
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
-\echo '\`\`\`'
-
-
-\echo In this example there exists a path from 2 to 1 but only complete routes are processed
-\echo can crash the server
+\echo pgr_trspViaVertices uses _pgr_trsp which as mentioned before
+\echo * Sometimes it crasses the server when no path was found
+\echo * Sometimes represents with Error a no path found
+\echo * Forcing the user to use the wrapper or the replacement function
+\echo
+\echo Calls to the original function of is no longer allowed without restrictions
\echo '\`\`\`'
-\echo SELECT * FROM _pgr_trspViaVertices(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo ARRAY[1, 15, 2, 1],
-\echo false,
-\echo true
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
+SELECT * FROM _pgr_trspViaVertices(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 15, 2],
+ false, true
+);
+SELECT * FROM _pgr_trspViaVertices(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 15, 2, 1],
+ false, true
+);
\echo '\`\`\`'
\echo **pgr_dijkstraVia** returning what paths of the route it finds or EMPTY SET when non is found
@@ -603,21 +582,16 @@ SELECT * FROM pgr_dijkstraVia(
SELECT * FROM pgr_TRSPViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true
+ false, true
);
\echo '\`\`\`'
-\echo Using the original code
-\echo Because there is no path from 1 to 1 then there is no complete route 1 to 1 to 2
-\echo therefore the expected result is Error to represent no route was found
-\echo gives a result even that there is no path from 1 to 1
+\echo Calls to the original function of is no longer allowed without restrictions
\echo '\`\`\`'
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true
+ false, true
);
\echo '\`\`\`'
@@ -626,8 +600,7 @@ SELECT * FROM _pgr_trspViaVertices(
SELECT * FROM pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
\echo '\`\`\`'
@@ -638,8 +611,7 @@ SELECT * FROM pgr_trspViaVertices(
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
ARRAY[1, 1, 2],
- false,
- true,
+ false, true,
$$SELECT 100::float AS to_cost, 25::INTEGER AS target_id, '32, 33'::TEXT AS via_path$$
);
\echo '\`\`\`'
@@ -667,7 +639,7 @@ SELECT * FROM pgr_TRSPViaVertices(
);
\echo '\`\`\`'
-\echo forcing to use the original code, it give not give the shortest path from 2 to 3
+\echo Calls to the original function of is no longer allowed without restrictions
\echo '\`\`\`'
SELECT * FROM _pgr_trspViaVertices(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
@@ -706,7 +678,8 @@ SELECT * FROM pgr_trspViaEdges(
\echo '\`\`\`'
\echo A temporay wraper function is used when:
\echo * There are no restrictions
-\echo * No point is a vertex in disguise (with pcts value of 0)
+\echo * Before: No point is a vertex in disguise (with pcts value of 0)
+\echo * Now: c$Undefined behaviour when a point is a vertex in disguise (with pcts value of 0)
\echo
\echo Internaly:
\echo * builds a new graph and calls pgr_dijkstraVia
@@ -718,7 +691,7 @@ SELECT * FROM pgr_trspViaEdges(
\echo * the points are renumbered to -1, -2 .. -N
\echo * if a point is part of a path it will show on the path
\echo
-\echo Note: I dont mention the wrapper name due to the fact that this is not official documentation
+\echo Note: I do not mention the wrapper name due to the fact that this is not official documentation
\echo Note: I will use *_pgr_withPointsVia* as the wrapper name just for sake of this notes
\echo Example excution
@@ -736,20 +709,14 @@ SELECT * FROM _pgr_withPointsVia(
\echo This example no path is found (edge 17 is disconnected) from the big graph.
\echo * There is a vertex in disguise (fraction 0 or 1)
-\echo * *pgr_trspViaEdges* original code is used
-\echo * throws error to represent no route was not found
-\echo * sometimes crashes the server
+\echo * Undefined behaviour
\echo
\echo '\`\`\`'
-\echo SELECT * FROM pgr_trspViaEdges(
-\echo $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
-\echo ARRAY[1, 17, 1], ARRAY[0,0.5,0.5],
-\echo false, true
-\echo );
-\echo server closed the connection unexpectedly
-\echo This probably means the server terminated abnormally
-\echo before or while processing the request.
-\echo The connection to the server was lost. Attempting reset: Failed.
+SELECT * FROM pgr_trspViaEdges(
+ $$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
+ ARRAY[1, 17, 1], ARRAY[0,0.5,0.5],
+ false, true
+);
\echo '\`\`\`'
@@ -828,7 +795,7 @@ SELECT * FROM pgr_trspViaEdges(
\echo Routing points & vertices
\echo * vertex 6 is on edge 11 with fraction 0
-\echo original code is used
+\echo * Undefined behavior
\echo '\`\`\`'
SELECT * FROM pgr_trspViaEdges(
$$SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table$$,
@@ -844,3 +811,4 @@ SELECT * FROM pgr_trspViaEdges(
true
);
\echo '\`\`\`'
+BEGIN;
diff --git a/src/trsp/test/trsp_vias-any-04.test.sql b/src/trsp/test/trsp_vias-any-04.test.sql
index bbe198c..7cf1489 100644
--- a/src/trsp/test/trsp_vias-any-04.test.sql
+++ b/src/trsp/test/trsp_vias-any-04.test.sql
@@ -21,7 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-BEGIN;
SELECT * FROM pgr_trspViaVertices(
@@ -60,4 +59,3 @@ BEGIN;
-- include the turn restrictions
'SELECT to_cost, target_id::INTEGER, from_edge||coalesce('',''||via_path,'''') AS via_path FROM restrictions');
\echo '---------------------------'
- ROLLBACK;
diff --git a/src/tsp/doc/tsp.rst b/src/tsp/doc/TSP-family.rst
similarity index 60%
rename from src/tsp/doc/tsp.rst
rename to src/tsp/doc/TSP-family.rst
index f10faf5..8d6bc14 100644
--- a/src/tsp/doc/tsp.rst
+++ b/src/tsp/doc/TSP-family.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -9,41 +9,27 @@
.. _tsp:
-Traveling Sales Person
+Traveling Sales Person - Family of functions
===============================================================================
-- :ref:`pgr_TSP` - When input is given as matrix cell information.
-- :ref:`pgr_eucledianTSP` - When input are coordinates.
-
-.. toctree::
- :hidden:
+.. index from here
- ./pgr_tsp
- ./pgr_eucledianTSP
+* :ref:`pgr_TSP` - When input is given as matrix cell information.
+* :ref:`pgr_eucledianTSP` - When input are coordinates.
-.. NOTE:: These signatures are being deprecated
+.. index to here
- .. code-block:: sql
-
- -- (1)
- pgr_costResult[] pgr_tsp(sql text, start_id integer)
- pgr_costResult[] pgr_tsp(sql text, start_id integer, end_id integer)
-
- -- (2)
- record[] pgr_tsp(matrix float[][], start integer)
- record[] pgr_tsp(matrix float[][], start integer, end integer)
+.. toctree::
+ :hidden:
- - See http://docs.pgrouting.org/2.2/en/src/common/doc/types/cost_result.html
- - See http://docs.pgrouting.org/2.2/en/src/tsp/doc/pgr_tsp.html
- - For more details, see tsp_deprecated_.
+ pgr_TSP
+ pgr_eucledianTSP
- Use :ref:`pgr_eucledianTSP` insteadi of (1).
- Use :ref:`pgr_TSP` instead of (2).
-General Information
+General Information
------------------------------------
-Origin
+Origin
..........
The traveling sales person problem was studied in the 18th century by mathematicians
@@ -53,20 +39,20 @@ A discussion about the work of Hamilton & Kirkman
can be found in the book **Graph Theory (Biggs et al. 1976)**.
* ISBN-13: 978-0198539162
-* ISBN-10: 0198539169
+* ISBN-10: 0198539169
It is believed that the general form of the TSP have been first studied by Kalr Menger in Vienna and Harvard.
The problem was later promoted by Hassler, Whitney & Merrill at Princeton.
-A detailed description about the connection between Menger & Whitney, and the development of the
+A detailed description about the connection between Menger & Whitney, and the development of the
TSP can be found in `On the history of combinatorial optimization (till 1960) <http://www.cwi.nl/~lex/files/histco.ps>`_
-Problem Definition
+Problem Definition
...................
Given a collection of cities and travel cost between each pair,
find the cheapest way for visiting all of the cities and returning to the starting point.
-Characteristics
+Characteristics
................
- The travel costs are symmetric:
@@ -92,10 +78,10 @@ TSP & Simulated Annealing
The simulated annealing algorithm was originally inspired from the process of
annealing in metal work.
- Annealing involves heating and cooling a material to
- alter its physical properties due to the changes in its internal structure.
- As the metal cools its new structure becomes fixed,
- consequently causing the metal to retain its newly obtained properties.
+Annealing involves heating and cooling a material to
+alter its physical properties due to the changes in its internal structure.
+As the metal cools its new structure becomes fixed,
+consequently causing the metal to retain its newly obtained properties. [C001]_
.. rubric:: Pseudocode
@@ -136,18 +122,18 @@ simulated annealing process.
To cool down faster to the next temperature:
- - max_changes_per_temperature: limits the number of changes in the solution per temperature
- - max_consecutive_non_changes: limits the number of consecutive non changes per temperature
+- max_changes_per_temperature: limits the number of changes in the solution per temperature
+- max_consecutive_non_changes: limits the number of consecutive non changes per temperature
This is done by doing some book keeping on the times **solution ← snew;** is executed.
- - max_changes_per_temperature: Increases by one when **solution** changes
- - max_consecutive_non_changes: Reset to 0 when **solution** changes, and increased each **try**
+- max_changes_per_temperature: Increases by one when **solution** changes
+- max_consecutive_non_changes: Reset to 0 when **solution** changes, and increased each **try**
Additionally to stop the algorithm at a higher temperature than the desired one:
- - max_processing_time: limits the time the simulated annealing is performed.
- - book keeping is done to see if there was a change in **solution** on the last temperature
+- max_processing_time: limits the time the simulated annealing is performed.
+- book keeping is done to see if there was a change in **solution** on the last temperature
Note that, if no change was found in the first **max_consecutive_non_changes** tries, then the
simulated annealing will stop.
@@ -209,69 +195,24 @@ A recommendation is to play with the values and see what fits to the particular
description of control parameters
-.. include:: tsp_parameters.txt
-
-
-.. _tsp_deprecated:
-
-Deprecated functionality
-.........................
-
-The old functionality is deprecated:
+.. include:: tsp_parameters.txt
-* User can not control the execution.
-* Not all valuable information is returned.
-* Some returned column don not have meaningful names.
-:Example:
-Using the old functionality, for example
-
-* `id` can not be of type `BIGINT`.
-* `id1` and `id2` are meningless column names.
-* Needs an index as parameter for the starting node.
-
-.. literalinclude:: doc-tsp.queries
- :start-after: -- q1
- :end-before: -- q2
-
-With the new functionality:
-
-* `id` can be of type `BIGINT` .
-* There is an aggregate cost column.
-* Instead of an index it uses the node identifier for the starting node.
-
-.. literalinclude:: doc-tsp.queries
- :start-after: -- q2
- :end-before: -- q3
-
-:Example:
-
-Using the old functionality, for example
-
-* `id`, `source`, `target` can not be of type `BIGINT`.
-* It does not return the `cost` column.
-* Needs an index as parameter for the starting node.
-* The identifiers in the result does not correspond to the indentifiers given as input.
+See Also
+.........................
-.. literalinclude:: doc-tsp.queries
- :start-after: -- q3
- :end-before: -- q4
+.. rubric:: References
-With the new functionality:
+.. [C001] `Simulated annaeling algorithm for beginners <http://www.theprojectspot.com/tutorial-post/simulated-annealing-algorithm-for-beginners/6>`_
-* `id`, `source`, `target` can be of type `BIGINT`,
-* There is an aggregate cost column and a cost column in the results.
-* Instead of an index it uses the node identifier for the starting node.
+* http://en.wikipedia.org/wiki/Traveling_salesman_problem
+* http://en.wikipedia.org/wiki/Simulated_annealing
-.. literalinclude:: doc-tsp.queries
- :start-after: -- q4
- :end-before: -- q5
+.. rubric:: Indices and tables
+* :ref:`genindex`
+* :ref:`search`
-See Also
-.........................
- * http://en.wikipedia.org/wiki/Traveling_salesman_problem
- * http://en.wikipedia.org/wiki/Simulated_annealing
diff --git a/src/tsp/doc/doc-pgr_TSP.queries b/src/tsp/doc/doc-pgr_TSP.queries
index abd0633..374dd6b 100644
--- a/src/tsp/doc/doc-pgr_TSP.queries
+++ b/src/tsp/doc/doc-pgr_TSP.queries
@@ -1,4 +1,6 @@
-SET client_min_messages TO WARNING;
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
SET
-- q1
WITH
@@ -71,3 +73,5 @@ SELECT * FROM pgr_TSP(
(6 rows)
-- q4
+ROLLBACK;
+ROLLBACK
diff --git a/src/tsp/doc/doc-pgr_eucledianTSP.queries b/src/tsp/doc/doc-pgr_eucledianTSP.queries
index 3fa21f4..8067930 100644
--- a/src/tsp/doc/doc-pgr_eucledianTSP.queries
+++ b/src/tsp/doc/doc-pgr_eucledianTSP.queries
@@ -1,6 +1,6 @@
BEGIN;
BEGIN
-SET client_min_messages TO WARNING;
+SET client_min_messages TO NOTICE;
SET
-- q1
WITH
@@ -49,7 +49,7 @@ SELECT* from pgr_eucledianTSP(
(18 rows)
-- q3
-SET client_min_messages TO NOTICE;
+SET client_min_messages TO DEBUG1;
SET
SELECT* from pgr_eucledianTSP(
$$
@@ -58,7 +58,7 @@ SELECT* from pgr_eucledianTSP(
tries_per_temperature := 0,
randomize := false
);
-NOTICE: pgr_eucledianTSP Processing Information
+DEBUG: pgr_eucledianTSP Processing Information
Initializing tsp class ---> tsp.greedyInitial ---> tsp.annealing ---> OK
Cycle(100) total changes =0 0 were because delta energy < 0
diff --git a/src/tsp/doc/doc-tsp.queries b/src/tsp/doc/doc-tsp.queries
index 84d11b5..d67eac0 100644
--- a/src/tsp/doc/doc-tsp.queries
+++ b/src/tsp/doc/doc-tsp.queries
@@ -1,6 +1,6 @@
BEGIN;
BEGIN
-SET client_min_messages TO WARNING;
+SET client_min_messages TO NOTICE;
SET
-- q1
SELECT * FROM pgr_TSP(
@@ -64,54 +64,38 @@ SELECT * FROM pgr_eucledianTSP(
SELECT * FROM pgr_TSP(
(SELECT * FROM pgr_vidsToDMatrix(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
- (SELECT array_agg(id) from edge_table_vertices_pgr WHERE id < 14)::INTEGER[], false , true, true)
+ ARRAY[8,11,12,13]::INTEGER[], false , true, true)
),
1
);
+NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
seq | id
-----+----
0 | 1
1 | 2
2 | 3
- 3 | 8
- 4 | 11
- 5 | 5
- 6 | 10
- 7 | 12
- 8 | 9
- 9 | 6
- 10 | 7
- 11 | 4
- 12 | 0
-(13 rows)
+ 3 | 0
+(4 rows)
-- q4
SELECT * FROM pgr_TSP(
$$
SELECT * FROM pgr_dijkstraCostMatrix(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- (SELECT array_agg(id) from edge_table_vertices_pgr WHERE id < 14), false)
+ ARRAY[8,11,12,13]::INTEGER[], false)
$$,
- 1,
+ 8,
randomize := false
);
seq | node | cost | agg_cost
-----+------+------+----------
- 1 | 1 | 3 | 0
- 2 | 4 | 1 | 3
- 3 | 9 | 1 | 4
- 4 | 12 | 1 | 5
- 5 | 11 | 2 | 6
- 6 | 13 | 1 | 8
- 7 | 10 | 1 | 9
- 8 | 5 | 2 | 10
- 9 | 7 | 1 | 12
- 10 | 8 | 2 | 13
- 11 | 6 | 1 | 15
- 12 | 3 | 1 | 16
- 13 | 2 | 1 | 17
- 14 | 1 | 0 | 18
-(14 rows)
+ 1 | 8 | 3 | 0
+ 2 | 11 | 1 | 3
+ 3 | 12 | 3 | 4
+ 4 | 13 | 3 | 7
+ 5 | 8 | 0 | 10
+(5 rows)
-- q5
ROLLBACK;
diff --git a/src/tsp/doc/pgr_tsp.rst b/src/tsp/doc/pgr_TSP.rst
similarity index 93%
rename from src/tsp/doc/pgr_tsp.rst
rename to src/tsp/doc/pgr_TSP.rst
index 60a139c..3649937 100644
--- a/src/tsp/doc/pgr_tsp.rst
+++ b/src/tsp/doc/pgr_TSP.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -17,6 +17,10 @@ Name
* ``pgr_TSP`` - Returns a route that visits all the nodes exactly once.
+.. rubric:: Availability: 2.0.0
+
+* Signature changed 2.3.0
+
Synopsis
-------------------------------------------------------------------------------
@@ -24,9 +28,9 @@ Synopsis
The travelling salesman problem (TSP) or travelling salesperson problem asks the following question:
- Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city?
-
+
This implementation uses simulated annealing to return the approximate solution when the input is given in the form of matrix cell contents.
-The matrix informetion must be symmetrical.
+The matrix information must be symmetrical.
Signature Summary
@@ -46,11 +50,9 @@ Signature Summary
Signatures
-------------------------------------------------------------------------------
-.. NOTE:: The following only aplies to the new signature(s)
-
.. index::
- single: TSP(Basic Use) -- New Signature
+ single: TSP(Basic Use)
Basic Use
...............................................................................
@@ -60,7 +62,7 @@ Basic Use
pgr_TSP(matrix_cell_sql)
RETURNS SETOF (seq, node, cost, agg_cost)
-:Example:
+:Example:
Because the documentation examples are auto generated and tested for non changing results,
and the default is to have random execution, the example is wrapping the actual call.
@@ -73,7 +75,7 @@ and the default is to have random execution, the example is wrapping the actual
TODO Intermediate Use
.. index::
- single: TSP(Complete Signature) -- New Signature
+ single: TSP(Complete Signature)
Complete Signature
...............................................................................
@@ -156,14 +158,6 @@ The queries use the :ref:`sampledata` network.
-.. rubric:: History
-
-* Rewritten in version 2.3.0
-* Renamed in version 2.0.0
-* GAUL dependency removed in version 2.0.0
-
-
-
See Also
-------------------------------------------------------------------------------
diff --git a/src/tsp/doc/pgr_eucledianTSP.rst b/src/tsp/doc/pgr_eucledianTSP.rst
index 1cabd1d..0880bc8 100644
--- a/src/tsp/doc/pgr_eucledianTSP.rst
+++ b/src/tsp/doc/pgr_eucledianTSP.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -15,7 +15,9 @@ pgr_eucledianTSP
Name
-------------------------------------------------------------------------------
-* ``pgr_eucledianTSP`` - Returns a route that visits all the coordinates pairs exactly once.
+``pgr_eucledianTSP`` - Returns a route that visits all the coordinates pairs exactly once.
+
+.. rubric:: Availability: 2.3.0
Synopsis
@@ -24,7 +26,7 @@ Synopsis
The travelling salesman problem (TSP) or travelling salesperson problem asks the following question:
- Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city?
-
+
This implementation uses simulated annealing to return the approximate solution when the input is given in the form of coordinates.
Signature Summary
@@ -56,7 +58,7 @@ Minimal Signature
pgr_eucledianTSP(coordinates_sql)
RETURNS SETOF (seq, node, cost, agg_cost)
-:Example:
+:Example:
Because the documentation examples are auto generated and tested for non changing results,
and the default is to have random execution, the example is wrapping the actual call.
diff --git a/src/tsp/doc/pgr_tsp-V2.0.rst b/src/tsp/doc/pgr_tsp-V2.0.rst
deleted file mode 100644
index d27df47..0000000
--- a/src/tsp/doc/pgr_tsp-V2.0.rst
+++ /dev/null
@@ -1,255 +0,0 @@
-..
- ****************************************************************************
- pgRouting Manual
- Copyright(c) pgRouting Contributors
-
- This documentation is licensed under a Creative Commons Attribution-Share
- Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
- ****************************************************************************
-
-.. _pgr_tsp-V2.0:
-
-pgr_tsp -Deprecated Signatures
-===============================================================================
-
-.. warning:: These functions signatures are deprecated!!!
-
- * That means they has been replaced by new signatures.
- * These signatures are no longer supported, and may be removed from future versions.
- * All code that use these functions signatures should be converted to use its replacement.
-
-Name
--------------------------------------------------------------------------------
-
-* ``pgr_tsp`` - Returns the best route from a start node via a list of nodes.
-
-.. warning:: Use :ref:`pgr_eucledianTSP` instead.
-
-* ``pgr_tsp`` - Returns the best route order when passed a disance matrix.
-
-.. warning:: Use :ref:`pgr_TSP` instead.
-
-* ``_pgr_makeDistanceMatrix`` - Returns a Eucleadian distance Matrix from the points provided in the sql result.
-
-.. warning:: There is no replacement.
-
-
-Synopsis
--------------------------------------------------------------------------------
-
-The travelling salesman problem (TSP) or travelling salesperson problem asks the following question: Given a list of cities and the distances between each pair of cities, what is the shortest possible route that visits each city exactly once and returns to the origin city? This algorithm uses simulated annealing to return a high quality approximate solution. Returns a set of :ref:`pgr_costResult <type_cost_result>` (seq, id1, id2, cost) rows, that make up a path.
-
-.. code-block:: sql
-
- pgr_costResult[] pgr_tsp(sql text, start_id integer);
- pgr_costResult[] pgr_tsp(sql text, start_id integer, end_id integer);
-
-
-Returns a set of (seq integer, id1 integer, id2 integer, cost float8) that is the best order to visit the nodes in the matrix. ``id1`` is the index into the distance matrix. ``id2`` is the point id from the sql.
-
-If no ``end_id`` is supplied or it is -1 or equal to the start_id then the TSP result is assumed to be a circluar loop returning back to the start. If ``end_id`` is supplied then the route is assumed to start and end the the designated ids.
-
-.. code-block:: sql
-
- record[] pgr_tsp(matrix float[][], start integer)
- record[] pgr_tsp(matrix float[][], start integer, end integer)
-
-
-Description
--------------------------------------------------------------------------------
-
-.. rubric:: With Euclidean distances
-
-The TSP solver is based on ordering the points using straight line (euclidean) distance [#f0]_ between nodes. The implementation is using an approximation algorithm that is very fast. It is not an exact solution, but it is guaranteed that a solution is returned after certain number of iterations.
-
-:sql: a SQL query, which should return a set of rows with the following columns:
-
- .. code-block:: sql
-
- SELECT id, x, y FROM vertex_table
-
- :id: ``int4`` identifier of the vertex
- :x: ``float8`` x-coordinate
- :y: ``float8`` y-coordinate
-
-:start_id: ``int4`` id of the start point
-:end_id: ``int4`` id of the end point, This is *OPTIONAL*, if include the route is optimized from start to end, otherwise it is assumed that the start and the end are the same point.
-
-
-The function returns set of :ref:`type_cost_result`:
-
-:seq: row sequence
-:id1: internal index to the distance matric
-:id2: ``id`` of the node
-:cost: cost to traverse from the current node to the next node.
-
-.. rubric:: Create a distance matrix
-
-For users that need a distance matrix we have a simple function that takes SQL in ``sql`` as described above and returns a record with ``dmatrix`` and ``ids``.
-
- .. code-block:: sql
-
- SELECT dmatrix, ids from _pgr_makeDistanceMatrix('SELECT id, x, y FROM vertex_table');
-
-The function returns a record of ``dmatrix``, ``ids``:
-
-:dmatrix: ``float8[][]`` a symeteric Euclidean distance matrix based on ``sql``.
-:ids: ``integer[]`` an array of ids as they are ordered in the distance matrix.
-
-
-.. rubric:: With distance matrix
-
-For users, that do not want to use Euclidean distances, we also provode the ability to pass a distance matrix that we will solve and return an ordered list of nodes for the best order to visit each. It is up to the user to fully populate the distance matrix.
-
-:matrix: ``float[][]`` distance matrix of points
-:start: ``int4`` index of the start point
-:end: ``int4`` (optional) index of the end node
-
-The ``end`` node is an optional parameter, you can just leave it out if you want a loop where the ``start`` is the depot and the route returns back to the depot. If you include the ``end`` parameter, we optimize the path from ``start`` to ``end`` and minimize the distance of the route while include the remaining points.
-
-The distance matrix is a multidimensional `PostgreSQL array type <http://www.postgresql.org/docs/9.1/static/arrays.html>`_ that must be ``N x N`` in size.
-
-The result will be N records of ``[ seq, id ]``:
-
-:seq: row sequence
-:id: index into the matrix
-
-
-.. rubric:: Footnotes
-
-.. [#f0] There was some thought given to pre-calculating the driving distances between the nodes using Dijkstra, but then I read a paper (unfortunately I don't remember who wrote it), where it was proved that the quality of TSP with euclidean distance is only slightly worse than one with real distance in case of normal city layout. In case of very sparse network or rivers and bridges it becomes more inaccurate, but still wholly satisfactory. Of course it is nice to have exact solution, b [...]
-
-
-.. rubric:: History
-
-* Renamed in version 2.0.0
-* GAUL dependency removed in version 2.0.0
-
-
-Examples
--------------------------------------------------------------------------------
-
-* Using SQL parameter (all points from the table, atarting from 6 and ending at 5). We have listed two queries in this example, the first might vary from system to system because there are multiple equivalent answers. The second query should be stable in that the length optimal route should be the same regardless of order.
-
-
-
-.. code-block:: sql
-
- CREATE TABLE vertex_table (
- id serial,
- x double precision,
- y double precision
- );
-
- INSERT INTO vertex_table VALUES
- (1,2,0), (2,2,1), (3,3,1), (4,4,1), (5,0,2), (6,1,2), (7,2,2),
- (8,3,2), (9,4,2), (10,2,3), (11,3,3), (12,4,3), (13,2,4);
-
- SELECT seq, id1, id2, round(cost::numeric, 2) AS cost
- FROM pgr_tsp('SELECT id, x, y FROM vertex_table ORDER BY id', 6, 5);
-
- seq | id1 | id2 | cost
- -----+-----+-----+------
- 0 | 5 | 6 | 1.00
- 1 | 6 | 7 | 1.00
- 2 | 7 | 8 | 1.41
- 3 | 1 | 2 | 1.00
- 4 | 0 | 1 | 1.41
- 5 | 2 | 3 | 1.00
- 6 | 3 | 4 | 1.00
- 7 | 8 | 9 | 1.00
- 8 | 11 | 12 | 1.00
- 9 | 10 | 11 | 1.41
- 10 | 12 | 13 | 1.00
- 11 | 9 | 10 | 2.24
- 12 | 4 | 5 | 1.00
- (13 rows)
-
- SELECT round(sum(cost)::numeric, 4) as cost
- FROM pgr_tsp('SELECT id, x, y FROM vertex_table ORDER BY id', 6, 5);
-
- cost
- ---------
- 15.4787
- (1 row)
-
-
-
-* Using distance matrix (A loop starting from 1)
-
-When using just the start node you are getting a loop that starts with 1, in this case, and travels through the other nodes and is implied to return to the start node from the last one in the list. Since this is a circle there are at least two possible paths, one clockwise and one counter-clockwise that will have the same length and be equall valid. So in the following example it is also possible to get back a sequence of ids = {1,0,3,2} instead of the {1,2,3,0} sequence listed below.
-
-.. code-block:: sql
-
- SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[],1);
-
- seq | id
- -----+----
- 0 | 1
- 1 | 2
- 2 | 3
- 3 | 0
- (4 rows)
-
-* Using distance matrix (Starting from 1, ending at 2)
-
-.. code-block:: sql
-
- SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[],1,2);
-
- seq | id
- -----+----
- 0 | 1
- 1 | 0
- 2 | 3
- 3 | 2
- (4 rows)
-
-* Using the vertices table edge_table_vertices_pgr generated by :ref:`pgr_create_topology`. Again we have two queries where the first might vary and the second is based on the overal path length.
-
-.. code-block:: sql
-
- SELECT seq, id1, id2, round(cost::numeric, 2) AS cost
- FROM pgr_tsp('SELECT id::integer, st_x(the_geom) as x,st_x(the_geom) as y FROM edge_table_vertices_pgr ORDER BY id', 6, 5);
-
- seq | id1 | id2 | cost
- -----+-----+-----+------
- 0 | 5 | 6 | 0.00
- 1 | 10 | 11 | 0.00
- 2 | 2 | 3 | 1.41
- 3 | 3 | 4 | 0.00
- 4 | 11 | 12 | 0.00
- 5 | 8 | 9 | 0.71
- 6 | 15 | 16 | 0.00
- 7 | 16 | 17 | 2.12
- 8 | 1 | 2 | 0.00
- 9 | 14 | 15 | 1.41
- 10 | 7 | 8 | 1.41
- 11 | 6 | 7 | 0.71
- 12 | 13 | 14 | 2.12
- 13 | 0 | 1 | 0.00
- 14 | 9 | 10 | 0.00
- 15 | 12 | 13 | 0.00
- 16 | 4 | 5 | 1.41
- (17 rows)
-
- SELECT round(sum(cost)::numeric, 4) as cost
- FROM pgr_tsp('SELECT id::integer, st_x(the_geom) as x,st_x(the_geom) as y FROM edge_table_vertices_pgr ORDER BY id', 6, 5);
-
- cost
- ---------
- 11.3137
- (1 row)
-
-
-The queries use the :ref:`sampledata` network.
-
-
-See Also
--------------------------------------------------------------------------------
-
-* :ref:`tsp`, :ref:`pgr_TSP`, :ref:`pgr_eucledianTSP`
-
-* :ref:`type_cost_result`
-* http://en.wikipedia.org/wiki/Traveling_salesman_problem
-* http://en.wikipedia.org/wiki/Simulated_annealing
diff --git a/src/tsp/doc/tsp_parameters.txt b/src/tsp/doc/tsp_parameters.txt
index 9b5ebb1..3397fbf 100644
--- a/src/tsp/doc/tsp_parameters.txt
+++ b/src/tsp/doc/tsp_parameters.txt
@@ -27,8 +27,8 @@ Parameter Type Default Description
**cooling_factor** ``FLOAT`` `0.9` Value between between 0 and 1 (not including) used to calculate the next temperature.
**randomize** ``BOOLEAN`` `true` Choose the random seed
- - true: Use current time as seed
- - false: Use `1` as seed. Using this value will get the same results with the same data in each execution.
+ - true: Use current time as seed
+ - false: Use `1` as seed. Using this value will get the same results with the same data in each execution.
=============================== =========== ============ =================================================
diff --git a/src/tsp/sql/CMakeLists.txt b/src/tsp/sql/CMakeLists.txt
index 7f647e9..4f7445e 100644
--- a/src/tsp/sql/CMakeLists.txt
+++ b/src/tsp/sql/CMakeLists.txt
@@ -1,18 +1,16 @@
# Append in local scope
LIST(APPEND PACKAGE_SQL_FILES
- #This are the old signature
- ${CMAKE_CURRENT_SOURCE_DIR}/routing_tsp.sql
+ # This are the old signature
+ ${CMAKE_CURRENT_SOURCE_DIR}/tsp_v2.0_matrix.sql
+ # this file wrap pgr_tsp with pgr_eucledianTSP
+ ${CMAKE_CURRENT_SOURCE_DIR}/tsp_v2.0_coordinates.sql
+ # This file has vidstodmatrix
${CMAKE_CURRENT_SOURCE_DIR}/routing_tsp_wrappers.sql
#this one implements the new tsp
${CMAKE_CURRENT_SOURCE_DIR}/TSP.sql
${CMAKE_CURRENT_SOURCE_DIR}/eucledianTSP.sql
- #this file wrap pgr_tsp with pgr_eucledianTSP
- ${CMAKE_CURRENT_SOURCE_DIR}/tsp_v2.0_coordinates.sql
-
-
- #${CMAKE_CURRENT_SOURCE_DIR}/_makeMatrix.sql
)
# set in parent scope
diff --git a/src/tsp/sql/TSP.sql b/src/tsp/sql/TSP.sql
index 610d62c..89e7b82 100644
--- a/src/tsp/sql/TSP.sql
+++ b/src/tsp/sql/TSP.sql
@@ -1,4 +1,28 @@
+/*PGR-GNU*****************************************************************
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
CREATE OR REPLACE FUNCTION pgr_TSP(
matrix_row_sql TEXT,
start_id BIGINT DEFAULT 0,
diff --git a/src/tsp/sql/_makeMatrix.sql b/src/tsp/sql/_makeMatrix.sql
deleted file mode 100644
index 7d50069..0000000
--- a/src/tsp/sql/_makeMatrix.sql
+++ /dev/null
@@ -1,69 +0,0 @@
-/*
-UNUSED CODE
-*/
--- vertices_sql has the form
--- SELECT id, the_geom FROM .....
-
-CREATE OR REPLACE FUNCTION _pgr_makeMatrix(
- matrix_sql regclass,
- OUT dmatrix double precision[],
- OUT ids BIGINT[]
-)
-AS
-$BODY$
-DECLARE
- sql text;
- count_sql text;
- ids_sql text;
- rec record;
- dummy_row double precision[];
- n INTEGER; -- size of matrix
- has_the_geom BOOLEAN DEFAULT false;
-
-BEGIN
- dmatrix := array[]::double precision[];
- ids := array[]::integer[];
- sql = format('SELECT start_vid, end_vid, agg_cost FROM %I ', matrix_sql);
- BEGIN
- EXECUTE sql || 'LIMIT 1';
- EXCEPTION WHEN OTHERS THEN
- RAISE EXCEPTION 'An expected column was not found in the query 1'
- USING HINT = 'Please verify columns: (start_vid, end_vid, agg_cost)';
- END;
-
- count_sql = format('SELECT count(DISTINCT start_vid) AS count FROM %I', matrix_sql);
- EXECUTE count_sql INTO rec;
- n := rec.count;
-
- ids_sql = format('SELECT DISTINCT start_vid FROM %I ORDER BY start_vid', matrix_sql);
- FOR rec IN EXECUTE ids_sql LOOP
- ids := ids || rec.start_vid;
- END LOOP;
-
- FOR i in 1 .. n LOOP
- dummy_row := dummy_row || '+Infinity'::float8;
- END LOOP;
-
- FOR i in 1 .. n LOOP
- dmatrix := dmatrix || ARRAY[dummy_row];
- END LOOP;
-
- FOR i IN 1 .. n LOOP
- dmatrix[i][i] := 0.0;
- END LOOP;
-
- sql = format('
- WITH
- ids AS (SELECT DISTINCT start_vid FROM %I ORDER by start_vid),
- distinct_ids AS (SELECT DISTINCT row_number() over () AS id, start_vid FROM ids),
- renumbered1 AS (SELECT id AS new_start_vid, end_vid, agg_cost FROM distinct_ids JOIN %I USING (start_vid) ORDER BY new_start_vid, end_vid),
- renumbered2 AS (SELECT new_start_vid, id AS new_end_vid, agg_cost FROM distinct_ids JOIN renumbered1 ON (start_vid = end_vid))
- SELECT new_start_vid AS start_vid, new_end_vid AS end_vid, agg_cost from renumbered2 ORDER BY new_start_vid', matrix_sql,matrix_sql);
-
- FOR rec IN EXECUTE sql LOOP
- dmatrix[rec.start_vid][rec.end_vid] := rec.agg_cost;
- END LOOP;
-
-END
-$BODY$
-language plpgsql stable cost 10;
diff --git a/src/tsp/sql/eucledianTSP.sql b/src/tsp/sql/eucledianTSP.sql
index 7d6ceac..fb1b513 100644
--- a/src/tsp/sql/eucledianTSP.sql
+++ b/src/tsp/sql/eucledianTSP.sql
@@ -1,4 +1,28 @@
+/*PGR-GNU*****************************************************************
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
CREATE OR REPLACE FUNCTION pgr_eucledianTSP(
coordinates_sql TEXT,
start_id BIGINT DEFAULT 0,
diff --git a/src/tsp/sql/routing_tsp.sql b/src/tsp/sql/routing_tsp.sql
deleted file mode 100644
index 913f4a3..0000000
--- a/src/tsp/sql/routing_tsp.sql
+++ /dev/null
@@ -1,49 +0,0 @@
-/*PGR-MIT*****************************************************************
-
---
--- Copyright (c) 2013 Stephen Woodbridge
---
--- This files is released under an MIT-X license.
-
-------
-MIT/X license
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-********************************************************************PGR-MIT*/
-
-
------------------------------------------------------------------------
--- Core function for TSP
------------------------------------------------------------------------
-/*
- * select seq, id from pgr_tsp(matrix float8[][], start int,
- * OUT seq int, OUT id int);
-*/
--- endpt does not work, and is ignored in the code at the moment
--- we hope to support it in the future but the tsp algorithm needs to
--- change or be replaced to support this functionality.
-CREATE OR REPLACE FUNCTION pgr_tsp(matrix float8[][], startpt integer, endpt integer DEFAULT -1, OUT seq integer, OUT id integer)
-
---CREATE OR REPLACE FUNCTION pgr_tsp(matrix float8[][], startpt integer, OUT seq integer, OUT id integer)
- RETURNS SETOF record
- AS '$libdir/${PGROUTING_LIBRARY_NAME}', 'tsp_matrix'
- LANGUAGE c IMMUTABLE STRICT;
diff --git a/src/tsp/sql/routing_tsp_wrappers.sql b/src/tsp/sql/routing_tsp_wrappers.sql
index 9e242f5..a9099ce 100644
--- a/src/tsp/sql/routing_tsp_wrappers.sql
+++ b/src/tsp/sql/routing_tsp_wrappers.sql
@@ -61,47 +61,3 @@ end;
$body$
language plpgsql stable cost 10;
-/*
-
-create or replace function pgr_tsp(sql text, start_id integer, end_id integer default (-1))
- returns setof pgr_costResult as
-$body$
-declare
- sid integer;
- eid integer;
-
-begin
-
- return query with dm as (
- select * from _pgr_makeDistanceMatrix( sql )
- ),
- ids as (
- select (row_number() over (order by id asc))-1 as rnum, id
- from (
- select unnest(ids) as id
- from dm
- ) foo
- ),
- t as (
- select a.seq, b.rnum, b.id
- from pgr_tsp(
- (select dmatrix from dm),
- (select rnum from ids where id=start_id)::integer,
- (case when end_id = -1 then -1 else (select rnum from ids where id=end_id) end)::integer
- ) a,
- ids b
- where a.id=b.rnum
- ),
- r as (
- select array_agg(t.rnum) as rnum from t
- )
- select t.seq::integer,
- t.rnum::integer as id1,
- t.id::integer as id2,
- dm.dmatrix[r.rnum[t.seq+1]+1][r.rnum[(t.seq+1)%array_length(r.rnum, 1)+1]+1]::float8 as cost
- from t, dm, r;
-end;
-$body$
-language plpgsql volatile cost 50 rows 50;
-
-*/
diff --git a/src/tsp/sql/tsp_v2.0_coordinates.sql b/src/tsp/sql/tsp_v2.0_coordinates.sql
index 047cae1..77a237b 100644
--- a/src/tsp/sql/tsp_v2.0_coordinates.sql
+++ b/src/tsp/sql/tsp_v2.0_coordinates.sql
@@ -1,4 +1,28 @@
+/*PGR-GNU*****************************************************************
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
/*
Old signature has:
sql: id INTEGER, x FLOAT, y FLOAT
@@ -17,14 +41,9 @@ debuglevel TEXT;
n BIGINT;
BEGIN
- -- checking the fixed columns and data types of the integers
- EXECUTE 'SHOW client_min_messages' INTO debuglevel;
-
- EXECUTE 'SET client_min_messages TO NOTICE';
RAISE NOTICE 'Deprecated Signature pgr_tsp(sql, integer, integer)';
- EXECUTE 'set client_min_messages to '|| debuglevel;
- table_sql := 'CREATE TABLE ___tmp AS ' || sql ;
+ table_sql := 'CREATE TEMP TABLE ___tmp ON COMMIT DROP AS ' || sql ;
EXECUTE table_sql;
@@ -54,7 +73,6 @@ BEGIN
EXECUTE 'SELECT count(*) AS n FROM (' || sql || ') AS __a__' INTO rec;
n = rec.n;
- EXECUTE 'SET client_min_messages TO ERROR';
RETURN query
SELECT (seq - 1)::INTEGER AS seq, node::INTEGER AS id1, node::INTEGER AS id2, cost
FROM pgr_eucledianTSP(sql, start_id, end_id,
@@ -65,7 +83,6 @@ BEGIN
randomize := false) WHERE seq <= n;
DROP TABLE ___tmp;
- EXECUTE 'set client_min_messages to '|| debuglevel;
END;
$body$
diff --git a/src/tsp/sql/tsp_v2.0_matrix.sql b/src/tsp/sql/tsp_v2.0_matrix.sql
new file mode 100644
index 0000000..6021967
--- /dev/null
+++ b/src/tsp/sql/tsp_v2.0_matrix.sql
@@ -0,0 +1,95 @@
+/*PGR-GNU*****************************************************************
+
+Copyright (c) 2016 pgRouting developers
+Mail: project at pgrouting.org
+
+Copyright (c) 2016 Celia Virginia Vergara Castillo
+mail: vicky_vergara at hotmail.com
+
+------
+
+This program is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2 of the License, or
+(at your option) any later version.
+
+This program is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+********************************************************************PGR-GNU*/
+
+CREATE OR REPLACE FUNCTION _pgr_unnest_matrix(matrix float8[][], OUT start_vid integer, OUT end_vid integer, out agg_cost float8)
+RETURNS SETOF record AS
+
+$body$
+DECLARE
+
+m float8[];
+
+BEGIN
+ start_vid = 1;
+ foreach m slice 1 in ARRAY matrix
+ LOOP
+ end_vid = 1;
+ foreach agg_cost in ARRAY m
+ LOOP
+ RETURN next;
+ end_vid = end_vid + 1;
+ END LOOP;
+ start_vid = start_vid + 1;
+ END LOOP;
+END;
+$body$
+language plpgsql volatile cost 500 ROWS 50;
+
+
+
+CREATE OR REPLACE FUNCTION pgr_tsp(
+ matrix float8[][],
+ startpt INTEGER,
+ endpt INTEGER DEFAULT -1,
+ OUT seq INTEGER,
+ OUT id INTEGER)
+RETURNS SETOF record AS
+$body$
+DECLARE
+table_sql TEXT;
+debuglevel TEXT;
+BEGIN
+ RAISE NOTICE 'Deprecated Signature pgr_tsp(float8[][], integer, integer)';
+
+ CREATE TEMP TABLE ___tmp2 ON COMMIT DROP AS SELECT * FROM _pgr_unnest_matrix( matrix );
+
+
+ startpt := startpt + 1;
+ IF endpt = -1 THEN endpt := startpt;
+ END IF;
+
+
+ RETURN QUERY
+ WITH
+ result AS (
+ SELECT * FROM pgr_TSP(
+ $$SELECT * FROM ___tmp2 $$,
+ startpt, endpt,
+
+ tries_per_temperature := 500 :: INTEGER,
+ max_changes_per_temperature := 30 :: INTEGER,
+ max_consecutive_non_changes := 500 :: INTEGER,
+
+ randomize:=false)
+ )
+ SELECT (row_number() over(ORDER BY result.seq) - 1)::INTEGER AS seq, (result.node - 1)::INTEGER AS id
+
+ FROM result WHERE NOT(result.node = startpt AND result.seq != 1);
+
+ DROP TABLE ___tmp2;
+END;
+$body$
+language plpgsql volatile cost 500 ROWS 50;
diff --git a/src/tsp/src/CMakeLists.txt b/src/tsp/src/CMakeLists.txt
index fe87114..ed24e17 100644
--- a/src/tsp/src/CMakeLists.txt
+++ b/src/tsp/src/CMakeLists.txt
@@ -9,7 +9,4 @@ ADD_LIBRARY(tsp OBJECT
eucledianDmatrix.cpp
tour.cpp
- #Code for the old signature
- tsp2.c
- tsplib.c
)
diff --git a/src/tsp/src/Dmatrix.cpp b/src/tsp/src/Dmatrix.cpp
index 5c242a2..fb6033d 100644
--- a/src/tsp/src/Dmatrix.cpp
+++ b/src/tsp/src/Dmatrix.cpp
@@ -22,12 +22,6 @@ along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#undef min
-#undef max
-#endif
#include "./Dmatrix.h"
@@ -38,9 +32,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include <vector>
#include <cmath>
+#include "./tour.h"
#include "../../common/src/pgr_assert.h"
-#include "./tour.h"
namespace pgrouting {
namespace tsp {
@@ -54,7 +48,7 @@ Dmatrix::tourCost(const Tour &tour) const {
for (const auto &id : tour.cities) {
if (id == tour.cities.front()) continue;
- pgassert(distance(prev_id, id) != std::numeric_limits<double>::max());
+ pgassert(distance(prev_id, id) != (std::numeric_limits<double>::max)());
total_cost += costs[prev_id][id];
prev_id = id;
@@ -103,13 +97,12 @@ Dmatrix::get_id(size_t id) const {
*/
Dmatrix::Dmatrix(const std::vector < Matrix_cell_t > &data_costs) {
set_ids(data_costs);
- costs.resize(ids.size());
- for (auto &row : costs) {
- row.resize(ids.size());
- for (auto &cell : row) {
- cell = std::numeric_limits<double>::max();
- }
- }
+ costs.resize(
+ ids.size(),
+ std::vector<double>(
+ ids.size(),
+ (std::numeric_limits<double>::max)()));
+
for (const auto &data : data_costs) {
costs[get_index(data.from_vid)][get_index(data.to_vid)] = data.cost;
}
@@ -123,7 +116,8 @@ bool
Dmatrix::has_no_infinity() const {
for (const auto &row : costs) {
for (const auto &val : row) {
- if (val == std::numeric_limits<double>::max()) return false;
+ if (val == (std::numeric_limits<double>::infinity)()) return false;
+ if (val == (std::numeric_limits<double>::max)()) return false;
}
}
return true;
@@ -185,7 +179,10 @@ std::ostream& operator<<(std::ostream &log, const Dmatrix &matrix) {
<< "," << matrix.get_index(matrix.ids[j]) << ")"
<< "\t = " << cost
<< "\t = " << matrix.costs[i][j]
- << "\t = " << matrix.costs[j][i] << "\n";
+ << "\t = " << matrix.costs[j][i]
+ << "=inf:" << (matrix.costs[i][j] == (std::numeric_limits<double>::infinity)())
+ << "=inf:" << (matrix.costs[j][i] == (std::numeric_limits<double>::infinity)())
+ << "\n";
++j;
}
++i;
@@ -195,7 +192,8 @@ std::ostream& operator<<(std::ostream &log, const Dmatrix &matrix) {
for (size_t k = 0; k < matrix.costs.size(); ++k) {
log << matrix.costs[i][k] << " <= ("
<< matrix.costs[i][j] << " + " << matrix.costs[j][k] << ")"
- << (matrix.costs[i][k] <= (matrix.costs[i][j] + matrix.costs[j][k]))
+ << (matrix.costs[i][k]
+ <= (matrix.costs[i][j] + matrix.costs[j][k]))
<< "\n";
}
}
diff --git a/src/tsp/src/eucledianDmatrix.cpp b/src/tsp/src/eucledianDmatrix.cpp
index 3e10097..908621a 100644
--- a/src/tsp/src/eucledianDmatrix.cpp
+++ b/src/tsp/src/eucledianDmatrix.cpp
@@ -23,19 +23,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./eucledianDmatrix.h"
#include <algorithm>
#include <vector>
#include <cmath>
-#include "../../common/src/pgr_assert.h"
-#include "./eucledianDmatrix.h"
#include "./tour.h"
+#include "../../common/src/pgr_assert.h"
+
namespace pgrouting {
namespace tsp {
diff --git a/src/tsp/src/eucledianTSP.c b/src/tsp/src/eucledianTSP.c
index cadff5b..9c45799 100644
--- a/src/tsp/src/eucledianTSP.c
+++ b/src/tsp/src/eucledianTSP.c
@@ -27,22 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
-
-#define DEBUG
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/coordinates_input.h"
#include "./eucledianTSP_driver.h"
@@ -79,7 +70,8 @@ process(
* errors in parameters
*/
if (initial_temperature < final_temperature) {
- elog(ERROR, "Condition not met: initial_temperature > final_temperature");
+ elog(ERROR, "Condition not met: initial_temperature"
+ " > final_temperature");
}
if (final_temperature <= 0) {
elog(ERROR, "Condition not met: final_temperature > 0");
@@ -113,12 +105,14 @@ process(
return;
}
- char *err_msg = NULL;
- char *log_msg = NULL;
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
do_pgr_eucledianTSP(
- coordinates,
- total_coordinates,
+ coordinates, total_coordinates,
start_vid,
end_vid,
initial_temperature,
@@ -132,19 +126,24 @@ process(
result_tuples,
result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing eucledianTSP", start_t, clock());
- if (log_msg) {
- elog(NOTICE, "%s", log_msg);
- free(log_msg);
- }
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+
+ time_msg("eucledianTSP", start_t, clock());
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
}
- pfree(coordinates);
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (coordinates) pfree(coordinates);
+
pgr_SPI_finish();
}
/* */
@@ -154,8 +153,6 @@ PG_FUNCTION_INFO_V1(eucledianTSP);
PGDLLEXPORT Datum
eucledianTSP(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
@@ -195,7 +192,7 @@ eucledianTSP(PG_FUNCTION_ARGS) {
*/
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
PG_GETARG_INT64(2),
@@ -215,7 +212,12 @@ eucledianTSP(PG_FUNCTION_ARGS) {
/* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -230,12 +232,10 @@ eucledianTSP(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -258,20 +258,16 @@ eucledianTSP(PG_FUNCTION_ARGS) {
}
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(result_tuples[call_cntr].node);
- values[2] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[3] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[2] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[3] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/tsp/src/eucledianTSP_driver.cpp b/src/tsp/src/eucledianTSP_driver.cpp
index e118e5c..01b745b 100644
--- a/src/tsp/src/eucledianTSP_driver.cpp
+++ b/src/tsp/src/eucledianTSP_driver.cpp
@@ -27,23 +27,19 @@
*
* ******************************************************************** PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
+#include "./eucledianTSP_driver.h"
#include <string.h>
#include <sstream>
#include <vector>
#include <algorithm>
-#include "./eucledianTSP_driver.h"
+#include "./pgr_tsp.hpp"
#include "./eucledianDmatrix.h"
-#include "./pgr_tsp.hpp"
-#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
void
do_pgr_eucledianTSP(
@@ -64,9 +60,11 @@ do_pgr_eucledianTSP(
General_path_element_t **return_tuples,
size_t *return_count,
char **log_msg,
+ char **notice_msg,
char **err_msg) {
- std::ostringstream err;
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
std::vector< Coordinate_t > coordinates(
@@ -75,7 +73,6 @@ do_pgr_eucledianTSP(
pgrouting::tsp::eucledianDmatrix costs(coordinates);
- double real_cost = -1;
size_t idx_start = costs.has_id(start_vid) ?
costs.get_index(start_vid) : 0;
@@ -83,14 +80,24 @@ do_pgr_eucledianTSP(
size_t idx_end = costs.has_id(end_vid) ?
costs.get_index(end_vid) : 0;
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
- /* An ending vertex needs to be by the starting vertex */
+ /* The ending vertex needs to be by the starting vertex */
+ double real_cost = 0;
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
+ /*
+ * Saving the real cost (distance) between the start_vid and end_vid
+ */
real_cost = costs.distance(idx_start, idx_end);
+ /*
+ * Temporarly setting the cost between the start_vid and end_vid to 0
+ */
costs.set(idx_start, idx_end, 0);
}
- log << "pgr_eucledianTSP Processing Information \nInitializing tsp class --->";
+ log << "pgr_eucledianTSP Processing Information\n"
+ << "Initializing tsp class --->";
pgrouting::tsp::TSP<pgrouting::tsp::eucledianDmatrix> tsp(costs);
@@ -109,13 +116,20 @@ do_pgr_eucledianTSP(
max_consecutive_non_changes,
randomize,
time_limit);
- log << " OK\n";
- log << tsp.get_log();
- log << tsp.get_stats();
+ log << " OK\n";
+ log << tsp.get_log();
+ log << tsp.get_stats();
+
auto bestTour(tsp.get_tour());
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
+ /* The ending vertex needs to be by the starting vertex */
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
+ /*
+ * Restoring the real cost (distance) between the start_vid and end_vid
+ */
costs.set(idx_start, idx_end, real_cost);
}
@@ -131,7 +145,9 @@ do_pgr_eucledianTSP(
start_ptr,
bestTour.cities.end());
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
if (*(bestTour.cities.begin() + 1) == idx_end) {
std::reverse(
bestTour.cities.begin() + 1,
@@ -182,26 +198,30 @@ do_pgr_eucledianTSP(
++seq;
}
- *log_msg = strdup(log.str().c_str());
- (*err_msg) = NULL;
- return;
+ pgassert(!log.str().empty());
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
} catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
} catch(...) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
diff --git a/src/tsp/src/eucledianTSP_driver.h b/src/tsp/src/eucledianTSP_driver.h
index a97abb0..bbc0d07 100644
--- a/src/tsp/src/eucledianTSP_driver.h
+++ b/src/tsp/src/eucledianTSP_driver.h
@@ -29,7 +29,6 @@
#ifndef SRC_TSP_SRC_EUCLEDIANTSP_DRIVER_H_
#define SRC_TSP_SRC_EUCLEDIANTSP_DRIVER_H_
-
#pragma once
#include "../../common/src/pgr_types.h"
@@ -56,6 +55,7 @@ do_pgr_eucledianTSP(
General_path_element_t **results,
size_t *total_results,
char **log_msg,
+ char **notice_msg,
char **err_msg);
#ifdef __cplusplus
diff --git a/src/tsp/src/newTSP.c b/src/tsp/src/newTSP.c
index 08913c3..8c5768a 100644
--- a/src/tsp/src/newTSP.c
+++ b/src/tsp/src/newTSP.c
@@ -27,22 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
-
-#define DEBUG
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/matrixRows_input.h"
#include "./newTSP_driver.h"
@@ -80,7 +71,8 @@ process(
*/
if (initial_temperature < final_temperature) {
- elog(ERROR, "Condition not met: initial_temperature > final_temperature");
+ elog(ERROR, "Condition not met: initial_temperature"
+ " > final_temperature");
}
if (final_temperature <= 0) {
elog(ERROR, "Condition not met: final_temperature > 0");
@@ -114,12 +106,15 @@ process(
return;
}
- char *err_msg = NULL;
- char *log_msg = NULL;
+
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
do_pgr_tsp(
- distances,
- total_distances,
+ distances, total_distances,
start_vid,
end_vid,
initial_temperature,
@@ -133,19 +128,24 @@ process(
result_tuples,
result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing eucledianTSP", start_t, clock());
- if (log_msg) {
- elog(NOTICE, "%s", log_msg);
- free(log_msg);
- }
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+
+ time_msg("eucledianTSP", start_t, clock());
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
}
- pfree(distances);
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (distances) pfree(distances);
+
pgr_SPI_finish();
}
/* */
@@ -155,8 +155,6 @@ PG_FUNCTION_INFO_V1(newTSP);
PGDLLEXPORT Datum
newTSP(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
@@ -196,7 +194,7 @@ newTSP(PG_FUNCTION_ARGS) {
*/
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
PG_GETARG_INT64(2),
@@ -216,7 +214,12 @@ newTSP(PG_FUNCTION_ARGS) {
/* */
/**********************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
+
funcctx->user_fctx = result_tuples;
if (get_call_result_type(fcinfo, NULL, &tuple_desc)
!= TYPEFUNC_COMPOSITE) {
@@ -231,12 +234,10 @@ newTSP(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
@@ -259,19 +260,16 @@ newTSP(PG_FUNCTION_ARGS) {
}
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int64GetDatum(result_tuples[call_cntr].node);
- values[2] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[3] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[2] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[3] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
/**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/tsp/src/newTSP_driver.cpp b/src/tsp/src/newTSP_driver.cpp
index 239baa6..f3af088 100644
--- a/src/tsp/src/newTSP_driver.cpp
+++ b/src/tsp/src/newTSP_driver.cpp
@@ -27,23 +27,18 @@
*
* ******************************************************************** PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./newTSP_driver.h"
#include <string.h>
#include <sstream>
#include <vector>
#include <algorithm>
-#include "./newTSP_driver.h"
#include "./Dmatrix.h"
-
#include "./pgr_tsp.hpp"
-#include "./../../common/src/pgr_assert.h"
+
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
void
do_pgr_tsp(
@@ -64,12 +59,14 @@ do_pgr_tsp(
General_path_element_t **return_tuples,
size_t *return_count,
char **log_msg,
+ char **notice_msg,
char **err_msg) {
- std::ostringstream err;
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
- std::vector < Matrix_cell_t > data_costs(
+ std::vector <Matrix_cell_t> data_costs(
distances,
distances + total_distances);
@@ -77,15 +74,13 @@ do_pgr_tsp(
if (!costs.has_no_infinity()) {
err << "An Infinity value was found on the Matrix";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ *err_msg = pgr_msg(err.str().c_str());
return;
}
if (!costs.is_symmetric()) {
err << "A Non symmetric Matrix was given as input";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ *err_msg = pgr_msg(err.str().c_str());
return;
}
@@ -97,14 +92,17 @@ do_pgr_tsp(
size_t idx_end = costs.has_id(end_vid) ?
costs.get_index(end_vid) : 0;
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
/* An ending vertex needs to be by the starting vertex */
real_cost = costs.distance(idx_start, idx_end);
costs.set(idx_start, idx_end, 0);
}
- log << "pgr_eucledianTSP Processing Information \nInitializing tsp class --->";
+ log << "pgr_eucledianTSP Processing Information \n"
+ << "Initializing tsp class --->";
pgrouting::tsp::TSP<pgrouting::tsp::Dmatrix> tsp(costs);
@@ -129,7 +127,9 @@ do_pgr_tsp(
auto bestTour(tsp.get_tour());
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
costs.set(idx_start, idx_end, real_cost);
}
@@ -147,7 +147,9 @@ do_pgr_tsp(
start_ptr,
bestTour.cities.end());
- if (costs.has_id(start_vid) && costs.has_id(end_vid) && start_vid != end_vid) {
+ if (costs.has_id(start_vid)
+ && costs.has_id(end_vid)
+ && start_vid != end_vid) {
if (*(bestTour.cities.begin() + 1) == idx_end) {
std::reverse(
bestTour.cities.begin() + 1,
@@ -198,26 +200,29 @@ do_pgr_tsp(
++seq;
}
- *log_msg = strdup(log.str().c_str());
- (*err_msg) = NULL;
- return;
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
} catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
} catch(...) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- *log_msg = strdup(log.str().c_str());
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
}
diff --git a/src/tsp/src/newTSP_driver.h b/src/tsp/src/newTSP_driver.h
index 82c6180..bd6b324 100644
--- a/src/tsp/src/newTSP_driver.h
+++ b/src/tsp/src/newTSP_driver.h
@@ -55,6 +55,7 @@ do_pgr_tsp(
General_path_element_t **results,
size_t *total_results,
char **log_msg,
+ char **notice_msg,
char **err_msg);
#ifdef __cplusplus
diff --git a/src/tsp/src/pgr_tsp.cpp b/src/tsp/src/pgr_tsp.cpp
index f696a5f..bc4b693 100644
--- a/src/tsp/src/pgr_tsp.cpp
+++ b/src/tsp/src/pgr_tsp.cpp
@@ -27,17 +27,12 @@
*
* ********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#undef min
-#undef max
-#endif
#include "./pgr_tsp.hpp"
#include <time.h>
+#include <utility>
#include <iomanip>
#include <limits>
#include <vector>
@@ -120,7 +115,7 @@ TSP<MATRIX>::find_closest_city(
#endif
size_t best_city = 0;
- auto best_distance = std::numeric_limits<double>::max();
+ auto best_distance = (std::numeric_limits<double>::max)();
#ifndef NDEBUG
bool found(false);
#endif
@@ -342,7 +337,8 @@ TSP<MATRIX>::getDeltaSwap(size_t posA, size_t posE) const {
auto f = current_tour.cities[succ(posE, n)];
#ifndef NDEBUG
- auto delta = distance(b, e) + distance(e, c) + distance(d, a) + distance(a, f)
+ auto delta = distance(b, e)
+ + distance(e, c) + distance(d, a) + distance(a, f)
- distance(b, a) - distance(a, c) - distance(d, e) - distance(e, f);
auto new_tour(current_tour);
new_tour.swap(posA, posE);
@@ -383,7 +379,8 @@ TSP<MATRIX>::getDeltaReverse(size_t posA, size_t posC) const {
#ifndef NDEBUG
- auto delta = distance(a, c) + distance(b, d) - distance(a, b) - distance(c, d);
+ auto delta =
+ distance(a, c) + distance(b, d) - distance(a, b) - distance(c, d);
auto new_tour(current_tour);
new_tour.reverse(posA, posC);
auto exactDelta = tourCost(new_tour) - tourCost(current_tour);
@@ -486,9 +483,13 @@ TSP<MATRIX>::annealing(
auto energyChange = getDeltaReverse(c1, c2);
- if ( (energyChange < 0 && epsilon < std::fabs(energyChange))
+ if ( (energyChange < 0
+ && epsilon < std::fabs(energyChange))
|| (0 < energyChange
- && (static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) < exp(-energyChange / temperature))) {
+ && (
+ static_cast<double>(std::rand()) /
+ static_cast<double>(RAND_MAX))
+ < exp(-energyChange / temperature))) {
if (energyChange < 0) ++enchg;
++reverse_count;
++pathchg;
@@ -501,6 +502,10 @@ TSP<MATRIX>::annealing(
break;
case 1: {
/* slide */
+ if (n <= 3) {
+ break;
+ }
+
pgassert(n > 3);
auto first = std::rand() % n;
@@ -518,13 +523,19 @@ TSP<MATRIX>::annealing(
last + (place - first) + 1;
- pgassert((place < first || place > last) && (first < last));
+ pgassert((place < first
+ || place > last)
+ && (first < last));
- auto energyChange = getDeltaSlide(place, first, last);
+ auto energyChange = getDeltaSlide(
+ place, first, last);
- if ((energyChange < 0 && epsilon < std::fabs(energyChange))
+ if ((energyChange < 0
+ && epsilon < std::fabs(energyChange))
|| (0 < energyChange
- && (static_cast<double>(std::rand()) / static_cast<double>(RAND_MAX)) < exp(-energyChange / temperature))) {
+ && (static_cast<double>(std::rand())
+ / static_cast<double>(RAND_MAX))
+ < exp(-energyChange / temperature))) {
if (energyChange < 0) ++enchg;
++slide_count;
++pathchg;
@@ -546,7 +557,8 @@ TSP<MATRIX>::annealing(
swapClimb();
clock_t current_time(clock());
- double elapsed_time = static_cast<double>(current_time - start_time) / CLOCKS_PER_SEC;
+ double elapsed_time = static_cast<double>(
+ current_time - start_time) / CLOCKS_PER_SEC;
if (time_limit < elapsed_time) {
break;
}
diff --git a/src/tsp/src/pgr_tsp.hpp b/src/tsp/src/pgr_tsp.hpp
index 37cf422..9456d55 100644
--- a/src/tsp/src/pgr_tsp.hpp
+++ b/src/tsp/src/pgr_tsp.hpp
@@ -26,6 +26,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
* ********************************************************************PGR-GNU*/
+
+#ifndef SRC_TSP_SRC_PGR_TSP_HPP_
+#define SRC_TSP_SRC_PGR_TSP_HPP_
#pragma once
#include <sstream>
@@ -142,3 +145,5 @@ class TSP: public MATRIX {
} // namespace pgrouting
#include "pgr_tsp.cpp"
+
+#endif // SRC_TSP_SRC_PGR_TSP_HPP_
diff --git a/src/tsp/src/tsp.h b/src/tsp/src/tsp.h
deleted file mode 100644
index 5cb4481..0000000
--- a/src/tsp/src/tsp.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/*PGR-GNU*****************************************************************
-
- * Traveling Salesman Problem solution algorithm for PostgreSQL
- *
- * Copyright (c) 2006 Anton A. Patrushev, Orkney, Inc.
- * Copyright (c) 2013 Stephen Woodbridge, iMaptools.com.
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-/*
- * This code is deprecated
- */
-
-#ifndef SRC_TSP_SRC_TSP_H_
-#define SRC_TSP_SRC_TSP_H_
-
-// define the type of object for the distance matrix
-#define DTYPE double
-
-#include "postgres.h"
-#include "../../common/src/pgr_types.h"
-
-typedef struct point {
- int id;
- float8 x;
- float8 y;
-} point_t;
-
-#ifdef __cplusplus
-extern "C" {
-#endif
- int find_tsp_solution(int num, DTYPE *dist, int *p_ids, int source, int end, DTYPE *fit, char* err_msg);
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_TSP_SRC_TSP_H_
diff --git a/src/tsp/src/tsp2.c b/src/tsp/src/tsp2.c
deleted file mode 100644
index 9c297b0..0000000
--- a/src/tsp/src/tsp2.c
+++ /dev/null
@@ -1,345 +0,0 @@
-/*PGR-MIT*****************************************************************
-
- * Traveling Sales Problem solver for pgRouting and PostgreSQL
- *
- * Copyright 2013, Stephen Woodbridge, iMaptools.com
- * This program is released under an MIT-X license.
- *
-
-------
-MIT/X license
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files (the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-********************************************************************PGR-MIT*/
-
-/*
- * This code is deprecated
- */
-
-#include "./tsp.h"
-#include <math.h>
-
-#include "postgres.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#include "utils/array.h"
-#include "utils/lsyscache.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
-
-PGDLLEXPORT Datum tsp_matrix(PG_FUNCTION_ARGS);
-
-#undef DEBUG
-#include "../../common/src/debug_macro.h"
-
-#if 0
-#ifndef INFINITY
-#ifndef _MSC_VER
-#define INFINITY (1.0/0.0)
-#else // _MSC_VER
-#define INFINITY (DBL_MAX + DBL_MAX);
-#endif // _MSC_VER
-#endif
-#endif
-
-// The number of tuples to fetch from the SPI cursor at each iteration
-#define TUPLIMIT 1000
-
-
-static DTYPE *get_pgarray(int *num, ArrayType *input) {
- int ndims, *dims; // , *lbs;
- bool *nulls;
- Oid i_eltype;
- int16 i_typlen;
- bool i_typbyval;
- char i_typalign;
- Datum *i_data;
- int i, n;
- DTYPE *data;
-
- /* get input array element type */
- i_eltype = ARR_ELEMTYPE(input);
- get_typlenbyvalalign(i_eltype, &i_typlen, &i_typbyval, &i_typalign);
-
-
- /* validate input data type */
- switch (i_eltype) {
- case INT2OID:
- case INT4OID:
- case FLOAT4OID:
- case FLOAT8OID:
- break;
- default:
- elog(ERROR, "Invalid input data type");
- break;
- }
-
- /* get various pieces of data from the input array */
- ndims = ARR_NDIM(input);
- dims = ARR_DIMS(input);
- // lbs = ARR_LBOUND(input);
-
- if (ndims != 2 || dims[0] != dims[1]) {
- elog(ERROR, "Error: matrix[num][num] in its definition.");
- }
-
- /* get src data */
- deconstruct_array(input, i_eltype, i_typlen, i_typbyval, i_typalign,
-&i_data, &nulls, &n);
-
- PGR_DBG("get_pgarray: ndims=%d, n=%d", ndims, n);
-
-#ifdef DEBUG
- for (i = 0; i < ndims; i++) {
- // PGR_DBG(" dims[%d]=%d, lbs[%d]=%d", i, dims[i], i, lbs[i]);
- PGR_DBG(" dims[%d]=%d", i, dims[i]);
- }
-#endif
-
- /* construct a C array */
- data = (DTYPE *) palloc((size_t)(n) * sizeof(DTYPE));
- if (!data) {
- elog(ERROR, "Error: Out of memory!");
- }
-
- for (i = 0; i < n; i++) {
- if (nulls[i]) {
- data[i] = (DTYPE) 0;
- } else {
- switch (i_eltype) {
- case INT2OID:
- data[i] = (DTYPE) DatumGetInt16(i_data[i]);
- break;
- case INT4OID:
- data[i] = (DTYPE) DatumGetInt32(i_data[i]);
- break;
- case FLOAT4OID:
- data[i] = (DTYPE) DatumGetFloat4(i_data[i]);
- break;
- case FLOAT8OID:
- data[i] = (DTYPE) DatumGetFloat8(i_data[i]);
- break;
- }
- /* we assume negative values are INFINTY */
- /********************************************************
- TODO: based on trying to add an endpt it is likely
- that this will not work and you will get and error in
- findEulerianPath
- **********************************************************/
- if (data[i] < 0) {
- data[i] = (DTYPE) 0;
- nulls[i] = true;
- }
- }
- PGR_DBG(" data[%d]=%.4f", i, data[i]);
- }
-
- pfree(nulls);
- pfree(i_data);
-
- *num = dims[0];
-
- return data;
-}
-
-
-// macro to store distance values as matrix[num][num]
-#define D(i, j) matrix[(i) * num + j]
-
-static int solve_tsp(DTYPE *matrix, int num, int start, int end, int **results) {
- int ret;
- int i;
- int *ids;
- DTYPE fit;
- char *err_msg = NULL;
-
- PGR_DBG("In solve_tsp: num: %d, start: %d, end: %d", num, start, end);
-
- if (num < 4)
- elog(ERROR, "Error TSP requires four or more locations to optimize. Only %d were supplied.", num);
-
- if (start < 0 || start >= num)
- elog(ERROR, "Error start must be in the range of 0 <= start(%d) < num(%d).", start, num);
-
- if (end >= num)
- elog(ERROR, "Error end must be in the range of 0 <= end(%d) < num(%d).", end, num);
-
- /* if start and end are the same this is the same as setting end = -1 */
- if (start == end)
- end = -1;
-
- /*
- fix up matrix id we have an end point
- basically set D(start,end)=INFINITY and D(end,start)=0.0
- */
- if (end >= 0) {
- PGR_DBG("Updating start end costs");
- D(start, end) = 0.0;
- D(end, start) = 0.0;
- }
-
- PGR_DBG("Alloc ids");
-
- ids = (int *) malloc((size_t)(num) * sizeof(int));
- if (!ids) {
- elog(ERROR, "Error: Out of memory (solve_tsp)");
- }
-
- for (i = 0; i < num; i++) {
- ids[i] = i;
- }
-
- PGR_DBG("Calling find_tsp_solution");
-
-// int find_tsp_solution(int num, DTYPE *dist, int *p_ids, int source, DTYPE *fit, char* err_msg);
- ret = find_tsp_solution(num, matrix, ids, start, end, &fit, err_msg);
- if (ret < 0) {
- elog(ERROR, "Error solving TSP, %s", err_msg);
- }
-
- PGR_DBG("TSP solved, Score: %f", fit);
-
- *results = ids;
- return ret;
-}
-
-/*
- * select seq, id from pgr_tsp(matrix float8[][], start int,
- * OUT seq int, OUT id int);
-*/
-
-PG_FUNCTION_INFO_V1(tsp_matrix);
-PGDLLEXPORT Datum
-tsp_matrix(PG_FUNCTION_ARGS) {
- FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
- TupleDesc tuple_desc;
- // AttInMetadata *attinmeta;
-
- DTYPE *matrix;
- int *tsp_res;
- int num;
-
- /* stuff done only on the first call of the function */
- if (SRF_IS_FIRSTCALL()) {
- MemoryContext oldcontext;
- // int path_count;
- int ret = -1;
-
- /* create a function context for cross-call persistence */
- funcctx = SRF_FIRSTCALL_INIT();
-
- /* switch to memory context appropriate for multiple function calls */
- oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
-
- matrix = get_pgarray(&num, PG_GETARG_ARRAYTYPE_P(0));
-
- ret = solve_tsp(matrix, num,
- PG_GETARG_INT32(1), // start index
- PG_GETARG_INT32(2), // end index
- &tsp_res);
-
- pfree(matrix);
- if (ret < 0) {
- elog(ERROR, "Error, failed to solve TSP.");
- }
-
- funcctx->max_calls = (uint32_t)num;
- funcctx->user_fctx = tsp_res;
-
- /* Build a tuple descriptor for our result type */
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
- ereport(ERROR,
- (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
- errmsg("function returning record called in context "
- "that cannot accept type record")));
-
- funcctx->tuple_desc = BlessTupleDesc(tuple_desc);
-
- /*
- * generate attribute metadata needed later to produce tuples from raw
- * C strings
- */
- // attinmeta = TupleDescGetAttInMetadata(tuple_desc);
- // funcctx->attinmeta = attinmeta;
-
- MemoryContextSwitchTo(oldcontext);
- }
-
- /* stuff done on every call of the function */
- funcctx = SRF_PERCALL_SETUP();
-
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
- tuple_desc = funcctx->tuple_desc;
- tsp_res = funcctx->user_fctx;
-
- PGR_DBG("Trying to allocate some memory");
- PGR_DBG("call_cntr = %i, max_calls = %i", call_cntr, max_calls);
-
- if (call_cntr < max_calls) { /* do when there is more left to send */
- HeapTuple tuple;
- Datum result;
- Datum *values;
- bool* nulls;
-
- values = palloc(2 * sizeof(Datum));
- nulls = palloc(2 * sizeof(bool));
-
- values[0] = Int32GetDatum(call_cntr);
- nulls[0] = false;
- values[1] = Int32GetDatum(tsp_res[call_cntr]);
- nulls[1] = false;
-
- PGR_DBG("RESULT: %d, %d", call_cntr, tsp_res[call_cntr]);
-
- PGR_DBG("Heap making");
-
- tuple = heap_form_tuple(tuple_desc, values, nulls);
-
- PGR_DBG("Datum making");
-
- /* make the tuple into a datum */
- result = HeapTupleGetDatum(tuple);
-
- PGR_DBG("RESULT: seq:%d, id:%d", call_cntr, tsp_res[call_cntr]);
- PGR_DBG("Trying to free some memory");
-
- /* clean up (this is not really necessary) */
- pfree(values);
- pfree(nulls);
-
-
- SRF_RETURN_NEXT(funcctx, result);
- } else { /* do when there is no more left */
- PGR_DBG("Freeing tsp_res");
- free(tsp_res);
-
- PGR_DBG("Ending function");
- SRF_RETURN_DONE(funcctx);
- }
-}
-
diff --git a/src/tsp/src/tsplib.c b/src/tsp/src/tsplib.c
deleted file mode 100644
index 3b9c8d3..0000000
--- a/src/tsp/src/tsplib.c
+++ /dev/null
@@ -1,616 +0,0 @@
-/*
- * THIS CODE IS DEPRECATED
- */
-
-/*PGR-MIT*****************************************************************
-
-* $Id: tsplib.c, v 1.1 2006/05/13 23:39:56 woodbri Exp $
-*
-* tsplib
-* Copyright 2005, 2013, Stephen Woodbridge, All rights Reserved
-* This file is released under MIT-X license as part of pgRouting.
-
-------
-MIT/X license
-
-Permission is hereby granted, free of charge, to any person obtaining a copy
-of this software and associated documentation files(the "Software"), to deal
-in the Software without restriction, including without limitation the rights
-to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-copies of the Software, and to permit persons to whom the Software is
-furnished to do so, subject to the following conditions:
-
-
-The above copyright notice and this permission notice shall be included in
-all copies or substantial portions of the Software.
-
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
-AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
-OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
-THE SOFTWARE.
-
-********************************************************************PGR-MIT*/
-
-/*
-**********************************************************************
-*
-* tsplib.c
-*
-* Routine to calculate the node order for a Traveling Salesman Problem
-* from a distance matrix.
-*
-* $Log: tsplib.c, v $
-* Revision 1.1 2006/05/13 23:39:56 woodbri
-* Initial checkin of IMT::TSP module.
-*
-* Initial revision created from router tsp2.c
-*
-**********************************************************************
-*
-* Simulated annealing and a non symmetric
-* Euclidian Traveling Salesman Problem.
-*
-* Solution based on local search heuristics for
-* non-crossing paths and nearest neighbors
-*
-* Storage Requirements: 4n ints
-*
-* Problem: given an nXn matrix of costs for n cities in the plane,
-* find a permutation pi_1, pi_2, ..., pi_n of 1, 2, ..., n that
-* minimizes sum for 1<=i<n D(pi_i, pi_i+1), where D(i, j) is the
-* euclidian distance between cities i and j from the matrix
-*
-* This means that the ith row is the "from" city and the jth column
-* is the cost to the "to" city.
-*
-* NOTE: costs are assumed to be ints, so scaling them to meters or
-* some other int would be advisable.
-*
-* NOTE: the internal cost calculations ASSUME a symmetric matrix. There
-* are notes of what needs to be updated, but all D(i, j)s need to be
-* reviewed because order is important for asymetric cases.
-*
-* Note: with n cities, there is(n-1)!/2 possible tours.
-* factorial(10)=3628800 factorial(50)=3E+64 factorial(150)=5.7E+262
-* If we could check one tour per clock cycle on a 100 MHZ computer, we
-* would still need to wait approximately 10^236 times the age of the
-* universe to explore all tours for 150 cities.
-*
-* Derivied from code 1995 by Maugis Lionel(Sofreavia) on sid1
-* that was placed in the public domain.
-*************************************************************************/
-
-// #ifdef __MINGW64__
-// #define ELOG_H
-// #include <winsock2.h>
-// #endif
-#include <postgres.h>
-#include <string.h> /* memcpy */
-#include <math.h> /* exp */
-
-#include "./tsp.h"
-
-#undef DEBUG
-// #define DEBUG 1
-#include "../../common/src/debug_macro.h"
-
-
-#define T_INIT 100
-#define FINAL_T 0.1
-#define COOLING 0.9 /* to lower down T(< 1) */
-#define TRIES_PER_T 500*n
-#define IMPROVED_PATH_PER_T 60*n
-
-/*
- * MACHINE INDEPENDENT RANDOM NUMBER GENERATOR
- * Written by: DIMACS (modified for TSP)
-*/
-
-#define PRANDMAX 1000000000
-static int a;
-static int b;
-static int arr[55];
-
-static
-int Rand(void);
-
-static
-void initRand(int seed) {
- int i, ii;
- int last, next;
-
- seed %= PRANDMAX;
- if (seed < 0) seed += PRANDMAX;
-
- arr[0] = last = seed;
- next = 1;
- for (i = 1; i < 55; i++) {
- ii =(21 * i) % 55;
- arr[ii] = next;
- next = last - next;
- if (next < 0)
- next += PRANDMAX;
- last = arr[ii];
- }
- a = 0;
- b = 24;
- for (i = 0; i < 165; i++)
- last = Rand();
-}
-
-static
-int Rand(void) {
- int t;
-
- if (a-- == 0)
- a = 54;
- if (b-- == 0)
- b = 54;
-
- t = arr[a] - arr[b];
-
- if (t < 0)
- t += PRANDMAX;
-
- arr[a] = t;
-
- return t;
-}
-
-#define RREAL ((double)Rand()/PRANDMAX)
-#define RANDOM Rand
-#define unifRand(n) (Rand()%n)
-
-
-/*
- * Defs
- */
-
-typedef int Path[3]; /* specify how to change path */
-
-typedef struct tspstruct {
- int n;
- DTYPE maxd;
- DTYPE *dist;
- DTYPE bestlen;
- int *iorder;
- int *jorder;
- int *border; // best order we find
- float b[4];
-} TSP;
-
-#define MOD(i, n) ((i) %(n) >= 0 ?(i) %(n) :(i) %(n) +(n))
-#define D(x, y) dist[(x)*n+y]
-
-#define MIN(a, b)((a) < (b)?(a) : (b))
-#define MAX(a, b)((a) > (b)?(a) : (b))
-#define sqr(x) ((x)*(x))
-
-/*
- * Prim's approximated TSP tour
- * See also [Cristophides'92]
- */
-static
-int findEulerianPath(TSP *tsp) {
- int *mst, *arc;
- int i, j, k, l, a;
- int n, *iorder, *jorder;
- DTYPE d;
- DTYPE maxd;
- DTYPE *dist;
- DTYPE *dis;
-
- jorder = tsp->jorder;
- iorder = tsp->iorder;
- dist = tsp->dist;
- maxd = tsp->maxd;
- n = tsp->n;
-
- if (!(mst =(int*) palloc((size_t) n * sizeof(int))) ||
- !(arc =(int*) palloc((size_t) n * sizeof(int))) ||
- !(dis =(DTYPE*) palloc((size_t) n * sizeof(DTYPE))) ) {
- elog(ERROR, "Failed to allocate memory!");
- return -1;
- }
- // PGR_DBG("findEulerianPath: 1");
-
- k = -1;
- j = -1;
- d = maxd;
- dis[0] = -1;
- for (i = 1; i < n; i++) {
- dis[i] = D(i, 0);
- arc[i] = 0;
- if (d > dis[i]) {
- d = dis[i];
- j = i;
- }
- }
- // PGR_DBG("findEulerianPath: j=%d", j);
-
- if (j == -1)
- elog(ERROR, "Error TSP fail to findEulerianPath, check your distance matrix is valid.");
-
- /*
- * O(n^2) Minimum Spanning Trees by Prim and Jarnick
- * for graphs with adjacency matrix.
- */
- for (a = 0; a < n - 1; a++) {
- mst[a] = j * n + arc[j]; /* join fragment j with MST */
- dis[j] = -1;
- d = maxd;
- for (i = 0; i < n; i++) {
- if (dis[i] >= 0) {
- /* not connected yet */
- if (dis[i] > D(i, j)) {
- dis[i] = D(i, j);
- arc[i] = j;
- }
- if (d > dis[i]) {
- d = dis[i];
- k = i;
- }
- }
- }
- j = k;
- }
- // PGR_DBG("findEulerianPath: 3");
-
- /*
- * Preorder Tour of MST
- */
-#define VISITED(x) jorder[x]
-#define NQ(x) arc[l++] = x
-#define DQ() arc[--l]
-#define EMPTY (l == 0)
-
- for (i = 0; i < n; i++) VISITED(i) = 0;
- k = 0; l = 0; d = 0; NQ(0);
- while (!EMPTY) {
- i = DQ();
- if (!VISITED(i)) {
- iorder[k++] = i;
- VISITED(i) = 1;
- for (j = 0; j < n - 1; j++) /* push all kids of i */ {
- if (i == mst[j]%n) NQ(mst[j]/n);
- }
- }
- }
- // PGR_DBG("findEulerianPath: 4");
-
- return 0;
-}
-
-static
-DTYPE pathLength(TSP *tsp) {
- unsigned int i;
- DTYPE len = 0;
-
- int* iorder = tsp->iorder;
- DTYPE *dist = tsp->dist;
- int n = tsp->n;
-
- for (i = 0; (int)i < (int)(n-1); i++) {
- len += D(iorder[i], iorder[i+1]);
- }
- len += D(iorder[n-1], iorder[0]); /* close path */
- return(len);
-}
-
-/*
- * Local Search Heuristics
- * b-------a b a
- * . . => .\ /.
- * . d...e . . e...d .
- * ./ \. . .
- * c f c-------f
- */
-static
-DTYPE getThreeWayCost(TSP *tsp, Path p) {
- int a, b, c, d, e, f;
- int *iorder = tsp->iorder;
- DTYPE *dist = tsp->dist;
- int n = tsp->n;
-
- a = iorder[MOD(p[0]-1, n)];
- b = iorder[p[0]];
- c = iorder[p[1]];
- d = iorder[MOD(p[1]+1, n)];
- e = iorder[p[2]];
- f = iorder[MOD(p[2]+1, n)];
-
- return(D(a, d) + D(e, b) + D(c, f) - D(a, b) - D(c, d) - D(e, f));
- /* add cost between d and e if non symmetric TSP */
-}
-
-static
-void doThreeWay(TSP *tsp, Path p) {
- int i, count, m1, m2, m3, a, b, c, d, e, f;
- int *iorder = tsp->iorder;
- int *jorder = tsp->jorder;
- int n = tsp->n;
-
- a = MOD(p[0]-1, n);
- b = p[0];
- c = p[1];
- d = MOD(p[1]+1, n);
- e = p[2];
- f = MOD(p[2]+1, n);
-
- m1 = MOD(n+c-b, n)+1; /* num cities from b to c */
- m2 = MOD(n+a-f, n)+1; /* num cities from f to a */
- m3 = MOD(n+e-d, n)+1; /* num cities from d to e */
-
- count = 0;
- /* [b..c] */
- for (i = 0; i < m1; i++) jorder[count++] = iorder[MOD(i+b, n)];
-
- /* [f..a] */
- for (i = 0; i < m2; i++) jorder[count++] = iorder[MOD(i+f, n)];
-
- /* [d..e] */
- for (i = 0; i < m3; i++) jorder[count++] = iorder[MOD(i+d, n)];
-
- /* copy segment back into iorder */
- for (i = 0; i < n; i++) iorder[i] = jorder[i];
-}
-
-/*
- * c..b c..b
- * \/ => | |
- * /\ | |
- * a d a d
- */
-static
-DTYPE getReverseCost(TSP *tsp, Path p) {
- int a, b, c, d;
- int *iorder = tsp->iorder;
- DTYPE *dist = tsp->dist;
- int n = tsp->n;
-
- a = iorder[MOD(p[0]-1, n)];
- b = iorder[p[0]];
- c = iorder[p[1]];
- d = iorder[MOD(p[1]+1, n)];
-
- return(D(d, b) + D(c, a) - D(a, b) - D(c, d));
- /* add cost between c and b if non symmetric TSP */
-}
-static void doReverse(TSP *tsp, Path p) {
- int i, nswaps, first, last, tmp;
- int *iorder = tsp->iorder;
- int n = tsp->n;
-
-
- /* reverse path b...c */
- nswaps =(MOD(p[1]-p[0], n)+1)/2;
- for (i = 0; i < nswaps; i++) {
- first = MOD(p[0]+i, n);
- last = MOD(p[1]-i, n);
- tmp = iorder[first];
- iorder[first] = iorder[last];
- iorder[last] = tmp;
- }
-}
-
-static
-void annealing(TSP *tsp) {
- Path p;
- int i, j, pathchg;
- int numOnPath, numNotOnPath;
- DTYPE pathlen;
- int n = tsp->n;
- double energyChange, T;
-
- pathlen = pathLength(tsp);
-
- for (T = T_INIT; T > FINAL_T; T *= COOLING) /* annealing schedule */ {
- pathchg = 0;
- for (j = 0; j < TRIES_PER_T; j++) {
- do {
- p[0] = unifRand(n);
- p[1] = unifRand(n);
- /* non-empty path */
- if (p[0] == p[1]) p[1] = MOD(p[0]+1, n);
- numOnPath = MOD(p[1]-p[0], n) + 1;
- numNotOnPath = n - numOnPath;
- } while (numOnPath < 2 || numNotOnPath < 2); /* non-empty path */
-
- if (RANDOM() % 2) /* threeWay */ {
- do {
- p[2] = MOD(unifRand(numNotOnPath)+p[1]+1, n);
- } while (p[0] == MOD(p[2]+1, n)); /* avoids a non-change */
-
- energyChange = getThreeWayCost(tsp, p);
- if (energyChange < 0 || RREAL < exp(-energyChange/T)) {
- pathchg++;
- pathlen += energyChange;
- doThreeWay(tsp, p);
- }
- } else {
- /* path Reverse */
- energyChange = getReverseCost(tsp, p);
- if (energyChange < 0 || RREAL < exp(-energyChange/T)) {
- pathchg++;
- pathlen += energyChange;
- doReverse(tsp, p);
- }
- }
- // if the new length is better than best then save it as best
- if (pathlen < tsp->bestlen) {
- tsp->bestlen = pathlen;
- for (i = 0; i < tsp->n; i++) tsp->border[i] = tsp->iorder[i];
- }
- if (pathchg > IMPROVED_PATH_PER_T) break; /* finish early */
- }
- PGR_DBG("T:%f L:%f B:%f C:%d", T, pathlen, tsp->bestlen, pathchg);
- if (pathchg == 0) break; /* if no change then quit */
- }
-}
-
-
-static
-void reverse(int num, int *ids) {
- int i, j, t;
- for (i = 0, j = num - 1; i < j; i++, j--) {
- t = ids[j];
- ids[j] = ids[i];
- ids[i] = t;
- }
-}
-
-
-int find_tsp_solution(int num, DTYPE *cost, int *ids, int start, int end, DTYPE *total_len, char *err_msg) {
- int i, j;
- int istart = 0;
- int jstart = 0;
- int iend = -1;
- int jend = -1;
- int rev = 0;
- TSP tsp;
- int64_t seed = -314159L;
- DTYPE blength;
-
- PGR_DBG("sizeof(int64_t)=%d", (int)sizeof(int64_t));
-
- initRand((int) seed);
-
-#ifdef DEBUG
- char bufff[2048];
- int nnn;
- PGR_DBG("---------- Matrix[%d][%d] ---------------------\n", num, num);
- for (i = 0; i < num; i++) {
- sprintf(bufff, "%d:", i);
- nnn = 0;
- for (j = 0; j < num; j++) {
- nnn += sprintf(bufff + nnn, "\t%.4f", cost[i * num + j]);
- }
- PGR_DBG("%s", bufff);
- }
-#endif
-
- /* initialize tsp struct */
- tsp.n = num;
- tsp.dist = NULL;
- tsp.iorder = NULL;
- tsp.jorder = NULL;
- tsp.border = NULL;
-
- if (!(tsp.iorder =(int*) palloc((size_t) tsp.n * sizeof(int))) ||
- !(tsp.jorder =(int*) palloc((size_t) tsp.n * sizeof(int))) ||
- !(tsp.border =(int*) palloc((size_t) tsp.n * sizeof(int))) ) {
- elog(FATAL, "Memory allocation failed!");
- return -1;
- }
-
- tsp.dist = cost;
- tsp.maxd = 0;
- for (i=0; i < tsp.n * tsp.n; i++) {
- tsp.maxd = MAX(tsp.maxd, cost[i]);
- }
-
- /* identity permutation */
- for (i = 0; i < tsp.n; i++) tsp.iorder[i] = i;
-
- tsp.bestlen = pathLength(&tsp);
- for (i = 0; i < tsp.n; i++) tsp.border[i] = tsp.iorder[i];
-
- PGR_DBG("Initial Path Length: %.4f", tsp.bestlen);
-
- /*
- * Set up first eulerian path iorder to be improved by
- * simulated annealing.
- */
- if (findEulerianPath(&tsp))
- return -1;
-
- blength = pathLength(&tsp);
- if (blength < tsp.bestlen) {
- tsp.bestlen = blength;
- for (i = 0; i < tsp.n; i++) tsp.border[i] = tsp.iorder[i];
- }
-
- PGR_DBG("Approximated Path Length: %.4f", blength);
-
- annealing(&tsp);
-
- *total_len = pathLength(&tsp);
- PGR_DBG("Final Path Length: %.4f", *total_len);
-
- *total_len = tsp.bestlen;
- for (i = 0; i < tsp.n; i++) tsp.iorder[i] = tsp.border[i];
- PGR_DBG("Best Path Length: %.4f", *total_len);
-
- // reorder ids[] with start as first
-
-#ifdef DEBUG
- for (i = 0; i < tsp.n; i++) {
- PGR_DBG("i: %d, ids[i]: %d, io[i]: %d, jo[i]: %d, jo[io[i]]: %d",
- i, ids[i], tsp.iorder[i], tsp.jorder[i], tsp.jorder[tsp.iorder[i]]);
- }
-#endif
-
- // get index of start node in ids
- for (i=0; i < tsp.n; i++) {
- if (ids[i] == start) istart = i;
- if (ids[i] == end) iend = i;
- }
- PGR_DBG("istart: %d, iend: %d", istart, iend);
-
- // get the idex of start in iorder
- for (i=0; i < tsp.n; i++) {
- if (tsp.iorder[i] == istart) jstart = i;
- if (tsp.iorder[i] == iend) jend = i;
- }
- PGR_DBG("jstart: %d, jend: %d", jstart, jend);
-
- /*
- * If the end is specified and the end point and it follow start
- * then we swap start and end and extract the list backwards
- * and later we reverse the list for the desired order.
- */
- if ((jend > 0 && jend == jstart+1) ||(jend == 0 && jstart == tsp.n-1)) {
- int tmp = jend;
- jend = jstart;
- jstart = tmp;
- rev = 1;
- PGR_DBG("reversed start and end: jstart: %d, jend: %d", jstart, jend);
- }
-
- // copy ids to tsp.jorder so we can rewrite ids
- memcpy(tsp.jorder, ids, (size_t) tsp.n * sizeof(int));
-
- // write reordered ids into ids[]
- // remember at this point jorder is our list if ids
- for (i=jstart, j = 0; i < tsp.n; i++, j++)
- ids[j] = tsp.jorder[tsp.iorder[i]];
-
- for (i=0; i < jstart; i++, j++)
- ids[j] = tsp.jorder[tsp.iorder[i]];
-
- // if we reversed the order above, now put it correct.
- if (rev) {
- int tmp = jend;
- jend = jstart;
- jstart = tmp;
- reverse(tsp.n, ids);
- }
-
-#ifdef DEBUG
- PGR_DBG("ids getting returned!");
- for (i=0; i < tsp.n; i++) {
- PGR_DBG("i: %d, ids[i]: %d, io[i]: %d, jo[i]: %d",
- i, ids[i], tsp.iorder[i], tsp.jorder[i]);
- }
-#endif
-
- PGR_DBG("tsplib: jstart=%d, jend=%d, n=%d, j=%d", jstart, jend, tsp.n, j);
-
- return 0;
-}
-
-/* EOF */
diff --git a/src/tsp/test/development/gr9882-tsp.test.sql b/src/tsp/test/development/gr9882-tsp.test.sql
index 5e69d87..701b34f 100644
--- a/src/tsp/test/development/gr9882-tsp.test.sql
+++ b/src/tsp/test/development/gr9882-tsp.test.sql
@@ -1,9903 +1,9903 @@
--- http://www.math.uwaterloo.ca/tsp/world/countries.html#GR
-
--- NAME : gr9882
--- COMMENT : 9882 locations in Greece
--- COMMENT : Derived from National Imagery and Mapping Agency data
--- TYPE : TSP
--- DIMENSION : 9882
--- EDGE_WEIGHT_TYPE : EUC_2D
--- NODE_COORD_SECTION
-
-DROP TABLE IF EXISTS gr9882;
-CREATE TABLE gr9882 (id BIGINT, x FLOAT, y FLOAT, the_geom geometry);
-COPY gr9882 (id, x, y) FROM stdin WITH DELIMITER ' ';
-1 34816.6667 24100.0000
-2 34833.3333 24083.3333
-3 34850.0000 24050.0000
-4 34850.0000 24083.3333
-5 34850.0000 24116.6667
-6 34866.6667 24083.3333
-7 34933.3333 24800.0000
-8 34933.3333 24916.6667
-9 34966.6667 24883.3333
-10 34966.6667 24933.3333
-11 34966.6667 24950.0000
-12 34966.6667 25033.3333
-13 34966.6667 25133.3333
-14 34966.6667 25250.0000
-15 34983.3333 24750.0000
-16 34983.3333 24850.0000
-17 34983.3333 24916.6667
-18 34983.3333 24983.3333
-19 34983.3333 25000.0000
-20 34983.3333 25016.6667
-21 34983.3333 25150.0000
-22 34983.3333 25166.6667
-23 34983.3333 25200.0000
-24 34983.3333 25216.6667
-25 34983.3333 25266.6667
-26 34983.3333 25283.3333
-27 34983.3333 25316.6667
-28 34983.3333 25333.3333
-29 35000.0000 24816.6667
-30 35000.0000 24900.0000
-31 35000.0000 24933.3333
-32 35000.0000 25033.3333
-33 35000.0000 25066.6667
-34 35000.0000 25133.3333
-35 35000.0000 25150.0000
-36 35000.0000 25366.6667
-37 35000.0000 25383.3333
-38 35000.0000 25483.3333
-39 35000.0000 25516.6667
-40 35000.0000 25533.3333
-41 35000.0000 25583.3333
-42 35000.0000 25633.3333
-43 35016.6667 24783.3333
-44 35016.6667 24800.0000
-45 35016.6667 24833.3333
-46 35016.6667 24866.6667
-47 35016.6667 24883.3333
-48 35016.6667 24900.0000
-49 35016.6667 24916.6667
-50 35016.6667 24950.0000
-51 35016.6667 24966.6667
-52 35016.6667 25000.0000
-53 35016.6667 25066.6667
-54 35016.6667 25083.3333
-55 35016.6667 25116.6667
-56 35016.6667 25166.6667
-57 35016.6667 25200.0000
-58 35016.6667 25416.6667
-59 35016.6667 25516.6667
-60 35016.6667 25533.3333
-61 35016.6667 25550.0000
-62 35016.6667 25583.3333
-63 35016.6667 25683.3333
-64 35016.6667 25750.0000
-65 35016.6667 25833.3333
-66 35016.6667 26100.0000
-67 35016.6667 26116.6667
-68 35033.3333 24783.3333
-69 35033.3333 24833.3333
-70 35033.3333 24933.3333
-71 35033.3333 25150.0000
-72 35033.3333 25233.3333
-73 35033.3333 25250.0000
-74 35033.3333 25266.6667
-75 35033.3333 25283.3333
-76 35033.3333 25383.3333
-77 35033.3333 25433.3333
-78 35033.3333 25450.0000
-79 35033.3333 25483.3333
-80 35033.3333 25500.0000
-81 35033.3333 25550.0000
-82 35033.3333 25566.6667
-83 35033.3333 25600.0000
-84 35033.3333 25666.6667
-85 35033.3333 25750.0000
-86 35033.3333 25766.6667
-87 35033.3333 25900.0000
-88 35033.3333 25950.0000
-89 35033.3333 25966.6667
-90 35033.3333 25983.3333
-91 35033.3333 26150.0000
-92 35050.0000 24816.6667
-93 35050.0000 24833.3333
-94 35050.0000 24866.6667
-95 35050.0000 24900.0000
-96 35050.0000 24950.0000
-97 35050.0000 25050.0000
-98 35050.0000 25066.6667
-99 35050.0000 25100.0000
-100 35050.0000 25116.6667
-101 35050.0000 25183.3333
-102 35050.0000 25300.0000
-103 35050.0000 25333.3333
-104 35050.0000 25383.3333
-105 35050.0000 25416.6667
-106 35050.0000 25450.0000
-107 35050.0000 25500.0000
-108 35050.0000 25550.0000
-109 35050.0000 25633.3333
-110 35050.0000 25666.6667
-111 35050.0000 25783.3333
-112 35050.0000 25800.0000
-113 35050.0000 25833.3333
-114 35050.0000 25883.3333
-115 35050.0000 25950.0000
-116 35050.0000 26050.0000
-117 35050.0000 26066.6667
-118 35050.0000 26100.0000
-119 35050.0000 26116.6667
-120 35050.0000 26150.0000
-121 35050.0000 26183.3333
-122 35066.6667 24766.6667
-123 35066.6667 24816.6667
-124 35066.6667 24866.6667
-125 35066.6667 24883.3333
-126 35066.6667 24916.6667
-127 35066.6667 24933.3333
-128 35066.6667 24966.6667
-129 35066.6667 25016.6667
-130 35066.6667 25033.3333
-131 35066.6667 25083.3333
-132 35066.6667 25100.0000
-133 35066.6667 25116.6667
-134 35066.6667 25133.3333
-135 35066.6667 25200.0000
-136 35066.6667 25216.6667
-137 35066.6667 25233.3333
-138 35066.6667 25300.0000
-139 35066.6667 25566.6667
-140 35066.6667 25716.6667
-141 35066.6667 25750.0000
-142 35066.6667 25816.6667
-143 35066.6667 25866.6667
-144 35066.6667 25966.6667
-145 35066.6667 26016.6667
-146 35066.6667 26083.3333
-147 35066.6667 26116.6667
-148 35083.3333 24733.3333
-149 35083.3333 24833.3333
-150 35083.3333 24866.6667
-151 35083.3333 24883.3333
-152 35083.3333 24916.6667
-153 35083.3333 24933.3333
-154 35083.3333 24950.0000
-155 35083.3333 24966.6667
-156 35083.3333 25033.3333
-157 35083.3333 25050.0000
-158 35083.3333 25083.3333
-159 35083.3333 25100.0000
-160 35083.3333 25183.3333
-161 35083.3333 25216.6667
-162 35083.3333 25233.3333
-163 35083.3333 25250.0000
-164 35083.3333 25266.6667
-165 35083.3333 25283.3333
-166 35083.3333 25333.3333
-167 35083.3333 25366.6667
-168 35083.3333 25400.0000
-169 35083.3333 25566.6667
-170 35083.3333 25583.3333
-171 35083.3333 25650.0000
-172 35083.3333 25716.6667
-173 35083.3333 25766.6667
-174 35083.3333 25816.6667
-175 35083.3333 25833.3333
-176 35083.3333 25916.6667
-177 35083.3333 25933.3333
-178 35083.3333 25950.0000
-179 35083.3333 25966.6667
-180 35083.3333 25983.3333
-181 35083.3333 26033.3333
-182 35083.3333 26050.0000
-183 35083.3333 26066.6667
-184 35083.3333 26083.3333
-185 35083.3333 26100.0000
-186 35083.3333 26133.3333
-187 35083.3333 26166.6667
-188 35100.0000 24683.3333
-189 35100.0000 24783.3333
-190 35100.0000 24833.3333
-191 35100.0000 24850.0000
-192 35100.0000 24916.6667
-193 35100.0000 24966.6667
-194 35100.0000 25000.0000
-195 35100.0000 25066.6667
-196 35100.0000 25083.3333
-197 35100.0000 25166.6667
-198 35100.0000 25183.3333
-199 35100.0000 25216.6667
-200 35100.0000 25250.0000
-201 35100.0000 25283.3333
-202 35100.0000 25300.0000
-203 35100.0000 25350.0000
-204 35100.0000 25366.6667
-205 35100.0000 25383.3333
-206 35100.0000 25400.0000
-207 35100.0000 25416.6667
-208 35100.0000 25683.3333
-209 35100.0000 25800.0000
-210 35100.0000 25866.6667
-211 35100.0000 25950.0000
-212 35100.0000 26066.6667
-213 35100.0000 26083.3333
-214 35100.0000 26133.3333
-215 35100.0000 26266.6667
-216 35116.6667 24616.6667
-217 35116.6667 24750.0000
-218 35116.6667 24766.6667
-219 35116.6667 24816.6667
-220 35116.6667 24866.6667
-221 35116.6667 24900.0000
-222 35116.6667 24916.6667
-223 35116.6667 24933.3333
-224 35116.6667 24950.0000
-225 35116.6667 25000.0000
-226 35116.6667 25116.6667
-227 35116.6667 25133.3333
-228 35116.6667 25216.6667
-229 35116.6667 25233.3333
-230 35116.6667 25250.0000
-231 35116.6667 25266.6667
-232 35116.6667 25283.3333
-233 35116.6667 25300.0000
-234 35116.6667 25333.3333
-235 35116.6667 25716.6667
-236 35116.6667 25733.3333
-237 35116.6667 25800.0000
-238 35116.6667 25850.0000
-239 35116.6667 25883.3333
-240 35116.6667 25983.3333
-241 35116.6667 26016.6667
-242 35116.6667 26066.6667
-243 35116.6667 26083.3333
-244 35116.6667 26100.0000
-245 35116.6667 26150.0000
-246 35116.6667 26216.6667
-247 35116.6667 26233.3333
-248 35133.3333 24600.0000
-249 35133.3333 24650.0000
-250 35133.3333 24733.3333
-251 35133.3333 24816.6667
-252 35133.3333 24900.0000
-253 35133.3333 24916.6667
-254 35133.3333 24950.0000
-255 35133.3333 24983.3333
-256 35133.3333 25000.0000
-257 35133.3333 25016.6667
-258 35133.3333 25033.3333
-259 35133.3333 25066.6667
-260 35133.3333 25083.3333
-261 35133.3333 25116.6667
-262 35133.3333 25150.0000
-263 35133.3333 25166.6667
-264 35133.3333 25183.3333
-265 35133.3333 25216.6667
-266 35133.3333 25233.3333
-267 35133.3333 25266.6667
-268 35133.3333 25333.3333
-269 35133.3333 25533.3333
-270 35133.3333 25666.6667
-271 35133.3333 25900.0000
-272 35133.3333 25950.0000
-273 35133.3333 26016.6667
-274 35133.3333 26033.3333
-275 35133.3333 26066.6667
-276 35133.3333 26100.0000
-277 35133.3333 26116.6667
-278 35133.3333 26166.6667
-279 35133.3333 26216.6667
-280 35133.3333 26250.0000
-281 35150.0000 24633.3333
-282 35150.0000 24666.6667
-283 35150.0000 24716.6667
-284 35150.0000 24733.3333
-285 35150.0000 24750.0000
-286 35150.0000 24766.6667
-287 35150.0000 24783.3333
-288 35150.0000 24816.6667
-289 35150.0000 24833.3333
-290 35150.0000 25033.3333
-291 35150.0000 25200.0000
-292 35150.0000 25233.3333
-293 35150.0000 25266.6667
-294 35150.0000 25300.0000
-295 35150.0000 25350.0000
-296 35150.0000 25466.6667
-297 35150.0000 25533.3333
-298 35150.0000 25550.0000
-299 35150.0000 25566.6667
-300 35150.0000 25583.3333
-301 35150.0000 25633.3333
-302 35150.0000 25866.6667
-303 35150.0000 25916.6667
-304 35150.0000 25966.6667
-305 35150.0000 26016.6667
-306 35150.0000 26083.3333
-307 35150.0000 26100.0000
-308 35150.0000 26166.6667
-309 35150.0000 26183.3333
-310 35150.0000 26250.0000
-311 35166.6667 24450.0000
-312 35166.6667 24483.3333
-313 35166.6667 24516.6667
-314 35166.6667 24533.3333
-315 35166.6667 24583.3333
-316 35166.6667 24716.6667
-317 35166.6667 24733.3333
-318 35166.6667 24783.3333
-319 35166.6667 25000.0000
-320 35166.6667 25066.6667
-321 35166.6667 25100.0000
-322 35166.6667 25116.6667
-323 35166.6667 25200.0000
-324 35166.6667 25250.0000
-325 35166.6667 25333.3333
-326 35166.6667 25350.0000
-327 35166.6667 25366.6667
-328 35166.6667 25433.3333
-329 35166.6667 25450.0000
-330 35166.6667 25483.3333
-331 35166.6667 25650.0000
-332 35166.6667 25700.0000
-333 35166.6667 25933.3333
-334 35166.6667 25950.0000
-335 35166.6667 25983.3333
-336 35166.6667 26016.6667
-337 35166.6667 26033.3333
-338 35166.6667 26050.0000
-339 35166.6667 26100.0000
-340 35166.6667 26116.6667
-341 35166.6667 26166.6667
-342 35166.6667 26183.3333
-343 35166.6667 26250.0000
-344 35183.3333 24233.3333
-345 35183.3333 24416.6667
-346 35183.3333 24450.0000
-347 35183.3333 24516.6667
-348 35183.3333 24533.3333
-349 35183.3333 24550.0000
-350 35183.3333 24583.3333
-351 35183.3333 24666.6667
-352 35183.3333 24683.3333
-353 35183.3333 24733.3333
-354 35183.3333 25016.6667
-355 35183.3333 25033.3333
-356 35183.3333 25066.6667
-357 35183.3333 25216.6667
-358 35183.3333 25250.0000
-359 35183.3333 25283.3333
-360 35183.3333 25316.6667
-361 35183.3333 25333.3333
-362 35183.3333 25366.6667
-363 35183.3333 25433.3333
-364 35183.3333 25500.0000
-365 35183.3333 25516.6667
-366 35183.3333 25600.0000
-367 35183.3333 25616.6667
-368 35183.3333 25666.6667
-369 35183.3333 25683.3333
-370 35183.3333 25716.6667
-371 35183.3333 25900.0000
-372 35183.3333 25966.6667
-373 35183.3333 26033.3333
-374 35183.3333 26050.0000
-375 35183.3333 26066.6667
-376 35183.3333 26100.0000
-377 35183.3333 26116.6667
-378 35183.3333 26150.0000
-379 35183.3333 26183.3333
-380 35200.0000 24066.6667
-381 35200.0000 24083.3333
-382 35200.0000 24150.0000
-383 35200.0000 24166.6667
-384 35200.0000 24233.3333
-385 35200.0000 24266.6667
-386 35200.0000 24283.3333
-387 35200.0000 24316.6667
-388 35200.0000 24383.3333
-389 35200.0000 24400.0000
-390 35200.0000 24416.6667
-391 35200.0000 24450.0000
-392 35200.0000 24483.3333
-393 35200.0000 24500.0000
-394 35200.0000 24566.6667
-395 35200.0000 24633.3333
-396 35200.0000 24650.0000
-397 35200.0000 24683.3333
-398 35200.0000 25000.0000
-399 35200.0000 25033.3333
-400 35200.0000 25083.3333
-401 35200.0000 25100.0000
-402 35200.0000 25166.6667
-403 35200.0000 25183.3333
-404 35200.0000 25200.0000
-405 35200.0000 25216.6667
-406 35200.0000 25250.0000
-407 35200.0000 25266.6667
-408 35200.0000 25316.6667
-409 35200.0000 25333.3333
-410 35200.0000 25350.0000
-411 35200.0000 25366.6667
-412 35200.0000 25383.3333
-413 35200.0000 25466.6667
-414 35200.0000 25483.3333
-415 35200.0000 25583.3333
-416 35200.0000 25616.6667
-417 35200.0000 25650.0000
-418 35200.0000 25666.6667
-419 35200.0000 25683.3333
-420 35200.0000 25700.0000
-421 35200.0000 26116.6667
-422 35200.0000 26250.0000
-423 35200.0000 26266.6667
-424 35216.6667 24066.6667
-425 35216.6667 24083.3333
-426 35216.6667 24100.0000
-427 35216.6667 24183.3333
-428 35216.6667 24200.0000
-429 35216.6667 24216.6667
-430 35216.6667 24266.6667
-431 35216.6667 24500.0000
-432 35216.6667 24516.6667
-433 35216.6667 24533.3333
-434 35216.6667 24600.0000
-435 35216.6667 24616.6667
-436 35216.6667 24683.3333
-437 35216.6667 24700.0000
-438 35216.6667 24716.6667
-439 35216.6667 25000.0000
-440 35216.6667 25033.3333
-441 35216.6667 25050.0000
-442 35216.6667 25200.0000
-443 35216.6667 25216.6667
-444 35216.6667 25266.6667
-445 35216.6667 25300.0000
-446 35216.6667 25333.3333
-447 35216.6667 25350.0000
-448 35216.6667 25383.3333
-449 35216.6667 25466.6667
-450 35216.6667 25516.6667
-451 35216.6667 25533.3333
-452 35216.6667 25550.0000
-453 35216.6667 25600.0000
-454 35216.6667 25650.0000
-455 35216.6667 25683.3333
-456 35216.6667 25700.0000
-457 35216.6667 26033.3333
-458 35216.6667 26216.6667
-459 35216.6667 26266.6667
-460 35233.3333 23633.3333
-461 35233.3333 23683.3333
-462 35233.3333 23966.6667
-463 35233.3333 24016.6667
-464 35233.3333 24083.3333
-465 35233.3333 24116.6667
-466 35233.3333 24133.3333
-467 35233.3333 24216.6667
-468 35233.3333 24350.0000
-469 35233.3333 24383.3333
-470 35233.3333 24400.0000
-471 35233.3333 24450.0000
-472 35233.3333 24466.6667
-473 35233.3333 24516.6667
-474 35233.3333 24633.3333
-475 35233.3333 24650.0000
-476 35233.3333 24666.6667
-477 35233.3333 24700.0000
-478 35233.3333 24983.3333
-479 35233.3333 25000.0000
-480 35233.3333 25016.6667
-481 35233.3333 25033.3333
-482 35233.3333 25166.6667
-483 35233.3333 25183.3333
-484 35233.3333 25216.6667
-485 35233.3333 25233.3333
-486 35233.3333 25350.0000
-487 35233.3333 25366.6667
-488 35233.3333 25433.3333
-489 35233.3333 25450.0000
-490 35233.3333 25466.6667
-491 35233.3333 25616.6667
-492 35233.3333 25683.3333
-493 35233.3333 25700.0000
-494 35233.3333 25716.6667
-495 35250.0000 23550.0000
-496 35250.0000 23583.3333
-497 35250.0000 23666.6667
-498 35250.0000 23683.3333
-499 35250.0000 23716.6667
-500 35250.0000 23783.3333
-501 35250.0000 23816.6667
-502 35250.0000 24150.0000
-503 35250.0000 24166.6667
-504 35250.0000 24183.3333
-505 35250.0000 24216.6667
-506 35250.0000 24250.0000
-507 35250.0000 24300.0000
-508 35250.0000 24316.6667
-509 35250.0000 24333.3333
-510 35250.0000 24433.3333
-511 35250.0000 24450.0000
-512 35250.0000 24500.0000
-513 35250.0000 24533.3333
-514 35250.0000 24566.6667
-515 35250.0000 24600.0000
-516 35250.0000 24633.3333
-517 35250.0000 24650.0000
-518 35250.0000 24683.3333
-519 35250.0000 24983.3333
-520 35250.0000 25033.3333
-521 35250.0000 25066.6667
-522 35250.0000 25116.6667
-523 35250.0000 25166.6667
-524 35250.0000 25233.3333
-525 35250.0000 25250.0000
-526 35250.0000 25300.0000
-527 35250.0000 25333.3333
-528 35250.0000 25350.0000
-529 35250.0000 25383.3333
-530 35250.0000 25416.6667
-531 35250.0000 25550.0000
-532 35250.0000 25616.6667
-533 35250.0000 25633.3333
-534 35250.0000 25650.0000
-535 35250.0000 25666.6667
-536 35250.0000 25683.3333
-537 35250.0000 26250.0000
-538 35266.6667 23616.6667
-539 35266.6667 23650.0000
-540 35266.6667 23683.3333
-541 35266.6667 23700.0000
-542 35266.6667 23716.6667
-543 35266.6667 23733.3333
-544 35266.6667 23750.0000
-545 35266.6667 23816.6667
-546 35266.6667 24133.3333
-547 35266.6667 24283.3333
-548 35266.6667 24300.0000
-549 35266.6667 24333.3333
-550 35266.6667 24350.0000
-551 35266.6667 24433.3333
-552 35266.6667 24516.6667
-553 35266.6667 24583.3333
-554 35266.6667 24650.0000
-555 35266.6667 25000.0000
-556 35266.6667 25016.6667
-557 35266.6667 25050.0000
-558 35266.6667 25116.6667
-559 35266.6667 25133.3333
-560 35266.6667 25183.3333
-561 35266.6667 25216.6667
-562 35266.6667 25233.3333
-563 35266.6667 25250.0000
-564 35266.6667 25283.3333
-565 35266.6667 25300.0000
-566 35266.6667 25366.6667
-567 35266.6667 25416.6667
-568 35266.6667 25566.6667
-569 35266.6667 25583.3333
-570 35266.6667 25650.0000
-571 35266.6667 25666.6667
-572 35266.6667 25716.6667
-573 35266.6667 26266.6667
-574 35283.3333 23616.6667
-575 35283.3333 23633.3333
-576 35283.3333 23650.0000
-577 35283.3333 23666.6667
-578 35283.3333 23683.3333
-579 35283.3333 23700.0000
-580 35283.3333 23733.3333
-581 35283.3333 23750.0000
-582 35283.3333 23766.6667
-583 35283.3333 23783.3333
-584 35283.3333 23816.6667
-585 35283.3333 23833.3333
-586 35283.3333 23966.6667
-587 35283.3333 24183.3333
-588 35283.3333 24200.0000
-589 35283.3333 24333.3333
-590 35283.3333 24350.0000
-591 35283.3333 24366.6667
-592 35283.3333 24383.3333
-593 35283.3333 24416.6667
-594 35283.3333 24466.6667
-595 35283.3333 24483.3333
-596 35283.3333 24500.0000
-597 35283.3333 24516.6667
-598 35283.3333 24883.3333
-599 35283.3333 25033.3333
-600 35283.3333 25050.0000
-601 35283.3333 25066.6667
-602 35283.3333 25083.3333
-603 35283.3333 25100.0000
-604 35283.3333 25133.3333
-605 35283.3333 25183.3333
-606 35283.3333 25233.3333
-607 35283.3333 25266.6667
-608 35283.3333 25300.0000
-609 35283.3333 25316.6667
-610 35283.3333 25333.3333
-611 35283.3333 25466.6667
-612 35283.3333 25500.0000
-613 35283.3333 25616.6667
-614 35283.3333 25633.3333
-615 35283.3333 25666.6667
-616 35283.3333 25700.0000
-617 35300.0000 23516.6667
-618 35300.0000 23583.3333
-619 35300.0000 23600.0000
-620 35300.0000 23616.6667
-621 35300.0000 23633.3333
-622 35300.0000 23650.0000
-623 35300.0000 23683.3333
-624 35300.0000 23700.0000
-625 35300.0000 23716.6667
-626 35300.0000 23783.3333
-627 35300.0000 23800.0000
-628 35300.0000 24183.3333
-629 35300.0000 24316.6667
-630 35300.0000 24350.0000
-631 35300.0000 24366.6667
-632 35300.0000 24383.3333
-633 35300.0000 24400.0000
-634 35300.0000 24416.6667
-635 35300.0000 24450.0000
-636 35300.0000 24466.6667
-637 35300.0000 24500.0000
-638 35300.0000 24533.3333
-639 35300.0000 24583.3333
-640 35300.0000 24800.0000
-641 35300.0000 24816.6667
-642 35300.0000 24833.3333
-643 35300.0000 24900.0000
-644 35300.0000 24916.6667
-645 35300.0000 24933.3333
-646 35300.0000 25016.6667
-647 35300.0000 25083.3333
-648 35300.0000 25100.0000
-649 35300.0000 25150.0000
-650 35300.0000 25166.6667
-651 35300.0000 25233.3333
-652 35300.0000 25250.0000
-653 35300.0000 25300.0000
-654 35300.0000 25366.6667
-655 35300.0000 25383.3333
-656 35300.0000 25433.3333
-657 35300.0000 25516.6667
-658 35300.0000 25566.6667
-659 35300.0000 25583.3333
-660 35300.0000 25600.0000
-661 35300.0000 25616.6667
-662 35300.0000 25650.0000
-663 35300.0000 25666.6667
-664 35300.0000 25733.3333
-665 35316.6667 23533.3333
-666 35316.6667 23616.6667
-667 35316.6667 23650.0000
-668 35316.6667 23666.6667
-669 35316.6667 23683.3333
-670 35316.6667 23700.0000
-671 35316.6667 23716.6667
-672 35316.6667 23733.3333
-673 35316.6667 23750.0000
-674 35316.6667 23783.3333
-675 35316.6667 23800.0000
-676 35316.6667 23816.6667
-677 35316.6667 24200.0000
-678 35316.6667 24300.0000
-679 35316.6667 24316.6667
-680 35316.6667 24333.3333
-681 35316.6667 24350.0000
-682 35316.6667 24416.6667
-683 35316.6667 24450.0000
-684 35316.6667 24533.3333
-685 35316.6667 24616.6667
-686 35316.6667 24683.3333
-687 35316.6667 24800.0000
-688 35316.6667 24833.3333
-689 35316.6667 24850.0000
-690 35316.6667 24916.6667
-691 35316.6667 24950.0000
-692 35316.6667 25050.0000
-693 35316.6667 25133.3333
-694 35316.6667 25166.6667
-695 35316.6667 25183.3333
-696 35316.6667 25283.3333
-697 35316.6667 25316.6667
-698 35316.6667 25366.6667
-699 35316.6667 25383.3333
-700 35316.6667 25566.6667
-701 35316.6667 25600.0000
-702 35316.6667 25616.6667
-703 35316.6667 25650.0000
-704 35316.6667 25666.6667
-705 35316.6667 25683.3333
-706 35316.6667 25716.6667
-707 35316.6667 25733.3333
-708 35333.3333 23550.0000
-709 35333.3333 23600.0000
-710 35333.3333 23650.0000
-711 35333.3333 23700.0000
-712 35333.3333 23716.6667
-713 35333.3333 23733.3333
-714 35333.3333 23750.0000
-715 35333.3333 23766.6667
-716 35333.3333 23783.3333
-717 35333.3333 23800.0000
-718 35333.3333 23816.6667
-719 35333.3333 23833.3333
-720 35333.3333 23900.0000
-721 35333.3333 24183.3333
-722 35333.3333 24283.3333
-723 35333.3333 24300.0000
-724 35333.3333 24333.3333
-725 35333.3333 24350.0000
-726 35333.3333 24383.3333
-727 35333.3333 24400.0000
-728 35333.3333 24416.6667
-729 35333.3333 24466.6667
-730 35333.3333 24483.3333
-731 35333.3333 24500.0000
-732 35333.3333 24516.6667
-733 35333.3333 24616.6667
-734 35333.3333 24666.6667
-735 35333.3333 24683.3333
-736 35333.3333 24700.0000
-737 35333.3333 24716.6667
-738 35333.3333 24733.3333
-739 35333.3333 24750.0000
-740 35333.3333 24766.6667
-741 35333.3333 24783.3333
-742 35333.3333 24800.0000
-743 35333.3333 24816.6667
-744 35333.3333 24833.3333
-745 35333.3333 24850.0000
-746 35333.3333 24866.6667
-747 35333.3333 24883.3333
-748 35333.3333 25066.6667
-749 35333.3333 25083.3333
-750 35333.3333 25116.6667
-751 35333.3333 25133.3333
-752 35333.3333 25150.0000
-753 35333.3333 25166.6667
-754 35333.3333 25250.0000
-755 35333.3333 25350.0000
-756 35333.3333 25616.6667
-757 35333.3333 25633.3333
-758 35333.3333 25666.6667
-759 35333.3333 25700.0000
-760 35333.3333 25733.3333
-761 35333.3333 25750.0000
-762 35350.0000 23583.3333
-763 35350.0000 23600.0000
-764 35350.0000 23633.3333
-765 35350.0000 23666.6667
-766 35350.0000 23683.3333
-767 35350.0000 23700.0000
-768 35350.0000 23833.3333
-769 35350.0000 24166.6667
-770 35350.0000 24183.3333
-771 35350.0000 24200.0000
-772 35350.0000 24216.6667
-773 35350.0000 24233.3333
-774 35350.0000 24250.0000
-775 35350.0000 24266.6667
-776 35350.0000 24283.3333
-777 35350.0000 24316.6667
-778 35350.0000 24400.0000
-779 35350.0000 24416.6667
-780 35350.0000 24433.3333
-781 35350.0000 24450.0000
-782 35350.0000 24516.6667
-783 35350.0000 24533.3333
-784 35350.0000 24550.0000
-785 35350.0000 24566.6667
-786 35350.0000 24583.3333
-787 35350.0000 24600.0000
-788 35350.0000 24633.3333
-789 35350.0000 24666.6667
-790 35350.0000 24683.3333
-791 35350.0000 24716.6667
-792 35350.0000 24733.3333
-793 35350.0000 24750.0000
-794 35350.0000 24766.6667
-795 35350.0000 24783.3333
-796 35350.0000 24816.6667
-797 35350.0000 24833.3333
-798 35350.0000 24850.0000
-799 35350.0000 24866.6667
-800 35350.0000 24916.6667
-801 35350.0000 24966.6667
-802 35366.6667 23550.0000
-803 35366.6667 23566.6667
-804 35366.6667 23583.3333
-805 35366.6667 23600.0000
-806 35366.6667 23616.6667
-807 35366.6667 23633.3333
-808 35366.6667 23650.0000
-809 35366.6667 23666.6667
-810 35366.6667 23700.0000
-811 35366.6667 23733.3333
-812 35366.6667 23783.3333
-813 35366.6667 23850.0000
-814 35366.6667 23866.6667
-815 35366.6667 24150.0000
-816 35366.6667 24166.6667
-817 35366.6667 24250.0000
-818 35366.6667 24266.6667
-819 35366.6667 24466.6667
-820 35366.6667 24483.3333
-821 35366.6667 24500.0000
-822 35366.6667 24533.3333
-823 35366.6667 24566.6667
-824 35366.6667 24583.3333
-825 35366.6667 24600.0000
-826 35366.6667 24616.6667
-827 35366.6667 24633.3333
-828 35366.6667 24666.6667
-829 35366.6667 24700.0000
-830 35366.6667 24716.6667
-831 35366.6667 24766.6667
-832 35366.6667 24883.3333
-833 35366.6667 25016.6667
-834 35383.3333 23633.3333
-835 35383.3333 23666.6667
-836 35383.3333 23733.3333
-837 35383.3333 23766.6667
-838 35383.3333 23816.6667
-839 35383.3333 23850.0000
-840 35383.3333 23866.6667
-841 35383.3333 23900.0000
-842 35383.3333 23966.6667
-843 35383.3333 24100.0000
-844 35383.3333 24116.6667
-845 35383.3333 24133.3333
-846 35383.3333 24150.0000
-847 35383.3333 24166.6667
-848 35383.3333 24183.3333
-849 35383.3333 24200.0000
-850 35383.3333 24216.6667
-851 35383.3333 24233.3333
-852 35383.3333 24250.0000
-853 35383.3333 24600.0000
-854 35383.3333 24616.6667
-855 35383.3333 24683.3333
-856 35383.3333 24733.3333
-857 35383.3333 24950.0000
-858 35383.3333 24966.6667
-859 35400.0000 23550.0000
-860 35400.0000 23566.6667
-861 35400.0000 23600.0000
-862 35400.0000 23616.6667
-863 35400.0000 23633.3333
-864 35400.0000 23666.6667
-865 35400.0000 23683.3333
-866 35400.0000 23716.6667
-867 35400.0000 23733.3333
-868 35400.0000 23766.6667
-869 35400.0000 23783.3333
-870 35400.0000 23850.0000
-871 35400.0000 23900.0000
-872 35400.0000 23916.6667
-873 35400.0000 23933.3333
-874 35400.0000 23950.0000
-875 35400.0000 23983.3333
-876 35400.0000 24066.6667
-877 35400.0000 24083.3333
-878 35400.0000 24100.0000
-879 35400.0000 24133.3333
-880 35400.0000 24150.0000
-881 35400.0000 24166.6667
-882 35400.0000 24183.3333
-883 35400.0000 24200.0000
-884 35400.0000 24216.6667
-885 35400.0000 24233.3333
-886 35400.0000 24250.0000
-887 35400.0000 24700.0000
-888 35400.0000 24716.6667
-889 35400.0000 24733.3333
-890 35400.0000 24750.0000
-891 35400.0000 24783.3333
-892 35400.0000 24883.3333
-893 35400.0000 24983.3333
-894 35400.0000 26916.6667
-895 35400.0000 26933.3333
-896 35400.0000 26950.0000
-897 35416.6667 23566.6667
-898 35416.6667 23583.3333
-899 35416.6667 23633.3333
-900 35416.6667 23650.0000
-901 35416.6667 23683.3333
-902 35416.6667 23700.0000
-903 35416.6667 23750.0000
-904 35416.6667 23783.3333
-905 35416.6667 23850.0000
-906 35416.6667 23933.3333
-907 35416.6667 24016.6667
-908 35416.6667 24033.3333
-909 35416.6667 24050.0000
-910 35416.6667 24066.6667
-911 35416.6667 24083.3333
-912 35416.6667 24100.0000
-913 35416.6667 24116.6667
-914 35416.6667 24133.3333
-915 35416.6667 24150.0000
-916 35416.6667 24183.3333
-917 35416.6667 24200.0000
-918 35416.6667 24216.6667
-919 35416.6667 24233.3333
-920 35416.6667 24250.0000
-921 35416.6667 24700.0000
-922 35416.6667 24716.6667
-923 35416.6667 24783.3333
-924 35416.6667 26933.3333
-925 35433.3333 23583.3333
-926 35433.3333 23633.3333
-927 35433.3333 23666.6667
-928 35433.3333 23683.3333
-929 35433.3333 23700.0000
-930 35433.3333 23716.6667
-931 35433.3333 23750.0000
-932 35433.3333 23766.6667
-933 35433.3333 23783.3333
-934 35433.3333 23833.3333
-935 35433.3333 23850.0000
-936 35433.3333 23916.6667
-937 35433.3333 23933.3333
-938 35433.3333 24033.3333
-939 35433.3333 24050.0000
-940 35433.3333 24066.6667
-941 35433.3333 24116.6667
-942 35433.3333 24166.6667
-943 35433.3333 24183.3333
-944 35433.3333 24200.0000
-945 35433.3333 24233.3333
-946 35450.0000 23583.3333
-947 35450.0000 23600.0000
-948 35450.0000 23616.6667
-949 35450.0000 23633.3333
-950 35450.0000 23650.0000
-951 35450.0000 23666.6667
-952 35450.0000 23683.3333
-953 35450.0000 23700.0000
-954 35450.0000 23716.6667
-955 35450.0000 23733.3333
-956 35450.0000 23750.0000
-957 35450.0000 23766.6667
-958 35450.0000 23783.3333
-959 35450.0000 23800.0000
-960 35450.0000 23833.3333
-961 35450.0000 23866.6667
-962 35450.0000 23900.0000
-963 35450.0000 23916.6667
-964 35450.0000 24016.6667
-965 35450.0000 24033.3333
-966 35450.0000 24050.0000
-967 35450.0000 24116.6667
-968 35450.0000 24166.6667
-969 35450.0000 24200.0000
-970 35450.0000 24216.6667
-971 35450.0000 24233.3333
-972 35466.6667 23566.6667
-973 35466.6667 23600.0000
-974 35466.6667 23616.6667
-975 35466.6667 23633.3333
-976 35466.6667 23650.0000
-977 35466.6667 23666.6667
-978 35466.6667 23683.3333
-979 35466.6667 23700.0000
-980 35466.6667 23716.6667
-981 35466.6667 23733.3333
-982 35466.6667 23750.0000
-983 35466.6667 23766.6667
-984 35466.6667 23783.3333
-985 35466.6667 23800.0000
-986 35466.6667 23816.6667
-987 35466.6667 23833.3333
-988 35466.6667 23850.0000
-989 35466.6667 23866.6667
-990 35466.6667 23883.3333
-991 35466.6667 23900.0000
-992 35466.6667 23916.6667
-993 35466.6667 23933.3333
-994 35466.6667 23950.0000
-995 35466.6667 23966.6667
-996 35466.6667 23983.3333
-997 35466.6667 24066.6667
-998 35466.6667 24100.0000
-999 35466.6667 24116.6667
-1000 35466.6667 24133.3333
-1001 35466.6667 24150.0000
-1002 35466.6667 27133.3333
-1003 35483.3333 23583.3333
-1004 35483.3333 23600.0000
-1005 35483.3333 23650.0000
-1006 35483.3333 23666.6667
-1007 35483.3333 23683.3333
-1008 35483.3333 23700.0000
-1009 35483.3333 23716.6667
-1010 35483.3333 23733.3333
-1011 35483.3333 23750.0000
-1012 35483.3333 23766.6667
-1013 35483.3333 23783.3333
-1014 35483.3333 23800.0000
-1015 35483.3333 23816.6667
-1016 35483.3333 23833.3333
-1017 35483.3333 23850.0000
-1018 35483.3333 23866.6667
-1019 35483.3333 23900.0000
-1020 35483.3333 23916.6667
-1021 35483.3333 23950.0000
-1022 35483.3333 23966.6667
-1023 35483.3333 23983.3333
-1024 35483.3333 24000.0000
-1025 35483.3333 24016.6667
-1026 35483.3333 24033.3333
-1027 35483.3333 24066.6667
-1028 35483.3333 27116.6667
-1029 35483.3333 27183.3333
-1030 35500.0000 23600.0000
-1031 35500.0000 23616.6667
-1032 35500.0000 23633.3333
-1033 35500.0000 23650.0000
-1034 35500.0000 23666.6667
-1035 35500.0000 23683.3333
-1036 35500.0000 23700.0000
-1037 35500.0000 23716.6667
-1038 35500.0000 23733.3333
-1039 35500.0000 23750.0000
-1040 35500.0000 23766.6667
-1041 35500.0000 23783.3333
-1042 35500.0000 23800.0000
-1043 35500.0000 23816.6667
-1044 35500.0000 23833.3333
-1045 35500.0000 23850.0000
-1046 35500.0000 23866.6667
-1047 35500.0000 23883.3333
-1048 35500.0000 23900.0000
-1049 35500.0000 23933.3333
-1050 35500.0000 23966.6667
-1051 35500.0000 23983.3333
-1052 35500.0000 24000.0000
-1053 35500.0000 24016.6667
-1054 35500.0000 24033.3333
-1055 35500.0000 27233.3333
-1056 35516.6667 23600.0000
-1057 35516.6667 23616.6667
-1058 35516.6667 23633.3333
-1059 35516.6667 23750.0000
-1060 35516.6667 23783.3333
-1061 35516.6667 23816.6667
-1062 35516.6667 23850.0000
-1063 35516.6667 23866.6667
-1064 35516.6667 23883.3333
-1065 35516.6667 23916.6667
-1066 35516.6667 23933.3333
-1067 35516.6667 23966.6667
-1068 35516.6667 23983.3333
-1069 35516.6667 24000.0000
-1070 35516.6667 24033.3333
-1071 35516.6667 24050.0000
-1072 35516.6667 24083.3333
-1073 35516.6667 24100.0000
-1074 35516.6667 24116.6667
-1075 35516.6667 24133.3333
-1076 35516.6667 24150.0000
-1077 35516.6667 27133.3333
-1078 35533.3333 23733.3333
-1079 35533.3333 23750.0000
-1080 35533.3333 23766.6667
-1081 35533.3333 23783.3333
-1082 35533.3333 23800.0000
-1083 35533.3333 24083.3333
-1084 35533.3333 24100.0000
-1085 35533.3333 24116.6667
-1086 35533.3333 24150.0000
-1087 35533.3333 24183.3333
-1088 35533.3333 27150.0000
-1089 35550.0000 23750.0000
-1090 35550.0000 23766.6667
-1091 35550.0000 23783.3333
-1092 35550.0000 24150.0000
-1093 35550.0000 24166.6667
-1094 35550.0000 27166.6667
-1095 35550.0000 27183.3333
-1096 35566.6667 23600.0000
-1097 35566.6667 23750.0000
-1098 35566.6667 23766.6667
-1099 35566.6667 24100.0000
-1100 35566.6667 24133.3333
-1101 35600.0000 23716.6667
-1102 35616.6667 27116.6667
-1103 35633.3333 27150.0000
-1104 35666.6667 23733.3333
-1105 35683.3333 27150.0000
-1106 35733.3333 27183.3333
-1107 35750.0000 27216.6667
-1108 35766.6667 27183.3333
-1109 35800.0000 27216.6667
-1110 35866.6667 23300.0000
-1111 35883.3333 23283.3333
-1112 35900.0000 27216.6667
-1113 35900.0000 27250.0000
-1114 35950.0000 27766.6667
-1115 35966.6667 27866.6667
-1116 36000.0000 27816.6667
-1117 36016.6667 27933.3333
-1118 36050.0000 27816.6667
-1119 36050.0000 27883.3333
-1120 36066.6667 27933.3333
-1121 36083.3333 27800.0000
-1122 36083.3333 27850.0000
-1123 36083.3333 28083.3333
-1124 36100.0000 27833.3333
-1125 36100.0000 28016.6667
-1126 36116.6667 27750.0000
-1127 36133.3333 29583.3333
-1128 36150.0000 22983.3333
-1129 36150.0000 23016.6667
-1130 36150.0000 23033.3333
-1131 36150.0000 27783.3333
-1132 36150.0000 27850.0000
-1133 36150.0000 27950.0000
-1134 36166.6667 22966.6667
-1135 36166.6667 22983.3333
-1136 36166.6667 23000.0000
-1137 36183.3333 22950.0000
-1138 36183.3333 22966.6667
-1139 36183.3333 22983.3333
-1140 36183.3333 23000.0000
-1141 36183.3333 28133.3333
-1142 36200.0000 22950.0000
-1143 36200.0000 22966.6667
-1144 36200.0000 22983.3333
-1145 36200.0000 23000.0000
-1146 36216.6667 22916.6667
-1147 36216.6667 22950.0000
-1148 36216.6667 22966.6667
-1149 36216.6667 22983.3333
-1150 36216.6667 27600.0000
-1151 36216.6667 27616.6667
-1152 36216.6667 27866.6667
-1153 36233.3333 22950.0000
-1154 36233.3333 22966.6667
-1155 36233.3333 22983.3333
-1156 36233.3333 23000.0000
-1157 36233.3333 23083.3333
-1158 36233.3333 27850.0000
-1159 36250.0000 22933.3333
-1160 36250.0000 22950.0000
-1161 36250.0000 22983.3333
-1162 36250.0000 23000.0000
-1163 36250.0000 27716.6667
-1164 36250.0000 27966.6667
-1165 36250.0000 28016.6667
-1166 36250.0000 28166.6667
-1167 36266.6667 22950.0000
-1168 36266.6667 22966.6667
-1169 36266.6667 22983.3333
-1170 36266.6667 23083.3333
-1171 36266.6667 27900.0000
-1172 36266.6667 27916.6667
-1173 36283.3333 22950.0000
-1174 36283.3333 22966.6667
-1175 36283.3333 27866.6667
-1176 36283.3333 27950.0000
-1177 36300.0000 22966.6667
-1178 36300.0000 22983.3333
-1179 36300.0000 28150.0000
-1180 36316.6667 22933.3333
-1181 36316.6667 22950.0000
-1182 36316.6667 28050.0000
-1183 36333.3333 22950.0000
-1184 36333.3333 22966.6667
-1185 36333.3333 22983.3333
-1186 36333.3333 27950.0000
-1187 36350.0000 22950.0000
-1188 36350.0000 25400.0000
-1189 36350.0000 25450.0000
-1190 36350.0000 25766.6667
-1191 36350.0000 27983.3333
-1192 36366.6667 22950.0000
-1193 36383.3333 25433.3333
-1194 36383.3333 25450.0000
-1195 36383.3333 25466.6667
-1196 36399.1667 27423.6111
-1197 36400.0000 22483.3333
-1198 36400.0000 25450.0000
-1199 36400.0000 25483.3333
-1200 36400.0000 28083.3333
-1201 36400.0000 28116.6667
-1202 36400.0000 28166.6667
-1203 36415.8333 27385.0000
-1204 36416.6667 22483.3333
-1205 36416.6667 25433.3333
-1206 36416.6667 25450.0000
-1207 36416.6667 28183.3333
-1208 36420.8333 27371.3889
-1209 36433.3333 22466.6667
-1210 36433.3333 22483.3333
-1211 36433.3333 25333.3333
-1212 36433.3333 25350.0000
-1213 36433.3333 25416.6667
-1214 36433.3333 25433.3333
-1215 36433.3333 28216.6667
-1216 36449.1667 27348.3333
-1217 36450.0000 22466.6667
-1218 36450.0000 22483.3333
-1219 36450.0000 28250.0000
-1220 36458.6111 27318.6111
-1221 36466.6667 22433.3333
-1222 36466.6667 22450.0000
-1223 36466.6667 22466.6667
-1224 36466.6667 23166.6667
-1225 36466.6667 25366.6667
-1226 36466.6667 25383.3333
-1227 36466.6667 25400.0000
-1228 36483.3333 22366.6667
-1229 36483.3333 22383.3333
-1230 36483.3333 22400.0000
-1231 36483.3333 22416.6667
-1232 36483.3333 22450.0000
-1233 36483.3333 22483.3333
-1234 36483.3333 22500.0000
-1235 36483.3333 22950.0000
-1236 36483.3333 23100.0000
-1237 36483.3333 23150.0000
-1238 36500.0000 22366.6667
-1239 36500.0000 22383.3333
-1240 36500.0000 22400.0000
-1241 36500.0000 22416.6667
-1242 36500.0000 22433.3333
-1243 36500.0000 22466.6667
-1244 36500.0000 22483.3333
-1245 36500.0000 23083.3333
-1246 36516.6667 22366.6667
-1247 36516.6667 22383.3333
-1248 36516.6667 22400.0000
-1249 36516.6667 22416.6667
-1250 36516.6667 22466.6667
-1251 36516.6667 22483.3333
-1252 36516.6667 22983.3333
-1253 36516.6667 23050.0000
-1254 36516.6667 23066.6667
-1255 36516.6667 23083.3333
-1256 36533.3333 22366.6667
-1257 36533.3333 22383.3333
-1258 36533.3333 22400.0000
-1259 36533.3333 22416.6667
-1260 36533.3333 22433.3333
-1261 36533.3333 22450.0000
-1262 36533.3333 22466.6667
-1263 36533.3333 22983.3333
-1264 36533.3333 23083.3333
-1265 36533.3333 23116.6667
-1266 36533.3333 27850.0000
-1267 36550.0000 22400.0000
-1268 36550.0000 22416.6667
-1269 36550.0000 22450.0000
-1270 36550.0000 22983.3333
-1271 36550.0000 23000.0000
-1272 36550.0000 23016.6667
-1273 36550.0000 23033.3333
-1274 36550.0000 23050.0000
-1275 36550.0000 23100.0000
-1276 36550.0000 26350.0000
-1277 36558.6111 27175.5556
-1278 36566.6667 22400.0000
-1279 36566.6667 22416.6667
-1280 36566.6667 22466.6667
-1281 36566.6667 22483.3333
-1282 36566.6667 22966.6667
-1283 36566.6667 22983.3333
-1284 36566.6667 23000.0000
-1285 36566.6667 23016.6667
-1286 36566.6667 23033.3333
-1287 36566.6667 23050.0000
-1288 36574.1667 27177.7778
-1289 36583.3333 22400.0000
-1290 36583.3333 22416.6667
-1291 36583.3333 22466.6667
-1292 36583.3333 23033.3333
-1293 36600.0000 22366.6667
-1294 36600.0000 22383.3333
-1295 36600.0000 22400.0000
-1296 36600.0000 22416.6667
-1297 36600.0000 22966.6667
-1298 36600.0000 23050.0000
-1299 36600.0000 24916.6667
-1300 36600.0000 24933.3333
-1301 36600.0000 27833.3333
-1302 36603.3333 27177.7778
-1303 36611.3889 27133.3333
-1304 36616.6667 22383.3333
-1305 36616.6667 22400.0000
-1306 36616.6667 22466.6667
-1307 36616.6667 22483.3333
-1308 36616.6667 22500.0000
-1309 36616.6667 22916.6667
-1310 36616.6667 22983.3333
-1311 36616.6667 23000.0000
-1312 36616.6667 24950.0000
-1313 36617.7778 27170.8333
-1314 36633.3333 22383.3333
-1315 36633.3333 22400.0000
-1316 36633.3333 22466.6667
-1317 36633.3333 22483.3333
-1318 36633.3333 22500.0000
-1319 36633.3333 22883.3333
-1320 36633.3333 22950.0000
-1321 36633.3333 23000.0000
-1322 36633.3333 23016.6667
-1323 36633.3333 23033.3333
-1324 36633.3333 24900.0000
-1325 36633.3333 24916.6667
-1326 36650.0000 22383.3333
-1327 36650.0000 22400.0000
-1328 36650.0000 22416.6667
-1329 36650.0000 22433.3333
-1330 36650.0000 22466.6667
-1331 36650.0000 22500.0000
-1332 36650.0000 22900.0000
-1333 36650.0000 22966.6667
-1334 36650.0000 23016.6667
-1335 36650.0000 24883.3333
-1336 36662.7778 27119.4444
-1337 36666.6667 22366.6667
-1338 36666.6667 22383.3333
-1339 36666.6667 22433.3333
-1340 36666.6667 22450.0000
-1341 36666.6667 22466.6667
-1342 36666.6667 22483.3333
-1343 36666.6667 22500.0000
-1344 36666.6667 22533.3333
-1345 36666.6667 22550.0000
-1346 36666.6667 22933.3333
-1347 36666.6667 22983.3333
-1348 36666.6667 23016.6667
-1349 36683.3333 22383.3333
-1350 36683.3333 22416.6667
-1351 36683.3333 22433.3333
-1352 36683.3333 22450.0000
-1353 36683.3333 22466.6667
-1354 36683.3333 22483.3333
-1355 36683.3333 22516.6667
-1356 36683.3333 22833.3333
-1357 36683.3333 22916.6667
-1358 36683.3333 22933.3333
-1359 36683.3333 22966.6667
-1360 36683.3333 23033.3333
-1361 36683.3333 23050.0000
-1362 36683.3333 25333.3333
-1363 36700.0000 22383.3333
-1364 36700.0000 22466.6667
-1365 36700.0000 22483.3333
-1366 36700.0000 22533.3333
-1367 36700.0000 22900.0000
-1368 36700.0000 22916.6667
-1369 36700.0000 22933.3333
-1370 36700.0000 22950.0000
-1371 36700.0000 23033.3333
-1372 36700.0000 24483.3333
-1373 36700.0000 24533.3333
-1374 36700.0000 25116.6667
-1375 36716.6667 22350.0000
-1376 36716.6667 22366.6667
-1377 36716.6667 22383.3333
-1378 36716.6667 22400.0000
-1379 36716.6667 22416.6667
-1380 36716.6667 22433.3333
-1381 36716.6667 22466.6667
-1382 36716.6667 22500.0000
-1383 36716.6667 22866.6667
-1384 36716.6667 22950.0000
-1385 36716.6667 22983.3333
-1386 36733.3333 22333.3333
-1387 36733.3333 22350.0000
-1388 36733.3333 22416.6667
-1389 36733.3333 22433.3333
-1390 36733.3333 22450.0000
-1391 36733.3333 22466.6667
-1392 36733.3333 22483.3333
-1393 36733.3333 22500.0000
-1394 36733.3333 22550.0000
-1395 36733.3333 22566.6667
-1396 36733.3333 22866.6667
-1397 36733.3333 22900.0000
-1398 36733.3333 23033.3333
-1399 36733.3333 24433.3333
-1400 36733.3333 25283.3333
-1401 36750.0000 22333.3333
-1402 36750.0000 22450.0000
-1403 36750.0000 22466.6667
-1404 36750.0000 22500.0000
-1405 36750.0000 22516.6667
-1406 36750.0000 22533.3333
-1407 36750.0000 22566.6667
-1408 36750.0000 22800.0000
-1409 36750.0000 22933.3333
-1410 36750.0000 22966.6667
-1411 36750.0000 23000.0000
-1412 36750.0000 23016.6667
-1413 36750.0000 23066.6667
-1414 36750.0000 24416.6667
-1415 36750.0000 24433.3333
-1416 36750.0000 24533.3333
-1417 36766.6667 21900.0000
-1418 36766.6667 22316.6667
-1419 36766.6667 22416.6667
-1420 36766.6667 22433.3333
-1421 36766.6667 22466.6667
-1422 36766.6667 22500.0000
-1423 36766.6667 22933.3333
-1424 36766.6667 23083.3333
-1425 36766.6667 24516.6667
-1426 36766.6667 27083.3333
-1427 36783.3333 21883.3333
-1428 36783.3333 21916.6667
-1429 36783.3333 22333.3333
-1430 36783.3333 22416.6667
-1431 36783.3333 22450.0000
-1432 36783.3333 22466.6667
-1433 36783.3333 22483.3333
-1434 36783.3333 22516.6667
-1435 36783.3333 22533.3333
-1436 36783.3333 22550.0000
-1437 36783.3333 22900.0000
-1438 36783.3333 23050.0000
-1439 36783.3333 23083.3333
-1440 36783.3333 25800.0000
-1441 36783.3333 27150.0000
-1442 36800.0000 21766.6667
-1443 36800.0000 21800.0000
-1444 36800.0000 21833.3333
-1445 36800.0000 21866.6667
-1446 36800.0000 21916.6667
-1447 36800.0000 21950.0000
-1448 36800.0000 22316.6667
-1449 36800.0000 22333.3333
-1450 36800.0000 22416.6667
-1451 36800.0000 22450.0000
-1452 36800.0000 22466.6667
-1453 36800.0000 22483.3333
-1454 36800.0000 22500.0000
-1455 36800.0000 22516.6667
-1456 36800.0000 22533.3333
-1457 36800.0000 22783.3333
-1458 36800.0000 22850.0000
-1459 36800.0000 22916.6667
-1460 36800.0000 23050.0000
-1461 36800.0000 24583.3333
-1462 36800.0000 25783.3333
-1463 36800.0000 25816.6667
-1464 36800.0000 27116.6667
-1465 36816.6667 21700.0000
-1466 36816.6667 21750.0000
-1467 36816.6667 21800.0000
-1468 36816.6667 21833.3333
-1469 36816.6667 21850.0000
-1470 36816.6667 21883.3333
-1471 36816.6667 21900.0000
-1472 36816.6667 21916.6667
-1473 36816.6667 21933.3333
-1474 36816.6667 22283.3333
-1475 36816.6667 22300.0000
-1476 36816.6667 22316.6667
-1477 36816.6667 22416.6667
-1478 36816.6667 22433.3333
-1479 36816.6667 22450.0000
-1480 36816.6667 22550.0000
-1481 36816.6667 23033.3333
-1482 36816.6667 26966.6667
-1483 36833.3333 21766.6667
-1484 36833.3333 21800.0000
-1485 36833.3333 21833.3333
-1486 36833.3333 21866.6667
-1487 36833.3333 21883.3333
-1488 36833.3333 21916.6667
-1489 36833.3333 22300.0000
-1490 36833.3333 22316.6667
-1491 36833.3333 22333.3333
-1492 36833.3333 22350.0000
-1493 36833.3333 22400.0000
-1494 36833.3333 22433.3333
-1495 36833.3333 22483.3333
-1496 36833.3333 22550.0000
-1497 36833.3333 22583.3333
-1498 36833.3333 22616.6667
-1499 36833.3333 22683.3333
-1500 36833.3333 22700.0000
-1501 36833.3333 22733.3333
-1502 36833.3333 22783.3333
-1503 36833.3333 22800.0000
-1504 36833.3333 22850.0000
-1505 36833.3333 23000.0000
-1506 36833.3333 25450.0000
-1507 36833.3333 25866.6667
-1508 36833.3333 25900.0000
-1509 36850.0000 21733.3333
-1510 36850.0000 21750.0000
-1511 36850.0000 21766.6667
-1512 36850.0000 21816.6667
-1513 36850.0000 21833.3333
-1514 36850.0000 21866.6667
-1515 36850.0000 21916.6667
-1516 36850.0000 22266.6667
-1517 36850.0000 22283.3333
-1518 36850.0000 22316.6667
-1519 36850.0000 22350.0000
-1520 36850.0000 22416.6667
-1521 36850.0000 22450.0000
-1522 36850.0000 22466.6667
-1523 36850.0000 22500.0000
-1524 36850.0000 22600.0000
-1525 36850.0000 22666.6667
-1526 36850.0000 22683.3333
-1527 36850.0000 22733.3333
-1528 36850.0000 23000.0000
-1529 36850.0000 27083.3333
-1530 36850.0000 27166.6667
-1531 36850.0000 27216.6667
-1532 36866.6667 21700.0000
-1533 36866.6667 21716.6667
-1534 36866.6667 21750.0000
-1535 36866.6667 21766.6667
-1536 36866.6667 21783.3333
-1537 36866.6667 21816.6667
-1538 36866.6667 21833.3333
-1539 36866.6667 21866.6667
-1540 36866.6667 21900.0000
-1541 36866.6667 22316.6667
-1542 36866.6667 22466.6667
-1543 36866.6667 22500.0000
-1544 36866.6667 22683.3333
-1545 36866.6667 22700.0000
-1546 36866.6667 22900.0000
-1547 36866.6667 23016.6667
-1548 36866.6667 25466.6667
-1549 36866.6667 25516.6667
-1550 36883.3333 21716.6667
-1551 36883.3333 21866.6667
-1552 36883.3333 21900.0000
-1553 36883.3333 22233.3333
-1554 36883.3333 22250.0000
-1555 36883.3333 22283.3333
-1556 36883.3333 22400.0000
-1557 36883.3333 22416.6667
-1558 36883.3333 22483.3333
-1559 36883.3333 22516.6667
-1560 36883.3333 22550.0000
-1561 36883.3333 22566.6667
-1562 36883.3333 22666.6667
-1563 36883.3333 22700.0000
-1564 36883.3333 22800.0000
-1565 36883.3333 22983.3333
-1566 36883.3333 25516.6667
-1567 36883.3333 27150.0000
-1568 36883.3333 27283.3333
-1569 36883.3333 27300.0000
-1570 36900.0000 21750.0000
-1571 36900.0000 21766.6667
-1572 36900.0000 21816.6667
-1573 36900.0000 21850.0000
-1574 36900.0000 21866.6667
-1575 36900.0000 21900.0000
-1576 36900.0000 21916.6667
-1577 36900.0000 22250.0000
-1578 36900.0000 22266.6667
-1579 36900.0000 22450.0000
-1580 36900.0000 22650.0000
-1581 36900.0000 22716.6667
-1582 36900.0000 22850.0000
-1583 36900.0000 22966.6667
-1584 36900.0000 23000.0000
-1585 36900.0000 25566.6667
-1586 36900.0000 25983.3333
-1587 36900.0000 26000.0000
-1588 36916.6667 21700.0000
-1589 36916.6667 21833.3333
-1590 36916.6667 21850.0000
-1591 36916.6667 21866.6667
-1592 36916.6667 21900.0000
-1593 36916.6667 21916.6667
-1594 36916.6667 22150.0000
-1595 36916.6667 22233.3333
-1596 36916.6667 22250.0000
-1597 36916.6667 22266.6667
-1598 36916.6667 22433.3333
-1599 36916.6667 22450.0000
-1600 36916.6667 22750.0000
-1601 36916.6667 23000.0000
-1602 36916.6667 25983.3333
-1603 36933.3333 21833.3333
-1604 36933.3333 21883.3333
-1605 36933.3333 22150.0000
-1606 36933.3333 22166.6667
-1607 36933.3333 22183.3333
-1608 36933.3333 22200.0000
-1609 36933.3333 22466.6667
-1610 36933.3333 22483.3333
-1611 36933.3333 22533.3333
-1612 36933.3333 22816.6667
-1613 36933.3333 24683.3333
-1614 36933.3333 24733.3333
-1615 36933.3333 27150.0000
-1616 36950.0000 21700.0000
-1617 36950.0000 21733.3333
-1618 36950.0000 21750.0000
-1619 36950.0000 21783.3333
-1620 36950.0000 21816.6667
-1621 36950.0000 21850.0000
-1622 36950.0000 21866.6667
-1623 36950.0000 21883.3333
-1624 36950.0000 21933.3333
-1625 36950.0000 22166.6667
-1626 36950.0000 22183.3333
-1627 36950.0000 22216.6667
-1628 36950.0000 22233.3333
-1629 36950.0000 22250.0000
-1630 36950.0000 22416.6667
-1631 36950.0000 22450.0000
-1632 36950.0000 22466.6667
-1633 36950.0000 22766.6667
-1634 36950.0000 24750.0000
-1635 36950.0000 26983.3333
-1636 36966.6667 21700.0000
-1637 36966.6667 21733.3333
-1638 36966.6667 21750.0000
-1639 36966.6667 21816.6667
-1640 36966.6667 21850.0000
-1641 36966.6667 21866.6667
-1642 36966.6667 21900.0000
-1643 36966.6667 22150.0000
-1644 36966.6667 22166.6667
-1645 36966.6667 22200.0000
-1646 36966.6667 22233.3333
-1647 36966.6667 22400.0000
-1648 36966.6667 22416.6667
-1649 36966.6667 22450.0000
-1650 36966.6667 22466.6667
-1651 36966.6667 22650.0000
-1652 36966.6667 22983.3333
-1653 36966.6667 24716.6667
-1654 36966.6667 24733.3333
-1655 36966.6667 24750.0000
-1656 36966.6667 26966.6667
-1657 36966.6667 27016.6667
-1658 36983.3333 21666.6667
-1659 36983.3333 21716.6667
-1660 36983.3333 21766.6667
-1661 36983.3333 21783.3333
-1662 36983.3333 21800.0000
-1663 36983.3333 21833.3333
-1664 36983.3333 21850.0000
-1665 36983.3333 21883.3333
-1666 36983.3333 22150.0000
-1667 36983.3333 22183.3333
-1668 36983.3333 22316.6667
-1669 36983.3333 22400.0000
-1670 36983.3333 22433.3333
-1671 36983.3333 22466.6667
-1672 36983.3333 22500.0000
-1673 36983.3333 22516.6667
-1674 36983.3333 22533.3333
-1675 36983.3333 22566.6667
-1676 36983.3333 22850.0000
-1677 36983.3333 22883.3333
-1678 36983.3333 22983.3333
-1679 36983.3333 24683.3333
-1680 36983.3333 24716.6667
-1681 36983.3333 24733.3333
-1682 36983.3333 25066.6667
-1683 36983.3333 26933.3333
-1684 36983.3333 26950.0000
-1685 36983.3333 27000.0000
-1686 37000.0000 21666.6667
-1687 37000.0000 21683.3333
-1688 37000.0000 21716.6667
-1689 37000.0000 21750.0000
-1690 37000.0000 21850.0000
-1691 37000.0000 21883.3333
-1692 37000.0000 21916.6667
-1693 37000.0000 21933.3333
-1694 37000.0000 22150.0000
-1695 37000.0000 22166.6667
-1696 37000.0000 22183.3333
-1697 37000.0000 22250.0000
-1698 37000.0000 22300.0000
-1699 37000.0000 22383.3333
-1700 37000.0000 22500.0000
-1701 37000.0000 22700.0000
-1702 37000.0000 25166.6667
-1703 37016.6667 21633.3333
-1704 37016.6667 21733.3333
-1705 37016.6667 21750.0000
-1706 37016.6667 21800.0000
-1707 37016.6667 21833.3333
-1708 37016.6667 21883.3333
-1709 37016.6667 21900.0000
-1710 37016.6667 21933.3333
-1711 37016.6667 21950.0000
-1712 37016.6667 21966.6667
-1713 37016.6667 22266.6667
-1714 37016.6667 22416.6667
-1715 37016.6667 22450.0000
-1716 37016.6667 22466.6667
-1717 37016.6667 22483.3333
-1718 37016.6667 22783.3333
-1719 37016.6667 25183.3333
-1720 37016.6667 26983.3333
-1721 37033.3333 21783.3333
-1722 37033.3333 21800.0000
-1723 37033.3333 21866.6667
-1724 37033.3333 21883.3333
-1725 37033.3333 21916.6667
-1726 37033.3333 21933.3333
-1727 37033.3333 21966.6667
-1728 37033.3333 22083.3333
-1729 37033.3333 22116.6667
-1730 37033.3333 22133.3333
-1731 37033.3333 22183.3333
-1732 37033.3333 22216.6667
-1733 37033.3333 22233.3333
-1734 37033.3333 22366.6667
-1735 37033.3333 22416.6667
-1736 37033.3333 22433.3333
-1737 37033.3333 22450.0000
-1738 37033.3333 22466.6667
-1739 37033.3333 22483.3333
-1740 37033.3333 22516.6667
-1741 37033.3333 22566.6667
-1742 37033.3333 22616.6667
-1743 37033.3333 22833.3333
-1744 37033.3333 22983.3333
-1745 37033.3333 25083.3333
-1746 37033.3333 25433.3333
-1747 37033.3333 26966.6667
-1748 37050.0000 21600.0000
-1749 37050.0000 21666.6667
-1750 37050.0000 21700.0000
-1751 37050.0000 21716.6667
-1752 37050.0000 21766.6667
-1753 37050.0000 21800.0000
-1754 37050.0000 21816.6667
-1755 37050.0000 21850.0000
-1756 37050.0000 21883.3333
-1757 37050.0000 21933.3333
-1758 37050.0000 21950.0000
-1759 37050.0000 22016.6667
-1760 37050.0000 22083.3333
-1761 37050.0000 22100.0000
-1762 37050.0000 22166.6667
-1763 37050.0000 22183.3333
-1764 37050.0000 22366.6667
-1765 37050.0000 22400.0000
-1766 37050.0000 22416.6667
-1767 37050.0000 22433.3333
-1768 37050.0000 22450.0000
-1769 37050.0000 22783.3333
-1770 37050.0000 22900.0000
-1771 37050.0000 25133.3333
-1772 37050.0000 25200.0000
-1773 37050.0000 25233.3333
-1774 37050.0000 25250.0000
-1775 37050.0000 25400.0000
-1776 37050.0000 25483.3333
-1777 37050.0000 25500.0000
-1778 37050.0000 25533.3333
-1779 37050.0000 26933.3333
-1780 37066.6667 21583.3333
-1781 37066.6667 21600.0000
-1782 37066.6667 21633.3333
-1783 37066.6667 21700.0000
-1784 37066.6667 21750.0000
-1785 37066.6667 21783.3333
-1786 37066.6667 21816.6667
-1787 37066.6667 21883.3333
-1788 37066.6667 21933.3333
-1789 37066.6667 21966.6667
-1790 37066.6667 21983.3333
-1791 37066.6667 22000.0000
-1792 37066.6667 22066.6667
-1793 37066.6667 22083.3333
-1794 37066.6667 22100.0000
-1795 37066.6667 22166.6667
-1796 37066.6667 22216.6667
-1797 37066.6667 22350.0000
-1798 37066.6667 22366.6667
-1799 37066.6667 22383.3333
-1800 37066.6667 22416.6667
-1801 37066.6667 22433.3333
-1802 37066.6667 22450.0000
-1803 37066.6667 22583.3333
-1804 37066.6667 22783.3333
-1805 37066.6667 22800.0000
-1806 37066.6667 22816.6667
-1807 37066.6667 22850.0000
-1808 37066.6667 22916.6667
-1809 37066.6667 22933.3333
-1810 37066.6667 25116.6667
-1811 37066.6667 25133.3333
-1812 37066.6667 25400.0000
-1813 37066.6667 25433.3333
-1814 37066.6667 25450.0000
-1815 37066.6667 25466.6667
-1816 37066.6667 25483.3333
-1817 37066.6667 25500.0000
-1818 37066.6667 25516.6667
-1819 37083.3333 21666.6667
-1820 37083.3333 21766.6667
-1821 37083.3333 21783.3333
-1822 37083.3333 21800.0000
-1823 37083.3333 21833.3333
-1824 37083.3333 21866.6667
-1825 37083.3333 21900.0000
-1826 37083.3333 21916.6667
-1827 37083.3333 21933.3333
-1828 37083.3333 21950.0000
-1829 37083.3333 21966.6667
-1830 37083.3333 21983.3333
-1831 37083.3333 22000.0000
-1832 37083.3333 22033.3333
-1833 37083.3333 22050.0000
-1834 37083.3333 22100.0000
-1835 37083.3333 22216.6667
-1836 37083.3333 22350.0000
-1837 37083.3333 22366.6667
-1838 37083.3333 22416.6667
-1839 37083.3333 22433.3333
-1840 37083.3333 22566.6667
-1841 37083.3333 22650.0000
-1842 37083.3333 22800.0000
-1843 37083.3333 22833.3333
-1844 37083.3333 22900.0000
-1845 37083.3333 25150.0000
-1846 37083.3333 25166.6667
-1847 37083.3333 25200.0000
-1848 37083.3333 25216.6667
-1849 37083.3333 25416.6667
-1850 37083.3333 25500.0000
-1851 37083.3333 25533.3333
-1852 37083.3333 25583.3333
-1853 37100.0000 21633.3333
-1854 37100.0000 21716.6667
-1855 37100.0000 21750.0000
-1856 37100.0000 21766.6667
-1857 37100.0000 21816.6667
-1858 37100.0000 21833.3333
-1859 37100.0000 21850.0000
-1860 37100.0000 21966.6667
-1861 37100.0000 21983.3333
-1862 37100.0000 22000.0000
-1863 37100.0000 22033.3333
-1864 37100.0000 22050.0000
-1865 37100.0000 22066.6667
-1866 37100.0000 22233.3333
-1867 37100.0000 22250.0000
-1868 37100.0000 22366.6667
-1869 37100.0000 22433.3333
-1870 37100.0000 22450.0000
-1871 37100.0000 22533.3333
-1872 37100.0000 22733.3333
-1873 37100.0000 22800.0000
-1874 37100.0000 22866.6667
-1875 37100.0000 22883.3333
-1876 37100.0000 25383.3333
-1877 37100.0000 25400.0000
-1878 37100.0000 25433.3333
-1879 37100.0000 25483.3333
-1880 37100.0000 26866.6667
-1881 37116.6667 21583.3333
-1882 37116.6667 21733.3333
-1883 37116.6667 21766.6667
-1884 37116.6667 21800.0000
-1885 37116.6667 21833.3333
-1886 37116.6667 21933.3333
-1887 37116.6667 21966.6667
-1888 37116.6667 22033.3333
-1889 37116.6667 22066.6667
-1890 37116.6667 22250.0000
-1891 37116.6667 22333.3333
-1892 37116.6667 22350.0000
-1893 37116.6667 22383.3333
-1894 37116.6667 22866.6667
-1895 37116.6667 25233.3333
-1896 37116.6667 25416.6667
-1897 37116.6667 25433.3333
-1898 37116.6667 25516.6667
-1899 37116.6667 25533.3333
-1900 37116.6667 25816.6667
-1901 37116.6667 26866.6667
-1902 37133.3333 21683.3333
-1903 37133.3333 21750.0000
-1904 37133.3333 21766.6667
-1905 37133.3333 21816.6667
-1906 37133.3333 21866.6667
-1907 37133.3333 21883.3333
-1908 37133.3333 21916.6667
-1909 37133.3333 21966.6667
-1910 37133.3333 21983.3333
-1911 37133.3333 22000.0000
-1912 37133.3333 22016.6667
-1913 37133.3333 22033.3333
-1914 37133.3333 22066.6667
-1915 37133.3333 22333.3333
-1916 37133.3333 22450.0000
-1917 37133.3333 22583.3333
-1918 37133.3333 24450.0000
-1919 37133.3333 24466.6667
-1920 37133.3333 24500.0000
-1921 37133.3333 24516.6667
-1922 37133.3333 26850.0000
-1923 37150.0000 21583.3333
-1924 37150.0000 21766.6667
-1925 37150.0000 21783.3333
-1926 37150.0000 21800.0000
-1927 37150.0000 21833.3333
-1928 37150.0000 21850.0000
-1929 37150.0000 21883.3333
-1930 37150.0000 21966.6667
-1931 37150.0000 22033.3333
-1932 37150.0000 22050.0000
-1933 37150.0000 22083.3333
-1934 37150.0000 22233.3333
-1935 37150.0000 22433.3333
-1936 37150.0000 22900.0000
-1937 37150.0000 24433.3333
-1938 37150.0000 24450.0000
-1939 37150.0000 24500.0000
-1940 37150.0000 24516.6667
-1941 37150.0000 25466.6667
-1942 37150.0000 25533.3333
-1943 37150.0000 25550.0000
-1944 37150.0000 26866.6667
-1945 37166.6667 21616.6667
-1946 37166.6667 21666.6667
-1947 37166.6667 21700.0000
-1948 37166.6667 21716.6667
-1949 37166.6667 21750.0000
-1950 37166.6667 21783.3333
-1951 37166.6667 21833.3333
-1952 37166.6667 21883.3333
-1953 37166.6667 21916.6667
-1954 37166.6667 21983.3333
-1955 37166.6667 22033.3333
-1956 37166.6667 22066.6667
-1957 37166.6667 22083.3333
-1958 37166.6667 22133.3333
-1959 37166.6667 22316.6667
-1960 37166.6667 22416.6667
-1961 37166.6667 22450.0000
-1962 37166.6667 22500.0000
-1963 37166.6667 22666.6667
-1964 37166.6667 22716.6667
-1965 37166.6667 22866.6667
-1966 37166.6667 22900.0000
-1967 37166.6667 24433.3333
-1968 37166.6667 24450.0000
-1969 37166.6667 24483.3333
-1970 37166.6667 26800.0000
-1971 37166.6667 26833.3333
-1972 37183.3333 21600.0000
-1973 37183.3333 21616.6667
-1974 37183.3333 21683.3333
-1975 37183.3333 21750.0000
-1976 37183.3333 21766.6667
-1977 37183.3333 21816.6667
-1978 37183.3333 21850.0000
-1979 37183.3333 21933.3333
-1980 37183.3333 22050.0000
-1981 37183.3333 22183.3333
-1982 37183.3333 22200.0000
-1983 37183.3333 22233.3333
-1984 37183.3333 22300.0000
-1985 37183.3333 22316.6667
-1986 37183.3333 22550.0000
-1987 37183.3333 22600.0000
-1988 37183.3333 22683.3333
-1989 37183.3333 22900.0000
-1990 37183.3333 24483.3333
-1991 37183.3333 24516.6667
-1992 37183.3333 25550.0000
-1993 37200.0000 21616.6667
-1994 37200.0000 21783.3333
-1995 37200.0000 21800.0000
-1996 37200.0000 21883.3333
-1997 37200.0000 21933.3333
-1998 37200.0000 21966.6667
-1999 37200.0000 22000.0000
-2000 37200.0000 22016.6667
-2001 37200.0000 22050.0000
-2002 37200.0000 22083.3333
-2003 37200.0000 22166.6667
-2004 37200.0000 22266.6667
-2005 37200.0000 22283.3333
-2006 37200.0000 22316.6667
-2007 37200.0000 22350.0000
-2008 37200.0000 22366.6667
-2009 37200.0000 22400.0000
-2010 37200.0000 22783.3333
-2011 37200.0000 22883.3333
-2012 37200.0000 24500.0000
-2013 37216.6667 21600.0000
-2014 37216.6667 21633.3333
-2015 37216.6667 21650.0000
-2016 37216.6667 21666.6667
-2017 37216.6667 21683.3333
-2018 37216.6667 21716.6667
-2019 37216.6667 21733.3333
-2020 37216.6667 21750.0000
-2021 37216.6667 21850.0000
-2022 37216.6667 21950.0000
-2023 37216.6667 21966.6667
-2024 37216.6667 22033.3333
-2025 37216.6667 22283.3333
-2026 37216.6667 22300.0000
-2027 37216.6667 22883.3333
-2028 37233.3333 21650.0000
-2029 37233.3333 21666.6667
-2030 37233.3333 21800.0000
-2031 37233.3333 21816.6667
-2032 37233.3333 21850.0000
-2033 37233.3333 21866.6667
-2034 37233.3333 21900.0000
-2035 37233.3333 21933.3333
-2036 37233.3333 21966.6667
-2037 37233.3333 21983.3333
-2038 37233.3333 22016.6667
-2039 37233.3333 22033.3333
-2040 37233.3333 22133.3333
-2041 37233.3333 22166.6667
-2042 37233.3333 22183.3333
-2043 37233.3333 22200.0000
-2044 37233.3333 22250.0000
-2045 37233.3333 22266.6667
-2046 37233.3333 22283.3333
-2047 37233.3333 22500.0000
-2048 37233.3333 22533.3333
-2049 37233.3333 22850.0000
-2050 37250.0000 21666.6667
-2051 37250.0000 21683.3333
-2052 37250.0000 21700.0000
-2053 37250.0000 21716.6667
-2054 37250.0000 21733.3333
-2055 37250.0000 21783.3333
-2056 37250.0000 21816.6667
-2057 37250.0000 21833.3333
-2058 37250.0000 21966.6667
-2059 37250.0000 21983.3333
-2060 37250.0000 22000.0000
-2061 37250.0000 22016.6667
-2062 37250.0000 22116.6667
-2063 37250.0000 22183.3333
-2064 37250.0000 22333.3333
-2065 37250.0000 22550.0000
-2066 37250.0000 22833.3333
-2067 37250.0000 22866.6667
-2068 37250.0000 23150.0000
-2069 37266.6667 21750.0000
-2070 37266.6667 21766.6667
-2071 37266.6667 21866.6667
-2072 37266.6667 21900.0000
-2073 37266.6667 21933.3333
-2074 37266.6667 21950.0000
-2075 37266.6667 21966.6667
-2076 37266.6667 21983.3333
-2077 37266.6667 22000.0000
-2078 37266.6667 22016.6667
-2079 37266.6667 22166.6667
-2080 37266.6667 22250.0000
-2081 37266.6667 22316.6667
-2082 37266.6667 22533.3333
-2083 37266.6667 22650.0000
-2084 37266.6667 22683.3333
-2085 37266.6667 23150.0000
-2086 37283.3333 21700.0000
-2087 37283.3333 21716.6667
-2088 37283.3333 21816.6667
-2089 37283.3333 21850.0000
-2090 37283.3333 21900.0000
-2091 37283.3333 21916.6667
-2092 37283.3333 21933.3333
-2093 37283.3333 21966.6667
-2094 37283.3333 22050.0000
-2095 37283.3333 22066.6667
-2096 37283.3333 22150.0000
-2097 37283.3333 22166.6667
-2098 37283.3333 22200.0000
-2099 37283.3333 22350.0000
-2100 37283.3333 22366.6667
-2101 37283.3333 22650.0000
-2102 37283.3333 26766.6667
-2103 37300.0000 21716.6667
-2104 37300.0000 21750.0000
-2105 37300.0000 21766.6667
-2106 37300.0000 21783.3333
-2107 37300.0000 21816.6667
-2108 37300.0000 21833.3333
-2109 37300.0000 21850.0000
-2110 37300.0000 21883.3333
-2111 37300.0000 21916.6667
-2112 37300.0000 21950.0000
-2113 37300.0000 21966.6667
-2114 37300.0000 21983.3333
-2115 37300.0000 22000.0000
-2116 37300.0000 22050.0000
-2117 37300.0000 22116.6667
-2118 37300.0000 22150.0000
-2119 37300.0000 22250.0000
-2120 37300.0000 22500.0000
-2121 37300.0000 22766.6667
-2122 37300.0000 23183.3333
-2123 37300.0000 26516.6667
-2124 37316.6667 21733.3333
-2125 37316.6667 21816.6667
-2126 37316.6667 21833.3333
-2127 37316.6667 21850.0000
-2128 37316.6667 21866.6667
-2129 37316.6667 21883.3333
-2130 37316.6667 21916.6667
-2131 37316.6667 21933.3333
-2132 37316.6667 21950.0000
-2133 37316.6667 22000.0000
-2134 37316.6667 22066.6667
-2135 37316.6667 22083.3333
-2136 37316.6667 22133.3333
-2137 37316.6667 22150.0000
-2138 37316.6667 22183.3333
-2139 37316.6667 22233.3333
-2140 37316.6667 22283.3333
-2141 37316.6667 22316.6667
-2142 37316.6667 22650.0000
-2143 37316.6667 23150.0000
-2144 37316.6667 23166.6667
-2145 37316.6667 23416.6667
-2146 37316.6667 26533.3333
-2147 37333.3333 21766.6667
-2148 37333.3333 21833.3333
-2149 37333.3333 21866.6667
-2150 37333.3333 21883.3333
-2151 37333.3333 21900.0000
-2152 37333.3333 21933.3333
-2153 37333.3333 21950.0000
-2154 37333.3333 21966.6667
-2155 37333.3333 22033.3333
-2156 37333.3333 22116.6667
-2157 37333.3333 22133.3333
-2158 37333.3333 22200.0000
-2159 37333.3333 22233.3333
-2160 37333.3333 22300.0000
-2161 37333.3333 22316.6667
-2162 37333.3333 22500.0000
-2163 37333.3333 22550.0000
-2164 37333.3333 22683.3333
-2165 37333.3333 22700.0000
-2166 37333.3333 22750.0000
-2167 37333.3333 23150.0000
-2168 37333.3333 23500.0000
-2169 37350.0000 21700.0000
-2170 37350.0000 21733.3333
-2171 37350.0000 21750.0000
-2172 37350.0000 21850.0000
-2173 37350.0000 21866.6667
-2174 37350.0000 21916.6667
-2175 37350.0000 21933.3333
-2176 37350.0000 21950.0000
-2177 37350.0000 21966.6667
-2178 37350.0000 22066.6667
-2179 37350.0000 22150.0000
-2180 37350.0000 22183.3333
-2181 37350.0000 22400.0000
-2182 37350.0000 22433.3333
-2183 37350.0000 22550.0000
-2184 37350.0000 22583.3333
-2185 37350.0000 22600.0000
-2186 37350.0000 22666.6667
-2187 37350.0000 22733.3333
-2188 37350.0000 22766.6667
-2189 37350.0000 23316.6667
-2190 37350.0000 23350.0000
-2191 37350.0000 23450.0000
-2192 37350.0000 23466.6667
-2193 37350.0000 26566.6667
-2194 37366.6667 21700.0000
-2195 37366.6667 21750.0000
-2196 37366.6667 21816.6667
-2197 37366.6667 21900.0000
-2198 37366.6667 21983.3333
-2199 37366.6667 22016.6667
-2200 37366.6667 22050.0000
-2201 37366.6667 22100.0000
-2202 37366.6667 22133.3333
-2203 37366.6667 22150.0000
-2204 37366.6667 22216.6667
-2205 37366.6667 22266.6667
-2206 37366.6667 22283.3333
-2207 37366.6667 22300.0000
-2208 37366.6667 22333.3333
-2209 37366.6667 22383.3333
-2210 37366.6667 22400.0000
-2211 37366.6667 22466.6667
-2212 37366.6667 22500.0000
-2213 37366.6667 22533.3333
-2214 37366.6667 22550.0000
-2215 37366.6667 22633.3333
-2216 37366.6667 22716.6667
-2217 37366.6667 22750.0000
-2218 37366.6667 23216.6667
-2219 37366.6667 24883.3333
-2220 37383.3333 21750.0000
-2221 37383.3333 21766.6667
-2222 37383.3333 21816.6667
-2223 37383.3333 21833.3333
-2224 37383.3333 21850.0000
-2225 37383.3333 21883.3333
-2226 37383.3333 21916.6667
-2227 37383.3333 22033.3333
-2228 37383.3333 22083.3333
-2229 37383.3333 22116.6667
-2230 37383.3333 22133.3333
-2231 37383.3333 22166.6667
-2232 37383.3333 22200.0000
-2233 37383.3333 22233.3333
-2234 37383.3333 22300.0000
-2235 37383.3333 22450.0000
-2236 37383.3333 22500.0000
-2237 37383.3333 22566.6667
-2238 37383.3333 22650.0000
-2239 37383.3333 22683.3333
-2240 37383.3333 22733.3333
-2241 37383.3333 23150.0000
-2242 37383.3333 23250.0000
-2243 37383.3333 24400.0000
-2244 37383.3333 24433.3333
-2245 37383.3333 24883.3333
-2246 37383.3333 24900.0000
-2247 37383.3333 24916.6667
-2248 37400.0000 21683.3333
-2249 37400.0000 21716.6667
-2250 37400.0000 21733.3333
-2251 37400.0000 21816.6667
-2252 37400.0000 21850.0000
-2253 37400.0000 21883.3333
-2254 37400.0000 21916.6667
-2255 37400.0000 21933.3333
-2256 37400.0000 22016.6667
-2257 37400.0000 22100.0000
-2258 37400.0000 22133.3333
-2259 37400.0000 22183.3333
-2260 37400.0000 22216.6667
-2261 37400.0000 22250.0000
-2262 37400.0000 22316.6667
-2263 37400.0000 22600.0000
-2264 37400.0000 22616.6667
-2265 37400.0000 22650.0000
-2266 37400.0000 22716.6667
-2267 37400.0000 22733.3333
-2268 37400.0000 23233.3333
-2269 37400.0000 24400.0000
-2270 37400.0000 24450.0000
-2271 37400.0000 24883.3333
-2272 37400.0000 24900.0000
-2273 37400.0000 24916.6667
-2274 37400.0000 24933.3333
-2275 37400.0000 24950.0000
-2276 37400.0000 25266.6667
-2277 37416.6667 21666.6667
-2278 37416.6667 21700.0000
-2279 37416.6667 21850.0000
-2280 37416.6667 21866.6667
-2281 37416.6667 21950.0000
-2282 37416.6667 21966.6667
-2283 37416.6667 22000.0000
-2284 37416.6667 22033.3333
-2285 37416.6667 22050.0000
-2286 37416.6667 22083.3333
-2287 37416.6667 22100.0000
-2288 37416.6667 22116.6667
-2289 37416.6667 22166.6667
-2290 37416.6667 22233.3333
-2291 37416.6667 22266.6667
-2292 37416.6667 22366.6667
-2293 37416.6667 22400.0000
-2294 37416.6667 22466.6667
-2295 37416.6667 22566.6667
-2296 37416.6667 22583.3333
-2297 37416.6667 22600.0000
-2298 37416.6667 22766.6667
-2299 37416.6667 23133.3333
-2300 37416.6667 23150.0000
-2301 37416.6667 23316.6667
-2302 37416.6667 23350.0000
-2303 37416.6667 23383.3333
-2304 37416.6667 23400.0000
-2305 37416.6667 23466.6667
-2306 37416.6667 24433.3333
-2307 37416.6667 24883.3333
-2308 37416.6667 24900.0000
-2309 37416.6667 24916.6667
-2310 37416.6667 24933.3333
-2311 37416.6667 24950.0000
-2312 37416.6667 24966.6667
-2313 37433.3333 21666.6667
-2314 37433.3333 21716.6667
-2315 37433.3333 21733.3333
-2316 37433.3333 21766.6667
-2317 37433.3333 21833.3333
-2318 37433.3333 21950.0000
-2319 37433.3333 22000.0000
-2320 37433.3333 22050.0000
-2321 37433.3333 22116.6667
-2322 37433.3333 22300.0000
-2323 37433.3333 22416.6667
-2324 37433.3333 22533.3333
-2325 37433.3333 22616.6667
-2326 37433.3333 22633.3333
-2327 37433.3333 22650.0000
-2328 37433.3333 22683.3333
-2329 37433.3333 22733.3333
-2330 37433.3333 23183.3333
-2331 37433.3333 23300.0000
-2332 37433.3333 23400.0000
-2333 37433.3333 23466.6667
-2334 37433.3333 24900.0000
-2335 37433.3333 24916.6667
-2336 37433.3333 24950.0000
-2337 37450.0000 21683.3333
-2338 37450.0000 21733.3333
-2339 37450.0000 21750.0000
-2340 37450.0000 21866.6667
-2341 37450.0000 21916.6667
-2342 37450.0000 21950.0000
-2343 37450.0000 22033.3333
-2344 37450.0000 22066.6667
-2345 37450.0000 22100.0000
-2346 37450.0000 22116.6667
-2347 37450.0000 22150.0000
-2348 37450.0000 22166.6667
-2349 37450.0000 22250.0000
-2350 37450.0000 22366.6667
-2351 37450.0000 22400.0000
-2352 37450.0000 22416.6667
-2353 37450.0000 22433.3333
-2354 37450.0000 22450.0000
-2355 37450.0000 22466.6667
-2356 37450.0000 22566.6667
-2357 37450.0000 22583.3333
-2358 37450.0000 22616.6667
-2359 37450.0000 23233.3333
-2360 37450.0000 23266.6667
-2361 37450.0000 23283.3333
-2362 37450.0000 23483.3333
-2363 37450.0000 24416.6667
-2364 37450.0000 24900.0000
-2365 37450.0000 24933.3333
-2366 37450.0000 25333.3333
-2367 37450.0000 25400.0000
-2368 37466.6667 21650.0000
-2369 37466.6667 21700.0000
-2370 37466.6667 21800.0000
-2371 37466.6667 21966.6667
-2372 37466.6667 22000.0000
-2373 37466.6667 22083.3333
-2374 37466.6667 22116.6667
-2375 37466.6667 22166.6667
-2376 37466.6667 22200.0000
-2377 37466.6667 22333.3333
-2378 37466.6667 22366.6667
-2379 37466.6667 22383.3333
-2380 37466.6667 22400.0000
-2381 37466.6667 22416.6667
-2382 37466.6667 22433.3333
-2383 37466.6667 22450.0000
-2384 37466.6667 22516.6667
-2385 37466.6667 22616.6667
-2386 37466.6667 23166.6667
-2387 37466.6667 24916.6667
-2388 37466.6667 24933.3333
-2389 37483.3333 21650.0000
-2390 37483.3333 21683.3333
-2391 37483.3333 21716.6667
-2392 37483.3333 21733.3333
-2393 37483.3333 21816.6667
-2394 37483.3333 21833.3333
-2395 37483.3333 21900.0000
-2396 37483.3333 21933.3333
-2397 37483.3333 22016.6667
-2398 37483.3333 22033.3333
-2399 37483.3333 22083.3333
-2400 37483.3333 22116.6667
-2401 37483.3333 22133.3333
-2402 37483.3333 22150.0000
-2403 37483.3333 22283.3333
-2404 37483.3333 22366.6667
-2405 37483.3333 22416.6667
-2406 37483.3333 22433.3333
-2407 37483.3333 22466.6667
-2408 37483.3333 22733.3333
-2409 37483.3333 23000.0000
-2410 37483.3333 23016.6667
-2411 37483.3333 23266.6667
-2412 37483.3333 24916.6667
-2413 37483.3333 24933.3333
-2414 37500.0000 21650.0000
-2415 37500.0000 21700.0000
-2416 37500.0000 21766.6667
-2417 37500.0000 21800.0000
-2418 37500.0000 21850.0000
-2419 37500.0000 21866.6667
-2420 37500.0000 21916.6667
-2421 37500.0000 22100.0000
-2422 37500.0000 22116.6667
-2423 37500.0000 22166.6667
-2424 37500.0000 22450.0000
-2425 37500.0000 22466.6667
-2426 37500.0000 22483.3333
-2427 37500.0000 23016.6667
-2428 37500.0000 23033.3333
-2429 37500.0000 23050.0000
-2430 37500.0000 23066.6667
-2431 37500.0000 23183.3333
-2432 37500.0000 23366.6667
-2433 37500.0000 23383.3333
-2434 37500.0000 23450.0000
-2435 37516.6667 21600.0000
-2436 37516.6667 21650.0000
-2437 37516.6667 21733.3333
-2438 37516.6667 21750.0000
-2439 37516.6667 21766.6667
-2440 37516.6667 21883.3333
-2441 37516.6667 21950.0000
-2442 37516.6667 22066.6667
-2443 37516.6667 22116.6667
-2444 37516.6667 22233.3333
-2445 37516.6667 22300.0000
-2446 37516.6667 22316.6667
-2447 37516.6667 22366.6667
-2448 37516.6667 22383.3333
-2449 37516.6667 22416.6667
-2450 37516.6667 22433.3333
-2451 37516.6667 22450.0000
-2452 37516.6667 22583.3333
-2453 37516.6667 22700.0000
-2454 37516.6667 22733.3333
-2455 37516.6667 22850.0000
-2456 37516.6667 23083.3333
-2457 37516.6667 23100.0000
-2458 37516.6667 23116.6667
-2459 37516.6667 23200.0000
-2460 37516.6667 23283.3333
-2461 37516.6667 23300.0000
-2462 37516.6667 23366.6667
-2463 37516.6667 23383.3333
-2464 37516.6667 26016.6667
-2465 37533.3333 21700.0000
-2466 37533.3333 21733.3333
-2467 37533.3333 21750.0000
-2468 37533.3333 21800.0000
-2469 37533.3333 21816.6667
-2470 37533.3333 21850.0000
-2471 37533.3333 21916.6667
-2472 37533.3333 21950.0000
-2473 37533.3333 21983.3333
-2474 37533.3333 22016.6667
-2475 37533.3333 22266.6667
-2476 37533.3333 22283.3333
-2477 37533.3333 22316.6667
-2478 37533.3333 22350.0000
-2479 37533.3333 22416.6667
-2480 37533.3333 22433.3333
-2481 37533.3333 22700.0000
-2482 37533.3333 22716.6667
-2483 37533.3333 22883.3333
-2484 37533.3333 22916.6667
-2485 37533.3333 22966.6667
-2486 37533.3333 23083.3333
-2487 37533.3333 23133.3333
-2488 37533.3333 23150.0000
-2489 37533.3333 23183.3333
-2490 37533.3333 23200.0000
-2491 37533.3333 23233.3333
-2492 37533.3333 23283.3333
-2493 37533.3333 23350.0000
-2494 37533.3333 25166.6667
-2495 37533.3333 26000.0000
-2496 37550.0000 21600.0000
-2497 37550.0000 21683.3333
-2498 37550.0000 21783.3333
-2499 37550.0000 21816.6667
-2500 37550.0000 21866.6667
-2501 37550.0000 21916.6667
-2502 37550.0000 21933.3333
-2503 37550.0000 21983.3333
-2504 37550.0000 22083.3333
-2505 37550.0000 22216.6667
-2506 37550.0000 22283.3333
-2507 37550.0000 22366.6667
-2508 37550.0000 22416.6667
-2509 37550.0000 22716.6667
-2510 37550.0000 22850.0000
-2511 37550.0000 22866.6667
-2512 37550.0000 22883.3333
-2513 37550.0000 22916.6667
-2514 37550.0000 22983.3333
-2515 37550.0000 23116.6667
-2516 37550.0000 23166.6667
-2517 37550.0000 23200.0000
-2518 37550.0000 23366.6667
-2519 37550.0000 26000.0000
-2520 37550.0000 26016.6667
-2521 37566.6667 21583.3333
-2522 37566.6667 21633.3333
-2523 37566.6667 21700.0000
-2524 37566.6667 21750.0000
-2525 37566.6667 21783.3333
-2526 37566.6667 21950.0000
-2527 37566.6667 22033.3333
-2528 37566.6667 22383.3333
-2529 37566.6667 22466.6667
-2530 37566.6667 22683.3333
-2531 37566.6667 22800.0000
-2532 37566.6667 22833.3333
-2533 37566.6667 23066.6667
-2534 37566.6667 23150.0000
-2535 37566.6667 23250.0000
-2536 37566.6667 25150.0000
-2537 37566.6667 25166.6667
-2538 37566.6667 25183.3333
-2539 37566.6667 25200.0000
-2540 37566.6667 26000.0000
-2541 37566.6667 26116.6667
-2542 37583.3333 21566.6667
-2543 37583.3333 21616.6667
-2544 37583.3333 21666.6667
-2545 37583.3333 21733.3333
-2546 37583.3333 21816.6667
-2547 37583.3333 21866.6667
-2548 37583.3333 21916.6667
-2549 37583.3333 21950.0000
-2550 37583.3333 21983.3333
-2551 37583.3333 22016.6667
-2552 37583.3333 22083.3333
-2553 37583.3333 22233.3333
-2554 37583.3333 22283.3333
-2555 37583.3333 22366.6667
-2556 37583.3333 22533.3333
-2557 37583.3333 22566.6667
-2558 37583.3333 22750.0000
-2559 37583.3333 22883.3333
-2560 37583.3333 23166.6667
-2561 37583.3333 23233.3333
-2562 37583.3333 23383.3333
-2563 37583.3333 25150.0000
-2564 37583.3333 25166.6667
-2565 37583.3333 25183.3333
-2566 37583.3333 25200.0000
-2567 37583.3333 25216.6667
-2568 37583.3333 26016.6667
-2569 37583.3333 26233.3333
-2570 37600.0000 21550.0000
-2571 37600.0000 21583.3333
-2572 37600.0000 21683.3333
-2573 37600.0000 21750.0000
-2574 37600.0000 21800.0000
-2575 37600.0000 21816.6667
-2576 37600.0000 21866.6667
-2577 37600.0000 21883.3333
-2578 37600.0000 21900.0000
-2579 37600.0000 21916.6667
-2580 37600.0000 21950.0000
-2581 37600.0000 21983.3333
-2582 37600.0000 22033.3333
-2583 37600.0000 22050.0000
-2584 37600.0000 22400.0000
-2585 37600.0000 22516.6667
-2586 37600.0000 22683.3333
-2587 37600.0000 22800.0000
-2588 37600.0000 22816.6667
-2589 37600.0000 22833.3333
-2590 37600.0000 22950.0000
-2591 37600.0000 22966.6667
-2592 37600.0000 22983.3333
-2593 37600.0000 23050.0000
-2594 37600.0000 23333.3333
-2595 37600.0000 23350.0000
-2596 37600.0000 23366.6667
-2597 37600.0000 24283.3333
-2598 37600.0000 24300.0000
-2599 37600.0000 24333.3333
-2600 37600.0000 25083.3333
-2601 37600.0000 25133.3333
-2602 37600.0000 25150.0000
-2603 37600.0000 25166.6667
-2604 37600.0000 25183.3333
-2605 37600.0000 26250.0000
-2606 37616.6667 21516.6667
-2607 37616.6667 21600.0000
-2608 37616.6667 21633.3333
-2609 37616.6667 21650.0000
-2610 37616.6667 21700.0000
-2611 37616.6667 21716.6667
-2612 37616.6667 21766.6667
-2613 37616.6667 21800.0000
-2614 37616.6667 21833.3333
-2615 37616.6667 21866.6667
-2616 37616.6667 21900.0000
-2617 37616.6667 21916.6667
-2618 37616.6667 21933.3333
-2619 37616.6667 22100.0000
-2620 37616.6667 22216.6667
-2621 37616.6667 22333.3333
-2622 37616.6667 22433.3333
-2623 37616.6667 22466.6667
-2624 37616.6667 22550.0000
-2625 37616.6667 22600.0000
-2626 37616.6667 22666.6667
-2627 37616.6667 22766.6667
-2628 37616.6667 22800.0000
-2629 37616.6667 22850.0000
-2630 37616.6667 22983.3333
-2631 37616.6667 23000.0000
-2632 37616.6667 23033.3333
-2633 37616.6667 23333.3333
-2634 37616.6667 23350.0000
-2635 37616.6667 23400.0000
-2636 37616.6667 24283.3333
-2637 37616.6667 25050.0000
-2638 37616.6667 25116.6667
-2639 37616.6667 25133.3333
-2640 37616.6667 26183.3333
-2641 37628.6111 26791.3889
-2642 37633.3333 21500.0000
-2643 37633.3333 21683.3333
-2644 37633.3333 21750.0000
-2645 37633.3333 21833.3333
-2646 37633.3333 21850.0000
-2647 37633.3333 21866.6667
-2648 37633.3333 21883.3333
-2649 37633.3333 21900.0000
-2650 37633.3333 21933.3333
-2651 37633.3333 21950.0000
-2652 37633.3333 21983.3333
-2653 37633.3333 22083.3333
-2654 37633.3333 22150.0000
-2655 37633.3333 22166.6667
-2656 37633.3333 22300.0000
-2657 37633.3333 22533.3333
-2658 37633.3333 22683.3333
-2659 37633.3333 22733.3333
-2660 37633.3333 22766.6667
-2661 37633.3333 22783.3333
-2662 37633.3333 22800.0000
-2663 37633.3333 22816.6667
-2664 37633.3333 22933.3333
-2665 37633.3333 23066.6667
-2666 37633.3333 23083.3333
-2667 37633.3333 23116.6667
-2668 37633.3333 23150.0000
-2669 37633.3333 23366.6667
-2670 37633.3333 24316.6667
-2671 37633.3333 24350.0000
-2672 37633.3333 24383.3333
-2673 37633.3333 25033.3333
-2674 37633.3333 25050.0000
-2675 37633.3333 26083.3333
-2676 37650.0000 21316.6667
-2677 37650.0000 21433.3333
-2678 37650.0000 21500.0000
-2679 37650.0000 21533.3333
-2680 37650.0000 21616.6667
-2681 37650.0000 21633.3333
-2682 37650.0000 21650.0000
-2683 37650.0000 21683.3333
-2684 37650.0000 21700.0000
-2685 37650.0000 21733.3333
-2686 37650.0000 21750.0000
-2687 37650.0000 21850.0000
-2688 37650.0000 21900.0000
-2689 37650.0000 21933.3333
-2690 37650.0000 21950.0000
-2691 37650.0000 21983.3333
-2692 37650.0000 22333.3333
-2693 37650.0000 22416.6667
-2694 37650.0000 22766.6667
-2695 37650.0000 22800.0000
-2696 37650.0000 22816.6667
-2697 37650.0000 22833.3333
-2698 37650.0000 23066.6667
-2699 37650.0000 23083.3333
-2700 37650.0000 24100.0000
-2701 37650.0000 24300.0000
-2702 37650.0000 24383.3333
-2703 37650.0000 25016.6667
-2704 37658.8889 26780.8333
-2705 37663.8889 26882.5000
-2706 37666.6667 20816.6667
-2707 37666.6667 21316.6667
-2708 37666.6667 21533.3333
-2709 37666.6667 21550.0000
-2710 37666.6667 21616.6667
-2711 37666.6667 21633.3333
-2712 37666.6667 21783.3333
-2713 37666.6667 21816.6667
-2714 37666.6667 21833.3333
-2715 37666.6667 21866.6667
-2716 37666.6667 21916.6667
-2717 37666.6667 21933.3333
-2718 37666.6667 22183.3333
-2719 37666.6667 22366.6667
-2720 37666.6667 22450.0000
-2721 37666.6667 22483.3333
-2722 37666.6667 22583.3333
-2723 37666.6667 22666.6667
-2724 37666.6667 22750.0000
-2725 37666.6667 22766.6667
-2726 37666.6667 22783.3333
-2727 37666.6667 22816.6667
-2728 37666.6667 22850.0000
-2729 37666.6667 23133.3333
-2730 37666.6667 23983.3333
-2731 37666.6667 24016.6667
-2732 37666.6667 24033.3333
-2733 37666.6667 24050.0000
-2734 37666.6667 24316.6667
-2735 37666.6667 24333.3333
-2736 37666.6667 24350.0000
-2737 37672.7778 26831.9444
-2738 37675.5556 26769.1667
-2739 37678.6111 26801.3889
-2740 37679.7222 26861.1111
-2741 37683.3333 21316.6667
-2742 37683.3333 21333.3333
-2743 37683.3333 21366.6667
-2744 37683.3333 21383.3333
-2745 37683.3333 21450.0000
-2746 37683.3333 21483.3333
-2747 37683.3333 21500.0000
-2748 37683.3333 21516.6667
-2749 37683.3333 21550.0000
-2750 37683.3333 21583.3333
-2751 37683.3333 21616.6667
-2752 37683.3333 21650.0000
-2753 37683.3333 21683.3333
-2754 37683.3333 21783.3333
-2755 37683.3333 21833.3333
-2756 37683.3333 21866.6667
-2757 37683.3333 21916.6667
-2758 37683.3333 21966.6667
-2759 37683.3333 22033.3333
-2760 37683.3333 22133.3333
-2761 37683.3333 22183.3333
-2762 37683.3333 22300.0000
-2763 37683.3333 22516.6667
-2764 37683.3333 22616.6667
-2765 37683.3333 22716.6667
-2766 37683.3333 22750.0000
-2767 37683.3333 22816.6667
-2768 37683.3333 22833.3333
-2769 37683.3333 22966.6667
-2770 37683.3333 23150.0000
-2771 37683.3333 23350.0000
-2772 37683.3333 23450.0000
-2773 37683.3333 23483.3333
-2774 37684.7222 26759.1667
-2775 37686.6667 26918.8889
-2776 37691.9444 26948.3333
-2777 37692.5000 26774.1667
-2778 37692.7778 26588.0556
-2779 37698.3333 26618.6111
-2780 37699.4444 26746.1111
-2781 37700.0000 21333.3333
-2782 37700.0000 21416.6667
-2783 37700.0000 21466.6667
-2784 37700.0000 21516.6667
-2785 37700.0000 21566.6667
-2786 37700.0000 21783.3333
-2787 37700.0000 21916.6667
-2788 37700.0000 21950.0000
-2789 37700.0000 21966.6667
-2790 37700.0000 22050.0000
-2791 37700.0000 22133.3333
-2792 37700.0000 22433.3333
-2793 37700.0000 22483.3333
-2794 37700.0000 22550.0000
-2795 37700.0000 22750.0000
-2796 37700.0000 23066.6667
-2797 37700.0000 23366.6667
-2798 37700.0000 23500.0000
-2799 37700.0000 23516.6667
-2800 37700.0000 24116.6667
-2801 37703.6111 26905.5556
-2802 37704.7222 26839.4444
-2803 37706.6667 26771.3889
-2804 37707.7778 26669.1667
-2805 37708.6111 27018.0556
-2806 37709.7222 26749.7222
-2807 37709.7222 27046.9444
-2808 37710.2778 26685.8333
-2809 37710.8333 26700.0000
-2810 37711.6667 26804.1667
-2811 37713.6111 26975.5556
-2812 37714.1667 27059.1667
-2813 37716.1111 26782.2222
-2814 37716.6667 20783.3333
-2815 37716.6667 20833.3333
-2816 37716.6667 20983.3333
-2817 37716.6667 21333.3333
-2818 37716.6667 21350.0000
-2819 37716.6667 21416.6667
-2820 37716.6667 21433.3333
-2821 37716.6667 21483.3333
-2822 37716.6667 21566.6667
-2823 37716.6667 21583.3333
-2824 37716.6667 21616.6667
-2825 37716.6667 21650.0000
-2826 37716.6667 21716.6667
-2827 37716.6667 21833.3333
-2828 37716.6667 21950.0000
-2829 37716.6667 21983.3333
-2830 37716.6667 22100.0000
-2831 37716.6667 22150.0000
-2832 37716.6667 22250.0000
-2833 37716.6667 22316.6667
-2834 37716.6667 22350.0000
-2835 37716.6667 22600.0000
-2836 37716.6667 22650.0000
-2837 37716.6667 22750.0000
-2838 37716.6667 22833.3333
-2839 37716.6667 22883.3333
-2840 37716.6667 23350.0000
-2841 37716.6667 23450.0000
-2842 37716.6667 23466.6667
-2843 37716.6667 23483.3333
-2844 37716.6667 23500.0000
-2845 37716.6667 23516.6667
-2846 37716.6667 23950.0000
-2847 37716.6667 24050.0000
-2848 37716.6667 24116.6667
-2849 37718.0556 26861.9444
-2850 37719.1667 27000.2778
-2851 37726.3889 26690.0000
-2852 37727.2222 26822.2222
-2853 37728.6111 26908.3333
-2854 37730.8333 26829.4444
-2855 37733.3333 20816.6667
-2856 37733.3333 20833.3333
-2857 37733.3333 20916.6667
-2858 37733.3333 21350.0000
-2859 37733.3333 21366.6667
-2860 37733.3333 21383.3333
-2861 37733.3333 21400.0000
-2862 37733.3333 21416.6667
-2863 37733.3333 21466.6667
-2864 37733.3333 21500.0000
-2865 37733.3333 21516.6667
-2866 37733.3333 21533.3333
-2867 37733.3333 21550.0000
-2868 37733.3333 21666.6667
-2869 37733.3333 21700.0000
-2870 37733.3333 21783.3333
-2871 37733.3333 21933.3333
-2872 37733.3333 21950.0000
-2873 37733.3333 21983.3333
-2874 37733.3333 22016.6667
-2875 37733.3333 22200.0000
-2876 37733.3333 22283.3333
-2877 37733.3333 22300.0000
-2878 37733.3333 22500.0000
-2879 37733.3333 22516.6667
-2880 37733.3333 22533.3333
-2881 37733.3333 22683.3333
-2882 37733.3333 22716.6667
-2883 37733.3333 23466.6667
-2884 37733.3333 23483.3333
-2885 37733.3333 23516.6667
-2886 37733.3333 23950.0000
-2887 37733.3333 24000.0000
-2888 37733.3333 24016.6667
-2889 37733.3333 24050.0000
-2890 37733.3333 26583.3333
-2891 37735.2778 26945.0000
-2892 37738.0556 27000.5556
-2893 37738.3333 26745.2778
-2894 37741.3889 26715.5556
-2895 37747.2222 26728.6111
-2896 37750.0000 20783.3333
-2897 37750.0000 20816.6667
-2898 37750.0000 20950.0000
-2899 37750.0000 21316.6667
-2900 37750.0000 21333.3333
-2901 37750.0000 21366.6667
-2902 37750.0000 21433.3333
-2903 37750.0000 21450.0000
-2904 37750.0000 21466.6667
-2905 37750.0000 21516.6667
-2906 37750.0000 21550.0000
-2907 37750.0000 21683.3333
-2908 37750.0000 21883.3333
-2909 37750.0000 21900.0000
-2910 37750.0000 22000.0000
-2911 37750.0000 22016.6667
-2912 37750.0000 22050.0000
-2913 37750.0000 22083.3333
-2914 37750.0000 22100.0000
-2915 37750.0000 22183.3333
-2916 37750.0000 22416.6667
-2917 37750.0000 22483.3333
-2918 37750.0000 22833.3333
-2919 37750.0000 22883.3333
-2920 37750.0000 23000.0000
-2921 37750.0000 23433.3333
-2922 37750.0000 23450.0000
-2923 37750.0000 23483.3333
-2924 37750.0000 23516.6667
-2925 37750.0000 23533.3333
-2926 37750.0000 24916.6667
-2927 37750.0000 24933.3333
-2928 37750.0000 24950.0000
-2929 37750.0000 26983.3333
-2930 37750.2778 26716.1111
-2931 37751.1111 27005.5556
-2932 37751.6667 26592.2222
-2933 37754.4444 26677.2222
-2934 37755.2778 26738.3333
-2935 37755.8333 26715.8333
-2936 37757.2222 26607.2222
-2937 37757.2222 26976.9444
-2938 37758.0556 27024.4444
-2939 37758.8889 26946.3889
-2940 37759.1667 26660.0000
-2941 37761.3889 27009.7222
-2942 37766.6667 20800.0000
-2943 37766.6667 20816.6667
-2944 37766.6667 20866.6667
-2945 37766.6667 20916.6667
-2946 37766.6667 21333.3333
-2947 37766.6667 21500.0000
-2948 37766.6667 21616.6667
-2949 37766.6667 21666.6667
-2950 37766.6667 21833.3333
-2951 37766.6667 21866.6667
-2952 37766.6667 22016.6667
-2953 37766.6667 22083.3333
-2954 37766.6667 22116.6667
-2955 37766.6667 22150.0000
-2956 37766.6667 22183.3333
-2957 37766.6667 22216.6667
-2958 37766.6667 22250.0000
-2959 37766.6667 22383.3333
-2960 37766.6667 22483.3333
-2961 37766.6667 22566.6667
-2962 37766.6667 22966.6667
-2963 37766.6667 23133.3333
-2964 37766.6667 23433.3333
-2965 37766.6667 23483.3333
-2966 37766.6667 23516.6667
-2967 37766.6667 23533.3333
-2968 37766.6667 23966.6667
-2969 37766.6667 24033.3333
-2970 37766.6667 24916.6667
-2971 37766.6667 24933.3333
-2972 37766.6667 24950.0000
-2973 37767.7778 26966.9444
-2974 37769.7222 26919.7222
-2975 37772.2222 26658.8889
-2976 37773.3333 26685.8333
-2977 37776.3889 26893.8889
-2978 37778.0556 26673.3333
-2979 37779.1667 26993.3333
-2980 37779.4444 26751.6667
-2981 37783.3333 20683.3333
-2982 37783.3333 20716.6667
-2983 37783.3333 20783.3333
-2984 37783.3333 20800.0000
-2985 37783.3333 20833.3333
-2986 37783.3333 20850.0000
-2987 37783.3333 20866.6667
-2988 37783.3333 20900.0000
-2989 37783.3333 21300.0000
-2990 37783.3333 21316.6667
-2991 37783.3333 21400.0000
-2992 37783.3333 21466.6667
-2993 37783.3333 21566.6667
-2994 37783.3333 21633.3333
-2995 37783.3333 21683.3333
-2996 37783.3333 21716.6667
-2997 37783.3333 21866.6667
-2998 37783.3333 21933.3333
-2999 37783.3333 22033.3333
-3000 37783.3333 22066.6667
-3001 37783.3333 22116.6667
-3002 37783.3333 22150.0000
-3003 37783.3333 22283.3333
-3004 37783.3333 22316.6667
-3005 37783.3333 22433.3333
-3006 37783.3333 22866.6667
-3007 37783.3333 23900.0000
-3008 37783.3333 23916.6667
-3009 37783.3333 23950.0000
-3010 37783.3333 24066.6667
-3011 37783.3333 24083.3333
-3012 37783.3333 24883.3333
-3013 37783.3333 24933.3333
-3014 37783.3333 24950.0000
-3015 37783.3333 26850.0000
-3016 37784.4444 26828.6111
-3017 37789.4444 26666.3889
-3018 37790.2778 26683.8889
-3019 37790.2778 26704.4444
-3020 37792.2222 26828.8889
-3021 37792.5000 26696.6667
-3022 37796.1111 26812.5000
-3023 37797.5000 26859.1667
-3024 37798.3333 26738.3333
-3025 37798.6111 26706.1111
-3026 37799.1667 26750.8333
-3027 37800.0000 20683.3333
-3028 37800.0000 20733.3333
-3029 37800.0000 20766.6667
-3030 37800.0000 20783.3333
-3031 37800.0000 20800.0000
-3032 37800.0000 20833.3333
-3033 37800.0000 20850.0000
-3034 37800.0000 20866.6667
-3035 37800.0000 21300.0000
-3036 37800.0000 21350.0000
-3037 37800.0000 21383.3333
-3038 37800.0000 21433.3333
-3039 37800.0000 21466.6667
-3040 37800.0000 21533.3333
-3041 37800.0000 21566.6667
-3042 37800.0000 21583.3333
-3043 37800.0000 21616.6667
-3044 37800.0000 21633.3333
-3045 37800.0000 21716.6667
-3046 37800.0000 21750.0000
-3047 37800.0000 21816.6667
-3048 37800.0000 21900.0000
-3049 37800.0000 21950.0000
-3050 37800.0000 22000.0000
-3051 37800.0000 22016.6667
-3052 37800.0000 22200.0000
-3053 37800.0000 22250.0000
-3054 37800.0000 22283.3333
-3055 37800.0000 22583.3333
-3056 37800.0000 22716.6667
-3057 37800.0000 22800.0000
-3058 37800.0000 23050.0000
-3059 37800.0000 23883.3333
-3060 37800.0000 23983.3333
-3061 37800.0000 24050.0000
-3062 37800.0000 24866.6667
-3063 37800.0000 24900.0000
-3064 37800.0000 24916.6667
-3065 37800.0000 24933.3333
-3066 37800.0000 24950.0000
-3067 37801.1111 26803.3333
-3068 37801.3889 26745.5556
-3069 37802.2222 26841.3889
-3070 37802.7778 26812.2222
-3071 37805.8333 26815.2778
-3072 37806.6667 26732.2222
-3073 37808.3333 26794.7222
-3074 37808.6111 26738.8889
-3075 37816.6667 20683.3333
-3076 37816.6667 20766.6667
-3077 37816.6667 20800.0000
-3078 37816.6667 20833.3333
-3079 37816.6667 20850.0000
-3080 37816.6667 21266.6667
-3081 37816.6667 21283.3333
-3082 37816.6667 21350.0000
-3083 37816.6667 21383.3333
-3084 37816.6667 21416.6667
-3085 37816.6667 21583.3333
-3086 37816.6667 21616.6667
-3087 37816.6667 21700.0000
-3088 37816.6667 21850.0000
-3089 37816.6667 21866.6667
-3090 37816.6667 22000.0000
-3091 37816.6667 22133.3333
-3092 37816.6667 22150.0000
-3093 37816.6667 22166.6667
-3094 37816.6667 22333.3333
-3095 37816.6667 22516.6667
-3096 37816.6667 22533.3333
-3097 37816.6667 22666.6667
-3098 37816.6667 22700.0000
-3099 37816.6667 22750.0000
-3100 37816.6667 22866.6667
-3101 37816.6667 22933.3333
-3102 37816.6667 23000.0000
-3103 37816.6667 23783.3333
-3104 37816.6667 23800.0000
-3105 37816.6667 24050.0000
-3106 37816.6667 24833.3333
-3107 37816.6667 24883.3333
-3108 37816.6667 24900.0000
-3109 37816.6667 24916.6667
-3110 37816.6667 24933.3333
-3111 37816.6667 24950.0000
-3112 37833.3333 20750.0000
-3113 37833.3333 20766.6667
-3114 37833.3333 21300.0000
-3115 37833.3333 21383.3333
-3116 37833.3333 21433.3333
-3117 37833.3333 21450.0000
-3118 37833.3333 21533.3333
-3119 37833.3333 21566.6667
-3120 37833.3333 21583.3333
-3121 37833.3333 21600.0000
-3122 37833.3333 21700.0000
-3123 37833.3333 21766.6667
-3124 37833.3333 21833.3333
-3125 37833.3333 21850.0000
-3126 37833.3333 21933.3333
-3127 37833.3333 21983.3333
-3128 37833.3333 22000.0000
-3129 37833.3333 22100.0000
-3130 37833.3333 22116.6667
-3131 37833.3333 22166.6667
-3132 37833.3333 22316.6667
-3133 37833.3333 22383.3333
-3134 37833.3333 22566.6667
-3135 37833.3333 22583.3333
-3136 37833.3333 23016.6667
-3137 37833.3333 23033.3333
-3138 37833.3333 23800.0000
-3139 37833.3333 23866.6667
-3140 37833.3333 23916.6667
-3141 37833.3333 23966.6667
-3142 37833.3333 24816.6667
-3143 37833.3333 24900.0000
-3144 37833.3333 24916.6667
-3145 37833.3333 24933.3333
-3146 37850.0000 20650.0000
-3147 37850.0000 20700.0000
-3148 37850.0000 20783.3333
-3149 37850.0000 21116.6667
-3150 37850.0000 21150.0000
-3151 37850.0000 21216.6667
-3152 37850.0000 21250.0000
-3153 37850.0000 21316.6667
-3154 37850.0000 21366.6667
-3155 37850.0000 21383.3333
-3156 37850.0000 21433.3333
-3157 37850.0000 21450.0000
-3158 37850.0000 21500.0000
-3159 37850.0000 21516.6667
-3160 37850.0000 21566.6667
-3161 37850.0000 21616.6667
-3162 37850.0000 21766.6667
-3163 37850.0000 21800.0000
-3164 37850.0000 21983.3333
-3165 37850.0000 22016.6667
-3166 37850.0000 22066.6667
-3167 37850.0000 22083.3333
-3168 37850.0000 22116.6667
-3169 37850.0000 22150.0000
-3170 37850.0000 22166.6667
-3171 37850.0000 22216.6667
-3172 37850.0000 22316.6667
-3173 37850.0000 22416.6667
-3174 37850.0000 22600.0000
-3175 37850.0000 22666.6667
-3176 37850.0000 22800.0000
-3177 37850.0000 22883.3333
-3178 37850.0000 22916.6667
-3179 37850.0000 22983.3333
-3180 37850.0000 23000.0000
-3181 37850.0000 23766.6667
-3182 37850.0000 24783.3333
-3183 37850.0000 24916.6667
-3184 37850.0000 24933.3333
-3185 37866.6667 20650.0000
-3186 37866.6667 20666.6667
-3187 37866.6667 21116.6667
-3188 37866.6667 21150.0000
-3189 37866.6667 21183.3333
-3190 37866.6667 21200.0000
-3191 37866.6667 21266.6667
-3192 37866.6667 21300.0000
-3193 37866.6667 21350.0000
-3194 37866.6667 21433.3333
-3195 37866.6667 21450.0000
-3196 37866.6667 21483.3333
-3197 37866.6667 21500.0000
-3198 37866.6667 21616.6667
-3199 37866.6667 21650.0000
-3200 37866.6667 21750.0000
-3201 37866.6667 21850.0000
-3202 37866.6667 21900.0000
-3203 37866.6667 21950.0000
-3204 37866.6667 22016.6667
-3205 37866.6667 22033.3333
-3206 37866.6667 22066.6667
-3207 37866.6667 22116.6667
-3208 37866.6667 22166.6667
-3209 37866.6667 22383.3333
-3210 37866.6667 22416.6667
-3211 37866.6667 22450.0000
-3212 37866.6667 22466.6667
-3213 37866.6667 22533.3333
-3214 37866.6667 22783.3333
-3215 37866.6667 22900.0000
-3216 37866.6667 23000.0000
-3217 37866.6667 23750.0000
-3218 37866.6667 23933.3333
-3219 37866.6667 24816.6667
-3220 37866.6667 24833.3333
-3221 37866.6667 24850.0000
-3222 37866.6667 24866.6667
-3223 37866.6667 24883.3333
-3224 37883.3333 20700.0000
-3225 37883.3333 21133.3333
-3226 37883.3333 21200.0000
-3227 37883.3333 21233.3333
-3228 37883.3333 21250.0000
-3229 37883.3333 21283.3333
-3230 37883.3333 21316.6667
-3231 37883.3333 21366.6667
-3232 37883.3333 21383.3333
-3233 37883.3333 21416.6667
-3234 37883.3333 21433.3333
-3235 37883.3333 21450.0000
-3236 37883.3333 21500.0000
-3237 37883.3333 21550.0000
-3238 37883.3333 21583.3333
-3239 37883.3333 21683.3333
-3240 37883.3333 21900.0000
-3241 37883.3333 21916.6667
-3242 37883.3333 21983.3333
-3243 37883.3333 22016.6667
-3244 37883.3333 22050.0000
-3245 37883.3333 22150.0000
-3246 37883.3333 22333.3333
-3247 37883.3333 22466.6667
-3248 37883.3333 22483.3333
-3249 37883.3333 22566.6667
-3250 37883.3333 22633.3333
-3251 37883.3333 22733.3333
-3252 37883.3333 22833.3333
-3253 37883.3333 22883.3333
-3254 37883.3333 22950.0000
-3255 37883.3333 23416.6667
-3256 37883.3333 23433.3333
-3257 37883.3333 23733.3333
-3258 37883.3333 23750.0000
-3259 37883.3333 23933.3333
-3260 37883.3333 24016.6667
-3261 37883.3333 24733.3333
-3262 37900.0000 21233.3333
-3263 37900.0000 21266.6667
-3264 37900.0000 21350.0000
-3265 37900.0000 21383.3333
-3266 37900.0000 21400.0000
-3267 37900.0000 21450.0000
-3268 37900.0000 21466.6667
-3269 37900.0000 21500.0000
-3270 37900.0000 21533.3333
-3271 37900.0000 21550.0000
-3272 37900.0000 21600.0000
-3273 37900.0000 21650.0000
-3274 37900.0000 21766.6667
-3275 37900.0000 21833.3333
-3276 37900.0000 21916.6667
-3277 37900.0000 22000.0000
-3278 37900.0000 22033.3333
-3279 37900.0000 22050.0000
-3280 37900.0000 22083.3333
-3281 37900.0000 22116.6667
-3282 37900.0000 22133.3333
-3283 37900.0000 22150.0000
-3284 37900.0000 22333.3333
-3285 37900.0000 22466.6667
-3286 37900.0000 22600.0000
-3287 37900.0000 22650.0000
-3288 37900.0000 22733.3333
-3289 37900.0000 22933.3333
-3290 37900.0000 23416.6667
-3291 37900.0000 23483.3333
-3292 37900.0000 23733.3333
-3293 37900.0000 23750.0000
-3294 37900.0000 23883.3333
-3295 37900.0000 24733.3333
-3296 37900.0000 24750.0000
-3297 37900.0000 24766.6667
-3298 37900.0000 24783.3333
-3299 37900.0000 24833.3333
-3300 37900.0000 24916.6667
-3301 37916.6667 20700.0000
-3302 37916.6667 21183.3333
-3303 37916.6667 21200.0000
-3304 37916.6667 21233.3333
-3305 37916.6667 21250.0000
-3306 37916.6667 21283.3333
-3307 37916.6667 21333.3333
-3308 37916.6667 21400.0000
-3309 37916.6667 21416.6667
-3310 37916.6667 21433.3333
-3311 37916.6667 21466.6667
-3312 37916.6667 21500.0000
-3313 37916.6667 21533.3333
-3314 37916.6667 21666.6667
-3315 37916.6667 21716.6667
-3316 37916.6667 21750.0000
-3317 37916.6667 21800.0000
-3318 37916.6667 21866.6667
-3319 37916.6667 21933.3333
-3320 37916.6667 22133.3333
-3321 37916.6667 22166.6667
-3322 37916.6667 22200.0000
-3323 37916.6667 22283.3333
-3324 37916.6667 22300.0000
-3325 37916.6667 22316.6667
-3326 37916.6667 22516.6667
-3327 37916.6667 22616.6667
-3328 37916.6667 22700.0000
-3329 37916.6667 22883.3333
-3330 37916.6667 22983.3333
-3331 37916.6667 23000.0000
-3332 37916.6667 23150.0000
-3333 37916.6667 23466.6667
-3334 37916.6667 23500.0000
-3335 37916.6667 23716.6667
-3336 37916.6667 23733.3333
-3337 37916.6667 23966.6667
-3338 37933.3333 21150.0000
-3339 37933.3333 21266.6667
-3340 37933.3333 21316.6667
-3341 37933.3333 21333.3333
-3342 37933.3333 21350.0000
-3343 37933.3333 21400.0000
-3344 37933.3333 21466.6667
-3345 37933.3333 21566.6667
-3346 37933.3333 21616.6667
-3347 37933.3333 21633.3333
-3348 37933.3333 21650.0000
-3349 37933.3333 21750.0000
-3350 37933.3333 21850.0000
-3351 37933.3333 21916.6667
-3352 37933.3333 21966.6667
-3353 37933.3333 22000.0000
-3354 37933.3333 22033.3333
-3355 37933.3333 22050.0000
-3356 37933.3333 22083.3333
-3357 37933.3333 22100.0000
-3358 37933.3333 22166.6667
-3359 37933.3333 22183.3333
-3360 37933.3333 22200.0000
-3361 37933.3333 22333.3333
-3362 37933.3333 22633.3333
-3363 37933.3333 22716.6667
-3364 37933.3333 22800.0000
-3365 37933.3333 22833.3333
-3366 37933.3333 22850.0000
-3367 37933.3333 22933.3333
-3368 37933.3333 23033.3333
-3369 37933.3333 23533.3333
-3370 37933.3333 23700.0000
-3371 37933.3333 23733.3333
-3372 37933.3333 24716.6667
-3373 37933.3333 24766.6667
-3374 37933.3333 24800.0000
-3375 37950.0000 21316.6667
-3376 37950.0000 21350.0000
-3377 37950.0000 21366.6667
-3378 37950.0000 21383.3333
-3379 37950.0000 21400.0000
-3380 37950.0000 21416.6667
-3381 37950.0000 21450.0000
-3382 37950.0000 21483.3333
-3383 37950.0000 21500.0000
-3384 37950.0000 21533.3333
-3385 37950.0000 21550.0000
-3386 37950.0000 21700.0000
-3387 37950.0000 21716.6667
-3388 37950.0000 21766.6667
-3389 37950.0000 21850.0000
-3390 37950.0000 21933.3333
-3391 37950.0000 22016.6667
-3392 37950.0000 22133.3333
-3393 37950.0000 22316.6667
-3394 37950.0000 22350.0000
-3395 37950.0000 22566.6667
-3396 37950.0000 22650.0000
-3397 37950.0000 22750.0000
-3398 37950.0000 22783.3333
-3399 37950.0000 22800.0000
-3400 37950.0000 22833.3333
-3401 37950.0000 22966.6667
-3402 37950.0000 23533.3333
-3403 37950.0000 23633.3333
-3404 37950.0000 23666.6667
-3405 37950.0000 23700.0000
-3406 37950.0000 23716.6667
-3407 37950.0000 23766.6667
-3408 37950.0000 23850.0000
-3409 37950.0000 24750.0000
-3410 37950.0000 24800.0000
-3411 37966.6667 21250.0000
-3412 37966.6667 21266.6667
-3413 37966.6667 21283.3333
-3414 37966.6667 21300.0000
-3415 37966.6667 21333.3333
-3416 37966.6667 21350.0000
-3417 37966.6667 21400.0000
-3418 37966.6667 21516.6667
-3419 37966.6667 21550.0000
-3420 37966.6667 21633.3333
-3421 37966.6667 21666.6667
-3422 37966.6667 21700.0000
-3423 37966.6667 22050.0000
-3424 37966.6667 22083.3333
-3425 37966.6667 22116.6667
-3426 37966.6667 22566.6667
-3427 37966.6667 22633.3333
-3428 37966.6667 22766.6667
-3429 37966.6667 22783.3333
-3430 37966.6667 22816.6667
-3431 37966.6667 23200.0000
-3432 37966.6667 23366.6667
-3433 37966.6667 23450.0000
-3434 37966.6667 23483.3333
-3435 37966.6667 23516.6667
-3436 37966.6667 23566.6667
-3437 37966.6667 23633.3333
-3438 37966.6667 23650.0000
-3439 37966.6667 23683.3333
-3440 37966.6667 23750.0000
-3441 37966.6667 23800.0000
-3442 37966.6667 23916.6667
-3443 37966.6667 24000.0000
-3444 37966.6667 24483.3333
-3445 37966.6667 24733.3333
-3446 37966.6667 24750.0000
-3447 37966.6667 24766.6667
-3448 37983.3333 21266.6667
-3449 37983.3333 21316.6667
-3450 37983.3333 21350.0000
-3451 37983.3333 21400.0000
-3452 37983.3333 21416.6667
-3453 37983.3333 21450.0000
-3454 37983.3333 21466.6667
-3455 37983.3333 21583.3333
-3456 37983.3333 21666.6667
-3457 37983.3333 21733.3333
-3458 37983.3333 21766.6667
-3459 37983.3333 21800.0000
-3460 37983.3333 22000.0000
-3461 37983.3333 22066.6667
-3462 37983.3333 22133.3333
-3463 37983.3333 22266.6667
-3464 37983.3333 22350.0000
-3465 37983.3333 22466.6667
-3466 37983.3333 22483.3333
-3467 37983.3333 22516.6667
-3468 37983.3333 22566.6667
-3469 37983.3333 22650.0000
-3470 37983.3333 22733.3333
-3471 37983.3333 22783.3333
-3472 37983.3333 22966.6667
-3473 37983.3333 23350.0000
-3474 37983.3333 23533.3333
-3475 37983.3333 23666.6667
-3476 37983.3333 23683.3333
-3477 37983.3333 23733.3333
-3478 37983.3333 23766.6667
-3479 37983.3333 23816.6667
-3480 37983.3333 23866.6667
-3481 37983.3333 23883.3333
-3482 37983.3333 23900.0000
-3483 37983.3333 24016.6667
-3484 38000.0000 21316.6667
-3485 38000.0000 21350.0000
-3486 38000.0000 21366.6667
-3487 38000.0000 21383.3333
-3488 38000.0000 21516.6667
-3489 38000.0000 21666.6667
-3490 38000.0000 21716.6667
-3491 38000.0000 21766.6667
-3492 38000.0000 21916.6667
-3493 38000.0000 22000.0000
-3494 38000.0000 22133.3333
-3495 38000.0000 22266.6667
-3496 38000.0000 22366.6667
-3497 38000.0000 22466.6667
-3498 38000.0000 22483.3333
-3499 38000.0000 22533.3333
-3500 38000.0000 22566.6667
-3501 38000.0000 22650.0000
-3502 38000.0000 22733.3333
-3503 38000.0000 22750.0000
-3504 38000.0000 23350.0000
-3505 38000.0000 23433.3333
-3506 38000.0000 23583.3333
-3507 38000.0000 23666.6667
-3508 38000.0000 23683.3333
-3509 38000.0000 23700.0000
-3510 38000.0000 23733.3333
-3511 38000.0000 23800.0000
-3512 38000.0000 23883.3333
-3513 38000.0000 23916.6667
-3514 38000.0000 23950.0000
-3515 38016.6667 21366.6667
-3516 38016.6667 21383.3333
-3517 38016.6667 21400.0000
-3518 38016.6667 21416.6667
-3519 38016.6667 21433.3333
-3520 38016.6667 21466.6667
-3521 38016.6667 21550.0000
-3522 38016.6667 21566.6667
-3523 38016.6667 21600.0000
-3524 38016.6667 21633.3333
-3525 38016.6667 21700.0000
-3526 38016.6667 21733.3333
-3527 38016.6667 21766.6667
-3528 38016.6667 21900.0000
-3529 38016.6667 21966.6667
-3530 38016.6667 21983.3333
-3531 38016.6667 22233.3333
-3532 38016.6667 22250.0000
-3533 38016.6667 22266.6667
-3534 38016.6667 22416.6667
-3535 38016.6667 22483.3333
-3536 38016.6667 22500.0000
-3537 38016.6667 22616.6667
-3538 38016.6667 22650.0000
-3539 38016.6667 22683.3333
-3540 38016.6667 22716.6667
-3541 38016.6667 22733.3333
-3542 38016.6667 22750.0000
-3543 38016.6667 22983.3333
-3544 38016.6667 23666.6667
-3545 38016.6667 23700.0000
-3546 38016.6667 23733.3333
-3547 38016.6667 23750.0000
-3548 38016.6667 23766.6667
-3549 38016.6667 23833.3333
-3550 38016.6667 24000.0000
-3551 38016.6667 24266.6667
-3552 38016.6667 24283.3333
-3553 38016.6667 24333.3333
-3554 38016.6667 24416.6667
-3555 38016.6667 24450.0000
-3556 38016.6667 24466.6667
-3557 38016.6667 24516.6667
-3558 38016.6667 24533.3333
-3559 38016.6667 24550.0000
-3560 38016.6667 24566.6667
-3561 38033.3333 21366.6667
-3562 38033.3333 21466.6667
-3563 38033.3333 21500.0000
-3564 38033.3333 21550.0000
-3565 38033.3333 21633.3333
-3566 38033.3333 21700.0000
-3567 38033.3333 21716.6667
-3568 38033.3333 21733.3333
-3569 38033.3333 21750.0000
-3570 38033.3333 21800.0000
-3571 38033.3333 21866.6667
-3572 38033.3333 21883.3333
-3573 38033.3333 21900.0000
-3574 38033.3333 21933.3333
-3575 38033.3333 21966.6667
-3576 38033.3333 22000.0000
-3577 38033.3333 22116.6667
-3578 38033.3333 22250.0000
-3579 38033.3333 22266.6667
-3580 38033.3333 22333.3333
-3581 38033.3333 22366.6667
-3582 38033.3333 22483.3333
-3583 38033.3333 22533.3333
-3584 38033.3333 22566.6667
-3585 38033.3333 22583.3333
-3586 38033.3333 22600.0000
-3587 38033.3333 22666.6667
-3588 38033.3333 22716.6667
-3589 38033.3333 22733.3333
-3590 38033.3333 22950.0000
-3591 38033.3333 23166.6667
-3592 38033.3333 23500.0000
-3593 38033.3333 23533.3333
-3594 38033.3333 23700.0000
-3595 38033.3333 23733.3333
-3596 38033.3333 23750.0000
-3597 38033.3333 23766.6667
-3598 38033.3333 23783.3333
-3599 38033.3333 23800.0000
-3600 38033.3333 23916.6667
-3601 38033.3333 24316.6667
-3602 38033.3333 24400.0000
-3603 38033.3333 24416.6667
-3604 38033.3333 24433.3333
-3605 38033.3333 24500.0000
-3606 38033.3333 24533.3333
-3607 38050.0000 21316.6667
-3608 38050.0000 21350.0000
-3609 38050.0000 21366.6667
-3610 38050.0000 21383.3333
-3611 38050.0000 21450.0000
-3612 38050.0000 21483.3333
-3613 38050.0000 21550.0000
-3614 38050.0000 21583.3333
-3615 38050.0000 21666.6667
-3616 38050.0000 21700.0000
-3617 38050.0000 21750.0000
-3618 38050.0000 21766.6667
-3619 38050.0000 21783.3333
-3620 38050.0000 21816.6667
-3621 38050.0000 21850.0000
-3622 38050.0000 21866.6667
-3623 38050.0000 21916.6667
-3624 38050.0000 21933.3333
-3625 38050.0000 21983.3333
-3626 38050.0000 22016.6667
-3627 38050.0000 22066.6667
-3628 38050.0000 22316.6667
-3629 38050.0000 22350.0000
-3630 38050.0000 22450.0000
-3631 38050.0000 22500.0000
-3632 38050.0000 22533.3333
-3633 38050.0000 22550.0000
-3634 38050.0000 22583.3333
-3635 38050.0000 22600.0000
-3636 38050.0000 22616.6667
-3637 38050.0000 22650.0000
-3638 38050.0000 22683.3333
-3639 38050.0000 22933.3333
-3640 38050.0000 22966.6667
-3641 38050.0000 23016.6667
-3642 38050.0000 23683.3333
-3643 38050.0000 23766.6667
-3644 38050.0000 23800.0000
-3645 38050.0000 23833.3333
-3646 38050.0000 23866.6667
-3647 38050.0000 24316.6667
-3648 38050.0000 24366.6667
-3649 38050.0000 24383.3333
-3650 38050.0000 24416.6667
-3651 38050.0000 24533.3333
-3652 38050.0000 24550.0000
-3653 38066.6667 20733.3333
-3654 38066.6667 20750.0000
-3655 38066.6667 20783.3333
-3656 38066.6667 21350.0000
-3657 38066.6667 21400.0000
-3658 38066.6667 21433.3333
-3659 38066.6667 21500.0000
-3660 38066.6667 21516.6667
-3661 38066.6667 21550.0000
-3662 38066.6667 21600.0000
-3663 38066.6667 21616.6667
-3664 38066.6667 21650.0000
-3665 38066.6667 21666.6667
-3666 38066.6667 21683.3333
-3667 38066.6667 21716.6667
-3668 38066.6667 21733.3333
-3669 38066.6667 21750.0000
-3670 38066.6667 21766.6667
-3671 38066.6667 21800.0000
-3672 38066.6667 21850.0000
-3673 38066.6667 21900.0000
-3674 38066.6667 21933.3333
-3675 38066.6667 21950.0000
-3676 38066.6667 22033.3333
-3677 38066.6667 22233.3333
-3678 38066.6667 22316.6667
-3679 38066.6667 22333.3333
-3680 38066.6667 22350.0000
-3681 38066.6667 22400.0000
-3682 38066.6667 22450.0000
-3683 38066.6667 22500.0000
-3684 38066.6667 22516.6667
-3685 38066.6667 22633.3333
-3686 38066.6667 22650.0000
-3687 38066.6667 22666.6667
-3688 38066.6667 23500.0000
-3689 38066.6667 23583.3333
-3690 38066.6667 23700.0000
-3691 38066.6667 23766.6667
-3692 38066.6667 23783.3333
-3693 38066.6667 23816.6667
-3694 38066.6667 24000.0000
-3695 38066.6667 24316.6667
-3696 38066.6667 24333.3333
-3697 38066.6667 24350.0000
-3698 38066.6667 24433.3333
-3699 38066.6667 24533.3333
-3700 38083.3333 20716.6667
-3701 38083.3333 20733.3333
-3702 38083.3333 20750.0000
-3703 38083.3333 20783.3333
-3704 38083.3333 21383.3333
-3705 38083.3333 21466.6667
-3706 38083.3333 21483.3333
-3707 38083.3333 21500.0000
-3708 38083.3333 21533.3333
-3709 38083.3333 21566.6667
-3710 38083.3333 21583.3333
-3711 38083.3333 21616.6667
-3712 38083.3333 21633.3333
-3713 38083.3333 21666.6667
-3714 38083.3333 21733.3333
-3715 38083.3333 21766.6667
-3716 38083.3333 21833.3333
-3717 38083.3333 21900.0000
-3718 38083.3333 21916.6667
-3719 38083.3333 22033.3333
-3720 38083.3333 22100.0000
-3721 38083.3333 22133.3333
-3722 38083.3333 22166.6667
-3723 38083.3333 22216.6667
-3724 38083.3333 22333.3333
-3725 38083.3333 22350.0000
-3726 38083.3333 22416.6667
-3727 38083.3333 22433.3333
-3728 38083.3333 22483.3333
-3729 38083.3333 22533.3333
-3730 38083.3333 22583.3333
-3731 38083.3333 22600.0000
-3732 38083.3333 22616.6667
-3733 38083.3333 22633.3333
-3734 38083.3333 23183.3333
-3735 38083.3333 23216.6667
-3736 38083.3333 23516.6667
-3737 38083.3333 23700.0000
-3738 38083.3333 23733.3333
-3739 38083.3333 23983.3333
-3740 38083.3333 24283.3333
-3741 38083.3333 24316.6667
-3742 38083.3333 24333.3333
-3743 38083.3333 24366.6667
-3744 38083.3333 24383.3333
-3745 38083.3333 24533.3333
-3746 38083.3333 24566.6667
-3747 38100.0000 20716.6667
-3748 38100.0000 20750.0000
-3749 38100.0000 20766.6667
-3750 38100.0000 20783.3333
-3751 38100.0000 21416.6667
-3752 38100.0000 21450.0000
-3753 38100.0000 21466.6667
-3754 38100.0000 21483.3333
-3755 38100.0000 21516.6667
-3756 38100.0000 21533.3333
-3757 38100.0000 21550.0000
-3758 38100.0000 21600.0000
-3759 38100.0000 21616.6667
-3760 38100.0000 21633.3333
-3761 38100.0000 21666.6667
-3762 38100.0000 21700.0000
-3763 38100.0000 21716.6667
-3764 38100.0000 21733.3333
-3765 38100.0000 21816.6667
-3766 38100.0000 21833.3333
-3767 38100.0000 21916.6667
-3768 38100.0000 22033.3333
-3769 38100.0000 22100.0000
-3770 38100.0000 22133.3333
-3771 38100.0000 22166.6667
-3772 38100.0000 22233.3333
-3773 38100.0000 22283.3333
-3774 38100.0000 22316.6667
-3775 38100.0000 22333.3333
-3776 38100.0000 22350.0000
-3777 38100.0000 22366.6667
-3778 38100.0000 22450.0000
-3779 38100.0000 22483.3333
-3780 38100.0000 22533.3333
-3781 38100.0000 22566.6667
-3782 38100.0000 22583.3333
-3783 38100.0000 23666.6667
-3784 38100.0000 23816.6667
-3785 38100.0000 23883.3333
-3786 38100.0000 24250.0000
-3787 38100.0000 24333.3333
-3788 38100.0000 24400.0000
-3789 38100.0000 24433.3333
-3790 38100.0000 24483.3333
-3791 38100.0000 24566.6667
-3792 38116.6667 20516.6667
-3793 38116.6667 20533.3333
-3794 38116.6667 20550.0000
-3795 38116.6667 20566.6667
-3796 38116.6667 20583.3333
-3797 38116.6667 20633.3333
-3798 38116.6667 20650.0000
-3799 38116.6667 20750.0000
-3800 38116.6667 20766.6667
-3801 38116.6667 20783.3333
-3802 38116.6667 21466.6667
-3803 38116.6667 21483.3333
-3804 38116.6667 21500.0000
-3805 38116.6667 21516.6667
-3806 38116.6667 21566.6667
-3807 38116.6667 21583.3333
-3808 38116.6667 21600.0000
-3809 38116.6667 21633.3333
-3810 38116.6667 21650.0000
-3811 38116.6667 21666.6667
-3812 38116.6667 21716.6667
-3813 38116.6667 21783.3333
-3814 38116.6667 21900.0000
-3815 38116.6667 21933.3333
-3816 38116.6667 21966.6667
-3817 38116.6667 22066.6667
-3818 38116.6667 22083.3333
-3819 38116.6667 22116.6667
-3820 38116.6667 22216.6667
-3821 38116.6667 22283.3333
-3822 38116.6667 22383.3333
-3823 38116.6667 22400.0000
-3824 38116.6667 22433.3333
-3825 38116.6667 22466.6667
-3826 38116.6667 22483.3333
-3827 38116.6667 22533.3333
-3828 38116.6667 22550.0000
-3829 38116.6667 23400.0000
-3830 38116.6667 23833.3333
-3831 38116.6667 23850.0000
-3832 38116.6667 23866.6667
-3833 38116.6667 23883.3333
-3834 38116.6667 23950.0000
-3835 38116.6667 24216.6667
-3836 38116.6667 24300.0000
-3837 38116.6667 24316.6667
-3838 38116.6667 24483.3333
-3839 38116.6667 24500.0000
-3840 38116.6667 24583.3333
-3841 38133.3333 20500.0000
-3842 38133.3333 20516.6667
-3843 38133.3333 20533.3333
-3844 38133.3333 20550.0000
-3845 38133.3333 20566.6667
-3846 38133.3333 20583.3333
-3847 38133.3333 20616.6667
-3848 38133.3333 20716.6667
-3849 38133.3333 20733.3333
-3850 38133.3333 20750.0000
-3851 38133.3333 21400.0000
-3852 38133.3333 21466.6667
-3853 38133.3333 21533.3333
-3854 38133.3333 21550.0000
-3855 38133.3333 21566.6667
-3856 38133.3333 21583.3333
-3857 38133.3333 21600.0000
-3858 38133.3333 21633.3333
-3859 38133.3333 21700.0000
-3860 38133.3333 21716.6667
-3861 38133.3333 21766.6667
-3862 38133.3333 21783.3333
-3863 38133.3333 21833.3333
-3864 38133.3333 21900.0000
-3865 38133.3333 21916.6667
-3866 38133.3333 21983.3333
-3867 38133.3333 22150.0000
-3868 38133.3333 22200.0000
-3869 38133.3333 22216.6667
-3870 38133.3333 22233.3333
-3871 38133.3333 22283.3333
-3872 38133.3333 22316.6667
-3873 38133.3333 22333.3333
-3874 38133.3333 22366.6667
-3875 38133.3333 22383.3333
-3876 38133.3333 22400.0000
-3877 38133.3333 22416.6667
-3878 38133.3333 22433.3333
-3879 38133.3333 22450.0000
-3880 38133.3333 22466.6667
-3881 38133.3333 22483.3333
-3882 38133.3333 22516.6667
-3883 38133.3333 23800.0000
-3884 38133.3333 23850.0000
-3885 38133.3333 23883.3333
-3886 38133.3333 24000.0000
-3887 38133.3333 24250.0000
-3888 38133.3333 24366.6667
-3889 38133.3333 24383.3333
-3890 38133.3333 24466.6667
-3891 38133.3333 24483.3333
-3892 38133.3333 24533.3333
-3893 38133.3333 24566.6667
-3894 38150.0000 20500.0000
-3895 38150.0000 20550.0000
-3896 38150.0000 20566.6667
-3897 38150.0000 20733.3333
-3898 38150.0000 20750.0000
-3899 38150.0000 20783.3333
-3900 38150.0000 21516.6667
-3901 38150.0000 21550.0000
-3902 38150.0000 21616.6667
-3903 38150.0000 21650.0000
-3904 38150.0000 21666.6667
-3905 38150.0000 21733.3333
-3906 38150.0000 21750.0000
-3907 38150.0000 21800.0000
-3908 38150.0000 21833.3333
-3909 38150.0000 21850.0000
-3910 38150.0000 21866.6667
-3911 38150.0000 21900.0000
-3912 38150.0000 22033.3333
-3913 38150.0000 22066.6667
-3914 38150.0000 22166.6667
-3915 38150.0000 22183.3333
-3916 38150.0000 22200.0000
-3917 38150.0000 22266.6667
-3918 38150.0000 22283.3333
-3919 38150.0000 22300.0000
-3920 38150.0000 22316.6667
-3921 38150.0000 22333.3333
-3922 38150.0000 22350.0000
-3923 38150.0000 23233.3333
-3924 38150.0000 23533.3333
-3925 38150.0000 23716.6667
-3926 38150.0000 23833.3333
-3927 38150.0000 23850.0000
-3928 38150.0000 23866.6667
-3929 38150.0000 23966.6667
-3930 38150.0000 24233.3333
-3931 38150.0000 24316.6667
-3932 38150.0000 24350.0000
-3933 38150.0000 24383.3333
-3934 38150.0000 24400.0000
-3935 38166.6667 20483.3333
-3936 38166.6667 20550.0000
-3937 38166.6667 20600.0000
-3938 38166.6667 20666.6667
-3939 38166.6667 20683.3333
-3940 38166.6667 20700.0000
-3941 38166.6667 20716.6667
-3942 38166.6667 21416.6667
-3943 38166.6667 21450.0000
-3944 38166.6667 21466.6667
-3945 38166.6667 21483.3333
-3946 38166.6667 21666.6667
-3947 38166.6667 21683.3333
-3948 38166.6667 21700.0000
-3949 38166.6667 21716.6667
-3950 38166.6667 21733.3333
-3951 38166.6667 21816.6667
-3952 38166.6667 21850.0000
-3953 38166.6667 22000.0000
-3954 38166.6667 22066.6667
-3955 38166.6667 22100.0000
-3956 38166.6667 22133.3333
-3957 38166.6667 22233.3333
-3958 38166.6667 22266.6667
-3959 38166.6667 22283.3333
-3960 38166.6667 22316.6667
-3961 38166.6667 22333.3333
-3962 38166.6667 22350.0000
-3963 38166.6667 23333.3333
-3964 38166.6667 23416.6667
-3965 38166.6667 23783.3333
-3966 38166.6667 23866.6667
-3967 38166.6667 24000.0000
-3968 38166.6667 24233.3333
-3969 38166.6667 24250.0000
-3970 38166.6667 24266.6667
-3971 38166.6667 24316.6667
-3972 38183.3333 20383.3333
-3973 38183.3333 20400.0000
-3974 38183.3333 20416.6667
-3975 38183.3333 20433.3333
-3976 38183.3333 20483.3333
-3977 38183.3333 20533.3333
-3978 38183.3333 20583.3333
-3979 38183.3333 20683.3333
-3980 38183.3333 20700.0000
-3981 38183.3333 21383.3333
-3982 38183.3333 21416.6667
-3983 38183.3333 21433.3333
-3984 38183.3333 21683.3333
-3985 38183.3333 21700.0000
-3986 38183.3333 21716.6667
-3987 38183.3333 21733.3333
-3988 38183.3333 21750.0000
-3989 38183.3333 21766.6667
-3990 38183.3333 21816.6667
-3991 38183.3333 21950.0000
-3992 38183.3333 21983.3333
-3993 38183.3333 22066.6667
-3994 38183.3333 22133.3333
-3995 38183.3333 22150.0000
-3996 38183.3333 22183.3333
-3997 38183.3333 22266.6667
-3998 38183.3333 23150.0000
-3999 38183.3333 23383.3333
-4000 38183.3333 23500.0000
-4001 38183.3333 23516.6667
-4002 38183.3333 23550.0000
-4003 38183.3333 23850.0000
-4004 38183.3333 23916.6667
-4005 38183.3333 23983.3333
-4006 38183.3333 24033.3333
-4007 38183.3333 24200.0000
-4008 38183.3333 24233.3333
-4009 38183.3333 24266.6667
-4010 38183.3333 26016.6667
-4011 38200.0000 20383.3333
-4012 38200.0000 20400.0000
-4013 38200.0000 20416.6667
-4014 38200.0000 20433.3333
-4015 38200.0000 20516.6667
-4016 38200.0000 20666.6667
-4017 38200.0000 21700.0000
-4018 38200.0000 21733.3333
-4019 38200.0000 22000.0000
-4020 38200.0000 22050.0000
-4021 38200.0000 22083.3333
-4022 38200.0000 22116.6667
-4023 38200.0000 22150.0000
-4024 38200.0000 22166.6667
-4025 38200.0000 22200.0000
-4026 38200.0000 23050.0000
-4027 38200.0000 23116.6667
-4028 38200.0000 23966.6667
-4029 38200.0000 24200.0000
-4030 38216.6667 20383.3333
-4031 38216.6667 20400.0000
-4032 38216.6667 20500.0000
-4033 38216.6667 20516.6667
-4034 38216.6667 20616.6667
-4035 38216.6667 20650.0000
-4036 38216.6667 20666.6667
-4037 38216.6667 21716.6667
-4038 38216.6667 21733.3333
-4039 38216.6667 21750.0000
-4040 38216.6667 21766.6667
-4041 38216.6667 21783.3333
-4042 38216.6667 21800.0000
-4043 38216.6667 21816.6667
-4044 38216.6667 21900.0000
-4045 38216.6667 21966.6667
-4046 38216.6667 22033.3333
-4047 38216.6667 22066.6667
-4048 38216.6667 22100.0000
-4049 38216.6667 22116.6667
-4050 38216.6667 22133.3333
-4051 38216.6667 23266.6667
-4052 38216.6667 23316.6667
-4053 38216.6667 23500.0000
-4054 38216.6667 23550.0000
-4055 38216.6667 23616.6667
-4056 38216.6667 23783.3333
-4057 38216.6667 23833.3333
-4058 38216.6667 23866.6667
-4059 38216.6667 23883.3333
-4060 38216.6667 23916.6667
-4061 38216.6667 24250.0000
-4062 38233.3333 20366.6667
-4063 38233.3333 20383.3333
-4064 38233.3333 20400.0000
-4065 38233.3333 20416.6667
-4066 38233.3333 20483.3333
-4067 38233.3333 20600.0000
-4068 38233.3333 20650.0000
-4069 38233.3333 21733.3333
-4070 38233.3333 21750.0000
-4071 38233.3333 21766.6667
-4072 38233.3333 21783.3333
-4073 38233.3333 21916.6667
-4074 38233.3333 21966.6667
-4075 38233.3333 21983.3333
-4076 38233.3333 22033.3333
-4077 38233.3333 22083.3333
-4078 38233.3333 22100.0000
-4079 38233.3333 22116.6667
-4080 38233.3333 22133.3333
-4081 38233.3333 23216.6667
-4082 38233.3333 23416.6667
-4083 38233.3333 23800.0000
-4084 38233.3333 23900.0000
-4085 38233.3333 24216.6667
-4086 38233.3333 26000.0000
-4087 38233.3333 26050.0000
-4088 38233.3333 26066.6667
-4089 38233.3333 26083.3333
-4090 38233.3333 26100.0000
-4091 38250.0000 20383.3333
-4092 38250.0000 20400.0000
-4093 38250.0000 20600.0000
-4094 38250.0000 20650.0000
-4095 38250.0000 21733.3333
-4096 38250.0000 21750.0000
-4097 38250.0000 21800.0000
-4098 38250.0000 21933.3333
-4099 38250.0000 21950.0000
-4100 38250.0000 21966.6667
-4101 38250.0000 21983.3333
-4102 38250.0000 22000.0000
-4103 38250.0000 22016.6667
-4104 38250.0000 22050.0000
-4105 38250.0000 22083.3333
-4106 38250.0000 22116.6667
-4107 38250.0000 22983.3333
-4108 38250.0000 23066.6667
-4109 38250.0000 23183.3333
-4110 38250.0000 23266.6667
-4111 38250.0000 23466.6667
-4112 38250.0000 23700.0000
-4113 38250.0000 24200.0000
-4114 38250.0000 24216.6667
-4115 38250.0000 25933.3333
-4116 38250.0000 26033.3333
-4117 38250.0000 26066.6667
-4118 38250.0000 26083.3333
-4119 38250.0000 26100.0000
-4120 38266.6667 20466.6667
-4121 38266.6667 20683.3333
-4122 38266.6667 21733.3333
-4123 38266.6667 21750.0000
-4124 38266.6667 21766.6667
-4125 38266.6667 21783.3333
-4126 38266.6667 21816.6667
-4127 38266.6667 21833.3333
-4128 38266.6667 21900.0000
-4129 38266.6667 21916.6667
-4130 38266.6667 21933.3333
-4131 38266.6667 21966.6667
-4132 38266.6667 21983.3333
-4133 38266.6667 22000.0000
-4134 38266.6667 22016.6667
-4135 38266.6667 22050.0000
-4136 38266.6667 22916.6667
-4137 38266.6667 22966.6667
-4138 38266.6667 23116.6667
-4139 38266.6667 23233.3333
-4140 38266.6667 23566.6667
-4141 38266.6667 23800.0000
-4142 38266.6667 23816.6667
-4143 38266.6667 24166.6667
-4144 38266.6667 24183.3333
-4145 38266.6667 25916.6667
-4146 38266.6667 26066.6667
-4147 38266.6667 26083.3333
-4148 38266.6667 26100.0000
-4149 38283.3333 20433.3333
-4150 38283.3333 20466.6667
-4151 38283.3333 20583.3333
-4152 38283.3333 21766.6667
-4153 38283.3333 21800.0000
-4154 38283.3333 21866.6667
-4155 38283.3333 21883.3333
-4156 38283.3333 21900.0000
-4157 38283.3333 21966.6667
-4158 38283.3333 22000.0000
-4159 38283.3333 22033.3333
-4160 38283.3333 22766.6667
-4161 38283.3333 22783.3333
-4162 38283.3333 22800.0000
-4163 38283.3333 23266.6667
-4164 38283.3333 23350.0000
-4165 38283.3333 23583.3333
-4166 38283.3333 23750.0000
-4167 38283.3333 23800.0000
-4168 38283.3333 23816.6667
-4169 38283.3333 23833.3333
-4170 38283.3333 23866.6667
-4171 38283.3333 24133.3333
-4172 38283.3333 25983.3333
-4173 38283.3333 26083.3333
-4174 38300.0000 20483.3333
-4175 38300.0000 20550.0000
-4176 38300.0000 20566.6667
-4177 38300.0000 20583.3333
-4178 38300.0000 20600.0000
-4179 38300.0000 21783.3333
-4180 38300.0000 21800.0000
-4181 38300.0000 21833.3333
-4182 38300.0000 21900.0000
-4183 38300.0000 21950.0000
-4184 38300.0000 21983.3333
-4185 38300.0000 22000.0000
-4186 38300.0000 22016.6667
-4187 38300.0000 22550.0000
-4188 38300.0000 22583.3333
-4189 38300.0000 23116.6667
-4190 38300.0000 23150.0000
-4191 38300.0000 23166.6667
-4192 38300.0000 23266.6667
-4193 38300.0000 23316.6667
-4194 38300.0000 23383.3333
-4195 38300.0000 23500.0000
-4196 38300.0000 23733.3333
-4197 38300.0000 23750.0000
-4198 38300.0000 23900.0000
-4199 38300.0000 24116.6667
-4200 38300.0000 24200.0000
-4201 38300.0000 26016.6667
-4202 38300.0000 26066.6667
-4203 38300.0000 26100.0000
-4204 38300.0000 26116.6667
-4205 38316.6667 20416.6667
-4206 38316.6667 20466.6667
-4207 38316.6667 20550.0000
-4208 38316.6667 20566.6667
-4209 38316.6667 20583.3333
-4210 38316.6667 21816.6667
-4211 38316.6667 21850.0000
-4212 38316.6667 21983.3333
-4213 38316.6667 22583.3333
-4214 38316.6667 22900.0000
-4215 38316.6667 23116.6667
-4216 38316.6667 23183.3333
-4217 38316.6667 23316.6667
-4218 38316.6667 23333.3333
-4219 38316.6667 23450.0000
-4220 38316.6667 23533.3333
-4221 38316.6667 23616.6667
-4222 38316.6667 23633.3333
-4223 38316.6667 23800.0000
-4224 38316.6667 24150.0000
-4225 38316.6667 26050.0000
-4226 38316.6667 26100.0000
-4227 38316.6667 26133.3333
-4228 38333.3333 20550.0000
-4229 38333.3333 21566.6667
-4230 38333.3333 21766.6667
-4231 38333.3333 21850.0000
-4232 38333.3333 21866.6667
-4233 38333.3333 23133.3333
-4234 38333.3333 23316.6667
-4235 38333.3333 23733.3333
-4236 38333.3333 23783.3333
-4237 38333.3333 26000.0000
-4238 38333.3333 26083.3333
-4239 38333.3333 26100.0000
-4240 38333.3333 26116.6667
-4241 38350.0000 20616.6667
-4242 38350.0000 20683.3333
-4243 38350.0000 20716.6667
-4244 38350.0000 21533.3333
-4245 38350.0000 21566.6667
-4246 38350.0000 21600.0000
-4247 38350.0000 21633.3333
-4248 38350.0000 21650.0000
-4249 38350.0000 21700.0000
-4250 38350.0000 21716.6667
-4251 38350.0000 21733.3333
-4252 38350.0000 21750.0000
-4253 38350.0000 22783.3333
-4254 38350.0000 22916.6667
-4255 38350.0000 23016.6667
-4256 38350.0000 23483.3333
-4257 38350.0000 23583.3333
-4258 38350.0000 23666.6667
-4259 38350.0000 24100.0000
-4260 38350.0000 24150.0000
-4261 38350.0000 26083.3333
-4262 38366.6667 20566.6667
-4263 38366.6667 20583.3333
-4264 38366.6667 20600.0000
-4265 38366.6667 20716.6667
-4266 38366.6667 21433.3333
-4267 38366.6667 21533.3333
-4268 38366.6667 21566.6667
-4269 38366.6667 21633.3333
-4270 38366.6667 21666.6667
-4271 38366.6667 21716.6667
-4272 38366.6667 21750.0000
-4273 38366.6667 21766.6667
-4274 38366.6667 21783.3333
-4275 38366.6667 22083.3333
-4276 38366.6667 22133.3333
-4277 38366.6667 22200.0000
-4278 38366.6667 22233.3333
-4279 38366.6667 22250.0000
-4280 38366.6667 22283.3333
-4281 38366.6667 22833.3333
-4282 38366.6667 22933.3333
-4283 38366.6667 22966.6667
-4284 38366.6667 23016.6667
-4285 38366.6667 23066.6667
-4286 38366.6667 23083.3333
-4287 38366.6667 23100.0000
-4288 38366.6667 23450.0000
-4289 38366.6667 24183.3333
-4290 38366.6667 26133.3333
-4291 38383.3333 20533.3333
-4292 38383.3333 20550.0000
-4293 38383.3333 20566.6667
-4294 38383.3333 20583.3333
-4295 38383.3333 20666.6667
-4296 38383.3333 21500.0000
-4297 38383.3333 21533.3333
-4298 38383.3333 21566.6667
-4299 38383.3333 21600.0000
-4300 38383.3333 21633.3333
-4301 38383.3333 21683.3333
-4302 38383.3333 21716.6667
-4303 38383.3333 21800.0000
-4304 38383.3333 21850.0000
-4305 38383.3333 21916.6667
-4306 38383.3333 22116.6667
-4307 38383.3333 22383.3333
-4308 38383.3333 22633.3333
-4309 38383.3333 23000.0000
-4310 38383.3333 23400.0000
-4311 38383.3333 23600.0000
-4312 38383.3333 23633.3333
-4313 38383.3333 24050.0000
-4314 38383.3333 24066.6667
-4315 38383.3333 24083.3333
-4316 38383.3333 24116.6667
-4317 38383.3333 24133.3333
-4318 38383.3333 24166.6667
-4319 38383.3333 26016.6667
-4320 38383.3333 26100.0000
-4321 38400.0000 20550.0000
-4322 38400.0000 20566.6667
-4323 38400.0000 20583.3333
-4324 38400.0000 21266.6667
-4325 38400.0000 21433.3333
-4326 38400.0000 21483.3333
-4327 38400.0000 21533.3333
-4328 38400.0000 21550.0000
-4329 38400.0000 21650.0000
-4330 38400.0000 21733.3333
-4331 38400.0000 21750.0000
-4332 38400.0000 21766.6667
-4333 38400.0000 21783.3333
-4334 38400.0000 21800.0000
-4335 38400.0000 21816.6667
-4336 38400.0000 21833.3333
-4337 38400.0000 21866.6667
-4338 38400.0000 21883.3333
-4339 38400.0000 21900.0000
-4340 38400.0000 22000.0000
-4341 38400.0000 22016.6667
-4342 38400.0000 22050.0000
-4343 38400.0000 22150.0000
-4344 38400.0000 22716.6667
-4345 38400.0000 22933.3333
-4346 38400.0000 22983.3333
-4347 38400.0000 23600.0000
-4348 38400.0000 23616.6667
-4349 38400.0000 23633.3333
-4350 38400.0000 23766.6667
-4351 38400.0000 23800.0000
-4352 38400.0000 23883.3333
-4353 38400.0000 23916.6667
-4354 38400.0000 24050.0000
-4355 38400.0000 24083.3333
-4356 38400.0000 24100.0000
-4357 38400.0000 24133.3333
-4358 38400.0000 24166.6667
-4359 38400.0000 26016.6667
-4360 38416.6667 20550.0000
-4361 38416.6667 20566.6667
-4362 38416.6667 20650.0000
-4363 38416.6667 20666.6667
-4364 38416.6667 21250.0000
-4365 38416.6667 21283.3333
-4366 38416.6667 21316.6667
-4367 38416.6667 21466.6667
-4368 38416.6667 21516.6667
-4369 38416.6667 21566.6667
-4370 38416.6667 21616.6667
-4371 38416.6667 21633.3333
-4372 38416.6667 21750.0000
-4373 38416.6667 21766.6667
-4374 38416.6667 21783.3333
-4375 38416.6667 21816.6667
-4376 38416.6667 21833.3333
-4377 38416.6667 21850.0000
-4378 38416.6667 21866.6667
-4379 38416.6667 21883.3333
-4380 38416.6667 21900.0000
-4381 38416.6667 21933.3333
-4382 38416.6667 21950.0000
-4383 38416.6667 21966.6667
-4384 38416.6667 21983.3333
-4385 38416.6667 22000.0000
-4386 38416.6667 22016.6667
-4387 38416.6667 22050.0000
-4388 38416.6667 22100.0000
-4389 38416.6667 22183.3333
-4390 38416.6667 22216.6667
-4391 38416.6667 22316.6667
-4392 38416.6667 22533.3333
-4393 38416.6667 22816.6667
-4394 38416.6667 22833.3333
-4395 38416.6667 22983.3333
-4396 38416.6667 23000.0000
-4397 38416.6667 23016.6667
-4398 38416.6667 23350.0000
-4399 38416.6667 23516.6667
-4400 38416.6667 23650.0000
-4401 38416.6667 23683.3333
-4402 38416.6667 23816.6667
-4403 38416.6667 23833.3333
-4404 38416.6667 24033.3333
-4405 38416.6667 24100.0000
-4406 38416.6667 24133.3333
-4407 38416.6667 24200.0000
-4408 38416.6667 26133.3333
-4409 38433.3333 20550.0000
-4410 38433.3333 20566.6667
-4411 38433.3333 20583.3333
-4412 38433.3333 21283.3333
-4413 38433.3333 21350.0000
-4414 38433.3333 21416.6667
-4415 38433.3333 21516.6667
-4416 38433.3333 21600.0000
-4417 38433.3333 21633.3333
-4418 38433.3333 21716.6667
-4419 38433.3333 21750.0000
-4420 38433.3333 21766.6667
-4421 38433.3333 21833.3333
-4422 38433.3333 21866.6667
-4423 38433.3333 21950.0000
-4424 38433.3333 21966.6667
-4425 38433.3333 21983.3333
-4426 38433.3333 22066.6667
-4427 38433.3333 22116.6667
-4428 38433.3333 22416.6667
-4429 38433.3333 22450.0000
-4430 38433.3333 22666.6667
-4431 38433.3333 22833.3333
-4432 38433.3333 22883.3333
-4433 38433.3333 22900.0000
-4434 38433.3333 22916.6667
-4435 38433.3333 22966.6667
-4436 38433.3333 22983.3333
-4437 38433.3333 23033.3333
-4438 38433.3333 23300.0000
-4439 38433.3333 23400.0000
-4440 38433.3333 23600.0000
-4441 38433.3333 23633.3333
-4442 38433.3333 23650.0000
-4443 38433.3333 23666.6667
-4444 38433.3333 23683.3333
-4445 38433.3333 23883.3333
-4446 38433.3333 23900.0000
-4447 38433.3333 24033.3333
-4448 38433.3333 24066.6667
-4449 38433.3333 24116.6667
-4450 38433.3333 25966.6667
-4451 38450.0000 20533.3333
-4452 38450.0000 20550.0000
-4453 38450.0000 20566.6667
-4454 38450.0000 20583.3333
-4455 38450.0000 20633.3333
-4456 38450.0000 20650.0000
-4457 38450.0000 20666.6667
-4458 38450.0000 20683.3333
-4459 38450.0000 21116.6667
-4460 38450.0000 21233.3333
-4461 38450.0000 21383.3333
-4462 38450.0000 21400.0000
-4463 38450.0000 21516.6667
-4464 38450.0000 21583.3333
-4465 38450.0000 21600.0000
-4466 38450.0000 21633.3333
-4467 38450.0000 21666.6667
-4468 38450.0000 21683.3333
-4469 38450.0000 21700.0000
-4470 38450.0000 21800.0000
-4471 38450.0000 21816.6667
-4472 38450.0000 21916.6667
-4473 38450.0000 21983.3333
-4474 38450.0000 22000.0000
-4475 38450.0000 22033.3333
-4476 38450.0000 22150.0000
-4477 38450.0000 22233.3333
-4478 38450.0000 22300.0000
-4479 38450.0000 22366.6667
-4480 38450.0000 22816.6667
-4481 38450.0000 22833.3333
-4482 38450.0000 22866.6667
-4483 38450.0000 23000.0000
-4484 38450.0000 23216.6667
-4485 38450.0000 23683.3333
-4486 38450.0000 23816.6667
-4487 38450.0000 24000.0000
-4488 38450.0000 24016.6667
-4489 38450.0000 24083.3333
-4490 38450.0000 24116.6667
-4491 38450.0000 24133.3333
-4492 38450.0000 24150.0000
-4493 38450.0000 24166.6667
-4494 38466.6667 20550.0000
-4495 38466.6667 20566.6667
-4496 38466.6667 20583.3333
-4497 38466.6667 20633.3333
-4498 38466.6667 20650.0000
-4499 38466.6667 21266.6667
-4500 38466.6667 21366.6667
-4501 38466.6667 21500.0000
-4502 38466.6667 21566.6667
-4503 38466.6667 21583.3333
-4504 38466.6667 21600.0000
-4505 38466.6667 21616.6667
-4506 38466.6667 21650.0000
-4507 38466.6667 21700.0000
-4508 38466.6667 21733.3333
-4509 38466.6667 21800.0000
-4510 38466.6667 21816.6667
-4511 38466.6667 21866.6667
-4512 38466.6667 21933.3333
-4513 38466.6667 21950.0000
-4514 38466.6667 22100.0000
-4515 38466.6667 22183.3333
-4516 38466.6667 22466.6667
-4517 38466.6667 22783.3333
-4518 38466.6667 22800.0000
-4519 38466.6667 22866.6667
-4520 38466.6667 22950.0000
-4521 38466.6667 22966.6667
-4522 38466.6667 23000.0000
-4523 38466.6667 23283.3333
-4524 38466.6667 23583.3333
-4525 38466.6667 23600.0000
-4526 38466.6667 23650.0000
-4527 38466.6667 23766.6667
-4528 38466.6667 23966.6667
-4529 38466.6667 24116.6667
-4530 38466.6667 24150.0000
-4531 38466.6667 25916.6667
-4532 38466.6667 25966.6667
-4533 38466.6667 26116.6667
-4534 38483.3333 20666.6667
-4535 38483.3333 21100.0000
-4536 38483.3333 21250.0000
-4537 38483.3333 21283.3333
-4538 38483.3333 21350.0000
-4539 38483.3333 21416.6667
-4540 38483.3333 21450.0000
-4541 38483.3333 21583.3333
-4542 38483.3333 21633.3333
-4543 38483.3333 21650.0000
-4544 38483.3333 21666.6667
-4545 38483.3333 21766.6667
-4546 38483.3333 21833.3333
-4547 38483.3333 21850.0000
-4548 38483.3333 22016.6667
-4549 38483.3333 22033.3333
-4550 38483.3333 22050.0000
-4551 38483.3333 22083.3333
-4552 38483.3333 22166.6667
-4553 38483.3333 22183.3333
-4554 38483.3333 22366.6667
-4555 38483.3333 22400.0000
-4556 38483.3333 22500.0000
-4557 38483.3333 22583.3333
-4558 38483.3333 22883.3333
-4559 38483.3333 22933.3333
-4560 38483.3333 23100.0000
-4561 38483.3333 23233.3333
-4562 38483.3333 23450.0000
-4563 38483.3333 23550.0000
-4564 38483.3333 23750.0000
-4565 38483.3333 23800.0000
-4566 38483.3333 23900.0000
-4567 38483.3333 24116.6667
-4568 38483.3333 24133.3333
-4569 38483.3333 24166.6667
-4570 38483.3333 25916.6667
-4571 38483.3333 26050.0000
-4572 38500.0000 21350.0000
-4573 38500.0000 21383.3333
-4574 38500.0000 21483.3333
-4575 38500.0000 21516.6667
-4576 38500.0000 21550.0000
-4577 38500.0000 21583.3333
-4578 38500.0000 21600.0000
-4579 38500.0000 21616.6667
-4580 38500.0000 21633.3333
-4581 38500.0000 21650.0000
-4582 38500.0000 21666.6667
-4583 38500.0000 21700.0000
-4584 38500.0000 21800.0000
-4585 38500.0000 21833.3333
-4586 38500.0000 21850.0000
-4587 38500.0000 21883.3333
-4588 38500.0000 22133.3333
-4589 38500.0000 22233.3333
-4590 38500.0000 22383.3333
-4591 38500.0000 22800.0000
-4592 38500.0000 22850.0000
-4593 38500.0000 22883.3333
-4594 38500.0000 22933.3333
-4595 38500.0000 22983.3333
-4596 38500.0000 23166.6667
-4597 38500.0000 23266.6667
-4598 38500.0000 23616.6667
-4599 38500.0000 23966.6667
-4600 38500.0000 24016.6667
-4601 38500.0000 24083.3333
-4602 38500.0000 24116.6667
-4603 38500.0000 24133.3333
-4604 38500.0000 25916.6667
-4605 38516.6667 21283.3333
-4606 38516.6667 21383.3333
-4607 38516.6667 21433.3333
-4608 38516.6667 21466.6667
-4609 38516.6667 21533.3333
-4610 38516.6667 21550.0000
-4611 38516.6667 21566.6667
-4612 38516.6667 21666.6667
-4613 38516.6667 21683.3333
-4614 38516.6667 21716.6667
-4615 38516.6667 21766.6667
-4616 38516.6667 21783.3333
-4617 38516.6667 21833.3333
-4618 38516.6667 21866.6667
-4619 38516.6667 21883.3333
-4620 38516.6667 21916.6667
-4621 38516.6667 21950.0000
-4622 38516.6667 21966.6667
-4623 38516.6667 22166.6667
-4624 38516.6667 22383.3333
-4625 38516.6667 22550.0000
-4626 38516.6667 22733.3333
-4627 38516.6667 22783.3333
-4628 38516.6667 22950.0000
-4629 38516.6667 23033.3333
-4630 38516.6667 23633.3333
-4631 38516.6667 23650.0000
-4632 38516.6667 23783.3333
-4633 38516.6667 23850.0000
-4634 38516.6667 23983.3333
-4635 38516.6667 24000.0000
-4636 38516.6667 24033.3333
-4637 38516.6667 24100.0000
-4638 38516.6667 24133.3333
-4639 38516.6667 24150.0000
-4640 38516.6667 24166.6667
-4641 38516.6667 25883.3333
-4642 38516.6667 26216.6667
-4643 38533.3333 21083.3333
-4644 38533.3333 21183.3333
-4645 38533.3333 21216.6667
-4646 38533.3333 21366.6667
-4647 38533.3333 21383.3333
-4648 38533.3333 21400.0000
-4649 38533.3333 21416.6667
-4650 38533.3333 21433.3333
-4651 38533.3333 21450.0000
-4652 38533.3333 21500.0000
-4653 38533.3333 21533.3333
-4654 38533.3333 21550.0000
-4655 38533.3333 21566.6667
-4656 38533.3333 21683.3333
-4657 38533.3333 21700.0000
-4658 38533.3333 21766.6667
-4659 38533.3333 21816.6667
-4660 38533.3333 21833.3333
-4661 38533.3333 21900.0000
-4662 38533.3333 21916.6667
-4663 38533.3333 21933.3333
-4664 38533.3333 21983.3333
-4665 38533.3333 22033.3333
-4666 38533.3333 22100.0000
-4667 38533.3333 22200.0000
-4668 38533.3333 22266.6667
-4669 38533.3333 22383.3333
-4670 38533.3333 22500.0000
-4671 38533.3333 22850.0000
-4672 38533.3333 23016.6667
-4673 38533.3333 23100.0000
-4674 38533.3333 23716.6667
-4675 38533.3333 23816.6667
-4676 38533.3333 23850.0000
-4677 38533.3333 23916.6667
-4678 38533.3333 23933.3333
-4679 38533.3333 23983.3333
-4680 38533.3333 24050.0000
-4681 38533.3333 24066.6667
-4682 38533.3333 24083.3333
-4683 38533.3333 24116.6667
-4684 38533.3333 24133.3333
-4685 38533.3333 25566.6667
-4686 38533.3333 25933.3333
-4687 38533.3333 25950.0000
-4688 38533.3333 26100.0000
-4689 38533.3333 26116.6667
-4690 38550.0000 21233.3333
-4691 38550.0000 21333.3333
-4692 38550.0000 21366.6667
-4693 38550.0000 21383.3333
-4694 38550.0000 21533.3333
-4695 38550.0000 21650.0000
-4696 38550.0000 21666.6667
-4697 38550.0000 21700.0000
-4698 38550.0000 21800.0000
-4699 38550.0000 21816.6667
-4700 38550.0000 21866.6667
-4701 38550.0000 22016.6667
-4702 38550.0000 22066.6667
-4703 38550.0000 22116.6667
-4704 38550.0000 22166.6667
-4705 38550.0000 22416.6667
-4706 38550.0000 22833.3333
-4707 38550.0000 23083.3333
-4708 38550.0000 23783.3333
-4709 38550.0000 23850.0000
-4710 38550.0000 23900.0000
-4711 38550.0000 24000.0000
-4712 38550.0000 24050.0000
-4713 38550.0000 24083.3333
-4714 38550.0000 25850.0000
-4715 38550.0000 25933.3333
-4716 38566.6667 20916.6667
-4717 38566.6667 21100.0000
-4718 38566.6667 21300.0000
-4719 38566.6667 21633.3333
-4720 38566.6667 21650.0000
-4721 38566.6667 21666.6667
-4722 38566.6667 21683.3333
-4723 38566.6667 21700.0000
-4724 38566.6667 21850.0000
-4725 38566.6667 21916.6667
-4726 38566.6667 21966.6667
-4727 38566.6667 22016.6667
-4728 38566.6667 22150.0000
-4729 38566.6667 22700.0000
-4730 38566.6667 22750.0000
-4731 38566.6667 22783.3333
-4732 38566.6667 22866.6667
-4733 38566.6667 23100.0000
-4734 38566.6667 23216.6667
-4735 38566.6667 23283.3333
-4736 38566.6667 23600.0000
-4737 38566.6667 23633.3333
-4738 38566.6667 23766.6667
-4739 38566.6667 23816.6667
-4740 38566.6667 23833.3333
-4741 38566.6667 23850.0000
-4742 38566.6667 24050.0000
-4743 38566.6667 24066.6667
-4744 38566.6667 24083.3333
-4745 38566.6667 25866.6667
-4746 38566.6667 25883.3333
-4747 38566.6667 25916.6667
-4748 38566.6667 25950.0000
-4749 38566.6667 25983.3333
-4750 38566.6667 26033.3333
-4751 38583.3333 20550.0000
-4752 38583.3333 21066.6667
-4753 38583.3333 21150.0000
-4754 38583.3333 21166.6667
-4755 38583.3333 21233.3333
-4756 38583.3333 21383.3333
-4757 38583.3333 21450.0000
-4758 38583.3333 21616.6667
-4759 38583.3333 21633.3333
-4760 38583.3333 21650.0000
-4761 38583.3333 21666.6667
-4762 38583.3333 21683.3333
-4763 38583.3333 21716.6667
-4764 38583.3333 21750.0000
-4765 38583.3333 21833.3333
-4766 38583.3333 21883.3333
-4767 38583.3333 21933.3333
-4768 38583.3333 21983.3333
-4769 38583.3333 22050.0000
-4770 38583.3333 22333.3333
-4771 38583.3333 22416.6667
-4772 38583.3333 22666.6667
-4773 38583.3333 22750.0000
-4774 38583.3333 22800.0000
-4775 38583.3333 22950.0000
-4776 38583.3333 23033.3333
-4777 38583.3333 23550.0000
-4778 38583.3333 23633.3333
-4779 38583.3333 23716.6667
-4780 38583.3333 23766.6667
-4781 38583.3333 23800.0000
-4782 38583.3333 23833.3333
-4783 38583.3333 24050.0000
-4784 38583.3333 24066.6667
-4785 38583.3333 24083.3333
-4786 38583.3333 24100.0000
-4787 38583.3333 24116.6667
-4788 38583.3333 24133.3333
-4789 38583.3333 25916.6667
-4790 38583.3333 25966.6667
-4791 38583.3333 26016.6667
-4792 38600.0000 20883.3333
-4793 38600.0000 21083.3333
-4794 38600.0000 21183.3333
-4795 38600.0000 21316.6667
-4796 38600.0000 21400.0000
-4797 38600.0000 21450.0000
-4798 38600.0000 21483.3333
-4799 38600.0000 21500.0000
-4800 38600.0000 21550.0000
-4801 38600.0000 21566.6667
-4802 38600.0000 21583.3333
-4803 38600.0000 21600.0000
-4804 38600.0000 21650.0000
-4805 38600.0000 21666.6667
-4806 38600.0000 21733.3333
-4807 38600.0000 21800.0000
-4808 38600.0000 21850.0000
-4809 38600.0000 21933.3333
-4810 38600.0000 22050.0000
-4811 38600.0000 22116.6667
-4812 38600.0000 22183.3333
-4813 38600.0000 22500.0000
-4814 38600.0000 22716.6667
-4815 38600.0000 22766.6667
-4816 38600.0000 22850.0000
-4817 38600.0000 23216.6667
-4818 38600.0000 23550.0000
-4819 38600.0000 23666.6667
-4820 38600.0000 23783.3333
-4821 38600.0000 24083.3333
-4822 38600.0000 24100.0000
-4823 38600.0000 24116.6667
-4824 38616.6667 20600.0000
-4825 38616.6667 20666.6667
-4826 38616.6667 20683.3333
-4827 38616.6667 20933.3333
-4828 38616.6667 21216.6667
-4829 38616.6667 21300.0000
-4830 38616.6667 21316.6667
-4831 38616.6667 21383.3333
-4832 38616.6667 21450.0000
-4833 38616.6667 21500.0000
-4834 38616.6667 21516.6667
-4835 38616.6667 21533.3333
-4836 38616.6667 21566.6667
-4837 38616.6667 21600.0000
-4838 38616.6667 21616.6667
-4839 38616.6667 21683.3333
-4840 38616.6667 21700.0000
-4841 38616.6667 21783.3333
-4842 38616.6667 21883.3333
-4843 38616.6667 22200.0000
-4844 38616.6667 22550.0000
-4845 38616.6667 22650.0000
-4846 38616.6667 23116.6667
-4847 38616.6667 23166.6667
-4848 38616.6667 23233.3333
-4849 38616.6667 23533.3333
-4850 38616.6667 23566.6667
-4851 38616.6667 23700.0000
-4852 38616.6667 23733.3333
-4853 38616.6667 23750.0000
-4854 38616.6667 23883.3333
-4855 38616.6667 23950.0000
-4856 38616.6667 24050.0000
-4857 38616.6667 24066.6667
-4858 38616.6667 24083.3333
-4859 38616.6667 24116.6667
-4860 38633.3333 20600.0000
-4861 38633.3333 20633.3333
-4862 38633.3333 20650.0000
-4863 38633.3333 20716.6667
-4864 38633.3333 21150.0000
-4865 38633.3333 21183.3333
-4866 38633.3333 21350.0000
-4867 38633.3333 21366.6667
-4868 38633.3333 21400.0000
-4869 38633.3333 21416.6667
-4870 38633.3333 21433.3333
-4871 38633.3333 21450.0000
-4872 38633.3333 21466.6667
-4873 38633.3333 21483.3333
-4874 38633.3333 21566.6667
-4875 38633.3333 21583.3333
-4876 38633.3333 21616.6667
-4877 38633.3333 21666.6667
-4878 38633.3333 21683.3333
-4879 38633.3333 21700.0000
-4880 38633.3333 21716.6667
-4881 38633.3333 21733.3333
-4882 38633.3333 21800.0000
-4883 38633.3333 21983.3333
-4884 38633.3333 22016.6667
-4885 38633.3333 22100.0000
-4886 38633.3333 22183.3333
-4887 38633.3333 22216.6667
-4888 38633.3333 22500.0000
-4889 38633.3333 22533.3333
-4890 38633.3333 22583.3333
-4891 38633.3333 22733.3333
-4892 38633.3333 22766.6667
-4893 38633.3333 22883.3333
-4894 38633.3333 23083.3333
-4895 38633.3333 23600.0000
-4896 38633.3333 23616.6667
-4897 38633.3333 23633.3333
-4898 38633.3333 23933.3333
-4899 38633.3333 24050.0000
-4900 38633.3333 24066.6667
-4901 38633.3333 24083.3333
-4902 38633.3333 24100.0000
-4903 38633.3333 24133.3333
-4904 38650.0000 20683.3333
-4905 38650.0000 20783.3333
-4906 38650.0000 20933.3333
-4907 38650.0000 21283.3333
-4908 38650.0000 21383.3333
-4909 38650.0000 21416.6667
-4910 38650.0000 21450.0000
-4911 38650.0000 21483.3333
-4912 38650.0000 21533.3333
-4913 38650.0000 21550.0000
-4914 38650.0000 21616.6667
-4915 38650.0000 21650.0000
-4916 38650.0000 21683.3333
-4917 38650.0000 21750.0000
-4918 38650.0000 21766.6667
-4919 38650.0000 21833.3333
-4920 38650.0000 21916.6667
-4921 38650.0000 21966.6667
-4922 38650.0000 22033.3333
-4923 38650.0000 22066.6667
-4924 38650.0000 22416.6667
-4925 38650.0000 22466.6667
-4926 38650.0000 23000.0000
-4927 38650.0000 23166.6667
-4928 38650.0000 23183.3333
-4929 38650.0000 23583.3333
-4930 38650.0000 23900.0000
-4931 38666.6667 20566.6667
-4932 38666.6667 20600.0000
-4933 38666.6667 20650.0000
-4934 38666.6667 20700.0000
-4935 38666.6667 20766.6667
-4936 38666.6667 20783.3333
-4937 38666.6667 20933.3333
-4938 38666.6667 21083.3333
-4939 38666.6667 21150.0000
-4940 38666.6667 21316.6667
-4941 38666.6667 21366.6667
-4942 38666.6667 21383.3333
-4943 38666.6667 21433.3333
-4944 38666.6667 21500.0000
-4945 38666.6667 21516.6667
-4946 38666.6667 21533.3333
-4947 38666.6667 21616.6667
-4948 38666.6667 21633.3333
-4949 38666.6667 21716.6667
-4950 38666.6667 21733.3333
-4951 38666.6667 21816.6667
-4952 38666.6667 21833.3333
-4953 38666.6667 21866.6667
-4954 38666.6667 21900.0000
-4955 38666.6667 22000.0000
-4956 38666.6667 22433.3333
-4957 38666.6667 22566.6667
-4958 38666.6667 22666.6667
-4959 38666.6667 22883.3333
-4960 38666.6667 23083.3333
-4961 38666.6667 23783.3333
-4962 38666.6667 23816.6667
-4963 38683.3333 20583.3333
-4964 38683.3333 20616.6667
-4965 38683.3333 20666.6667
-4966 38683.3333 20683.3333
-4967 38683.3333 20700.0000
-4968 38683.3333 21266.6667
-4969 38683.3333 21366.6667
-4970 38683.3333 21416.6667
-4971 38683.3333 21466.6667
-4972 38683.3333 21483.3333
-4973 38683.3333 21533.3333
-4974 38683.3333 21666.6667
-4975 38683.3333 21750.0000
-4976 38683.3333 21800.0000
-4977 38683.3333 21833.3333
-4978 38683.3333 21866.6667
-4979 38683.3333 21900.0000
-4980 38683.3333 21983.3333
-4981 38683.3333 22200.0000
-4982 38683.3333 22333.3333
-4983 38683.3333 23000.0000
-4984 38683.3333 23583.3333
-4985 38683.3333 23733.3333
-4986 38683.3333 23766.6667
-4987 38683.3333 23783.3333
-4988 38700.0000 20616.6667
-4989 38700.0000 20633.3333
-4990 38700.0000 20683.3333
-4991 38700.0000 20700.0000
-4992 38700.0000 20716.6667
-4993 38700.0000 20933.3333
-4994 38700.0000 20966.6667
-4995 38700.0000 21000.0000
-4996 38700.0000 21033.3333
-4997 38700.0000 21183.3333
-4998 38700.0000 21283.3333
-4999 38700.0000 21333.3333
-5000 38700.0000 21350.0000
-5001 38700.0000 21366.6667
-5002 38700.0000 21450.0000
-5003 38700.0000 21600.0000
-5004 38700.0000 21650.0000
-5005 38700.0000 21700.0000
-5006 38700.0000 21733.3333
-5007 38700.0000 21783.3333
-5008 38700.0000 21933.3333
-5009 38700.0000 22033.3333
-5010 38700.0000 22183.3333
-5011 38700.0000 22250.0000
-5012 38700.0000 22283.3333
-5013 38700.0000 22350.0000
-5014 38700.0000 22416.6667
-5015 38700.0000 22633.3333
-5016 38700.0000 23583.3333
-5017 38716.6667 20583.3333
-5018 38716.6667 20600.0000
-5019 38716.6667 20666.6667
-5020 38716.6667 20683.3333
-5021 38716.6667 20733.3333
-5022 38716.6667 20933.3333
-5023 38716.6667 21083.3333
-5024 38716.6667 21166.6667
-5025 38716.6667 21466.6667
-5026 38716.6667 21516.6667
-5027 38716.6667 21533.3333
-5028 38716.6667 21566.6667
-5029 38716.6667 21650.0000
-5030 38716.6667 21683.3333
-5031 38716.6667 21700.0000
-5032 38716.6667 21800.0000
-5033 38716.6667 21866.6667
-5034 38716.6667 21966.6667
-5035 38716.6667 22366.6667
-5036 38716.6667 22400.0000
-5037 38716.6667 22466.6667
-5038 38716.6667 22483.3333
-5039 38716.6667 22550.0000
-5040 38716.6667 22583.3333
-5041 38716.6667 22700.0000
-5042 38716.6667 22883.3333
-5043 38716.6667 22933.3333
-5044 38716.6667 23050.0000
-5045 38716.6667 23433.3333
-5046 38716.6667 23450.0000
-5047 38716.6667 23733.3333
-5048 38716.6667 23750.0000
-5049 38733.3333 20650.0000
-5050 38733.3333 20666.6667
-5051 38733.3333 20983.3333
-5052 38733.3333 21116.6667
-5053 38733.3333 21350.0000
-5054 38733.3333 21450.0000
-5055 38733.3333 21466.6667
-5056 38733.3333 21516.6667
-5057 38733.3333 21650.0000
-5058 38733.3333 21666.6667
-5059 38733.3333 21700.0000
-5060 38733.3333 21716.6667
-5061 38733.3333 21733.3333
-5062 38733.3333 21916.6667
-5063 38733.3333 21933.3333
-5064 38733.3333 21966.6667
-5065 38733.3333 22000.0000
-5066 38733.3333 22233.3333
-5067 38733.3333 22333.3333
-5068 38733.3333 22400.0000
-5069 38733.3333 22450.0000
-5070 38733.3333 22666.6667
-5071 38733.3333 22733.3333
-5072 38733.3333 22750.0000
-5073 38733.3333 22933.3333
-5074 38733.3333 23333.3333
-5075 38733.3333 23416.6667
-5076 38733.3333 23483.3333
-5077 38750.0000 20600.0000
-5078 38750.0000 20616.6667
-5079 38750.0000 20650.0000
-5080 38750.0000 20683.3333
-5081 38750.0000 20716.6667
-5082 38750.0000 21033.3333
-5083 38750.0000 21066.6667
-5084 38750.0000 21133.3333
-5085 38750.0000 21200.0000
-5086 38750.0000 21400.0000
-5087 38750.0000 21433.3333
-5088 38750.0000 21450.0000
-5089 38750.0000 21516.6667
-5090 38750.0000 21533.3333
-5091 38750.0000 21616.6667
-5092 38750.0000 21666.6667
-5093 38750.0000 21683.3333
-5094 38750.0000 21700.0000
-5095 38750.0000 21750.0000
-5096 38750.0000 21783.3333
-5097 38750.0000 21816.6667
-5098 38750.0000 21850.0000
-5099 38750.0000 21916.6667
-5100 38750.0000 22166.6667
-5101 38750.0000 22216.6667
-5102 38750.0000 22266.6667
-5103 38750.0000 22450.0000
-5104 38750.0000 22616.6667
-5105 38750.0000 22700.0000
-5106 38750.0000 22783.3333
-5107 38750.0000 22950.0000
-5108 38750.0000 23033.3333
-5109 38750.0000 23400.0000
-5110 38750.0000 23433.3333
-5111 38750.0000 23583.3333
-5112 38750.0000 23666.6667
-5113 38750.0000 23733.3333
-5114 38766.6667 20633.3333
-5115 38766.6667 20650.0000
-5116 38766.6667 20716.6667
-5117 38766.6667 20883.3333
-5118 38766.6667 20983.3333
-5119 38766.6667 21400.0000
-5120 38766.6667 21416.6667
-5121 38766.6667 21433.3333
-5122 38766.6667 21483.3333
-5123 38766.6667 21583.3333
-5124 38766.6667 21616.6667
-5125 38766.6667 21700.0000
-5126 38766.6667 21750.0000
-5127 38766.6667 21783.3333
-5128 38766.6667 21800.0000
-5129 38766.6667 21883.3333
-5130 38766.6667 22133.3333
-5131 38766.6667 22366.6667
-5132 38766.6667 22400.0000
-5133 38766.6667 22450.0000
-5134 38766.6667 22616.6667
-5135 38766.6667 22650.0000
-5136 38766.6667 22850.0000
-5137 38766.6667 22900.0000
-5138 38766.6667 23316.6667
-5139 38766.6667 23433.3333
-5140 38766.6667 23550.0000
-5141 38766.6667 23700.0000
-5142 38783.3333 20616.6667
-5143 38783.3333 20650.0000
-5144 38783.3333 20666.6667
-5145 38783.3333 20700.0000
-5146 38783.3333 20833.3333
-5147 38783.3333 20883.3333
-5148 38783.3333 20900.0000
-5149 38783.3333 21033.3333
-5150 38783.3333 21116.6667
-5151 38783.3333 21283.3333
-5152 38783.3333 21433.3333
-5153 38783.3333 21450.0000
-5154 38783.3333 21483.3333
-5155 38783.3333 21533.3333
-5156 38783.3333 21616.6667
-5157 38783.3333 21633.3333
-5158 38783.3333 21683.3333
-5159 38783.3333 21716.6667
-5160 38783.3333 21866.6667
-5161 38783.3333 22083.3333
-5162 38783.3333 22366.6667
-5163 38783.3333 22416.6667
-5164 38783.3333 22583.3333
-5165 38783.3333 22783.3333
-5166 38783.3333 23266.6667
-5167 38783.3333 23300.0000
-5168 38783.3333 23333.3333
-5169 38783.3333 23400.0000
-5170 38783.3333 23433.3333
-5171 38783.3333 23500.0000
-5172 38800.0000 20716.6667
-5173 38800.0000 20766.6667
-5174 38800.0000 21166.6667
-5175 38800.0000 21366.6667
-5176 38800.0000 21450.0000
-5177 38800.0000 21466.6667
-5178 38800.0000 21516.6667
-5179 38800.0000 21583.3333
-5180 38800.0000 21616.6667
-5181 38800.0000 21633.3333
-5182 38800.0000 21650.0000
-5183 38800.0000 21716.6667
-5184 38800.0000 21733.3333
-5185 38800.0000 21800.0000
-5186 38800.0000 22050.0000
-5187 38800.0000 22116.6667
-5188 38800.0000 22200.0000
-5189 38800.0000 22383.3333
-5190 38800.0000 22416.6667
-5191 38800.0000 22450.0000
-5192 38800.0000 22466.6667
-5193 38800.0000 22500.0000
-5194 38800.0000 22533.3333
-5195 38800.0000 22550.0000
-5196 38800.0000 22700.0000
-5197 38800.0000 22716.6667
-5198 38800.0000 23350.0000
-5199 38800.0000 23433.3333
-5200 38800.0000 23483.3333
-5201 38800.0000 23500.0000
-5202 38800.0000 23516.6667
-5203 38800.0000 24583.3333
-5204 38816.6667 20650.0000
-5205 38816.6667 20683.3333
-5206 38816.6667 20716.6667
-5207 38816.6667 20750.0000
-5208 38816.6667 20833.3333
-5209 38816.6667 20916.6667
-5210 38816.6667 21016.6667
-5211 38816.6667 21233.3333
-5212 38816.6667 21333.3333
-5213 38816.6667 21366.6667
-5214 38816.6667 21383.3333
-5215 38816.6667 21400.0000
-5216 38816.6667 21433.3333
-5217 38816.6667 21466.6667
-5218 38816.6667 21500.0000
-5219 38816.6667 21616.6667
-5220 38816.6667 22000.0000
-5221 38816.6667 22016.6667
-5222 38816.6667 22166.6667
-5223 38816.6667 22433.3333
-5224 38816.6667 22600.0000
-5225 38816.6667 22650.0000
-5226 38816.6667 22683.3333
-5227 38816.6667 22733.3333
-5228 38816.6667 23233.3333
-5229 38816.6667 23250.0000
-5230 38816.6667 23266.6667
-5231 38816.6667 23366.6667
-5232 38816.6667 23416.6667
-5233 38816.6667 23450.0000
-5234 38833.3333 20683.3333
-5235 38833.3333 20700.0000
-5236 38833.3333 20750.0000
-5237 38833.3333 20900.0000
-5238 38833.3333 21000.0000
-5239 38833.3333 21066.6667
-5240 38833.3333 21183.3333
-5241 38833.3333 21250.0000
-5242 38833.3333 21416.6667
-5243 38833.3333 21466.6667
-5244 38833.3333 21516.6667
-5245 38833.3333 21533.3333
-5246 38833.3333 21583.3333
-5247 38833.3333 21600.0000
-5248 38833.3333 21616.6667
-5249 38833.3333 21633.3333
-5250 38833.3333 21716.6667
-5251 38833.3333 21733.3333
-5252 38833.3333 21800.0000
-5253 38833.3333 21966.6667
-5254 38833.3333 22050.0000
-5255 38833.3333 22083.3333
-5256 38833.3333 22166.6667
-5257 38833.3333 22400.0000
-5258 38833.3333 22416.6667
-5259 38833.3333 22450.0000
-5260 38833.3333 22883.3333
-5261 38833.3333 23250.0000
-5262 38833.3333 23283.3333
-5263 38833.3333 23333.3333
-5264 38833.3333 23366.6667
-5265 38833.3333 23400.0000
-5266 38833.3333 23466.6667
-5267 38833.3333 24533.3333
-5268 38850.0000 20950.0000
-5269 38850.0000 21333.3333
-5270 38850.0000 21383.3333
-5271 38850.0000 21450.0000
-5272 38850.0000 21466.6667
-5273 38850.0000 21516.6667
-5274 38850.0000 21633.3333
-5275 38850.0000 21916.6667
-5276 38850.0000 21933.3333
-5277 38850.0000 21966.6667
-5278 38850.0000 22183.3333
-5279 38850.0000 22216.6667
-5280 38850.0000 22366.6667
-5281 38850.0000 22383.3333
-5282 38850.0000 22433.3333
-5283 38850.0000 22466.6667
-5284 38850.0000 22866.6667
-5285 38850.0000 22900.0000
-5286 38850.0000 23050.0000
-5287 38850.0000 23066.6667
-5288 38850.0000 23100.0000
-5289 38850.0000 23116.6667
-5290 38850.0000 23133.3333
-5291 38850.0000 23250.0000
-5292 38850.0000 23283.3333
-5293 38850.0000 23300.0000
-5294 38850.0000 23400.0000
-5295 38866.6667 20800.0000
-5296 38866.6667 20983.3333
-5297 38866.6667 21000.0000
-5298 38866.6667 21016.6667
-5299 38866.6667 21033.3333
-5300 38866.6667 21066.6667
-5301 38866.6667 21166.6667
-5302 38866.6667 21283.3333
-5303 38866.6667 21350.0000
-5304 38866.6667 21366.6667
-5305 38866.6667 21500.0000
-5306 38866.6667 21516.6667
-5307 38866.6667 21566.6667
-5308 38866.6667 21583.3333
-5309 38866.6667 21616.6667
-5310 38866.6667 21633.3333
-5311 38866.6667 21666.6667
-5312 38866.6667 21683.3333
-5313 38866.6667 21700.0000
-5314 38866.6667 21733.3333
-5315 38866.6667 21750.0000
-5316 38866.6667 21766.6667
-5317 38866.6667 21783.3333
-5318 38866.6667 21966.6667
-5319 38866.6667 22033.3333
-5320 38866.6667 22133.3333
-5321 38866.6667 22200.0000
-5322 38866.6667 22233.3333
-5323 38866.6667 22350.0000
-5324 38866.6667 22750.0000
-5325 38866.6667 22966.6667
-5326 38866.6667 23216.6667
-5327 38866.6667 23233.3333
-5328 38866.6667 23366.6667
-5329 38866.6667 23400.0000
-5330 38883.3333 21200.0000
-5331 38883.3333 21550.0000
-5332 38883.3333 21566.6667
-5333 38883.3333 21600.0000
-5334 38883.3333 21650.0000
-5335 38883.3333 21700.0000
-5336 38883.3333 21750.0000
-5337 38883.3333 21800.0000
-5338 38883.3333 21833.3333
-5339 38883.3333 21966.6667
-5340 38883.3333 22050.0000
-5341 38883.3333 22100.0000
-5342 38883.3333 22116.6667
-5343 38883.3333 22200.0000
-5344 38883.3333 22216.6667
-5345 38883.3333 22250.0000
-5346 38883.3333 22266.6667
-5347 38883.3333 22316.6667
-5348 38883.3333 22400.0000
-5349 38883.3333 22416.6667
-5350 38883.3333 22433.3333
-5351 38883.3333 22466.6667
-5352 38883.3333 22483.3333
-5353 38883.3333 22716.6667
-5354 38883.3333 22783.3333
-5355 38883.3333 22816.6667
-5356 38883.3333 23050.0000
-5357 38883.3333 23166.6667
-5358 38900.0000 21100.0000
-5359 38900.0000 21316.6667
-5360 38900.0000 21333.3333
-5361 38900.0000 21450.0000
-5362 38900.0000 21566.6667
-5363 38900.0000 21583.3333
-5364 38900.0000 21600.0000
-5365 38900.0000 21633.3333
-5366 38900.0000 21716.6667
-5367 38900.0000 21766.6667
-5368 38900.0000 21866.6667
-5369 38900.0000 22033.3333
-5370 38900.0000 22050.0000
-5371 38900.0000 22066.6667
-5372 38900.0000 22100.0000
-5373 38900.0000 22116.6667
-5374 38900.0000 22166.6667
-5375 38900.0000 22216.6667
-5376 38900.0000 22233.3333
-5377 38900.0000 22283.3333
-5378 38900.0000 22333.3333
-5379 38900.0000 22366.6667
-5380 38900.0000 22433.3333
-5381 38900.0000 22583.3333
-5382 38900.0000 22733.3333
-5383 38900.0000 23033.3333
-5384 38900.0000 23050.0000
-5385 38900.0000 23066.6667
-5386 38900.0000 23133.3333
-5387 38900.0000 23166.6667
-5388 38900.0000 23183.3333
-5389 38900.0000 23216.6667
-5390 38900.0000 23266.6667
-5391 38900.0000 23333.3333
-5392 38900.0000 23350.0000
-5393 38900.0000 23400.0000
-5394 38904.1667 24563.0556
-5395 38916.6667 20883.3333
-5396 38916.6667 20950.0000
-5397 38916.6667 21200.0000
-5398 38916.6667 21216.6667
-5399 38916.6667 21266.6667
-5400 38916.6667 21483.3333
-5401 38916.6667 21633.3333
-5402 38916.6667 21666.6667
-5403 38916.6667 21683.3333
-5404 38916.6667 21783.3333
-5405 38916.6667 21916.6667
-5406 38916.6667 22000.0000
-5407 38916.6667 22166.6667
-5408 38916.6667 22216.6667
-5409 38916.6667 22233.3333
-5410 38916.6667 22300.0000
-5411 38916.6667 22550.0000
-5412 38916.6667 22616.6667
-5413 38916.6667 22650.0000
-5414 38916.6667 22700.0000
-5415 38916.6667 22800.0000
-5416 38916.6667 23116.6667
-5417 38916.6667 23183.3333
-5418 38916.6667 23200.0000
-5419 38916.6667 23216.6667
-5420 38933.3333 20850.0000
-5421 38933.3333 21150.0000
-5422 38933.3333 21400.0000
-5423 38933.3333 21433.3333
-5424 38933.3333 21600.0000
-5425 38933.3333 21700.0000
-5426 38933.3333 21716.6667
-5427 38933.3333 21916.6667
-5428 38933.3333 21983.3333
-5429 38933.3333 22016.6667
-5430 38933.3333 22033.3333
-5431 38933.3333 22116.6667
-5432 38933.3333 22250.0000
-5433 38933.3333 22350.0000
-5434 38933.3333 22400.0000
-5435 38933.3333 22416.6667
-5436 38933.3333 22733.3333
-5437 38933.3333 22783.3333
-5438 38933.3333 23066.6667
-5439 38933.3333 23150.0000
-5440 38933.3333 23166.6667
-5441 38933.3333 23283.3333
-5442 38933.3333 23366.6667
-5443 38933.3333 23416.6667
-5444 38950.0000 20733.3333
-5445 38950.0000 20750.0000
-5446 38950.0000 21183.3333
-5447 38950.0000 21200.0000
-5448 38950.0000 21416.6667
-5449 38950.0000 21516.6667
-5450 38950.0000 21600.0000
-5451 38950.0000 21650.0000
-5452 38950.0000 21666.6667
-5453 38950.0000 21883.3333
-5454 38950.0000 21966.6667
-5455 38950.0000 22050.0000
-5456 38950.0000 22150.0000
-5457 38950.0000 22200.0000
-5458 38950.0000 22216.6667
-5459 38950.0000 22316.6667
-5460 38950.0000 22516.6667
-5461 38950.0000 22633.3333
-5462 38950.0000 22833.3333
-5463 38950.0000 22916.6667
-5464 38950.0000 22966.6667
-5465 38950.0000 23100.0000
-5466 38950.0000 23150.0000
-5467 38950.0000 23183.3333
-5468 38950.0000 23266.6667
-5469 38962.5000 21150.0000
-5470 38966.6667 20783.3333
-5471 38966.6667 21166.6667
-5472 38966.6667 21183.3333
-5473 38966.6667 21200.0000
-5474 38966.6667 21216.6667
-5475 38966.6667 21283.3333
-5476 38966.6667 21316.6667
-5477 38966.6667 21333.3333
-5478 38966.6667 21450.0000
-5479 38966.6667 21483.3333
-5480 38966.6667 21566.6667
-5481 38966.6667 21616.6667
-5482 38966.6667 21716.6667
-5483 38966.6667 21866.6667
-5484 38966.6667 21966.6667
-5485 38966.6667 22000.0000
-5486 38966.6667 22100.0000
-5487 38966.6667 22116.6667
-5488 38966.6667 22166.6667
-5489 38966.6667 22200.0000
-5490 38966.6667 22450.0000
-5491 38966.6667 22500.0000
-5492 38966.6667 22800.0000
-5493 38966.6667 22900.0000
-5494 38966.6667 23150.0000
-5495 38966.6667 23166.6667
-5496 38966.6667 23233.3333
-5497 38966.6667 23300.0000
-5498 38966.6667 23350.0000
-5499 38976.3889 26368.3333
-5500 38983.3333 20783.3333
-5501 38983.3333 21300.0000
-5502 38983.3333 21350.0000
-5503 38983.3333 21366.6667
-5504 38983.3333 21383.3333
-5505 38983.3333 21400.0000
-5506 38983.3333 21433.3333
-5507 38983.3333 21616.6667
-5508 38983.3333 21683.3333
-5509 38983.3333 21816.6667
-5510 38983.3333 21900.0000
-5511 38983.3333 22000.0000
-5512 38983.3333 22566.6667
-5513 38983.3333 22850.0000
-5514 38983.3333 23233.3333
-5515 38983.3333 23316.6667
-5516 38983.3333 26383.3333
-5517 38983.3333 26400.0000
-5518 38988.3333 26311.3889
-5519 39000.0000 20700.0000
-5520 39000.0000 21150.0000
-5521 39000.0000 21166.6667
-5522 39000.0000 21200.0000
-5523 39000.0000 21250.0000
-5524 39000.0000 21300.0000
-5525 39000.0000 21383.3333
-5526 39000.0000 21466.6667
-5527 39000.0000 21600.0000
-5528 39000.0000 21616.6667
-5529 39000.0000 21633.3333
-5530 39000.0000 21716.6667
-5531 39000.0000 21733.3333
-5532 39000.0000 21800.0000
-5533 39000.0000 21850.0000
-5534 39000.0000 21916.6667
-5535 39000.0000 21933.3333
-5536 39000.0000 22000.0000
-5537 39000.0000 22116.6667
-5538 39000.0000 22216.6667
-5539 39000.0000 22266.6667
-5540 39000.0000 22350.0000
-5541 39000.0000 22933.3333
-5542 39000.0000 22950.0000
-5543 39000.0000 23116.6667
-5544 39000.0000 23200.0000
-5545 39000.0000 23250.0000
-5546 39000.0000 23333.3333
-5547 39000.0000 26316.6667
-5548 39016.6667 20916.6667
-5549 39016.6667 21200.0000
-5550 39016.6667 21266.6667
-5551 39016.6667 21316.6667
-5552 39016.6667 21383.3333
-5553 39016.6667 21400.0000
-5554 39016.6667 21550.0000
-5555 39016.6667 21683.3333
-5556 39016.6667 21700.0000
-5557 39016.6667 21766.6667
-5558 39016.6667 21783.3333
-5559 39016.6667 21816.6667
-5560 39016.6667 21900.0000
-5561 39016.6667 22133.3333
-5562 39016.6667 22250.0000
-5563 39016.6667 22616.6667
-5564 39016.6667 22850.0000
-5565 39016.6667 23033.3333
-5566 39016.6667 23233.3333
-5567 39016.6667 23250.0000
-5568 39016.6667 23300.0000
-5569 39019.1667 26365.8333
-5570 39026.3889 26307.7778
-5571 39028.8889 26321.1111
-5572 39029.7222 26448.3333
-5573 39033.3333 20733.3333
-5574 39033.3333 20750.0000
-5575 39033.3333 20866.6667
-5576 39033.3333 21083.3333
-5577 39033.3333 21150.0000
-5578 39033.3333 21300.0000
-5579 39033.3333 21316.6667
-5580 39033.3333 21450.0000
-5581 39033.3333 21583.3333
-5582 39033.3333 21666.6667
-5583 39033.3333 21700.0000
-5584 39033.3333 21733.3333
-5585 39033.3333 21816.6667
-5586 39033.3333 22066.6667
-5587 39033.3333 22116.6667
-5588 39033.3333 22283.3333
-5589 39033.3333 22333.3333
-5590 39033.3333 22400.0000
-5591 39033.3333 22416.6667
-5592 39033.3333 22516.6667
-5593 39033.3333 22800.0000
-5594 39033.3333 22950.0000
-5595 39033.3333 22966.6667
-5596 39033.3333 26316.6667
-5597 39036.3889 26444.4444
-5598 39039.4444 26201.1111
-5599 39039.4444 26454.7222
-5600 39045.5556 26454.4444
-5601 39046.3889 26533.0556
-5602 39048.3333 26497.2222
-5603 39050.0000 21033.3333
-5604 39050.0000 21116.6667
-5605 39050.0000 21150.0000
-5606 39050.0000 21166.6667
-5607 39050.0000 21216.6667
-5608 39050.0000 21250.0000
-5609 39050.0000 21266.6667
-5610 39050.0000 21283.3333
-5611 39050.0000 21300.0000
-5612 39050.0000 21366.6667
-5613 39050.0000 21450.0000
-5614 39050.0000 21466.6667
-5615 39050.0000 21533.3333
-5616 39050.0000 21566.6667
-5617 39050.0000 21583.3333
-5618 39050.0000 21633.3333
-5619 39050.0000 21750.0000
-5620 39050.0000 22316.6667
-5621 39050.0000 22450.0000
-5622 39050.0000 22950.0000
-5623 39050.0000 26266.6667
-5624 39050.0000 26316.6667
-5625 39055.8333 26451.1111
-5626 39056.9444 26545.0000
-5627 39066.6667 20700.0000
-5628 39066.6667 20750.0000
-5629 39066.6667 20933.3333
-5630 39066.6667 21016.6667
-5631 39066.6667 21033.3333
-5632 39066.6667 21050.0000
-5633 39066.6667 21100.0000
-5634 39066.6667 21116.6667
-5635 39066.6667 21150.0000
-5636 39066.6667 21183.3333
-5637 39066.6667 21216.6667
-5638 39066.6667 21233.3333
-5639 39066.6667 21266.6667
-5640 39066.6667 21283.3333
-5641 39066.6667 21400.0000
-5642 39066.6667 21450.0000
-5643 39066.6667 21466.6667
-5644 39066.6667 21483.3333
-5645 39066.6667 21516.6667
-5646 39066.6667 21533.3333
-5647 39066.6667 21550.0000
-5648 39066.6667 21633.3333
-5649 39066.6667 21683.3333
-5650 39066.6667 21733.3333
-5651 39066.6667 21800.0000
-5652 39066.6667 21883.3333
-5653 39066.6667 21983.3333
-5654 39066.6667 22066.6667
-5655 39066.6667 22116.6667
-5656 39066.6667 22183.3333
-5657 39066.6667 22483.3333
-5658 39066.6667 22550.0000
-5659 39066.6667 22800.0000
-5660 39066.6667 26566.6667
-5661 39066.6667 26583.3333
-5662 39081.1111 26183.3333
-5663 39083.3333 20716.6667
-5664 39083.3333 20750.0000
-5665 39083.3333 20866.6667
-5666 39083.3333 20916.6667
-5667 39083.3333 20933.3333
-5668 39083.3333 20950.0000
-5669 39083.3333 21016.6667
-5670 39083.3333 21050.0000
-5671 39083.3333 21083.3333
-5672 39083.3333 21100.0000
-5673 39083.3333 21150.0000
-5674 39083.3333 21200.0000
-5675 39083.3333 21250.0000
-5676 39083.3333 21266.6667
-5677 39083.3333 21283.3333
-5678 39083.3333 21383.3333
-5679 39083.3333 21433.3333
-5680 39083.3333 21483.3333
-5681 39083.3333 21500.0000
-5682 39083.3333 21566.6667
-5683 39083.3333 21583.3333
-5684 39083.3333 21633.3333
-5685 39083.3333 21650.0000
-5686 39083.3333 21833.3333
-5687 39083.3333 22150.0000
-5688 39083.3333 22316.6667
-5689 39083.3333 22350.0000
-5690 39083.3333 22416.6667
-5691 39083.3333 22783.3333
-5692 39083.3333 22866.6667
-5693 39083.3333 26433.3333
-5694 39083.3333 26550.0000
-5695 39083.3333 26566.6667
-5696 39085.0000 26370.0000
-5697 39100.0000 20700.0000
-5698 39100.0000 20883.3333
-5699 39100.0000 20950.0000
-5700 39100.0000 20983.3333
-5701 39100.0000 21000.0000
-5702 39100.0000 21016.6667
-5703 39100.0000 21083.3333
-5704 39100.0000 21100.0000
-5705 39100.0000 21150.0000
-5706 39100.0000 21233.3333
-5707 39100.0000 21266.6667
-5708 39100.0000 21283.3333
-5709 39100.0000 21433.3333
-5710 39100.0000 21500.0000
-5711 39100.0000 21516.6667
-5712 39100.0000 21666.6667
-5713 39100.0000 21783.3333
-5714 39100.0000 21816.6667
-5715 39100.0000 21850.0000
-5716 39100.0000 21866.6667
-5717 39100.0000 21983.3333
-5718 39100.0000 22200.0000
-5719 39100.0000 22233.3333
-5720 39100.0000 22266.6667
-5721 39100.0000 22350.0000
-5722 39100.0000 22416.6667
-5723 39100.0000 22716.6667
-5724 39100.0000 22866.6667
-5725 39100.0000 22900.0000
-5726 39100.0000 23066.6667
-5727 39100.0000 23083.3333
-5728 39100.0000 26166.6667
-5729 39100.0000 26383.3333
-5730 39100.0000 26433.3333
-5731 39100.0000 26516.6667
-5732 39100.0000 26550.0000
-5733 39102.5000 26552.5000
-5734 39103.8889 26241.3889
-5735 39105.0000 26440.2778
-5736 39105.5556 20637.7778
-5737 39105.8333 26218.6111
-5738 39110.5556 26411.1111
-5739 39116.6667 20900.0000
-5740 39116.6667 21016.6667
-5741 39116.6667 21050.0000
-5742 39116.6667 21083.3333
-5743 39116.6667 21133.3333
-5744 39116.6667 21150.0000
-5745 39116.6667 21200.0000
-5746 39116.6667 21216.6667
-5747 39116.6667 21233.3333
-5748 39116.6667 21250.0000
-5749 39116.6667 21416.6667
-5750 39116.6667 21466.6667
-5751 39116.6667 21516.6667
-5752 39116.6667 21583.3333
-5753 39116.6667 21633.3333
-5754 39116.6667 22050.0000
-5755 39116.6667 22100.0000
-5756 39116.6667 22200.0000
-5757 39116.6667 22450.0000
-5758 39116.6667 22466.6667
-5759 39116.6667 23100.0000
-5760 39116.6667 23733.3333
-5761 39116.6667 26413.0556
-5762 39132.7778 20631.3889
-5763 39133.3333 20600.0000
-5764 39133.3333 20633.3333
-5765 39133.3333 20666.6667
-5766 39133.3333 20816.6667
-5767 39133.3333 20916.6667
-5768 39133.3333 20933.3333
-5769 39133.3333 20950.0000
-5770 39133.3333 20983.3333
-5771 39133.3333 21050.0000
-5772 39133.3333 21066.6667
-5773 39133.3333 21116.6667
-5774 39133.3333 21200.0000
-5775 39133.3333 21216.6667
-5776 39133.3333 21250.0000
-5777 39133.3333 21416.6667
-5778 39133.3333 21450.0000
-5779 39133.3333 21483.3333
-5780 39133.3333 21500.0000
-5781 39133.3333 21516.6667
-5782 39133.3333 21566.6667
-5783 39133.3333 21650.0000
-5784 39133.3333 21700.0000
-5785 39133.3333 21783.3333
-5786 39133.3333 21800.0000
-5787 39133.3333 21816.6667
-5788 39133.3333 21950.0000
-5789 39133.3333 22016.6667
-5790 39133.3333 22116.6667
-5791 39133.3333 22150.0000
-5792 39133.3333 22300.0000
-5793 39133.3333 22350.0000
-5794 39133.3333 22383.3333
-5795 39133.3333 23166.6667
-5796 39133.3333 23266.6667
-5797 39133.3333 25933.3333
-5798 39133.3333 26000.0000
-5799 39133.3333 26400.0000
-5800 39133.3333 26416.6667
-5801 39133.3333 26516.6667
-5802 39146.1111 26529.7222
-5803 39148.0556 26514.4444
-5804 39150.0000 20233.3333
-5805 39150.0000 20583.3333
-5806 39150.0000 20666.6667
-5807 39150.0000 20700.0000
-5808 39150.0000 20816.6667
-5809 39150.0000 20866.6667
-5810 39150.0000 20933.3333
-5811 39150.0000 20983.3333
-5812 39150.0000 21116.6667
-5813 39150.0000 21133.3333
-5814 39150.0000 21150.0000
-5815 39150.0000 21183.3333
-5816 39150.0000 21200.0000
-5817 39150.0000 21233.3333
-5818 39150.0000 21250.0000
-5819 39150.0000 21266.6667
-5820 39150.0000 21283.3333
-5821 39150.0000 21383.3333
-5822 39150.0000 21400.0000
-5823 39150.0000 21433.3333
-5824 39150.0000 21450.0000
-5825 39150.0000 21483.3333
-5826 39150.0000 21616.6667
-5827 39150.0000 21650.0000
-5828 39150.0000 21666.6667
-5829 39150.0000 21783.3333
-5830 39150.0000 21833.3333
-5831 39150.0000 21866.6667
-5832 39150.0000 22183.3333
-5833 39150.0000 22250.0000
-5834 39150.0000 22283.3333
-5835 39150.0000 22300.0000
-5836 39150.0000 22366.6667
-5837 39150.0000 22566.6667
-5838 39150.0000 22683.3333
-5839 39150.0000 22716.6667
-5840 39150.0000 22750.0000
-5841 39150.0000 22766.6667
-5842 39150.0000 23083.3333
-5843 39150.0000 23200.0000
-5844 39150.0000 23850.0000
-5845 39150.0000 23866.6667
-5846 39156.6667 26521.6667
-5847 39166.6667 20183.3333
-5848 39166.6667 20566.6667
-5849 39166.6667 20600.0000
-5850 39166.6667 20716.6667
-5851 39166.6667 20750.0000
-5852 39166.6667 20933.3333
-5853 39166.6667 20950.0000
-5854 39166.6667 21000.0000
-5855 39166.6667 21033.3333
-5856 39166.6667 21116.6667
-5857 39166.6667 21133.3333
-5858 39166.6667 21166.6667
-5859 39166.6667 21183.3333
-5860 39166.6667 21200.0000
-5861 39166.6667 21216.6667
-5862 39166.6667 21266.6667
-5863 39166.6667 21433.3333
-5864 39166.6667 21466.6667
-5865 39166.6667 21516.6667
-5866 39166.6667 21700.0000
-5867 39166.6667 21766.6667
-5868 39166.6667 21816.6667
-5869 39166.6667 21833.3333
-5870 39166.6667 22166.6667
-5871 39166.6667 22416.6667
-5872 39166.6667 22466.6667
-5873 39166.6667 22516.6667
-5874 39166.6667 22600.0000
-5875 39166.6667 22616.6667
-5876 39166.6667 22633.3333
-5877 39166.6667 22650.0000
-5878 39166.6667 22783.3333
-5879 39166.6667 22850.0000
-5880 39166.6667 22883.3333
-5881 39166.6667 23216.6667
-5882 39166.6667 23283.3333
-5883 39166.6667 23350.0000
-5884 39166.6667 23483.3333
-5885 39166.6667 23616.6667
-5886 39166.6667 25933.3333
-5887 39166.6667 26050.0000
-5888 39166.6667 26066.6667
-5889 39166.6667 26133.3333
-5890 39166.6667 26500.0000
-5891 39180.5556 26486.3889
-5892 39183.3333 20166.6667
-5893 39183.3333 20183.3333
-5894 39183.3333 20200.0000
-5895 39183.3333 20633.3333
-5896 39183.3333 20716.6667
-5897 39183.3333 20783.3333
-5898 39183.3333 20983.3333
-5899 39183.3333 21083.3333
-5900 39183.3333 21150.0000
-5901 39183.3333 21183.3333
-5902 39183.3333 21333.3333
-5903 39183.3333 21383.3333
-5904 39183.3333 21416.6667
-5905 39183.3333 21433.3333
-5906 39183.3333 21450.0000
-5907 39183.3333 21466.6667
-5908 39183.3333 21483.3333
-5909 39183.3333 21500.0000
-5910 39183.3333 21616.6667
-5911 39183.3333 21650.0000
-5912 39183.3333 21683.3333
-5913 39183.3333 21733.3333
-5914 39183.3333 21766.6667
-5915 39183.3333 21783.3333
-5916 39183.3333 21866.6667
-5917 39183.3333 21966.6667
-5918 39183.3333 22133.3333
-5919 39183.3333 22383.3333
-5920 39183.3333 22600.0000
-5921 39183.3333 22683.3333
-5922 39183.3333 22766.6667
-5923 39183.3333 23216.6667
-5924 39183.3333 23250.0000
-5925 39183.3333 23283.3333
-5926 39183.3333 23333.3333
-5927 39183.3333 23616.6667
-5928 39183.3333 26416.6667
-5929 39183.8889 26406.3889
-5930 39197.2222 20530.2778
-5931 39199.4444 20184.4444
-5932 39200.0000 20166.6667
-5933 39200.0000 20183.3333
-5934 39200.0000 20566.6667
-5935 39200.0000 20616.6667
-5936 39200.0000 20650.0000
-5937 39200.0000 20666.6667
-5938 39200.0000 20733.3333
-5939 39200.0000 20883.3333
-5940 39200.0000 20933.3333
-5941 39200.0000 20983.3333
-5942 39200.0000 21083.3333
-5943 39200.0000 21150.0000
-5944 39200.0000 21166.6667
-5945 39200.0000 21216.6667
-5946 39200.0000 21350.0000
-5947 39200.0000 21400.0000
-5948 39200.0000 21416.6667
-5949 39200.0000 21566.6667
-5950 39200.0000 21616.6667
-5951 39200.0000 21650.0000
-5952 39200.0000 21683.3333
-5953 39200.0000 21750.0000
-5954 39200.0000 21933.3333
-5955 39200.0000 22083.3333
-5956 39200.0000 22100.0000
-5957 39200.0000 22250.0000
-5958 39200.0000 22316.6667
-5959 39200.0000 22333.3333
-5960 39200.0000 22450.0000
-5961 39200.0000 22483.3333
-5962 39200.0000 22516.6667
-5963 39200.0000 22583.3333
-5964 39200.0000 22733.3333
-5965 39200.0000 22750.0000
-5966 39200.0000 23216.6667
-5967 39200.0000 23333.3333
-5968 39200.0000 23916.6667
-5969 39200.0000 23966.6667
-5970 39200.0000 26016.6667
-5971 39206.6667 26212.5000
-5972 39210.8333 26461.3889
-5973 39216.6667 20116.6667
-5974 39216.6667 20133.3333
-5975 39216.6667 20150.0000
-5976 39216.6667 20166.6667
-5977 39216.6667 20500.0000
-5978 39216.6667 20533.3333
-5979 39216.6667 20633.3333
-5980 39216.6667 20783.3333
-5981 39216.6667 20850.0000
-5982 39216.6667 20883.3333
-5983 39216.6667 20900.0000
-5984 39216.6667 20950.0000
-5985 39216.6667 20983.3333
-5986 39216.6667 21033.3333
-5987 39216.6667 21066.6667
-5988 39216.6667 21200.0000
-5989 39216.6667 21233.3333
-5990 39216.6667 21250.0000
-5991 39216.6667 21300.0000
-5992 39216.6667 21316.6667
-5993 39216.6667 21333.3333
-5994 39216.6667 21350.0000
-5995 39216.6667 21366.6667
-5996 39216.6667 21416.6667
-5997 39216.6667 21450.0000
-5998 39216.6667 21616.6667
-5999 39216.6667 21783.3333
-6000 39216.6667 21816.6667
-6001 39216.6667 21866.6667
-6002 39216.6667 21983.3333
-6003 39216.6667 22016.6667
-6004 39216.6667 22050.0000
-6005 39216.6667 22516.6667
-6006 39216.6667 22566.6667
-6007 39216.6667 22600.0000
-6008 39216.6667 22616.6667
-6009 39216.6667 22650.0000
-6010 39216.6667 23933.3333
-6011 39216.6667 25850.0000
-6012 39216.6667 26033.3333
-6013 39216.6667 26050.0000
-6014 39216.6667 26200.0000
-6015 39219.1667 26206.6667
-6016 39219.7222 20518.8889
-6017 39225.5556 26439.4444
-6018 39227.7778 20158.8889
-6019 39229.4444 26457.7778
-6020 39230.0000 26218.6111
-6021 39232.7778 26208.0556
-6022 39233.3333 20133.3333
-6023 39233.3333 20150.0000
-6024 39233.3333 20166.6667
-6025 39233.3333 20600.0000
-6026 39233.3333 20616.6667
-6027 39233.3333 20650.0000
-6028 39233.3333 20683.3333
-6029 39233.3333 20716.6667
-6030 39233.3333 20866.6667
-6031 39233.3333 20883.3333
-6032 39233.3333 20933.3333
-6033 39233.3333 21050.0000
-6034 39233.3333 21100.0000
-6035 39233.3333 21150.0000
-6036 39233.3333 21183.3333
-6037 39233.3333 21216.6667
-6038 39233.3333 21233.3333
-6039 39233.3333 21316.6667
-6040 39233.3333 21333.3333
-6041 39233.3333 21366.6667
-6042 39233.3333 21383.3333
-6043 39233.3333 21433.3333
-6044 39233.3333 21450.0000
-6045 39233.3333 21516.6667
-6046 39233.3333 21600.0000
-6047 39233.3333 21633.3333
-6048 39233.3333 21666.6667
-6049 39233.3333 21683.3333
-6050 39233.3333 21766.6667
-6051 39233.3333 21783.3333
-6052 39233.3333 21800.0000
-6053 39233.3333 21866.6667
-6054 39233.3333 21950.0000
-6055 39233.3333 22250.0000
-6056 39233.3333 22666.6667
-6057 39233.3333 22683.3333
-6058 39233.3333 22700.0000
-6059 39233.3333 22766.6667
-6060 39233.3333 23200.0000
-6061 39233.3333 23216.6667
-6062 39233.3333 23250.0000
-6063 39233.3333 23283.3333
-6064 39233.3333 23300.0000
-6065 39233.3333 23316.6667
-6066 39233.3333 25983.3333
-6067 39233.3333 26000.0000
-6068 39233.3333 26050.0000
-6069 39236.3889 20131.6667
-6070 39236.6667 20539.7222
-6071 39239.1667 20485.0000
-6072 39240.2778 26200.5556
-6073 39248.0556 26271.6667
-6074 39250.0000 20533.3333
-6075 39250.0000 20566.6667
-6076 39250.0000 20583.3333
-6077 39250.0000 20616.6667
-6078 39250.0000 20633.3333
-6079 39250.0000 20750.0000
-6080 39250.0000 20783.3333
-6081 39250.0000 20833.3333
-6082 39250.0000 20983.3333
-6083 39250.0000 21000.0000
-6084 39250.0000 21016.6667
-6085 39250.0000 21033.3333
-6086 39250.0000 21050.0000
-6087 39250.0000 21133.3333
-6088 39250.0000 21166.6667
-6089 39250.0000 21183.3333
-6090 39250.0000 21200.0000
-6091 39250.0000 21233.3333
-6092 39250.0000 21316.6667
-6093 39250.0000 21383.3333
-6094 39250.0000 21400.0000
-6095 39250.0000 21500.0000
-6096 39250.0000 21550.0000
-6097 39250.0000 21666.6667
-6098 39250.0000 21716.6667
-6099 39250.0000 21733.3333
-6100 39250.0000 21833.3333
-6101 39250.0000 22050.0000
-6102 39250.0000 22100.0000
-6103 39250.0000 22183.3333
-6104 39250.0000 22216.6667
-6105 39250.0000 22383.3333
-6106 39250.0000 22450.0000
-6107 39250.0000 22483.3333
-6108 39250.0000 22583.3333
-6109 39250.0000 22616.6667
-6110 39250.0000 22750.0000
-6111 39250.0000 23183.3333
-6112 39250.0000 23266.6667
-6113 39250.0000 23283.3333
-6114 39250.0000 23300.0000
-6115 39250.0000 26100.0000
-6116 39266.6667 20533.3333
-6117 39266.6667 20566.6667
-6118 39266.6667 20600.0000
-6119 39266.6667 20700.0000
-6120 39266.6667 20800.0000
-6121 39266.6667 20850.0000
-6122 39266.6667 20883.3333
-6123 39266.6667 20950.0000
-6124 39266.6667 20983.3333
-6125 39266.6667 21000.0000
-6126 39266.6667 21016.6667
-6127 39266.6667 21166.6667
-6128 39266.6667 21183.3333
-6129 39266.6667 21216.6667
-6130 39266.6667 21300.0000
-6131 39266.6667 21333.3333
-6132 39266.6667 21366.6667
-6133 39266.6667 21383.3333
-6134 39266.6667 21433.3333
-6135 39266.6667 21483.3333
-6136 39266.6667 21533.3333
-6137 39266.6667 21550.0000
-6138 39266.6667 21583.3333
-6139 39266.6667 21600.0000
-6140 39266.6667 21666.6667
-6141 39266.6667 21700.0000
-6142 39266.6667 21716.6667
-6143 39266.6667 21933.3333
-6144 39266.6667 22033.3333
-6145 39266.6667 22083.3333
-6146 39266.6667 22150.0000
-6147 39266.6667 22216.6667
-6148 39266.6667 22333.3333
-6149 39266.6667 22416.6667
-6150 39266.6667 22466.6667
-6151 39266.6667 22516.6667
-6152 39266.6667 22750.0000
-6153 39266.6667 23166.6667
-6154 39266.6667 23950.0000
-6155 39266.6667 25966.6667
-6156 39266.6667 26066.6667
-6157 39266.6667 26150.0000
-6158 39270.0000 26287.5000
-6159 39275.0000 26376.6667
-6160 39280.8333 20427.7778
-6161 39283.3333 20450.0000
-6162 39283.3333 20550.0000
-6163 39283.3333 20600.0000
-6164 39283.3333 20633.3333
-6165 39283.3333 20666.6667
-6166 39283.3333 20683.3333
-6167 39283.3333 20700.0000
-6168 39283.3333 20766.6667
-6169 39283.3333 20800.0000
-6170 39283.3333 20900.0000
-6171 39283.3333 20933.3333
-6172 39283.3333 21000.0000
-6173 39283.3333 21033.3333
-6174 39283.3333 21050.0000
-6175 39283.3333 21066.6667
-6176 39283.3333 21100.0000
-6177 39283.3333 21116.6667
-6178 39283.3333 21133.3333
-6179 39283.3333 21200.0000
-6180 39283.3333 21233.3333
-6181 39283.3333 21266.6667
-6182 39283.3333 21283.3333
-6183 39283.3333 21333.3333
-6184 39283.3333 21366.6667
-6185 39283.3333 21383.3333
-6186 39283.3333 21416.6667
-6187 39283.3333 21433.3333
-6188 39283.3333 21450.0000
-6189 39283.3333 21466.6667
-6190 39283.3333 21483.3333
-6191 39283.3333 21500.0000
-6192 39283.3333 21533.3333
-6193 39283.3333 21566.6667
-6194 39283.3333 21583.3333
-6195 39283.3333 21600.0000
-6196 39283.3333 21700.0000
-6197 39283.3333 21733.3333
-6198 39283.3333 21750.0000
-6199 39283.3333 21783.3333
-6200 39283.3333 21800.0000
-6201 39283.3333 21850.0000
-6202 39283.3333 21900.0000
-6203 39283.3333 21966.6667
-6204 39283.3333 22050.0000
-6205 39283.3333 22116.6667
-6206 39283.3333 22283.3333
-6207 39283.3333 22550.0000
-6208 39283.3333 22650.0000
-6209 39283.3333 22816.6667
-6210 39283.3333 23183.3333
-6211 39283.3333 23216.6667
-6212 39283.3333 23266.6667
-6213 39284.1667 20402.2222
-6214 39300.0000 20366.6667
-6215 39300.0000 20483.3333
-6216 39300.0000 20550.0000
-6217 39300.0000 20683.3333
-6218 39300.0000 20716.6667
-6219 39300.0000 20766.6667
-6220 39300.0000 20800.0000
-6221 39300.0000 20866.6667
-6222 39300.0000 20900.0000
-6223 39300.0000 20983.3333
-6224 39300.0000 21016.6667
-6225 39300.0000 21200.0000
-6226 39300.0000 21216.6667
-6227 39300.0000 21283.3333
-6228 39300.0000 21316.6667
-6229 39300.0000 21400.0000
-6230 39300.0000 21416.6667
-6231 39300.0000 21533.3333
-6232 39300.0000 21683.3333
-6233 39300.0000 21700.0000
-6234 39300.0000 21716.6667
-6235 39300.0000 21733.3333
-6236 39300.0000 21833.3333
-6237 39300.0000 21933.3333
-6238 39300.0000 22050.0000
-6239 39300.0000 22066.6667
-6240 39300.0000 22133.3333
-6241 39300.0000 22200.0000
-6242 39300.0000 22383.3333
-6243 39300.0000 22500.0000
-6244 39300.0000 22600.0000
-6245 39300.0000 22616.6667
-6246 39300.0000 23116.6667
-6247 39300.0000 26133.3333
-6248 39300.0000 26183.3333
-6249 39311.6667 26219.7222
-6250 39311.6667 26333.8889
-6251 39312.7778 20357.7778
-6252 39313.6111 20427.7778
-6253 39316.6667 20333.3333
-6254 39316.6667 20433.3333
-6255 39316.6667 20450.0000
-6256 39316.6667 20500.0000
-6257 39316.6667 20583.3333
-6258 39316.6667 20600.0000
-6259 39316.6667 20616.6667
-6260 39316.6667 20700.0000
-6261 39316.6667 20766.6667
-6262 39316.6667 20800.0000
-6263 39316.6667 20883.3333
-6264 39316.6667 20933.3333
-6265 39316.6667 20950.0000
-6266 39316.6667 21000.0000
-6267 39316.6667 21016.6667
-6268 39316.6667 21033.3333
-6269 39316.6667 21083.3333
-6270 39316.6667 21216.6667
-6271 39316.6667 21300.0000
-6272 39316.6667 21433.3333
-6273 39316.6667 21466.6667
-6274 39316.6667 21500.0000
-6275 39316.6667 21700.0000
-6276 39316.6667 21716.6667
-6277 39316.6667 21783.3333
-6278 39316.6667 21800.0000
-6279 39316.6667 21816.6667
-6280 39316.6667 21866.6667
-6281 39316.6667 21883.3333
-6282 39316.6667 21900.0000
-6283 39316.6667 21916.6667
-6284 39316.6667 22233.3333
-6285 39316.6667 22300.0000
-6286 39316.6667 22316.6667
-6287 39316.6667 22500.0000
-6288 39316.6667 22633.3333
-6289 39316.6667 22683.3333
-6290 39316.6667 22716.6667
-6291 39316.6667 23100.0000
-6292 39316.6667 23133.3333
-6293 39317.5000 26244.1667
-6294 39328.6111 26279.4444
-6295 39333.3333 20450.0000
-6296 39333.3333 20600.0000
-6297 39333.3333 20716.6667
-6298 39333.3333 20733.3333
-6299 39333.3333 20766.6667
-6300 39333.3333 20783.3333
-6301 39333.3333 20883.3333
-6302 39333.3333 20900.0000
-6303 39333.3333 20916.6667
-6304 39333.3333 20933.3333
-6305 39333.3333 20950.0000
-6306 39333.3333 21000.0000
-6307 39333.3333 21050.0000
-6308 39333.3333 21066.6667
-6309 39333.3333 21083.3333
-6310 39333.3333 21183.3333
-6311 39333.3333 21233.3333
-6312 39333.3333 21266.6667
-6313 39333.3333 21300.0000
-6314 39333.3333 21333.3333
-6315 39333.3333 21400.0000
-6316 39333.3333 21416.6667
-6317 39333.3333 21433.3333
-6318 39333.3333 21466.6667
-6319 39333.3333 21483.3333
-6320 39333.3333 21500.0000
-6321 39333.3333 21516.6667
-6322 39333.3333 21683.3333
-6323 39333.3333 21833.3333
-6324 39333.3333 21866.6667
-6325 39333.3333 21950.0000
-6326 39333.3333 21983.3333
-6327 39333.3333 22016.6667
-6328 39333.3333 22100.0000
-6329 39333.3333 22150.0000
-6330 39333.3333 22366.6667
-6331 39333.3333 22383.3333
-6332 39333.3333 22416.6667
-6333 39333.3333 22433.3333
-6334 39333.3333 22450.0000
-6335 39333.3333 22500.0000
-6336 39333.3333 22550.0000
-6337 39333.3333 22583.3333
-6338 39333.3333 22700.0000
-6339 39333.3333 22766.6667
-6340 39333.3333 23016.6667
-6341 39333.3333 23033.3333
-6342 39333.3333 23050.0000
-6343 39333.3333 23116.6667
-6344 39333.3333 23133.3333
-6345 39333.3333 23150.0000
-6346 39333.3333 23216.6667
-6347 39333.3333 26183.3333
-6348 39333.3333 26216.6667
-6349 39334.7222 26311.3889
-6350 39344.7222 26362.5000
-6351 39348.0556 26321.6667
-6352 39350.0000 20416.6667
-6353 39350.0000 20433.3333
-6354 39350.0000 20450.0000
-6355 39350.0000 20550.0000
-6356 39350.0000 20583.3333
-6357 39350.0000 20650.0000
-6358 39350.0000 20700.0000
-6359 39350.0000 20750.0000
-6360 39350.0000 20766.6667
-6361 39350.0000 20800.0000
-6362 39350.0000 20883.3333
-6363 39350.0000 20916.6667
-6364 39350.0000 20950.0000
-6365 39350.0000 20966.6667
-6366 39350.0000 21000.0000
-6367 39350.0000 21016.6667
-6368 39350.0000 21033.3333
-6369 39350.0000 21050.0000
-6370 39350.0000 21066.6667
-6371 39350.0000 21100.0000
-6372 39350.0000 21150.0000
-6373 39350.0000 21183.3333
-6374 39350.0000 21200.0000
-6375 39350.0000 21216.6667
-6376 39350.0000 21266.6667
-6377 39350.0000 21283.3333
-6378 39350.0000 21300.0000
-6379 39350.0000 21316.6667
-6380 39350.0000 21333.3333
-6381 39350.0000 21350.0000
-6382 39350.0000 21450.0000
-6383 39350.0000 21466.6667
-6384 39350.0000 21500.0000
-6385 39350.0000 21533.3333
-6386 39350.0000 21666.6667
-6387 39350.0000 21683.3333
-6388 39350.0000 21750.0000
-6389 39350.0000 21766.6667
-6390 39350.0000 21833.3333
-6391 39350.0000 21900.0000
-6392 39350.0000 22083.3333
-6393 39350.0000 22216.6667
-6394 39350.0000 22266.6667
-6395 39350.0000 22300.0000
-6396 39350.0000 22333.3333
-6397 39350.0000 22500.0000
-6398 39350.0000 22550.0000
-6399 39350.0000 22616.6667
-6400 39350.0000 22833.3333
-6401 39350.0000 22866.6667
-6402 39350.0000 22900.0000
-6403 39350.0000 23066.6667
-6404 39350.0000 23083.3333
-6405 39350.0000 23200.0000
-6406 39360.8333 26263.6111
-6407 39361.3889 26295.8333
-6408 39366.6667 20283.3333
-6409 39366.6667 20400.0000
-6410 39366.6667 20533.3333
-6411 39366.6667 20566.6667
-6412 39366.6667 20583.3333
-6413 39366.6667 20700.0000
-6414 39366.6667 20783.3333
-6415 39366.6667 20866.6667
-6416 39366.6667 20883.3333
-6417 39366.6667 20950.0000
-6418 39366.6667 21016.6667
-6419 39366.6667 21033.3333
-6420 39366.6667 21050.0000
-6421 39366.6667 21066.6667
-6422 39366.6667 21100.0000
-6423 39366.6667 21116.6667
-6424 39366.6667 21133.3333
-6425 39366.6667 21200.0000
-6426 39366.6667 21216.6667
-6427 39366.6667 21233.3333
-6428 39366.6667 21266.6667
-6429 39366.6667 21283.3333
-6430 39366.6667 21300.0000
-6431 39366.6667 21333.3333
-6432 39366.6667 21400.0000
-6433 39366.6667 21416.6667
-6434 39366.6667 21533.3333
-6435 39366.6667 21600.0000
-6436 39366.6667 21616.6667
-6437 39366.6667 21633.3333
-6438 39366.6667 21666.6667
-6439 39366.6667 21816.6667
-6440 39366.6667 21916.6667
-6441 39366.6667 21966.6667
-6442 39366.6667 22000.0000
-6443 39366.6667 22083.3333
-6444 39366.6667 22133.3333
-6445 39366.6667 22400.0000
-6446 39366.6667 22516.6667
-6447 39366.6667 22766.6667
-6448 39366.6667 22950.0000
-6449 39366.6667 22983.3333
-6450 39366.6667 23066.6667
-6451 39366.6667 23183.3333
-6452 39366.6667 26166.6667
-6453 39366.6667 26283.3333
-6454 39368.8889 20303.8889
-6455 39373.6111 26303.6111
-6456 39383.3333 20066.6667
-6457 39383.3333 20083.3333
-6458 39383.3333 20116.6667
-6459 39383.3333 20383.3333
-6460 39383.3333 20483.3333
-6461 39383.3333 20566.6667
-6462 39383.3333 20583.3333
-6463 39383.3333 20700.0000
-6464 39383.3333 20850.0000
-6465 39383.3333 20900.0000
-6466 39383.3333 21000.0000
-6467 39383.3333 21016.6667
-6468 39383.3333 21033.3333
-6469 39383.3333 21050.0000
-6470 39383.3333 21066.6667
-6471 39383.3333 21100.0000
-6472 39383.3333 21133.3333
-6473 39383.3333 21183.3333
-6474 39383.3333 21200.0000
-6475 39383.3333 21216.6667
-6476 39383.3333 21233.3333
-6477 39383.3333 21250.0000
-6478 39383.3333 21266.6667
-6479 39383.3333 21283.3333
-6480 39383.3333 21400.0000
-6481 39383.3333 21466.6667
-6482 39383.3333 21633.3333
-6483 39383.3333 21700.0000
-6484 39383.3333 21766.6667
-6485 39383.3333 21816.6667
-6486 39383.3333 21866.6667
-6487 39383.3333 21916.6667
-6488 39383.3333 21983.3333
-6489 39383.3333 22233.3333
-6490 39383.3333 22266.6667
-6491 39383.3333 22333.3333
-6492 39383.3333 22350.0000
-6493 39383.3333 22500.0000
-6494 39383.3333 22516.6667
-6495 39383.3333 22566.6667
-6496 39383.3333 22750.0000
-6497 39383.3333 22916.6667
-6498 39383.3333 22966.6667
-6499 39383.3333 22983.3333
-6500 39383.3333 23000.0000
-6501 39383.3333 23050.0000
-6502 39383.3333 23183.3333
-6503 39400.0000 20050.0000
-6504 39400.0000 20066.6667
-6505 39400.0000 20083.3333
-6506 39400.0000 20333.3333
-6507 39400.0000 20350.0000
-6508 39400.0000 20366.6667
-6509 39400.0000 20383.3333
-6510 39400.0000 20416.6667
-6511 39400.0000 20483.3333
-6512 39400.0000 20566.6667
-6513 39400.0000 20783.3333
-6514 39400.0000 20816.6667
-6515 39400.0000 20966.6667
-6516 39400.0000 21016.6667
-6517 39400.0000 21050.0000
-6518 39400.0000 21066.6667
-6519 39400.0000 21083.3333
-6520 39400.0000 21100.0000
-6521 39400.0000 21116.6667
-6522 39400.0000 21283.3333
-6523 39400.0000 21333.3333
-6524 39400.0000 21366.6667
-6525 39400.0000 21600.0000
-6526 39400.0000 21633.3333
-6527 39400.0000 21666.6667
-6528 39400.0000 21700.0000
-6529 39400.0000 21733.3333
-6530 39400.0000 21750.0000
-6531 39400.0000 21800.0000
-6532 39400.0000 21816.6667
-6533 39400.0000 21900.0000
-6534 39400.0000 22016.6667
-6535 39400.0000 22066.6667
-6536 39400.0000 22200.0000
-6537 39400.0000 22216.6667
-6538 39400.0000 22416.6667
-6539 39400.0000 22433.3333
-6540 39400.0000 22466.6667
-6541 39400.0000 22716.6667
-6542 39400.0000 22733.3333
-6543 39400.0000 22983.3333
-6544 39400.0000 23133.3333
-6545 39400.0000 23166.6667
-6546 39405.2778 20253.0556
-6547 39416.6667 20016.6667
-6548 39416.6667 20066.6667
-6549 39416.6667 20083.3333
-6550 39416.6667 20300.0000
-6551 39416.6667 20316.6667
-6552 39416.6667 20366.6667
-6553 39416.6667 20383.3333
-6554 39416.6667 20500.0000
-6555 39416.6667 20550.0000
-6556 39416.6667 20566.6667
-6557 39416.6667 20616.6667
-6558 39416.6667 20633.3333
-6559 39416.6667 20700.0000
-6560 39416.6667 20766.6667
-6561 39416.6667 20783.3333
-6562 39416.6667 20816.6667
-6563 39416.6667 20833.3333
-6564 39416.6667 20850.0000
-6565 39416.6667 20866.6667
-6566 39416.6667 20900.0000
-6567 39416.6667 20916.6667
-6568 39416.6667 20933.3333
-6569 39416.6667 20950.0000
-6570 39416.6667 20983.3333
-6571 39416.6667 21016.6667
-6572 39416.6667 21033.3333
-6573 39416.6667 21050.0000
-6574 39416.6667 21066.6667
-6575 39416.6667 21083.3333
-6576 39416.6667 21100.0000
-6577 39416.6667 21116.6667
-6578 39416.6667 21266.6667
-6579 39416.6667 21383.3333
-6580 39416.6667 21483.3333
-6581 39416.6667 21500.0000
-6582 39416.6667 21533.3333
-6583 39416.6667 21583.3333
-6584 39416.6667 21600.0000
-6585 39416.6667 21633.3333
-6586 39416.6667 21700.0000
-6587 39416.6667 21733.3333
-6588 39416.6667 21750.0000
-6589 39416.6667 21783.3333
-6590 39416.6667 21800.0000
-6591 39416.6667 21966.6667
-6592 39416.6667 22100.0000
-6593 39416.6667 22166.6667
-6594 39416.6667 22383.3333
-6595 39416.6667 22433.3333
-6596 39416.6667 22616.6667
-6597 39416.6667 22650.0000
-6598 39416.6667 22933.3333
-6599 39416.6667 23133.3333
-6600 39416.6667 23150.0000
-6601 39419.7222 20084.1667
-6602 39424.4444 20073.0556
-6603 39433.3333 19983.3333
-6604 39433.3333 20000.0000
-6605 39433.3333 20050.0000
-6606 39433.3333 20283.3333
-6607 39433.3333 20333.3333
-6608 39433.3333 20400.0000
-6609 39433.3333 20433.3333
-6610 39433.3333 20466.6667
-6611 39433.3333 20483.3333
-6612 39433.3333 20533.3333
-6613 39433.3333 20550.0000
-6614 39433.3333 20633.3333
-6615 39433.3333 20683.3333
-6616 39433.3333 20716.6667
-6617 39433.3333 20733.3333
-6618 39433.3333 20750.0000
-6619 39433.3333 20766.6667
-6620 39433.3333 20783.3333
-6621 39433.3333 20833.3333
-6622 39433.3333 20883.3333
-6623 39433.3333 20916.6667
-6624 39433.3333 20950.0000
-6625 39433.3333 20983.3333
-6626 39433.3333 21016.6667
-6627 39433.3333 21033.3333
-6628 39433.3333 21050.0000
-6629 39433.3333 21083.3333
-6630 39433.3333 21100.0000
-6631 39433.3333 21116.6667
-6632 39433.3333 21216.6667
-6633 39433.3333 21350.0000
-6634 39433.3333 21366.6667
-6635 39433.3333 21383.3333
-6636 39433.3333 21433.3333
-6637 39433.3333 21516.6667
-6638 39433.3333 21533.3333
-6639 39433.3333 21566.6667
-6640 39433.3333 21666.6667
-6641 39433.3333 21716.6667
-6642 39433.3333 21750.0000
-6643 39433.3333 21766.6667
-6644 39433.3333 21833.3333
-6645 39433.3333 21866.6667
-6646 39433.3333 22050.0000
-6647 39433.3333 22100.0000
-6648 39433.3333 22133.3333
-6649 39433.3333 22183.3333
-6650 39433.3333 22300.0000
-6651 39433.3333 22333.3333
-6652 39433.3333 22683.3333
-6653 39433.3333 22750.0000
-6654 39433.3333 22883.3333
-6655 39433.3333 23116.6667
-6656 39436.1111 19978.3333
-6657 39450.0000 19983.3333
-6658 39450.0000 20000.0000
-6659 39450.0000 20066.6667
-6660 39450.0000 20266.6667
-6661 39450.0000 20283.3333
-6662 39450.0000 20300.0000
-6663 39450.0000 20316.6667
-6664 39450.0000 20400.0000
-6665 39450.0000 20450.0000
-6666 39450.0000 20533.3333
-6667 39450.0000 20600.0000
-6668 39450.0000 20683.3333
-6669 39450.0000 20716.6667
-6670 39450.0000 20733.3333
-6671 39450.0000 20766.6667
-6672 39450.0000 20816.6667
-6673 39450.0000 20833.3333
-6674 39450.0000 21000.0000
-6675 39450.0000 21016.6667
-6676 39450.0000 21033.3333
-6677 39450.0000 21066.6667
-6678 39450.0000 21083.3333
-6679 39450.0000 21100.0000
-6680 39450.0000 21116.6667
-6681 39450.0000 21233.3333
-6682 39450.0000 21250.0000
-6683 39450.0000 21316.6667
-6684 39450.0000 21333.3333
-6685 39450.0000 21366.6667
-6686 39450.0000 21383.3333
-6687 39450.0000 21416.6667
-6688 39450.0000 21466.6667
-6689 39450.0000 21483.3333
-6690 39450.0000 21500.0000
-6691 39450.0000 21516.6667
-6692 39450.0000 21533.3333
-6693 39450.0000 21550.0000
-6694 39450.0000 21566.6667
-6695 39450.0000 21800.0000
-6696 39450.0000 21833.3333
-6697 39450.0000 21966.6667
-6698 39450.0000 22083.3333
-6699 39450.0000 22150.0000
-6700 39450.0000 22250.0000
-6701 39450.0000 22333.3333
-6702 39450.0000 22350.0000
-6703 39450.0000 22483.3333
-6704 39450.0000 22533.3333
-6705 39450.0000 22550.0000
-6706 39450.0000 23100.0000
-6707 39450.0000 23116.6667
-6708 39458.0556 19958.0556
-6709 39466.6667 19916.6667
-6710 39466.6667 19933.3333
-6711 39466.6667 19950.0000
-6712 39466.6667 20316.6667
-6713 39466.6667 20333.3333
-6714 39466.6667 20350.0000
-6715 39466.6667 20366.6667
-6716 39466.6667 20416.6667
-6717 39466.6667 20433.3333
-6718 39466.6667 20516.6667
-6719 39466.6667 20666.6667
-6720 39466.6667 20716.6667
-6721 39466.6667 20750.0000
-6722 39466.6667 20816.6667
-6723 39466.6667 20833.3333
-6724 39466.6667 20850.0000
-6725 39466.6667 20900.0000
-6726 39466.6667 20916.6667
-6727 39466.6667 20966.6667
-6728 39466.6667 21033.3333
-6729 39466.6667 21050.0000
-6730 39466.6667 21083.3333
-6731 39466.6667 21100.0000
-6732 39466.6667 21250.0000
-6733 39466.6667 21283.3333
-6734 39466.6667 21316.6667
-6735 39466.6667 21350.0000
-6736 39466.6667 21366.6667
-6737 39466.6667 21416.6667
-6738 39466.6667 21433.3333
-6739 39466.6667 21450.0000
-6740 39466.6667 21533.3333
-6741 39466.6667 21566.6667
-6742 39466.6667 21616.6667
-6743 39466.6667 21666.6667
-6744 39466.6667 21700.0000
-6745 39466.6667 21733.3333
-6746 39466.6667 21833.3333
-6747 39466.6667 21866.6667
-6748 39466.6667 21900.0000
-6749 39466.6667 22083.3333
-6750 39466.6667 22166.6667
-6751 39466.6667 22216.6667
-6752 39466.6667 22283.3333
-6753 39466.6667 22450.0000
-6754 39466.6667 22500.0000
-6755 39466.6667 22733.3333
-6756 39466.6667 22916.6667
-6757 39474.4444 19931.9444
-6758 39483.3333 19916.6667
-6759 39483.3333 20266.6667
-6760 39483.3333 20300.0000
-6761 39483.3333 20333.3333
-6762 39483.3333 20400.0000
-6763 39483.3333 20466.6667
-6764 39483.3333 20500.0000
-6765 39483.3333 20566.6667
-6766 39483.3333 20666.6667
-6767 39483.3333 20850.0000
-6768 39483.3333 20866.6667
-6769 39483.3333 20883.3333
-6770 39483.3333 20916.6667
-6771 39483.3333 20966.6667
-6772 39483.3333 21033.3333
-6773 39483.3333 21050.0000
-6774 39483.3333 21066.6667
-6775 39483.3333 21083.3333
-6776 39483.3333 21100.0000
-6777 39483.3333 21316.6667
-6778 39483.3333 21333.3333
-6779 39483.3333 21533.3333
-6780 39483.3333 21550.0000
-6781 39483.3333 21716.6667
-6782 39483.3333 21850.0000
-6783 39483.3333 21900.0000
-6784 39483.3333 21983.3333
-6785 39483.3333 22200.0000
-6786 39483.3333 22266.6667
-6787 39483.3333 22600.0000
-6788 39483.3333 22700.0000
-6789 39483.3333 22950.0000
-6790 39483.3333 23100.0000
-6791 39495.8333 19873.0556
-6792 39500.0000 19916.6667
-6793 39500.0000 20266.6667
-6794 39500.0000 20316.6667
-6795 39500.0000 20366.6667
-6796 39500.0000 20383.3333
-6797 39500.0000 20416.6667
-6798 39500.0000 20433.3333
-6799 39500.0000 20466.6667
-6800 39500.0000 20500.0000
-6801 39500.0000 20533.3333
-6802 39500.0000 20650.0000
-6803 39500.0000 20683.3333
-6804 39500.0000 20750.0000
-6805 39500.0000 20866.6667
-6806 39500.0000 20916.6667
-6807 39500.0000 20950.0000
-6808 39500.0000 20966.6667
-6809 39500.0000 20983.3333
-6810 39500.0000 21000.0000
-6811 39500.0000 21033.3333
-6812 39500.0000 21050.0000
-6813 39500.0000 21083.3333
-6814 39500.0000 21316.6667
-6815 39500.0000 21350.0000
-6816 39500.0000 21516.6667
-6817 39500.0000 21533.3333
-6818 39500.0000 21616.6667
-6819 39500.0000 21683.3333
-6820 39500.0000 21783.3333
-6821 39500.0000 21900.0000
-6822 39500.0000 22016.6667
-6823 39500.0000 22050.0000
-6824 39500.0000 22150.0000
-6825 39500.0000 22250.0000
-6826 39500.0000 22450.0000
-6827 39500.0000 22550.0000
-6828 39500.0000 22633.3333
-6829 39500.0000 22650.0000
-6830 39500.0000 22700.0000
-6831 39500.0000 22883.3333
-6832 39500.0000 23066.6667
-6833 39516.6667 19866.6667
-6834 39516.6667 19900.0000
-6835 39516.6667 20350.0000
-6836 39516.6667 20433.3333
-6837 39516.6667 20550.0000
-6838 39516.6667 20566.6667
-6839 39516.6667 20600.0000
-6840 39516.6667 20633.3333
-6841 39516.6667 20683.3333
-6842 39516.6667 20733.3333
-6843 39516.6667 20800.0000
-6844 39516.6667 20816.6667
-6845 39516.6667 20950.0000
-6846 39516.6667 20983.3333
-6847 39516.6667 21050.0000
-6848 39516.6667 21066.6667
-6849 39516.6667 21083.3333
-6850 39516.6667 21150.0000
-6851 39516.6667 21600.0000
-6852 39516.6667 21650.0000
-6853 39516.6667 21666.6667
-6854 39516.6667 21700.0000
-6855 39516.6667 21750.0000
-6856 39516.6667 21800.0000
-6857 39516.6667 21866.6667
-6858 39516.6667 21950.0000
-6859 39516.6667 22083.3333
-6860 39516.6667 22100.0000
-6861 39516.6667 22116.6667
-6862 39516.6667 22316.6667
-6863 39516.6667 22466.6667
-6864 39516.6667 22550.0000
-6865 39516.6667 22683.3333
-6866 39525.5556 20257.2222
-6867 39533.3333 19850.0000
-6868 39533.3333 19866.6667
-6869 39533.3333 19900.0000
-6870 39533.3333 19916.6667
-6871 39533.3333 20283.3333
-6872 39533.3333 20350.0000
-6873 39533.3333 20400.0000
-6874 39533.3333 20466.6667
-6875 39533.3333 20550.0000
-6876 39533.3333 20666.6667
-6877 39533.3333 20716.6667
-6878 39533.3333 20733.3333
-6879 39533.3333 20783.3333
-6880 39533.3333 20850.0000
-6881 39533.3333 20916.6667
-6882 39533.3333 21033.3333
-6883 39533.3333 21050.0000
-6884 39533.3333 21066.6667
-6885 39533.3333 21083.3333
-6886 39533.3333 21100.0000
-6887 39533.3333 21116.6667
-6888 39533.3333 21250.0000
-6889 39533.3333 21300.0000
-6890 39533.3333 21366.6667
-6891 39533.3333 21400.0000
-6892 39533.3333 21433.3333
-6893 39533.3333 21466.6667
-6894 39533.3333 21566.6667
-6895 39533.3333 21583.3333
-6896 39533.3333 21616.6667
-6897 39533.3333 21633.3333
-6898 39533.3333 21683.3333
-6899 39533.3333 21700.0000
-6900 39533.3333 21766.6667
-6901 39533.3333 21800.0000
-6902 39533.3333 21833.3333
-6903 39533.3333 21866.6667
-6904 39533.3333 21933.3333
-6905 39533.3333 21983.3333
-6906 39533.3333 22000.0000
-6907 39533.3333 22166.6667
-6908 39533.3333 22233.3333
-6909 39533.3333 22266.6667
-6910 39533.3333 22366.6667
-6911 39533.3333 22500.0000
-6912 39533.3333 22666.6667
-6913 39538.8889 24991.6667
-6914 39546.3889 19911.1111
-6915 39550.0000 19866.6667
-6916 39550.0000 19883.3333
-6917 39550.0000 20266.6667
-6918 39550.0000 20316.6667
-6919 39550.0000 20366.6667
-6920 39550.0000 20433.3333
-6921 39550.0000 20516.6667
-6922 39550.0000 20550.0000
-6923 39550.0000 20583.3333
-6924 39550.0000 20600.0000
-6925 39550.0000 20633.3333
-6926 39550.0000 20683.3333
-6927 39550.0000 20766.6667
-6928 39550.0000 20900.0000
-6929 39550.0000 20950.0000
-6930 39550.0000 21016.6667
-6931 39550.0000 21033.3333
-6932 39550.0000 21050.0000
-6933 39550.0000 21116.6667
-6934 39550.0000 21366.6667
-6935 39550.0000 21583.3333
-6936 39550.0000 21616.6667
-6937 39550.0000 21633.3333
-6938 39550.0000 21650.0000
-6939 39550.0000 21666.6667
-6940 39550.0000 21683.3333
-6941 39550.0000 21700.0000
-6942 39550.0000 21750.0000
-6943 39550.0000 21766.6667
-6944 39550.0000 21900.0000
-6945 39550.0000 22200.0000
-6946 39550.0000 22616.6667
-6947 39550.0000 22650.0000
-6948 39550.0000 22750.0000
-6949 39550.0000 22983.3333
-6950 39566.6667 19850.0000
-6951 39566.6667 19866.6667
-6952 39566.6667 19883.3333
-6953 39566.6667 19900.0000
-6954 39566.6667 19916.6667
-6955 39566.6667 20200.0000
-6956 39566.6667 20283.3333
-6957 39566.6667 20316.6667
-6958 39566.6667 20433.3333
-6959 39566.6667 20550.0000
-6960 39566.6667 20633.3333
-6961 39566.6667 20700.0000
-6962 39566.6667 20733.3333
-6963 39566.6667 20833.3333
-6964 39566.6667 20883.3333
-6965 39566.6667 20950.0000
-6966 39566.6667 21000.0000
-6967 39566.6667 21083.3333
-6968 39566.6667 21166.6667
-6969 39566.6667 21250.0000
-6970 39566.6667 21366.6667
-6971 39566.6667 21583.3333
-6972 39566.6667 21616.6667
-6973 39566.6667 21700.0000
-6974 39566.6667 21716.6667
-6975 39566.6667 21750.0000
-6976 39566.6667 21766.6667
-6977 39566.6667 21833.3333
-6978 39566.6667 21933.3333
-6979 39566.6667 22000.0000
-6980 39566.6667 22016.6667
-6981 39566.6667 22083.3333
-6982 39566.6667 22216.6667
-6983 39566.6667 22366.6667
-6984 39566.6667 22466.6667
-6985 39566.6667 22533.3333
-6986 39566.6667 22600.0000
-6987 39566.6667 22750.0000
-6988 39566.6667 22766.6667
-6989 39583.3333 19850.0000
-6990 39583.3333 19866.6667
-6991 39583.3333 19883.3333
-6992 39583.3333 19900.0000
-6993 39583.3333 19916.6667
-6994 39583.3333 20333.3333
-6995 39583.3333 20400.0000
-6996 39583.3333 20466.6667
-6997 39583.3333 20550.0000
-6998 39583.3333 20600.0000
-6999 39583.3333 20616.6667
-7000 39583.3333 20666.6667
-7001 39583.3333 20700.0000
-7002 39583.3333 20716.6667
-7003 39583.3333 20800.0000
-7004 39583.3333 20883.3333
-7005 39583.3333 20916.6667
-7006 39583.3333 20933.3333
-7007 39583.3333 20950.0000
-7008 39583.3333 20983.3333
-7009 39583.3333 21000.0000
-7010 39583.3333 21033.3333
-7011 39583.3333 21066.6667
-7012 39583.3333 21083.3333
-7013 39583.3333 21116.6667
-7014 39583.3333 21583.3333
-7015 39583.3333 21683.3333
-7016 39583.3333 21733.3333
-7017 39583.3333 21750.0000
-7018 39583.3333 21783.3333
-7019 39583.3333 21800.0000
-7020 39583.3333 21816.6667
-7021 39583.3333 21850.0000
-7022 39583.3333 21900.0000
-7023 39583.3333 21916.6667
-7024 39583.3333 21966.6667
-7025 39583.3333 22166.6667
-7026 39583.3333 22300.0000
-7027 39583.3333 22333.3333
-7028 39583.3333 22583.3333
-7029 39583.3333 22783.3333
-7030 39583.3333 22916.6667
-7031 39593.8889 19823.6111
-7032 39600.0000 19866.6667
-7033 39600.0000 19900.0000
-7034 39600.0000 19916.6667
-7035 39600.0000 20233.3333
-7036 39600.0000 20266.6667
-7037 39600.0000 20283.3333
-7038 39600.0000 20316.6667
-7039 39600.0000 20433.3333
-7040 39600.0000 20466.6667
-7041 39600.0000 20533.3333
-7042 39600.0000 20566.6667
-7043 39600.0000 20650.0000
-7044 39600.0000 20683.3333
-7045 39600.0000 20750.0000
-7046 39600.0000 20850.0000
-7047 39600.0000 20883.3333
-7048 39600.0000 21000.0000
-7049 39600.0000 21050.0000
-7050 39600.0000 21100.0000
-7051 39600.0000 21283.3333
-7052 39600.0000 21300.0000
-7053 39600.0000 21466.6667
-7054 39600.0000 21500.0000
-7055 39600.0000 21650.0000
-7056 39600.0000 21766.6667
-7057 39600.0000 21816.6667
-7058 39600.0000 21983.3333
-7059 39600.0000 22050.0000
-7060 39600.0000 22066.6667
-7061 39600.0000 22583.3333
-7062 39600.0000 22716.6667
-7063 39616.6667 19800.0000
-7064 39616.6667 19816.6667
-7065 39616.6667 19850.0000
-7066 39616.6667 19900.0000
-7067 39616.6667 19916.6667
-7068 39616.6667 20183.3333
-7069 39616.6667 20333.3333
-7070 39616.6667 20500.0000
-7071 39616.6667 20533.3333
-7072 39616.6667 20583.3333
-7073 39616.6667 20633.3333
-7074 39616.6667 20733.3333
-7075 39616.6667 20833.3333
-7076 39616.6667 20883.3333
-7077 39616.6667 20950.0000
-7078 39616.6667 20966.6667
-7079 39616.6667 20983.3333
-7080 39616.6667 21050.0000
-7081 39616.6667 21350.0000
-7082 39616.6667 21416.6667
-7083 39616.6667 21533.3333
-7084 39616.6667 21650.0000
-7085 39616.6667 21750.0000
-7086 39616.6667 21766.6667
-7087 39616.6667 22016.6667
-7088 39616.6667 22133.3333
-7089 39616.6667 22233.3333
-7090 39616.6667 22266.6667
-7091 39616.6667 22300.0000
-7092 39616.6667 22366.6667
-7093 39616.6667 22433.3333
-7094 39616.6667 22533.3333
-7095 39616.6667 22566.6667
-7096 39616.6667 22616.6667
-7097 39616.6667 22683.3333
-7098 39616.6667 22883.3333
-7099 39620.0000 19919.7222
-7100 39625.0000 19875.5556
-7101 39626.9444 20187.2222
-7102 39633.0556 19764.4444
-7103 39633.3333 19900.0000
-7104 39633.3333 20416.6667
-7105 39633.3333 20450.0000
-7106 39633.3333 20566.6667
-7107 39633.3333 20700.0000
-7108 39633.3333 20716.6667
-7109 39633.3333 20733.3333
-7110 39633.3333 20766.6667
-7111 39633.3333 20783.3333
-7112 39633.3333 20866.6667
-7113 39633.3333 20916.6667
-7114 39633.3333 20966.6667
-7115 39633.3333 21033.3333
-7116 39633.3333 21066.6667
-7117 39633.3333 21250.0000
-7118 39633.3333 21300.0000
-7119 39633.3333 21350.0000
-7120 39633.3333 21583.3333
-7121 39633.3333 21700.0000
-7122 39633.3333 21783.3333
-7123 39633.3333 22016.6667
-7124 39633.3333 22050.0000
-7125 39633.3333 22400.0000
-7126 39633.3333 22416.6667
-7127 39633.3333 22500.0000
-7128 39633.3333 22516.6667
-7129 39650.0000 19766.6667
-7130 39650.0000 19850.0000
-7131 39650.0000 20283.3333
-7132 39650.0000 20316.6667
-7133 39650.0000 20366.6667
-7134 39650.0000 20483.3333
-7135 39650.0000 20516.6667
-7136 39650.0000 20616.6667
-7137 39650.0000 20666.6667
-7138 39650.0000 20700.0000
-7139 39650.0000 20716.6667
-7140 39650.0000 20733.3333
-7141 39650.0000 20800.0000
-7142 39650.0000 20950.0000
-7143 39650.0000 21033.3333
-7144 39650.0000 21483.3333
-7145 39650.0000 21616.6667
-7146 39650.0000 21650.0000
-7147 39650.0000 21816.6667
-7148 39650.0000 22266.6667
-7149 39650.0000 22283.3333
-7150 39650.0000 22433.3333
-7151 39650.0000 22716.6667
-7152 39663.8889 20101.3889
-7153 39666.6667 19816.6667
-7154 39666.6667 20250.0000
-7155 39666.6667 20366.6667
-7156 39666.6667 20433.3333
-7157 39666.6667 20516.6667
-7158 39666.6667 20533.3333
-7159 39666.6667 20550.0000
-7160 39666.6667 20566.6667
-7161 39666.6667 20583.3333
-7162 39666.6667 20650.0000
-7163 39666.6667 20716.6667
-7164 39666.6667 20733.3333
-7165 39666.6667 20833.3333
-7166 39666.6667 20933.3333
-7167 39666.6667 20950.0000
-7168 39666.6667 21033.3333
-7169 39666.6667 21216.6667
-7170 39666.6667 21450.0000
-7171 39666.6667 21566.6667
-7172 39666.6667 21633.3333
-7173 39666.6667 21700.0000
-7174 39666.6667 21733.3333
-7175 39666.6667 21766.6667
-7176 39666.6667 21833.3333
-7177 39666.6667 22383.3333
-7178 39666.6667 22483.3333
-7179 39666.6667 22666.6667
-7180 39666.6667 22733.3333
-7181 39666.6667 22783.3333
-7182 39666.6667 22866.6667
-7183 39670.0000 19740.8333
-7184 39681.6667 19706.9444
-7185 39683.3333 19683.3333
-7186 39683.3333 19700.0000
-7187 39683.3333 19733.3333
-7188 39683.3333 19750.0000
-7189 39683.3333 19816.6667
-7190 39683.3333 20066.6667
-7191 39683.3333 20300.0000
-7192 39683.3333 20466.6667
-7193 39683.3333 20533.3333
-7194 39683.3333 20616.6667
-7195 39683.3333 20666.6667
-7196 39683.3333 20766.6667
-7197 39683.3333 20783.3333
-7198 39683.3333 20866.6667
-7199 39683.3333 20883.3333
-7200 39683.3333 21050.0000
-7201 39683.3333 21183.3333
-7202 39683.3333 21300.0000
-7203 39683.3333 21550.0000
-7204 39683.3333 21583.3333
-7205 39683.3333 21683.3333
-7206 39683.3333 21800.0000
-7207 39683.3333 22300.0000
-7208 39683.3333 22316.6667
-7209 39683.3333 22333.3333
-7210 39683.3333 22500.0000
-7211 39683.3333 22583.3333
-7212 39683.3333 22633.3333
-7213 39683.3333 22700.0000
-7214 39683.3333 22733.3333
-7215 39683.3333 22833.3333
-7216 39694.4444 19836.6667
-7217 39700.0000 19700.0000
-7218 39700.0000 19716.6667
-7219 39700.0000 19733.3333
-7220 39700.0000 19833.3333
-7221 39700.0000 20266.6667
-7222 39700.0000 20333.3333
-7223 39700.0000 20400.0000
-7224 39700.0000 20533.3333
-7225 39700.0000 20566.6667
-7226 39700.0000 20633.3333
-7227 39700.0000 20666.6667
-7228 39700.0000 20783.3333
-7229 39700.0000 20800.0000
-7230 39700.0000 20816.6667
-7231 39700.0000 20850.0000
-7232 39700.0000 20950.0000
-7233 39700.0000 21033.3333
-7234 39700.0000 21066.6667
-7235 39700.0000 21383.3333
-7236 39700.0000 21516.6667
-7237 39700.0000 21633.3333
-7238 39700.0000 21716.6667
-7239 39700.0000 22016.6667
-7240 39700.0000 22083.3333
-7241 39700.0000 22416.6667
-7242 39700.0000 22433.3333
-7243 39700.0000 22700.0000
-7244 39707.7778 19795.5556
-7245 39709.7222 19702.2222
-7246 39716.6667 19666.6667
-7247 39716.6667 19716.6667
-7248 39716.6667 19733.3333
-7249 39716.6667 19750.0000
-7250 39716.6667 19766.6667
-7251 39716.6667 19783.3333
-7252 39716.6667 19833.3333
-7253 39716.6667 19900.0000
-7254 39716.6667 20350.0000
-7255 39716.6667 20450.0000
-7256 39716.6667 20483.3333
-7257 39716.6667 20533.3333
-7258 39716.6667 20600.0000
-7259 39716.6667 20716.6667
-7260 39716.6667 20750.0000
-7261 39716.6667 20833.3333
-7262 39716.6667 21066.6667
-7263 39716.6667 21083.3333
-7264 39716.6667 21383.3333
-7265 39716.6667 21466.6667
-7266 39716.6667 21616.6667
-7267 39716.6667 21683.3333
-7268 39716.6667 21783.3333
-7269 39716.6667 21933.3333
-7270 39716.6667 22166.6667
-7271 39716.6667 22183.3333
-7272 39716.6667 22400.0000
-7273 39716.6667 22550.0000
-7274 39716.6667 22566.6667
-7275 39716.6667 22733.3333
-7276 39716.6667 22766.6667
-7277 39733.3333 19666.6667
-7278 39733.3333 19683.3333
-7279 39733.3333 19700.0000
-7280 39733.3333 19716.6667
-7281 39733.3333 19733.3333
-7282 39733.3333 19750.0000
-7283 39733.3333 19766.6667
-7284 39733.3333 19800.0000
-7285 39733.3333 19816.6667
-7286 39733.3333 19900.0000
-7287 39733.3333 19916.6667
-7288 39733.3333 19933.3333
-7289 39733.3333 20416.6667
-7290 39733.3333 20450.0000
-7291 39733.3333 20516.6667
-7292 39733.3333 20566.6667
-7293 39733.3333 20583.3333
-7294 39733.3333 20616.6667
-7295 39733.3333 20633.3333
-7296 39733.3333 20666.6667
-7297 39733.3333 20766.6667
-7298 39733.3333 20816.6667
-7299 39733.3333 20916.6667
-7300 39733.3333 20933.3333
-7301 39733.3333 21033.3333
-7302 39733.3333 21066.6667
-7303 39733.3333 21100.0000
-7304 39733.3333 21133.3333
-7305 39733.3333 21883.3333
-7306 39733.3333 22350.0000
-7307 39733.3333 22533.3333
-7308 39733.3333 22600.0000
-7309 39733.3333 22733.3333
-7310 39733.3333 22750.0000
-7311 39733.3333 22800.0000
-7312 39736.1111 19928.0556
-7313 39743.6111 19932.2222
-7314 39748.8889 19938.8889
-7315 39750.0000 19683.3333
-7316 39750.0000 19700.0000
-7317 39750.0000 19716.6667
-7318 39750.0000 19733.3333
-7319 39750.0000 19750.0000
-7320 39750.0000 19766.6667
-7321 39750.0000 19783.3333
-7322 39750.0000 19833.3333
-7323 39750.0000 19883.3333
-7324 39750.0000 19916.6667
-7325 39750.0000 19933.3333
-7326 39750.0000 20333.3333
-7327 39750.0000 20416.6667
-7328 39750.0000 20466.6667
-7329 39750.0000 20533.3333
-7330 39750.0000 20566.6667
-7331 39750.0000 20633.3333
-7332 39750.0000 20650.0000
-7333 39750.0000 20716.6667
-7334 39750.0000 20750.0000
-7335 39750.0000 20800.0000
-7336 39750.0000 21050.0000
-7337 39750.0000 21083.3333
-7338 39750.0000 21100.0000
-7339 39750.0000 21333.3333
-7340 39750.0000 21366.6667
-7341 39750.0000 21416.6667
-7342 39750.0000 21500.0000
-7343 39750.0000 21750.0000
-7344 39750.0000 22083.3333
-7345 39750.0000 22100.0000
-7346 39750.0000 22283.3333
-7347 39750.0000 22366.6667
-7348 39750.0000 22433.3333
-7349 39750.0000 22583.3333
-7350 39750.0000 22700.0000
-7351 39750.0000 22800.0000
-7352 39755.8333 19676.3889
-7353 39763.0556 19873.0556
-7354 39766.6667 19533.3333
-7355 39766.6667 19750.0000
-7356 39766.6667 19783.3333
-7357 39766.6667 19816.6667
-7358 39766.6667 19833.3333
-7359 39766.6667 19916.6667
-7360 39766.6667 19933.3333
-7361 39766.6667 20316.6667
-7362 39766.6667 20383.3333
-7363 39766.6667 20533.3333
-7364 39766.6667 20583.3333
-7365 39766.6667 20600.0000
-7366 39766.6667 20783.3333
-7367 39766.6667 20866.6667
-7368 39766.6667 21000.0000
-7369 39766.6667 21033.3333
-7370 39766.6667 21050.0000
-7371 39766.6667 21066.6667
-7372 39766.6667 21116.6667
-7373 39766.6667 21183.3333
-7374 39766.6667 21466.6667
-7375 39766.6667 21666.6667
-7376 39766.6667 21733.3333
-7377 39766.6667 22383.3333
-7378 39766.6667 22533.3333
-7379 39766.6667 22583.3333
-7380 39767.5000 19946.6667
-7381 39775.0000 19662.5000
-7382 39783.3333 19516.6667
-7383 39783.3333 19683.3333
-7384 39783.3333 19750.0000
-7385 39783.3333 19783.3333
-7386 39783.3333 19833.3333
-7387 39783.3333 19850.0000
-7388 39783.3333 19866.6667
-7389 39783.3333 19883.3333
-7390 39783.3333 19916.6667
-7391 39783.3333 20350.0000
-7392 39783.3333 20466.6667
-7393 39783.3333 20616.6667
-7394 39783.3333 20683.3333
-7395 39783.3333 20716.6667
-7396 39783.3333 20750.0000
-7397 39783.3333 20800.0000
-7398 39783.3333 20816.6667
-7399 39783.3333 20833.3333
-7400 39783.3333 20866.6667
-7401 39783.3333 21000.0000
-7402 39783.3333 21083.3333
-7403 39783.3333 21100.0000
-7404 39783.3333 21116.6667
-7405 39783.3333 21283.3333
-7406 39783.3333 21416.6667
-7407 39783.3333 21550.0000
-7408 39783.3333 21800.0000
-7409 39783.3333 21983.3333
-7410 39783.3333 22083.3333
-7411 39783.3333 22400.0000
-7412 39783.3333 22583.3333
-7413 39785.5556 19673.0556
-7414 39788.6111 19787.5000
-7415 39790.5556 19707.5000
-7416 39793.3333 19759.1667
-7417 39795.5556 19811.1111
-7418 39800.0000 19683.3333
-7419 39800.0000 19833.3333
-7420 39800.0000 19850.0000
-7421 39800.0000 19866.6667
-7422 39800.0000 20433.3333
-7423 39800.0000 20516.6667
-7424 39800.0000 20583.3333
-7425 39800.0000 20600.0000
-7426 39800.0000 20666.6667
-7427 39800.0000 20700.0000
-7428 39800.0000 21000.0000
-7429 39800.0000 21333.3333
-7430 39800.0000 21383.3333
-7431 39800.0000 21600.0000
-7432 39800.0000 21633.3333
-7433 39800.0000 21766.6667
-7434 39800.0000 21850.0000
-7435 39800.0000 21900.0000
-7436 39800.0000 22066.6667
-7437 39800.0000 22116.6667
-7438 39800.0000 22183.3333
-7439 39800.0000 22333.3333
-7440 39800.0000 22366.6667
-7441 39800.0000 22483.3333
-7442 39800.0000 22650.0000
-7443 39800.0000 25333.3333
-7444 39816.6667 19850.0000
-7445 39816.6667 20516.6667
-7446 39816.6667 20550.0000
-7447 39816.6667 20633.3333
-7448 39816.6667 20650.0000
-7449 39816.6667 20733.3333
-7450 39816.6667 20916.6667
-7451 39816.6667 20950.0000
-7452 39816.6667 21350.0000
-7453 39816.6667 21733.3333
-7454 39816.6667 22083.3333
-7455 39816.6667 22233.3333
-7456 39816.6667 22533.3333
-7457 39816.6667 25350.0000
-7458 39833.3333 20433.3333
-7459 39833.3333 20483.3333
-7460 39833.3333 20500.0000
-7461 39833.3333 20550.0000
-7462 39833.3333 20583.3333
-7463 39833.3333 20600.0000
-7464 39833.3333 20616.6667
-7465 39833.3333 20750.0000
-7466 39833.3333 20883.3333
-7467 39833.3333 21300.0000
-7468 39833.3333 21433.3333
-7469 39833.3333 21500.0000
-7470 39833.3333 21616.6667
-7471 39833.3333 21866.6667
-7472 39833.3333 21883.3333
-7473 39833.3333 22033.3333
-7474 39833.3333 22050.0000
-7475 39833.3333 22100.0000
-7476 39833.3333 22200.0000
-7477 39833.3333 22300.0000
-7478 39833.3333 22466.6667
-7479 39833.3333 22516.6667
-7480 39833.3333 22766.6667
-7481 39833.3333 22783.3333
-7482 39833.3333 25333.3333
-7483 39843.6111 19402.7778
-7484 39850.0000 19416.6667
-7485 39850.0000 20483.3333
-7486 39850.0000 20516.6667
-7487 39850.0000 20583.3333
-7488 39850.0000 20666.6667
-7489 39850.0000 20683.3333
-7490 39850.0000 20766.6667
-7491 39850.0000 20950.0000
-7492 39850.0000 20983.3333
-7493 39850.0000 21233.3333
-7494 39850.0000 21350.0000
-7495 39850.0000 21450.0000
-7496 39850.0000 21600.0000
-7497 39850.0000 21666.6667
-7498 39850.0000 21700.0000
-7499 39850.0000 21716.6667
-7500 39850.0000 21783.3333
-7501 39850.0000 21800.0000
-7502 39850.0000 22066.6667
-7503 39850.0000 22166.6667
-7504 39850.0000 22183.3333
-7505 39850.0000 22550.0000
-7506 39850.0000 25083.3333
-7507 39866.6667 19383.3333
-7508 39866.6667 19416.6667
-7509 39866.6667 20400.0000
-7510 39866.6667 20516.6667
-7511 39866.6667 20550.0000
-7512 39866.6667 20566.6667
-7513 39866.6667 20750.0000
-7514 39866.6667 20783.3333
-7515 39866.6667 20850.0000
-7516 39866.6667 20966.6667
-7517 39866.6667 20983.3333
-7518 39866.6667 21466.6667
-7519 39866.6667 21566.6667
-7520 39866.6667 21683.3333
-7521 39866.6667 21766.6667
-7522 39866.6667 22116.6667
-7523 39866.6667 22416.6667
-7524 39866.6667 22433.3333
-7525 39866.6667 22466.6667
-7526 39866.6667 22516.6667
-7527 39866.6667 22533.3333
-7528 39866.6667 25066.6667
-7529 39866.6667 25150.0000
-7530 39866.6667 25166.6667
-7531 39866.6667 25266.6667
-7532 39866.6667 25316.6667
-7533 39883.3333 19583.3333
-7534 39883.3333 20466.6667
-7535 39883.3333 20500.0000
-7536 39883.3333 20633.3333
-7537 39883.3333 20650.0000
-7538 39883.3333 20666.6667
-7539 39883.3333 20700.0000
-7540 39883.3333 20750.0000
-7541 39883.3333 20783.3333
-7542 39883.3333 21333.3333
-7543 39883.3333 21366.6667
-7544 39883.3333 21616.6667
-7545 39883.3333 21650.0000
-7546 39883.3333 21733.3333
-7547 39883.3333 21816.6667
-7548 39883.3333 22066.6667
-7549 39883.3333 22233.3333
-7550 39883.3333 22716.6667
-7551 39883.3333 25183.3333
-7552 39883.3333 25316.6667
-7553 39900.0000 20383.3333
-7554 39900.0000 20400.0000
-7555 39900.0000 20466.6667
-7556 39900.0000 20583.3333
-7557 39900.0000 20650.0000
-7558 39900.0000 20683.3333
-7559 39900.0000 20783.3333
-7560 39900.0000 20816.6667
-7561 39900.0000 21283.3333
-7562 39900.0000 21683.3333
-7563 39900.0000 22183.3333
-7564 39900.0000 22550.0000
-7565 39900.0000 22633.3333
-7566 39900.0000 25183.3333
-7567 39900.0000 25200.0000
-7568 39900.0000 25216.6667
-7569 39900.0000 25283.3333
-7570 39916.6667 20383.3333
-7571 39916.6667 20400.0000
-7572 39916.6667 20533.3333
-7573 39916.6667 20566.6667
-7574 39916.6667 20850.0000
-7575 39916.6667 21400.0000
-7576 39916.6667 21450.0000
-7577 39916.6667 21516.6667
-7578 39916.6667 21566.6667
-7579 39916.6667 21766.6667
-7580 39916.6667 21816.6667
-7581 39916.6667 22150.0000
-7582 39916.6667 22583.3333
-7583 39916.6667 22683.3333
-7584 39916.6667 25083.3333
-7585 39916.6667 25116.6667
-7586 39916.6667 25150.0000
-7587 39916.6667 25200.0000
-7588 39916.6667 25266.6667
-7589 39916.6667 25300.0000
-7590 39916.6667 25333.3333
-7591 39933.3333 20366.6667
-7592 39933.3333 20400.0000
-7593 39933.3333 20416.6667
-7594 39933.3333 20466.6667
-7595 39933.3333 20600.0000
-7596 39933.3333 20650.0000
-7597 39933.3333 20666.6667
-7598 39933.3333 21050.0000
-7599 39933.3333 21350.0000
-7600 39933.3333 22050.0000
-7601 39933.3333 22150.0000
-7602 39933.3333 22566.6667
-7603 39933.3333 22683.3333
-7604 39933.3333 25133.3333
-7605 39933.3333 25183.3333
-7606 39933.3333 25233.3333
-7607 39933.3333 25266.6667
-7608 39933.3333 25333.3333
-7609 39950.0000 20350.0000
-7610 39950.0000 20433.3333
-7611 39950.0000 20533.3333
-7612 39950.0000 20616.6667
-7613 39950.0000 20666.6667
-7614 39950.0000 20700.0000
-7615 39950.0000 21233.3333
-7616 39950.0000 21366.6667
-7617 39950.0000 21400.0000
-7618 39950.0000 21616.6667
-7619 39950.0000 21666.6667
-7620 39950.0000 21733.3333
-7621 39950.0000 21966.6667
-7622 39950.0000 22066.6667
-7623 39950.0000 22616.6667
-7624 39950.0000 23533.3333
-7625 39950.0000 23616.6667
-7626 39950.0000 23666.6667
-7627 39950.0000 25166.6667
-7628 39950.0000 25200.0000
-7629 39950.0000 25216.6667
-7630 39950.0000 25300.0000
-7631 39966.6667 20333.3333
-7632 39966.6667 20350.0000
-7633 39966.6667 20383.3333
-7634 39966.6667 20566.6667
-7635 39966.6667 20583.3333
-7636 39966.6667 20633.3333
-7637 39966.6667 20683.3333
-7638 39966.6667 20716.6667
-7639 39966.6667 20950.0000
-7640 39966.6667 21266.6667
-7641 39966.6667 21450.0000
-7642 39966.6667 21500.0000
-7643 39966.6667 21733.3333
-7644 39966.6667 21933.3333
-7645 39966.6667 22116.6667
-7646 39966.6667 22250.0000
-7647 39966.6667 22350.0000
-7648 39966.6667 22583.3333
-7649 39966.6667 23400.0000
-7650 39966.6667 23916.6667
-7651 39966.6667 25150.0000
-7652 39966.6667 25233.3333
-7653 39966.6667 25366.6667
-7654 39983.3333 20433.3333
-7655 39983.3333 20550.0000
-7656 39983.3333 20666.6667
-7657 39983.3333 20916.6667
-7658 39983.3333 21116.6667
-7659 39983.3333 21316.6667
-7660 39983.3333 21416.6667
-7661 39983.3333 21816.6667
-7662 39983.3333 22033.3333
-7663 39983.3333 22150.0000
-7664 39983.3333 22183.3333
-7665 39983.3333 22250.0000
-7666 39983.3333 22333.3333
-7667 39983.3333 22400.0000
-7668 39983.3333 22466.6667
-7669 39983.3333 22616.6667
-7670 39983.3333 23616.6667
-7671 39983.3333 23983.3333
-7672 39983.3333 25400.0000
-7673 40000.0000 20416.6667
-7674 40000.0000 20600.0000
-7675 40000.0000 20683.3333
-7676 40000.0000 20883.3333
-7677 40000.0000 21133.3333
-7678 40000.0000 21283.3333
-7679 40000.0000 21300.0000
-7680 40000.0000 21333.3333
-7681 40000.0000 21600.0000
-7682 40000.0000 21650.0000
-7683 40000.0000 21683.3333
-7684 40000.0000 21966.6667
-7685 40000.0000 22083.3333
-7686 40000.0000 22233.3333
-7687 40000.0000 22283.3333
-7688 40000.0000 22533.3333
-7689 40000.0000 22583.3333
-7690 40000.0000 23383.3333
-7691 40000.0000 23416.6667
-7692 40000.0000 23583.3333
-7693 40000.0000 25416.6667
-7694 40016.6667 20516.6667
-7695 40016.6667 20566.6667
-7696 40016.6667 20633.3333
-7697 40016.6667 20666.6667
-7698 40016.6667 21316.6667
-7699 40016.6667 21433.3333
-7700 40016.6667 21533.3333
-7701 40016.6667 21616.6667
-7702 40016.6667 21850.0000
-7703 40016.6667 22133.3333
-7704 40016.6667 22183.3333
-7705 40016.6667 22200.0000
-7706 40016.6667 22550.0000
-7707 40016.6667 22583.3333
-7708 40016.6667 23450.0000
-7709 40016.6667 23533.3333
-7710 40016.6667 23916.6667
-7711 40033.3333 20433.3333
-7712 40033.3333 20466.6667
-7713 40033.3333 20483.3333
-7714 40033.3333 20666.6667
-7715 40033.3333 20883.3333
-7716 40033.3333 20916.6667
-7717 40033.3333 20966.6667
-7718 40033.3333 21016.6667
-7719 40033.3333 21183.3333
-7720 40033.3333 21200.0000
-7721 40033.3333 21266.6667
-7722 40033.3333 21350.0000
-7723 40033.3333 21616.6667
-7724 40033.3333 21650.0000
-7725 40033.3333 21933.3333
-7726 40033.3333 22050.0000
-7727 40033.3333 22066.6667
-7728 40033.3333 22166.6667
-7729 40033.3333 23366.6667
-7730 40033.3333 23466.6667
-7731 40033.3333 23883.3333
-7732 40033.3333 23933.3333
-7733 40033.3333 24000.0000
-7734 40050.0000 20550.0000
-7735 40050.0000 20600.0000
-7736 40050.0000 20650.0000
-7737 40050.0000 20683.3333
-7738 40050.0000 20700.0000
-7739 40050.0000 20750.0000
-7740 40050.0000 20850.0000
-7741 40050.0000 21200.0000
-7742 40050.0000 21683.3333
-7743 40050.0000 21766.6667
-7744 40050.0000 21866.6667
-7745 40050.0000 22033.3333
-7746 40050.0000 22516.6667
-7747 40050.0000 23416.6667
-7748 40050.0000 23816.6667
-7749 40050.0000 24000.0000
-7750 40066.6667 20433.3333
-7751 40066.6667 20566.6667
-7752 40066.6667 20616.6667
-7753 40066.6667 20750.0000
-7754 40066.6667 20783.3333
-7755 40066.6667 21116.6667
-7756 40066.6667 21216.6667
-7757 40066.6667 21283.3333
-7758 40066.6667 21333.3333
-7759 40066.6667 21400.0000
-7760 40066.6667 21516.6667
-7761 40066.6667 21566.6667
-7762 40066.6667 21616.6667
-7763 40066.6667 21683.3333
-7764 40066.6667 21816.6667
-7765 40066.6667 22050.0000
-7766 40066.6667 22166.6667
-7767 40066.6667 22233.3333
-7768 40066.6667 22566.6667
-7769 40083.3333 20616.6667
-7770 40083.3333 20666.6667
-7771 40083.3333 20716.6667
-7772 40083.3333 20783.3333
-7773 40083.3333 21150.0000
-7774 40083.3333 21200.0000
-7775 40083.3333 21283.3333
-7776 40083.3333 21333.3333
-7777 40083.3333 21416.6667
-7778 40083.3333 21516.6667
-7779 40083.3333 21550.0000
-7780 40083.3333 21650.0000
-7781 40083.3333 21883.3333
-7782 40083.3333 21966.6667
-7783 40083.3333 23450.0000
-7784 40083.3333 23800.0000
-7785 40100.0000 20733.3333
-7786 40100.0000 21016.6667
-7787 40100.0000 21366.6667
-7788 40100.0000 21533.3333
-7789 40100.0000 21600.0000
-7790 40100.0000 21616.6667
-7791 40100.0000 22250.0000
-7792 40100.0000 22500.0000
-7793 40100.0000 23433.3333
-7794 40100.0000 23783.3333
-7795 40100.0000 23983.3333
-7796 40116.6667 20716.6667
-7797 40116.6667 20750.0000
-7798 40116.6667 20800.0000
-7799 40116.6667 20850.0000
-7800 40116.6667 21150.0000
-7801 40116.6667 21266.6667
-7802 40116.6667 21316.6667
-7803 40116.6667 21350.0000
-7804 40116.6667 21416.6667
-7805 40116.6667 21483.3333
-7806 40116.6667 21516.6667
-7807 40116.6667 21933.3333
-7808 40116.6667 23333.3333
-7809 40116.6667 23816.6667
-7810 40133.3333 20683.3333
-7811 40133.3333 20750.0000
-7812 40133.3333 20816.6667
-7813 40133.3333 21133.3333
-7814 40133.3333 21200.0000
-7815 40133.3333 21233.3333
-7816 40133.3333 21666.6667
-7817 40133.3333 21733.3333
-7818 40133.3333 21866.6667
-7819 40133.3333 21950.0000
-7820 40133.3333 22150.0000
-7821 40133.3333 23400.0000
-7822 40133.3333 23766.6667
-7823 40133.3333 24283.3333
-7824 40133.3333 24350.0000
-7825 40150.0000 20733.3333
-7826 40150.0000 20850.0000
-7827 40150.0000 20900.0000
-7828 40150.0000 21250.0000
-7829 40150.0000 21333.3333
-7830 40150.0000 21366.6667
-7831 40150.0000 21433.3333
-7832 40150.0000 21483.3333
-7833 40150.0000 21516.6667
-7834 40150.0000 21550.0000
-7835 40150.0000 21950.0000
-7836 40150.0000 22016.6667
-7837 40150.0000 22233.3333
-7838 40150.0000 22550.0000
-7839 40150.0000 23350.0000
-7840 40150.0000 24300.0000
-7841 40150.0000 24383.3333
-7842 40166.6667 20733.3333
-7843 40166.6667 20783.3333
-7844 40166.6667 20950.0000
-7845 40166.6667 21166.6667
-7846 40166.6667 21183.3333
-7847 40166.6667 21216.6667
-7848 40166.6667 21283.3333
-7849 40166.6667 21466.6667
-7850 40166.6667 21633.3333
-7851 40166.6667 21816.6667
-7852 40166.6667 21866.6667
-7853 40166.6667 21916.6667
-7854 40166.6667 22016.6667
-7855 40166.6667 22483.3333
-7856 40166.6667 23866.6667
-7857 40183.3333 21033.3333
-7858 40183.3333 21516.6667
-7859 40183.3333 21583.3333
-7860 40183.3333 21766.6667
-7861 40183.3333 21850.0000
-7862 40183.3333 21966.6667
-7863 40183.3333 22000.0000
-7864 40183.3333 22433.3333
-7865 40183.3333 22483.3333
-7866 40183.3333 22566.6667
-7867 40200.0000 20850.0000
-7868 40200.0000 21133.3333
-7869 40200.0000 21183.3333
-7870 40200.0000 21233.3333
-7871 40200.0000 21316.6667
-7872 40200.0000 21366.6667
-7873 40200.0000 21400.0000
-7874 40200.0000 21433.3333
-7875 40200.0000 21483.3333
-7876 40200.0000 21600.0000
-7877 40200.0000 21750.0000
-7878 40200.0000 21800.0000
-7879 40200.0000 21866.6667
-7880 40200.0000 21950.0000
-7881 40200.0000 22033.3333
-7882 40200.0000 22233.3333
-7883 40200.0000 22450.0000
-7884 40200.0000 23333.3333
-7885 40200.0000 24316.6667
-7886 40216.6667 20816.6667
-7887 40216.6667 20866.6667
-7888 40216.6667 20916.6667
-7889 40216.6667 21016.6667
-7890 40216.6667 21200.0000
-7891 40216.6667 21250.0000
-7892 40216.6667 21283.3333
-7893 40216.6667 21483.3333
-7894 40216.6667 21783.3333
-7895 40216.6667 21850.0000
-7896 40216.6667 21883.3333
-7897 40216.6667 21900.0000
-7898 40216.6667 22066.6667
-7899 40216.6667 23666.6667
-7900 40216.6667 24216.6667
-7901 40233.3333 20783.3333
-7902 40233.3333 20850.0000
-7903 40233.3333 20933.3333
-7904 40233.3333 21166.6667
-7905 40233.3333 21216.6667
-7906 40233.3333 21283.3333
-7907 40233.3333 21316.6667
-7908 40233.3333 21350.0000
-7909 40233.3333 21383.3333
-7910 40233.3333 21416.6667
-7911 40233.3333 21750.0000
-7912 40233.3333 21833.3333
-7913 40233.3333 21900.0000
-7914 40233.3333 21966.6667
-7915 40233.3333 22300.0000
-7916 40233.3333 22466.6667
-7917 40233.3333 22500.0000
-7918 40233.3333 22583.3333
-7919 40233.3333 23600.0000
-7920 40233.3333 23666.6667
-7921 40250.0000 20816.6667
-7922 40250.0000 21200.0000
-7923 40250.0000 21266.6667
-7924 40250.0000 21433.3333
-7925 40250.0000 21683.3333
-7926 40250.0000 21750.0000
-7927 40250.0000 21800.0000
-7928 40250.0000 21900.0000
-7929 40250.0000 21916.6667
-7930 40250.0000 22066.6667
-7931 40250.0000 22333.3333
-7932 40250.0000 22366.6667
-7933 40250.0000 22383.3333
-7934 40250.0000 22566.6667
-7935 40250.0000 23283.3333
-7936 40250.0000 23550.0000
-7937 40250.0000 23700.0000
-7938 40250.0000 24200.0000
-7939 40250.0000 24250.0000
-7940 40266.6667 20733.3333
-7941 40266.6667 20750.0000
-7942 40266.6667 20766.6667
-7943 40266.6667 20900.0000
-7944 40266.6667 21200.0000
-7945 40266.6667 21283.3333
-7946 40266.6667 21316.6667
-7947 40266.6667 21383.3333
-7948 40266.6667 21416.6667
-7949 40266.6667 21450.0000
-7950 40266.6667 21500.0000
-7951 40266.6667 21550.0000
-7952 40266.6667 21750.0000
-7953 40266.6667 21783.3333
-7954 40266.6667 21816.6667
-7955 40266.6667 21933.3333
-7956 40266.6667 22033.3333
-7957 40266.6667 22083.3333
-7958 40266.6667 22150.0000
-7959 40266.6667 22283.3333
-7960 40266.6667 22300.0000
-7961 40266.6667 22416.6667
-7962 40266.6667 22466.6667
-7963 40266.6667 22500.0000
-7964 40266.6667 22533.3333
-7965 40266.6667 22583.3333
-7966 40266.6667 22600.0000
-7967 40266.6667 23200.0000
-7968 40266.6667 23216.6667
-7969 40266.6667 23266.6667
-7970 40266.6667 23333.3333
-7971 40266.6667 23500.0000
-7972 40266.6667 24250.0000
-7973 40283.3333 20966.6667
-7974 40283.3333 21033.3333
-7975 40283.3333 21150.0000
-7976 40283.3333 21166.6667
-7977 40283.3333 21200.0000
-7978 40283.3333 21216.6667
-7979 40283.3333 21233.3333
-7980 40283.3333 21350.0000
-7981 40283.3333 21483.3333
-7982 40283.3333 21733.3333
-7983 40283.3333 21866.6667
-7984 40283.3333 21966.6667
-7985 40283.3333 22116.6667
-7986 40283.3333 22283.3333
-7987 40283.3333 22433.3333
-7988 40283.3333 22466.6667
-7989 40283.3333 22600.0000
-7990 40283.3333 23150.0000
-7991 40283.3333 23250.0000
-7992 40283.3333 23300.0000
-7993 40283.3333 23350.0000
-7994 40283.3333 23400.0000
-7995 40283.3333 23450.0000
-7996 40283.3333 24250.0000
-7997 40300.0000 20766.6667
-7998 40300.0000 20950.0000
-7999 40300.0000 21133.3333
-8000 40300.0000 21200.0000
-8001 40300.0000 21216.6667
-8002 40300.0000 21233.3333
-8003 40300.0000 21266.6667
-8004 40300.0000 21283.3333
-8005 40300.0000 21300.0000
-8006 40300.0000 21366.6667
-8007 40300.0000 21416.6667
-8008 40300.0000 21650.0000
-8009 40300.0000 21783.3333
-8010 40300.0000 22033.3333
-8011 40300.0000 22500.0000
-8012 40300.0000 23200.0000
-8013 40300.0000 23350.0000
-8014 40300.0000 23550.0000
-8015 40300.0000 24050.0000
-8016 40300.0000 24066.6667
-8017 40300.0000 24216.6667
-8018 40316.6667 20850.0000
-8019 40316.6667 21133.3333
-8020 40316.6667 21183.3333
-8021 40316.6667 21333.3333
-8022 40316.6667 21383.3333
-8023 40316.6667 21433.3333
-8024 40316.6667 21550.0000
-8025 40316.6667 21650.0000
-8026 40316.6667 21666.6667
-8027 40316.6667 21700.0000
-8028 40316.6667 21916.6667
-8029 40316.6667 22116.6667
-8030 40316.6667 22250.0000
-8031 40316.6667 22350.0000
-8032 40316.6667 22466.6667
-8033 40316.6667 22500.0000
-8034 40316.6667 22583.3333
-8035 40316.6667 23066.6667
-8036 40316.6667 23350.0000
-8037 40333.3333 21000.0000
-8038 40333.3333 21133.3333
-8039 40333.3333 21183.3333
-8040 40333.3333 21233.3333
-8041 40333.3333 21250.0000
-8042 40333.3333 21283.3333
-8043 40333.3333 21366.6667
-8044 40333.3333 21666.6667
-8045 40333.3333 21683.3333
-8046 40333.3333 21716.6667
-8047 40333.3333 21733.3333
-8048 40333.3333 21783.3333
-8049 40333.3333 21800.0000
-8050 40333.3333 21866.6667
-8051 40333.3333 21883.3333
-8052 40333.3333 22016.6667
-8053 40333.3333 22166.6667
-8054 40333.3333 22333.3333
-8055 40333.3333 22533.3333
-8056 40333.3333 23066.6667
-8057 40333.3333 23133.3333
-8058 40333.3333 23150.0000
-8059 40333.3333 23166.6667
-8060 40333.3333 23233.3333
-8061 40333.3333 23266.6667
-8062 40333.3333 23400.0000
-8063 40333.3333 23616.6667
-8064 40333.3333 23650.0000
-8065 40333.3333 23716.6667
-8066 40333.3333 23916.6667
-8067 40333.3333 23983.3333
-8068 40350.0000 20933.3333
-8069 40350.0000 21083.3333
-8070 40350.0000 21333.3333
-8071 40350.0000 21400.0000
-8072 40350.0000 21516.6667
-8073 40350.0000 21716.6667
-8074 40350.0000 21816.6667
-8075 40350.0000 21833.3333
-8076 40350.0000 21866.6667
-8077 40350.0000 21916.6667
-8078 40350.0000 21933.3333
-8079 40350.0000 21950.0000
-8080 40350.0000 21966.6667
-8081 40350.0000 22033.3333
-8082 40350.0000 22200.0000
-8083 40350.0000 22433.3333
-8084 40350.0000 22500.0000
-8085 40350.0000 22550.0000
-8086 40350.0000 23016.6667
-8087 40350.0000 23133.3333
-8088 40350.0000 23183.3333
-8089 40350.0000 23233.3333
-8090 40350.0000 23316.6667
-8091 40350.0000 23583.3333
-8092 40350.0000 23733.3333
-8093 40366.6667 21016.6667
-8094 40366.6667 21116.6667
-8095 40366.6667 21150.0000
-8096 40366.6667 21183.3333
-8097 40366.6667 21200.0000
-8098 40366.6667 21233.3333
-8099 40366.6667 21316.6667
-8100 40366.6667 21350.0000
-8101 40366.6667 21433.3333
-8102 40366.6667 21466.6667
-8103 40366.6667 21983.3333
-8104 40366.6667 22066.6667
-8105 40366.6667 22466.6667
-8106 40366.6667 22583.3333
-8107 40366.6667 22616.6667
-8108 40366.6667 23050.0000
-8109 40366.6667 23100.0000
-8110 40366.6667 23166.6667
-8111 40366.6667 23233.3333
-8112 40366.6667 23266.6667
-8113 40366.6667 23283.3333
-8114 40366.6667 23533.3333
-8115 40366.6667 23583.3333
-8116 40366.6667 23650.0000
-8117 40366.6667 23666.6667
-8118 40366.6667 23700.0000
-8119 40366.6667 23833.3333
-8120 40366.6667 23883.3333
-8121 40383.3333 20833.3333
-8122 40383.3333 20950.0000
-8123 40383.3333 21000.0000
-8124 40383.3333 21100.0000
-8125 40383.3333 21166.6667
-8126 40383.3333 21200.0000
-8127 40383.3333 21300.0000
-8128 40383.3333 21316.6667
-8129 40383.3333 21350.0000
-8130 40383.3333 21700.0000
-8131 40383.3333 21716.6667
-8132 40383.3333 21766.6667
-8133 40383.3333 21966.6667
-8134 40383.3333 21983.3333
-8135 40383.3333 22000.0000
-8136 40383.3333 22216.6667
-8137 40383.3333 22516.6667
-8138 40383.3333 22633.3333
-8139 40383.3333 23050.0000
-8140 40383.3333 23083.3333
-8141 40383.3333 23450.0000
-8142 40383.3333 23616.6667
-8143 40383.3333 23916.6667
-8144 40383.3333 23983.3333
-8145 40400.0000 21000.0000
-8146 40400.0000 21133.3333
-8147 40400.0000 21166.6667
-8148 40400.0000 21250.0000
-8149 40400.0000 21933.3333
-8150 40400.0000 22150.0000
-8151 40400.0000 22383.3333
-8152 40400.0000 22550.0000
-8153 40400.0000 22900.0000
-8154 40400.0000 23150.0000
-8155 40400.0000 23200.0000
-8156 40400.0000 23800.0000
-8157 40400.0000 23883.3333
-8158 40416.6667 20883.3333
-8159 40416.6667 20966.6667
-8160 40416.6667 21066.6667
-8161 40416.6667 21233.3333
-8162 40416.6667 21283.3333
-8163 40416.6667 21300.0000
-8164 40416.6667 21383.3333
-8165 40416.6667 21516.6667
-8166 40416.6667 21683.3333
-8167 40416.6667 21766.6667
-8168 40416.6667 21916.6667
-8169 40416.6667 22116.6667
-8170 40416.6667 22233.3333
-8171 40416.6667 22300.0000
-8172 40416.6667 22450.0000
-8173 40416.6667 22466.6667
-8174 40416.6667 22550.0000
-8175 40416.6667 22600.0000
-8176 40416.6667 23000.0000
-8177 40416.6667 23100.0000
-8178 40416.6667 23133.3333
-8179 40416.6667 23250.0000
-8180 40416.6667 23583.3333
-8181 40416.6667 24000.0000
-8182 40433.3333 21033.3333
-8183 40433.3333 21066.6667
-8184 40433.3333 21083.3333
-8185 40433.3333 21116.6667
-8186 40433.3333 21266.6667
-8187 40433.3333 21333.3333
-8188 40433.3333 21500.0000
-8189 40433.3333 21866.6667
-8190 40433.3333 21900.0000
-8191 40433.3333 22183.3333
-8192 40433.3333 22583.3333
-8193 40433.3333 22933.3333
-8194 40433.3333 23033.3333
-8195 40433.3333 23100.0000
-8196 40433.3333 23133.3333
-8197 40433.3333 23316.6667
-8198 40433.3333 23416.6667
-8199 40433.3333 23516.6667
-8200 40433.3333 25533.3333
-8201 40450.0000 20850.0000
-8202 40450.0000 20933.3333
-8203 40450.0000 21133.3333
-8204 40450.0000 21166.6667
-8205 40450.0000 21183.3333
-8206 40450.0000 21216.6667
-8207 40450.0000 21333.3333
-8208 40450.0000 21433.3333
-8209 40450.0000 21516.6667
-8210 40450.0000 21733.3333
-8211 40450.0000 21800.0000
-8212 40450.0000 21833.3333
-8213 40450.0000 22266.6667
-8214 40450.0000 22383.3333
-8215 40450.0000 22450.0000
-8216 40450.0000 22583.3333
-8217 40450.0000 23033.3333
-8218 40450.0000 23683.3333
-8219 40450.0000 25516.6667
-8220 40466.6667 20866.6667
-8221 40466.6667 20900.0000
-8222 40466.6667 20966.6667
-8223 40466.6667 21000.0000
-8224 40466.6667 21066.6667
-8225 40466.6667 21100.0000
-8226 40466.6667 21266.6667
-8227 40466.6667 21300.0000
-8228 40466.6667 21666.6667
-8229 40466.6667 21766.6667
-8230 40466.6667 21866.6667
-8231 40466.6667 22083.3333
-8232 40466.6667 22166.6667
-8233 40466.6667 22550.0000
-8234 40466.6667 22583.3333
-8235 40466.6667 22866.6667
-8236 40466.6667 22950.0000
-8237 40466.6667 22966.6667
-8238 40466.6667 22983.3333
-8239 40466.6667 23000.0000
-8240 40466.6667 23083.3333
-8241 40466.6667 23133.3333
-8242 40466.6667 23183.3333
-8243 40466.6667 23283.3333
-8244 40466.6667 23383.3333
-8245 40466.6667 25500.0000
-8246 40483.3333 20983.3333
-8247 40483.3333 21016.6667
-8248 40483.3333 21133.3333
-8249 40483.3333 21166.6667
-8250 40483.3333 21183.3333
-8251 40483.3333 21216.6667
-8252 40483.3333 21283.3333
-8253 40483.3333 21550.0000
-8254 40483.3333 21566.6667
-8255 40483.3333 21600.0000
-8256 40483.3333 21633.3333
-8257 40483.3333 21716.6667
-8258 40483.3333 21816.6667
-8259 40483.3333 22116.6667
-8260 40483.3333 22216.6667
-8261 40483.3333 22233.3333
-8262 40483.3333 22316.6667
-8263 40483.3333 22350.0000
-8264 40483.3333 22483.3333
-8265 40483.3333 22833.3333
-8266 40483.3333 22866.6667
-8267 40483.3333 23016.6667
-8268 40483.3333 23050.0000
-8269 40483.3333 23133.3333
-8270 40483.3333 23600.0000
-8271 40483.3333 25466.6667
-8272 40483.3333 25516.6667
-8273 40500.0000 21050.0000
-8274 40500.0000 21166.6667
-8275 40500.0000 21216.6667
-8276 40500.0000 21250.0000
-8277 40500.0000 21383.3333
-8278 40500.0000 21533.3333
-8279 40500.0000 21766.6667
-8280 40500.0000 21816.6667
-8281 40500.0000 21850.0000
-8282 40500.0000 22183.3333
-8283 40500.0000 22250.0000
-8284 40500.0000 22416.6667
-8285 40500.0000 22433.3333
-8286 40500.0000 22550.0000
-8287 40500.0000 22833.3333
-8288 40500.0000 22883.3333
-8289 40500.0000 22916.6667
-8290 40500.0000 22933.3333
-8291 40500.0000 22983.3333
-8292 40500.0000 23383.3333
-8293 40500.0000 23433.3333
-8294 40500.0000 23450.0000
-8295 40500.0000 23650.0000
-8296 40500.0000 25533.3333
-8297 40516.6667 21000.0000
-8298 40516.6667 21050.0000
-8299 40516.6667 21083.3333
-8300 40516.6667 21200.0000
-8301 40516.6667 21266.6667
-8302 40516.6667 21316.6667
-8303 40516.6667 21416.6667
-8304 40516.6667 21550.0000
-8305 40516.6667 21683.3333
-8306 40516.6667 21750.0000
-8307 40516.6667 22083.3333
-8308 40516.6667 22200.0000
-8309 40516.6667 22233.3333
-8310 40516.6667 22383.3333
-8311 40516.6667 22400.0000
-8312 40516.6667 22500.0000
-8313 40516.6667 22966.6667
-8314 40516.6667 23116.6667
-8315 40516.6667 23216.6667
-8316 40516.6667 23283.3333
-8317 40516.6667 23683.3333
-8318 40516.6667 23833.3333
-8319 40533.3333 21016.6667
-8320 40533.3333 21033.3333
-8321 40533.3333 21116.6667
-8322 40533.3333 21183.3333
-8323 40533.3333 21216.6667
-8324 40533.3333 21466.6667
-8325 40533.3333 21500.0000
-8326 40533.3333 21600.0000
-8327 40533.3333 22133.3333
-8328 40533.3333 22266.6667
-8329 40533.3333 22316.6667
-8330 40533.3333 22433.3333
-8331 40533.3333 23050.0000
-8332 40533.3333 23750.0000
-8333 40533.3333 23766.6667
-8334 40550.0000 21350.0000
-8335 40550.0000 21400.0000
-8336 40550.0000 21433.3333
-8337 40550.0000 21716.6667
-8338 40550.0000 21750.0000
-8339 40550.0000 22033.3333
-8340 40550.0000 22250.0000
-8341 40550.0000 22266.6667
-8342 40550.0000 22316.6667
-8343 40550.0000 22400.0000
-8344 40550.0000 22416.6667
-8345 40550.0000 22450.0000
-8346 40550.0000 22466.6667
-8347 40550.0000 22500.0000
-8348 40550.0000 23016.6667
-8349 40550.0000 23050.0000
-8350 40550.0000 23133.3333
-8351 40550.0000 23166.6667
-8352 40550.0000 23300.0000
-8353 40550.0000 23416.6667
-8354 40550.0000 23450.0000
-8355 40550.0000 23583.3333
-8356 40550.0000 23850.0000
-8357 40566.6667 21250.0000
-8358 40566.6667 21266.6667
-8359 40566.6667 21316.6667
-8360 40566.6667 21433.3333
-8361 40566.6667 21600.0000
-8362 40566.6667 21700.0000
-8363 40566.6667 22116.6667
-8364 40566.6667 22150.0000
-8365 40566.6667 22183.3333
-8366 40566.6667 22200.0000
-8367 40566.6667 22216.6667
-8368 40566.6667 22233.3333
-8369 40566.6667 22333.3333
-8370 40566.6667 22350.0000
-8371 40566.6667 22366.6667
-8372 40566.6667 22516.6667
-8373 40566.6667 22550.0000
-8374 40566.6667 22583.3333
-8375 40566.6667 23100.0000
-8376 40566.6667 23283.3333
-8377 40566.6667 23350.0000
-8378 40566.6667 23366.6667
-8379 40566.6667 23466.6667
-8380 40566.6667 23666.6667
-8381 40583.3333 21066.6667
-8382 40583.3333 21083.3333
-8383 40583.3333 21150.0000
-8384 40583.3333 21300.0000
-8385 40583.3333 21400.0000
-8386 40583.3333 21483.3333
-8387 40583.3333 22066.6667
-8388 40583.3333 22250.0000
-8389 40583.3333 22300.0000
-8390 40583.3333 22400.0000
-8391 40583.3333 22516.6667
-8392 40583.3333 22600.0000
-8393 40583.3333 22966.6667
-8394 40583.3333 23033.3333
-8395 40583.3333 23216.6667
-8396 40583.3333 23350.0000
-8397 40583.3333 23400.0000
-8398 40583.3333 23416.6667
-8399 40583.3333 23433.3333
-8400 40583.3333 24650.0000
-8401 40600.0000 21266.6667
-8402 40600.0000 21366.6667
-8403 40600.0000 21616.6667
-8404 40600.0000 21783.3333
-8405 40600.0000 22133.3333
-8406 40600.0000 22200.0000
-8407 40600.0000 22216.6667
-8408 40600.0000 22233.3333
-8409 40600.0000 22333.3333
-8410 40600.0000 22350.0000
-8411 40600.0000 22366.6667
-8412 40600.0000 22450.0000
-8413 40600.0000 22483.3333
-8414 40600.0000 22500.0000
-8415 40600.0000 22550.0000
-8416 40600.0000 22983.3333
-8417 40600.0000 23100.0000
-8418 40600.0000 23183.3333
-8419 40600.0000 23450.0000
-8420 40600.0000 23483.3333
-8421 40600.0000 23750.0000
-8422 40600.0000 23783.3333
-8423 40600.0000 24750.0000
-8424 40616.6667 21216.6667
-8425 40616.6667 21316.6667
-8426 40616.6667 21350.0000
-8427 40616.6667 21466.6667
-8428 40616.6667 21500.0000
-8429 40616.6667 21750.0000
-8430 40616.6667 22183.3333
-8431 40616.6667 22366.6667
-8432 40616.6667 22400.0000
-8433 40616.6667 22433.3333
-8434 40616.6667 22683.3333
-8435 40616.6667 22700.0000
-8436 40616.6667 23433.3333
-8437 40616.6667 23566.6667
-8438 40633.3333 21083.3333
-8439 40633.3333 21183.3333
-8440 40633.3333 21233.3333
-8441 40633.3333 21283.3333
-8442 40633.3333 21566.6667
-8443 40633.3333 21583.3333
-8444 40633.3333 21700.0000
-8445 40633.3333 21833.3333
-8446 40633.3333 22066.6667
-8447 40633.3333 22133.3333
-8448 40633.3333 22383.3333
-8449 40633.3333 22450.0000
-8450 40633.3333 22500.0000
-8451 40633.3333 22733.3333
-8452 40633.3333 22933.3333
-8453 40633.3333 22950.0000
-8454 40633.3333 23183.3333
-8455 40633.3333 23216.6667
-8456 40633.3333 23250.0000
-8457 40633.3333 23266.6667
-8458 40633.3333 23350.0000
-8459 40633.3333 23450.0000
-8460 40633.3333 23483.3333
-8461 40633.3333 23616.6667
-8462 40633.3333 24566.6667
-8463 40633.3333 24583.3333
-8464 40650.0000 21066.6667
-8465 40650.0000 21233.3333
-8466 40650.0000 21500.0000
-8467 40650.0000 21700.0000
-8468 40650.0000 21766.6667
-8469 40650.0000 22116.6667
-8470 40650.0000 22166.6667
-8471 40650.0000 22216.6667
-8472 40650.0000 22233.3333
-8473 40650.0000 22433.3333
-8474 40650.0000 22533.3333
-8475 40650.0000 22866.6667
-8476 40650.0000 22883.3333
-8477 40650.0000 22900.0000
-8478 40650.0000 23033.3333
-8479 40650.0000 23300.0000
-8480 40650.0000 23400.0000
-8481 40650.0000 23483.3333
-8482 40650.0000 23616.6667
-8483 40650.0000 23700.0000
-8484 40650.0000 24516.6667
-8485 40666.6667 21100.0000
-8486 40666.6667 21150.0000
-8487 40666.6667 21266.6667
-8488 40666.6667 21333.3333
-8489 40666.6667 21550.0000
-8490 40666.6667 21583.3333
-8491 40666.6667 21600.0000
-8492 40666.6667 21633.3333
-8493 40666.6667 21833.3333
-8494 40666.6667 22050.0000
-8495 40666.6667 22450.0000
-8496 40666.6667 22516.6667
-8497 40666.6667 22600.0000
-8498 40666.6667 22633.3333
-8499 40666.6667 22716.6667
-8500 40666.6667 22800.0000
-8501 40666.6667 22900.0000
-8502 40666.6667 22916.6667
-8503 40666.6667 22933.3333
-8504 40666.6667 22950.0000
-8505 40666.6667 22983.3333
-8506 40666.6667 23116.6667
-8507 40666.6667 23333.3333
-8508 40666.6667 23700.0000
-8509 40666.6667 24650.0000
-8510 40666.6667 24700.0000
-8511 40666.6667 24766.6667
-8512 40683.3333 21450.0000
-8513 40683.3333 21616.6667
-8514 40683.3333 21666.6667
-8515 40683.3333 21683.3333
-8516 40683.3333 21716.6667
-8517 40683.3333 22133.3333
-8518 40683.3333 22200.0000
-8519 40683.3333 22250.0000
-8520 40683.3333 22266.6667
-8521 40683.3333 22300.0000
-8522 40683.3333 22533.3333
-8523 40683.3333 22850.0000
-8524 40683.3333 22950.0000
-8525 40683.3333 23000.0000
-8526 40683.3333 23083.3333
-8527 40683.3333 23250.0000
-8528 40683.3333 23283.3333
-8529 40683.3333 23566.6667
-8530 40683.3333 23616.6667
-8531 40683.3333 24616.6667
-8532 40700.0000 21166.6667
-8533 40700.0000 21266.6667
-8534 40700.0000 21300.0000
-8535 40700.0000 21400.0000
-8536 40700.0000 21466.6667
-8537 40700.0000 21516.6667
-8538 40700.0000 21783.3333
-8539 40700.0000 21900.0000
-8540 40700.0000 21933.3333
-8541 40700.0000 22016.6667
-8542 40700.0000 22100.0000
-8543 40700.0000 22266.6667
-8544 40700.0000 22550.0000
-8545 40700.0000 22600.0000
-8546 40700.0000 23216.6667
-8547 40700.0000 23333.3333
-8548 40700.0000 23433.3333
-8549 40700.0000 23650.0000
-8550 40700.0000 24550.0000
-8551 40700.0000 24766.6667
-8552 40716.6667 21050.0000
-8553 40716.6667 21100.0000
-8554 40716.6667 21150.0000
-8555 40716.6667 21200.0000
-8556 40716.6667 21266.6667
-8557 40716.6667 21366.6667
-8558 40716.6667 21466.6667
-8559 40716.6667 21783.3333
-8560 40716.6667 22000.0000
-8561 40716.6667 22083.3333
-8562 40716.6667 22116.6667
-8563 40716.6667 22150.0000
-8564 40716.6667 22166.6667
-8565 40716.6667 22216.6667
-8566 40716.6667 22300.0000
-8567 40716.6667 22633.3333
-8568 40716.6667 22733.3333
-8569 40716.6667 22783.3333
-8570 40716.6667 23000.0000
-8571 40716.6667 23050.0000
-8572 40716.6667 23183.3333
-8573 40716.6667 23283.3333
-8574 40716.6667 23383.3333
-8575 40716.6667 23700.0000
-8576 40716.6667 24533.3333
-8577 40716.6667 24550.0000
-8578 40716.6667 24583.3333
-8579 40716.6667 24616.6667
-8580 40716.6667 24733.3333
-8581 40733.3333 21016.6667
-8582 40733.3333 21133.3333
-8583 40733.3333 21200.0000
-8584 40733.3333 21400.0000
-8585 40733.3333 21433.3333
-8586 40733.3333 21483.3333
-8587 40733.3333 21666.6667
-8588 40733.3333 21750.0000
-8589 40733.3333 21816.6667
-8590 40733.3333 22133.3333
-8591 40733.3333 22216.6667
-8592 40733.3333 22600.0000
-8593 40733.3333 22700.0000
-8594 40733.3333 22883.3333
-8595 40733.3333 22916.6667
-8596 40733.3333 23250.0000
-8597 40733.3333 23550.0000
-8598 40733.3333 24116.6667
-8599 40733.3333 24616.6667
-8600 40733.3333 24733.3333
-8601 40750.0000 21000.0000
-8602 40750.0000 21066.6667
-8603 40750.0000 21116.6667
-8604 40750.0000 21300.0000
-8605 40750.0000 21466.6667
-8606 40750.0000 21516.6667
-8607 40750.0000 21633.3333
-8608 40750.0000 22016.6667
-8609 40750.0000 22216.6667
-8610 40750.0000 22250.0000
-8611 40750.0000 22283.3333
-8612 40750.0000 22333.3333
-8613 40750.0000 22583.3333
-8614 40750.0000 22633.3333
-8615 40750.0000 22766.6667
-8616 40750.0000 22850.0000
-8617 40750.0000 22983.3333
-8618 40750.0000 23033.3333
-8619 40750.0000 23066.6667
-8620 40750.0000 23133.3333
-8621 40750.0000 23383.3333
-8622 40750.0000 23466.6667
-8623 40750.0000 23583.3333
-8624 40750.0000 23983.3333
-8625 40750.0000 24583.3333
-8626 40750.0000 24633.3333
-8627 40758.0556 24577.5000
-8628 40766.6667 21033.3333
-8629 40766.6667 21150.0000
-8630 40766.6667 21200.0000
-8631 40766.6667 21350.0000
-8632 40766.6667 21400.0000
-8633 40766.6667 21533.3333
-8634 40766.6667 21616.6667
-8635 40766.6667 21900.0000
-8636 40766.6667 22050.0000
-8637 40766.6667 22066.6667
-8638 40766.6667 22116.6667
-8639 40766.6667 22150.0000
-8640 40766.6667 22166.6667
-8641 40766.6667 22183.3333
-8642 40766.6667 22250.0000
-8643 40766.6667 22316.6667
-8644 40766.6667 22500.0000
-8645 40766.6667 22533.3333
-8646 40766.6667 22583.3333
-8647 40766.6667 22716.6667
-8648 40766.6667 22933.3333
-8649 40766.6667 23033.3333
-8650 40766.6667 23083.3333
-8651 40766.6667 23216.6667
-8652 40766.6667 23250.0000
-8653 40766.6667 23383.3333
-8654 40766.6667 23450.0000
-8655 40766.6667 23483.3333
-8656 40766.6667 23583.3333
-8657 40766.6667 24633.3333
-8658 40770.0000 24723.8889
-8659 40778.0556 24709.4444
-8660 40778.8889 24611.6667
-8661 40783.3333 21083.3333
-8662 40783.3333 21133.3333
-8663 40783.3333 21250.0000
-8664 40783.3333 21300.0000
-8665 40783.3333 21400.0000
-8666 40783.3333 21466.6667
-8667 40783.3333 21483.3333
-8668 40783.3333 21550.0000
-8669 40783.3333 21683.3333
-8670 40783.3333 22083.3333
-8671 40783.3333 22166.6667
-8672 40783.3333 22266.6667
-8673 40783.3333 22483.3333
-8674 40783.3333 22583.3333
-8675 40783.3333 22883.3333
-8676 40783.3333 22966.6667
-8677 40783.3333 23533.3333
-8678 40783.3333 23850.0000
-8679 40783.3333 23950.0000
-8680 40783.3333 24033.3333
-8681 40800.0000 21150.0000
-8682 40800.0000 21466.6667
-8683 40800.0000 21516.6667
-8684 40800.0000 21583.3333
-8685 40800.0000 21783.3333
-8686 40800.0000 21833.3333
-8687 40800.0000 21850.0000
-8688 40800.0000 21866.6667
-8689 40800.0000 21916.6667
-8690 40800.0000 22000.0000
-8691 40800.0000 22033.3333
-8692 40800.0000 22050.0000
-8693 40800.0000 22216.6667
-8694 40800.0000 22233.3333
-8695 40800.0000 22333.3333
-8696 40800.0000 22366.6667
-8697 40800.0000 22416.6667
-8698 40800.0000 22466.6667
-8699 40800.0000 22566.6667
-8700 40800.0000 22666.6667
-8701 40800.0000 22766.6667
-8702 40800.0000 22783.3333
-8703 40800.0000 22833.3333
-8704 40800.0000 22866.6667
-8705 40800.0000 22900.0000
-8706 40800.0000 23116.6667
-8707 40800.0000 23466.6667
-8708 40800.0000 23850.0000
-8709 40800.0000 23916.6667
-8710 40800.0000 23950.0000
-8711 40816.6667 21116.6667
-8712 40816.6667 21133.3333
-8713 40816.6667 21300.0000
-8714 40816.6667 21400.0000
-8715 40816.6667 21933.3333
-8716 40816.6667 22066.6667
-8717 40816.6667 22100.0000
-8718 40816.6667 22166.6667
-8719 40816.6667 22183.3333
-8720 40816.6667 22266.6667
-8721 40816.6667 22350.0000
-8722 40816.6667 22416.6667
-8723 40816.6667 22533.3333
-8724 40816.6667 22666.6667
-8725 40816.6667 22700.0000
-8726 40816.6667 22733.3333
-8727 40816.6667 23033.3333
-8728 40816.6667 23116.6667
-8729 40816.6667 23150.0000
-8730 40816.6667 23283.3333
-8731 40816.6667 23300.0000
-8732 40816.6667 23350.0000
-8733 40816.6667 23516.6667
-8734 40816.6667 23566.6667
-8735 40816.6667 23650.0000
-8736 40816.6667 24150.0000
-8737 40816.6667 24250.0000
-8738 40833.3333 21033.3333
-8739 40833.3333 21133.3333
-8740 40833.3333 21150.0000
-8741 40833.3333 21166.6667
-8742 40833.3333 21300.0000
-8743 40833.3333 21400.0000
-8744 40833.3333 21500.0000
-8745 40833.3333 21516.6667
-8746 40833.3333 21533.3333
-8747 40833.3333 21583.3333
-8748 40833.3333 21766.6667
-8749 40833.3333 22000.0000
-8750 40833.3333 22200.0000
-8751 40833.3333 22250.0000
-8752 40833.3333 22300.0000
-8753 40833.3333 22350.0000
-8754 40833.3333 22383.3333
-8755 40833.3333 22450.0000
-8756 40833.3333 22600.0000
-8757 40833.3333 22650.0000
-8758 40833.3333 22783.3333
-8759 40833.3333 22850.0000
-8760 40833.3333 22983.3333
-8761 40833.3333 23200.0000
-8762 40833.3333 23783.3333
-8763 40833.3333 23850.0000
-8764 40833.3333 23933.3333
-8765 40833.3333 24000.0000
-8766 40833.3333 24016.6667
-8767 40833.3333 24200.0000
-8768 40838.8889 24303.6111
-8769 40850.0000 21316.6667
-8770 40850.0000 21383.3333
-8771 40850.0000 21400.0000
-8772 40850.0000 21816.6667
-8773 40850.0000 21850.0000
-8774 40850.0000 21950.0000
-8775 40850.0000 22100.0000
-8776 40850.0000 22216.6667
-8777 40850.0000 22250.0000
-8778 40850.0000 22283.3333
-8779 40850.0000 22300.0000
-8780 40850.0000 22500.0000
-8781 40850.0000 22716.6667
-8782 40850.0000 22833.3333
-8783 40850.0000 22916.6667
-8784 40850.0000 23166.6667
-8785 40850.0000 23650.0000
-8786 40850.0000 23733.3333
-8787 40850.0000 24066.6667
-8788 40850.0000 24150.0000
-8789 40850.0000 24166.6667
-8790 40850.0000 24250.0000
-8791 40850.0000 25750.0000
-8792 40850.0000 25833.3333
-8793 40850.0000 25866.6667
-8794 40850.0000 25933.3333
-8795 40850.0000 26100.0000
-8796 40858.3333 24706.1111
-8797 40864.4444 24315.8333
-8798 40866.6667 21350.0000
-8799 40866.6667 21366.6667
-8800 40866.6667 21450.0000
-8801 40866.6667 21466.6667
-8802 40866.6667 21500.0000
-8803 40866.6667 21600.0000
-8804 40866.6667 21616.6667
-8805 40866.6667 21633.3333
-8806 40866.6667 22050.0000
-8807 40866.6667 22216.6667
-8808 40866.6667 22416.6667
-8809 40866.6667 22466.6667
-8810 40866.6667 22533.3333
-8811 40866.6667 22583.3333
-8812 40866.6667 22683.3333
-8813 40866.6667 22816.6667
-8814 40866.6667 22883.3333
-8815 40866.6667 22916.6667
-8816 40866.6667 22966.6667
-8817 40866.6667 23000.0000
-8818 40866.6667 23583.3333
-8819 40866.6667 23616.6667
-8820 40866.6667 23766.6667
-8821 40866.6667 23900.0000
-8822 40866.6667 23933.3333
-8823 40866.6667 24083.3333
-8824 40866.6667 24116.6667
-8825 40866.6667 24150.0000
-8826 40866.6667 24166.6667
-8827 40866.6667 24183.3333
-8828 40866.6667 24200.0000
-8829 40866.6667 24283.3333
-8830 40866.6667 25683.3333
-8831 40866.6667 25700.0000
-8832 40866.6667 25900.0000
-8833 40866.6667 25983.3333
-8834 40866.6667 26000.0000
-8835 40866.6667 26116.6667
-8836 40875.5556 24706.9444
-8837 40878.6111 24731.3889
-8838 40883.3333 21383.3333
-8839 40883.3333 21400.0000
-8840 40883.3333 21516.6667
-8841 40883.3333 21683.3333
-8842 40883.3333 21966.6667
-8843 40883.3333 22033.3333
-8844 40883.3333 22416.6667
-8845 40883.3333 22516.6667
-8846 40883.3333 22566.6667
-8847 40883.3333 22633.3333
-8848 40883.3333 22650.0000
-8849 40883.3333 22733.3333
-8850 40883.3333 22816.6667
-8851 40883.3333 22866.6667
-8852 40883.3333 22916.6667
-8853 40883.3333 22950.0000
-8854 40883.3333 23100.0000
-8855 40883.3333 23183.3333
-8856 40883.3333 23233.3333
-8857 40883.3333 23250.0000
-8858 40883.3333 23600.0000
-8859 40883.3333 23616.6667
-8860 40883.3333 23633.3333
-8861 40883.3333 23700.0000
-8862 40883.3333 23766.6667
-8863 40883.3333 23950.0000
-8864 40883.3333 24166.6667
-8865 40883.3333 24183.3333
-8866 40883.3333 24200.0000
-8867 40883.3333 24233.3333
-8868 40883.3333 25516.6667
-8869 40883.3333 25733.3333
-8870 40883.3333 25866.6667
-8871 40883.3333 25983.3333
-8872 40883.3333 26050.0000
-8873 40900.0000 21466.6667
-8874 40900.0000 21516.6667
-8875 40900.0000 22050.0000
-8876 40900.0000 22150.0000
-8877 40900.0000 22183.3333
-8878 40900.0000 22333.3333
-8879 40900.0000 22450.0000
-8880 40900.0000 22483.3333
-8881 40900.0000 22550.0000
-8882 40900.0000 22633.3333
-8883 40900.0000 22783.3333
-8884 40900.0000 22966.6667
-8885 40900.0000 22983.3333
-8886 40900.0000 23500.0000
-8887 40900.0000 23550.0000
-8888 40900.0000 23616.6667
-8889 40900.0000 23700.0000
-8890 40900.0000 23750.0000
-8891 40900.0000 23816.6667
-8892 40900.0000 24216.6667
-8893 40900.0000 25616.6667
-8894 40900.0000 25833.3333
-8895 40900.0000 25916.6667
-8896 40900.0000 26000.0000
-8897 40900.0000 26050.0000
-8898 40900.0000 26166.6667
-8899 40900.0000 26216.6667
-8900 40903.3333 24348.0556
-8901 40904.1667 24670.8333
-8902 40907.5000 24708.3333
-8903 40908.8889 24657.2222
-8904 40916.6667 21416.6667
-8905 40916.6667 21683.3333
-8906 40916.6667 21933.3333
-8907 40916.6667 21950.0000
-8908 40916.6667 22400.0000
-8909 40916.6667 22700.0000
-8910 40916.6667 22750.0000
-8911 40916.6667 22766.6667
-8912 40916.6667 22866.6667
-8913 40916.6667 22950.0000
-8914 40916.6667 23050.0000
-8915 40916.6667 23083.3333
-8916 40916.6667 23300.0000
-8917 40916.6667 23483.3333
-8918 40916.6667 23566.6667
-8919 40916.6667 23650.0000
-8920 40916.6667 23866.6667
-8921 40916.6667 23983.3333
-8922 40916.6667 24216.6667
-8923 40916.6667 24250.0000
-8924 40916.6667 25516.6667
-8925 40916.6667 25650.0000
-8926 40916.6667 25666.6667
-8927 40916.6667 25700.0000
-8928 40916.6667 25866.6667
-8929 40916.6667 25983.3333
-8930 40933.3333 21966.6667
-8931 40933.3333 22016.6667
-8932 40933.3333 22100.0000
-8933 40933.3333 22416.6667
-8934 40933.3333 22550.0000
-8935 40933.3333 22566.6667
-8936 40933.3333 22966.6667
-8937 40933.3333 23183.3333
-8938 40933.3333 23233.3333
-8939 40933.3333 23433.3333
-8940 40933.3333 23566.6667
-8941 40933.3333 24300.0000
-8942 40933.3333 24350.0000
-8943 40933.3333 24716.6667
-8944 40933.3333 24733.3333
-8945 40933.3333 24816.6667
-8946 40933.3333 24833.3333
-8947 40933.3333 24983.3333
-8948 40933.3333 25566.6667
-8949 40933.3333 25683.3333
-8950 40933.3333 25916.6667
-8951 40933.3333 26116.6667
-8952 40933.3333 26166.6667
-8953 40933.3333 26216.6667
-8954 40939.7222 24401.9444
-8955 40950.0000 21933.3333
-8956 40950.0000 21966.6667
-8957 40950.0000 22050.0000
-8958 40950.0000 22116.6667
-8959 40950.0000 22200.0000
-8960 40950.0000 22416.6667
-8961 40950.0000 22450.0000
-8962 40950.0000 22500.0000
-8963 40950.0000 22566.6667
-8964 40950.0000 22683.3333
-8965 40950.0000 22750.0000
-8966 40950.0000 22800.0000
-8967 40950.0000 22816.6667
-8968 40950.0000 22900.0000
-8969 40950.0000 22933.3333
-8970 40950.0000 23350.0000
-8971 40950.0000 23400.0000
-8972 40950.0000 23416.6667
-8973 40950.0000 23466.6667
-8974 40950.0000 23500.0000
-8975 40950.0000 23883.3333
-8976 40950.0000 23916.6667
-8977 40950.0000 24000.0000
-8978 40950.0000 24150.0000
-8979 40950.0000 24183.3333
-8980 40950.0000 24216.6667
-8981 40950.0000 24433.3333
-8982 40950.0000 24633.3333
-8983 40950.0000 24783.3333
-8984 40950.0000 24866.6667
-8985 40950.0000 25166.6667
-8986 40950.0000 25433.3333
-8987 40950.0000 25466.6667
-8988 40950.0000 25566.6667
-8989 40950.0000 25650.0000
-8990 40950.0000 26000.0000
-8991 40950.0000 26100.0000
-8992 40950.0000 26233.3333
-8993 40950.0000 26300.0000
-8994 40961.6667 24510.0000
-8995 40966.6667 21950.0000
-8996 40966.6667 22016.6667
-8997 40966.6667 22033.3333
-8998 40966.6667 22083.3333
-8999 40966.6667 22516.6667
-9000 40966.6667 22783.3333
-9001 40966.6667 22866.6667
-9002 40966.6667 22933.3333
-9003 40966.6667 23050.0000
-9004 40966.6667 23200.0000
-9005 40966.6667 23716.6667
-9006 40966.6667 24033.3333
-9007 40966.6667 24316.6667
-9008 40966.6667 24333.3333
-9009 40966.6667 24366.6667
-9010 40966.6667 24583.3333
-9011 40966.6667 24700.0000
-9012 40966.6667 24800.0000
-9013 40966.6667 24933.3333
-9014 40966.6667 25133.3333
-9015 40966.6667 25366.6667
-9016 40966.6667 25716.6667
-9017 40966.6667 26183.3333
-9018 40966.6667 26266.6667
-9019 40966.6667 26333.3333
-9020 40983.3333 21966.6667
-9021 40983.3333 21983.3333
-9022 40983.3333 22066.6667
-9023 40983.3333 22133.3333
-9024 40983.3333 22383.3333
-9025 40983.3333 22416.6667
-9026 40983.3333 22550.0000
-9027 40983.3333 22616.6667
-9028 40983.3333 22650.0000
-9029 40983.3333 22666.6667
-9030 40983.3333 22950.0000
-9031 40983.3333 23000.0000
-9032 40983.3333 23116.6667
-9033 40983.3333 23233.3333
-9034 40983.3333 23283.3333
-9035 40983.3333 23350.0000
-9036 40983.3333 23416.6667
-9037 40983.3333 23433.3333
-9038 40983.3333 23516.6667
-9039 40983.3333 23666.6667
-9040 40983.3333 23866.6667
-9041 40983.3333 23966.6667
-9042 40983.3333 24033.3333
-9043 40983.3333 24050.0000
-9044 40983.3333 24333.3333
-9045 40983.3333 24466.6667
-9046 40983.3333 24500.0000
-9047 40983.3333 24516.6667
-9048 40983.3333 24566.6667
-9049 40983.3333 24616.6667
-9050 40983.3333 24700.0000
-9051 40983.3333 24783.3333
-9052 40983.3333 24800.0000
-9053 40983.3333 24833.3333
-9054 40983.3333 24933.3333
-9055 40983.3333 24950.0000
-9056 40983.3333 24966.6667
-9057 40983.3333 25216.6667
-9058 40983.3333 25233.3333
-9059 40983.3333 25300.0000
-9060 40983.3333 25416.6667
-9061 40983.3333 25566.6667
-9062 40983.3333 25616.6667
-9063 40983.3333 25650.0000
-9064 40983.3333 25666.6667
-9065 40983.3333 25783.3333
-9066 40983.3333 26150.0000
-9067 40983.3333 26216.6667
-9068 40983.3333 26250.0000
-9069 41000.0000 22033.3333
-9070 41000.0000 22050.0000
-9071 41000.0000 22150.0000
-9072 41000.0000 22175.2778
-9073 41000.0000 22573.8889
-9074 41000.0000 22725.5556
-9075 41000.0000 22766.6667
-9076 41000.0000 22933.3333
-9077 41000.0000 23033.3333
-9078 41000.0000 23100.0000
-9079 41000.0000 23133.3333
-9080 41000.0000 23366.6667
-9081 41000.0000 23483.3333
-9082 41000.0000 23566.6667
-9083 41000.0000 23600.0000
-9084 41000.0000 23633.3333
-9085 41000.0000 23783.3333
-9086 41000.0000 23866.6667
-9087 41000.0000 23966.6667
-9088 41000.0000 24633.3333
-9089 41000.0000 24650.0000
-9090 41000.0000 24966.6667
-9091 41000.0000 24983.3333
-9092 41000.0000 25383.3333
-9093 41000.0000 25450.0000
-9094 41000.0000 25466.6667
-9095 41000.0000 25483.3333
-9096 41000.0000 25533.3333
-9097 41000.0000 25550.0000
-9098 41000.0000 25733.3333
-9099 41000.0000 25866.6667
-9100 41000.0000 26266.6667
-9101 41002.7778 22882.2222
-9102 41006.1111 22292.2222
-9103 41008.6111 22796.9444
-9104 41008.8889 22133.8889
-9105 41009.1667 22065.2778
-9106 41010.5556 22177.5000
-9107 41010.5556 22499.7222
-9108 41010.5556 22664.4444
-9109 41014.4444 22595.8333
-9110 41016.6667 22816.6667
-9111 41016.6667 23333.3333
-9112 41016.6667 23400.0000
-9113 41016.6667 23433.3333
-9114 41016.6667 23466.6667
-9115 41016.6667 23483.3333
-9116 41016.6667 23516.6667
-9117 41016.6667 23550.0000
-9118 41016.6667 23616.6667
-9119 41016.6667 23650.0000
-9120 41016.6667 23700.0000
-9121 41016.6667 23766.6667
-9122 41016.6667 24166.6667
-9123 41016.6667 24216.6667
-9124 41016.6667 24316.6667
-9125 41016.6667 24383.3333
-9126 41016.6667 24416.6667
-9127 41016.6667 24633.3333
-9128 41016.6667 24766.6667
-9129 41016.6667 24800.0000
-9130 41016.6667 24900.0000
-9131 41016.6667 24916.6667
-9132 41016.6667 25116.6667
-9133 41016.6667 25200.0000
-9134 41016.6667 25233.3333
-9135 41016.6667 25350.0000
-9136 41016.6667 25366.6667
-9137 41016.6667 25516.6667
-9138 41016.6667 25600.0000
-9139 41016.6667 25683.3333
-9140 41016.6667 25950.0000
-9141 41016.6667 26200.0000
-9142 41020.0000 22953.6111
-9143 41023.6111 22886.6667
-9144 41024.1667 22190.8333
-9145 41026.1111 22007.5000
-9146 41026.1111 22048.3333
-9147 41026.9444 22767.2222
-9148 41028.8889 22100.0000
-9149 41029.4444 22081.1111
-9150 41030.5556 22191.3889
-9151 41030.8333 22598.0556
-9152 41033.3333 22800.0000
-9153 41033.3333 22866.6667
-9154 41033.3333 23366.6667
-9155 41033.3333 23816.6667
-9156 41033.3333 23833.3333
-9157 41033.3333 23916.6667
-9158 41033.3333 23933.3333
-9159 41033.3333 24033.3333
-9160 41033.3333 24283.3333
-9161 41033.3333 24300.0000
-9162 41033.3333 24333.3333
-9163 41033.3333 24383.3333
-9164 41033.3333 24666.6667
-9165 41033.3333 24800.0000
-9166 41033.3333 24850.0000
-9167 41033.3333 24866.6667
-9168 41033.3333 25033.3333
-9169 41033.3333 25066.6667
-9170 41033.3333 25216.6667
-9171 41033.3333 25316.6667
-9172 41033.3333 25400.0000
-9173 41033.3333 25566.6667
-9174 41033.3333 25700.0000
-9175 41033.3333 26250.0000
-9176 41033.3333 26283.3333
-9177 41033.6111 22045.0000
-9178 41035.0000 22154.7222
-9179 41036.9444 22238.8889
-9180 41038.6111 22952.5000
-9181 41041.9444 22578.8889
-9182 41044.1667 22696.1111
-9183 41050.0000 22516.6667
-9184 41050.0000 23000.0000
-9185 41050.0000 23050.0000
-9186 41050.0000 23316.6667
-9187 41050.0000 23550.0000
-9188 41050.0000 23583.3333
-9189 41050.0000 23683.3333
-9190 41050.0000 23766.6667
-9191 41050.0000 23916.6667
-9192 41050.0000 24050.0000
-9193 41050.0000 24100.0000
-9194 41050.0000 24133.3333
-9195 41050.0000 24183.3333
-9196 41050.0000 24266.6667
-9197 41050.0000 24450.0000
-9198 41050.0000 24550.0000
-9199 41050.0000 24583.3333
-9200 41050.0000 24600.0000
-9201 41050.0000 24650.0000
-9202 41050.0000 24700.0000
-9203 41050.0000 24716.6667
-9204 41050.0000 24766.6667
-9205 41050.0000 24783.3333
-9206 41050.0000 24816.6667
-9207 41050.0000 24850.0000
-9208 41050.0000 25016.6667
-9209 41050.0000 25200.0000
-9210 41050.0000 25333.3333
-9211 41050.0000 25366.6667
-9212 41050.0000 25400.0000
-9213 41050.0000 25416.6667
-9214 41050.0000 25466.6667
-9215 41050.0000 25483.3333
-9216 41050.0000 25500.0000
-9217 41050.0000 25533.3333
-9218 41050.0000 25683.3333
-9219 41050.0000 26266.6667
-9220 41057.2222 22175.2778
-9221 41058.6111 22162.2222
-9222 41063.8889 22733.8889
-9223 41066.6667 22083.3333
-9224 41066.6667 22633.3333
-9225 41066.6667 22966.6667
-9226 41066.6667 23066.6667
-9227 41066.6667 23166.6667
-9228 41066.6667 23383.3333
-9229 41066.6667 23400.0000
-9230 41066.6667 23433.3333
-9231 41066.6667 23450.0000
-9232 41066.6667 23600.0000
-9233 41066.6667 23650.0000
-9234 41066.6667 23750.0000
-9235 41066.6667 23816.6667
-9236 41066.6667 23883.3333
-9237 41066.6667 23933.3333
-9238 41066.6667 23950.0000
-9239 41066.6667 24066.6667
-9240 41066.6667 24250.0000
-9241 41066.6667 24266.6667
-9242 41066.6667 24366.6667
-9243 41066.6667 24483.3333
-9244 41066.6667 24566.6667
-9245 41066.6667 24600.0000
-9246 41066.6667 24616.6667
-9247 41066.6667 24733.3333
-9248 41066.6667 24750.0000
-9249 41066.6667 24783.3333
-9250 41066.6667 24833.3333
-9251 41066.6667 24850.0000
-9252 41066.6667 24900.0000
-9253 41066.6667 24916.6667
-9254 41066.6667 24933.3333
-9255 41066.6667 24966.6667
-9256 41066.6667 25066.6667
-9257 41066.6667 25233.3333
-9258 41066.6667 25333.3333
-9259 41066.6667 25450.0000
-9260 41066.6667 25533.3333
-9261 41066.6667 25550.0000
-9262 41066.6667 25583.3333
-9263 41066.6667 25616.6667
-9264 41066.6667 25650.0000
-9265 41066.6667 25716.6667
-9266 41066.6667 25766.6667
-9267 41066.6667 25900.0000
-9268 41066.6667 26266.6667
-9269 41068.0556 22595.8333
-9270 41071.1111 22359.4444
-9271 41071.1111 22572.5000
-9272 41072.2222 22907.2222
-9273 41072.5000 22704.4444
-9274 41072.5000 22761.9444
-9275 41074.4444 22635.0000
-9276 41075.8333 22428.6111
-9277 41076.3889 22851.1111
-9278 41080.8333 22475.8333
-9279 41082.2222 22498.3333
-9280 41083.3333 22900.0000
-9281 41083.3333 23016.6667
-9282 41083.3333 23033.3333
-9283 41083.3333 23133.3333
-9284 41083.3333 23250.0000
-9285 41083.3333 23283.3333
-9286 41083.3333 23350.0000
-9287 41083.3333 23466.6667
-9288 41083.3333 23550.0000
-9289 41083.3333 23716.6667
-9290 41083.3333 23733.3333
-9291 41083.3333 23750.0000
-9292 41083.3333 23833.3333
-9293 41083.3333 23950.0000
-9294 41083.3333 24183.3333
-9295 41083.3333 24300.0000
-9296 41083.3333 24400.0000
-9297 41083.3333 24483.3333
-9298 41083.3333 24500.0000
-9299 41083.3333 24516.6667
-9300 41083.3333 24533.3333
-9301 41083.3333 24566.6667
-9302 41083.3333 24666.6667
-9303 41083.3333 24766.6667
-9304 41083.3333 24800.0000
-9305 41083.3333 24850.0000
-9306 41083.3333 24866.6667
-9307 41083.3333 24900.0000
-9308 41083.3333 24916.6667
-9309 41083.3333 24950.0000
-9310 41083.3333 24966.6667
-9311 41083.3333 25016.6667
-9312 41083.3333 25233.3333
-9313 41083.3333 25266.6667
-9314 41083.3333 25283.3333
-9315 41083.3333 25333.3333
-9316 41083.3333 25416.6667
-9317 41083.3333 25483.3333
-9318 41083.3333 25550.0000
-9319 41083.3333 25566.6667
-9320 41083.3333 25616.6667
-9321 41083.3333 25650.0000
-9322 41083.3333 25700.0000
-9323 41083.3333 25766.6667
-9324 41083.3333 25783.3333
-9325 41083.3333 25800.0000
-9326 41083.3333 26300.0000
-9327 41084.1667 22280.0000
-9328 41085.8333 22678.6111
-9329 41091.1111 22783.6111
-9330 41091.6667 22726.9444
-9331 41095.2778 22382.5000
-9332 41095.5556 22176.1111
-9333 41095.5556 22523.8889
-9334 41100.0000 22900.0000
-9335 41100.0000 23416.6667
-9336 41100.0000 23500.0000
-9337 41100.0000 23583.3333
-9338 41100.0000 23616.6667
-9339 41100.0000 23650.0000
-9340 41100.0000 23683.3333
-9341 41100.0000 23900.0000
-9342 41100.0000 24083.3333
-9343 41100.0000 24116.6667
-9344 41100.0000 24183.3333
-9345 41100.0000 24233.3333
-9346 41100.0000 24283.3333
-9347 41100.0000 24300.0000
-9348 41100.0000 24533.3333
-9349 41100.0000 24600.0000
-9350 41100.0000 24633.3333
-9351 41100.0000 24783.3333
-9352 41100.0000 24800.0000
-9353 41100.0000 24900.0000
-9354 41100.0000 24916.6667
-9355 41100.0000 24933.3333
-9356 41100.0000 25150.0000
-9357 41100.0000 25200.0000
-9358 41100.0000 25300.0000
-9359 41100.0000 25350.0000
-9360 41100.0000 25383.3333
-9361 41100.0000 25450.0000
-9362 41100.0000 25583.3333
-9363 41100.0000 25766.6667
-9364 41100.0000 25783.3333
-9365 41102.5000 22920.8333
-9366 41103.3333 22208.0556
-9367 41103.6111 22262.7778
-9368 41103.6111 22845.0000
-9369 41104.4444 22623.0556
-9370 41105.0000 22481.9444
-9371 41105.5556 22557.7778
-9372 41106.1111 22733.3333
-9373 41108.0556 22993.8889
-9374 41109.7222 22046.9444
-9375 41111.6667 22271.3889
-9376 41114.7222 22897.5000
-9377 41115.5556 22794.7222
-9378 41116.6667 22833.3333
-9379 41116.6667 23066.6667
-9380 41116.6667 23183.3333
-9381 41116.6667 23250.0000
-9382 41116.6667 23300.0000
-9383 41116.6667 23333.3333
-9384 41116.6667 23383.3333
-9385 41116.6667 23466.6667
-9386 41116.6667 23516.6667
-9387 41116.6667 23650.0000
-9388 41116.6667 23916.6667
-9389 41116.6667 24000.0000
-9390 41116.6667 24033.3333
-9391 41116.6667 24050.0000
-9392 41116.6667 24083.3333
-9393 41116.6667 24100.0000
-9394 41116.6667 24133.3333
-9395 41116.6667 24150.0000
-9396 41116.6667 24283.3333
-9397 41116.6667 24300.0000
-9398 41116.6667 24350.0000
-9399 41116.6667 24383.3333
-9400 41116.6667 24433.3333
-9401 41116.6667 24583.3333
-9402 41116.6667 24700.0000
-9403 41116.6667 24783.3333
-9404 41116.6667 24816.6667
-9405 41116.6667 24833.3333
-9406 41116.6667 24850.0000
-9407 41116.6667 24866.6667
-9408 41116.6667 24916.6667
-9409 41116.6667 24950.0000
-9410 41116.6667 25000.0000
-9411 41116.6667 25016.6667
-9412 41116.6667 25066.6667
-9413 41116.6667 25116.6667
-9414 41116.6667 25200.0000
-9415 41116.6667 25300.0000
-9416 41116.6667 25366.6667
-9417 41116.6667 25400.0000
-9418 41116.6667 25433.3333
-9419 41116.6667 25633.3333
-9420 41116.6667 25650.0000
-9421 41116.6667 25683.3333
-9422 41116.6667 25716.6667
-9423 41116.6667 26283.3333
-9424 41120.2778 22661.1111
-9425 41122.7778 22511.9444
-9426 41128.3333 22876.1111
-9427 41133.3333 23066.6667
-9428 41133.3333 23216.6667
-9429 41133.3333 23383.3333
-9430 41133.3333 23933.3333
-9431 41133.3333 24000.0000
-9432 41133.3333 24116.6667
-9433 41133.3333 24150.0000
-9434 41133.3333 24166.6667
-9435 41133.3333 24216.6667
-9436 41133.3333 24266.6667
-9437 41133.3333 24316.6667
-9438 41133.3333 24366.6667
-9439 41133.3333 24700.0000
-9440 41133.3333 24733.3333
-9441 41133.3333 24850.0000
-9442 41133.3333 24866.6667
-9443 41133.3333 24883.3333
-9444 41133.3333 24983.3333
-9445 41133.3333 25000.0000
-9446 41133.3333 25050.0000
-9447 41133.3333 25183.3333
-9448 41133.3333 25216.6667
-9449 41133.3333 25266.6667
-9450 41133.3333 25283.3333
-9451 41133.3333 25550.0000
-9452 41133.3333 25600.0000
-9453 41133.3333 25650.0000
-9454 41133.3333 25716.6667
-9455 41133.3333 26216.6667
-9456 41134.4444 22917.2222
-9457 41139.1667 22668.6111
-9458 41144.7222 22972.7778
-9459 41146.9444 22744.7222
-9460 41150.0000 22833.3333
-9461 41150.0000 23000.0000
-9462 41150.0000 23166.6667
-9463 41150.0000 23283.3333
-9464 41150.0000 23333.3333
-9465 41150.0000 23416.6667
-9466 41150.0000 23450.0000
-9467 41150.0000 23583.3333
-9468 41150.0000 23900.0000
-9469 41150.0000 24066.6667
-9470 41150.0000 24133.3333
-9471 41150.0000 24150.0000
-9472 41150.0000 24483.3333
-9473 41150.0000 24933.3333
-9474 41150.0000 24966.6667
-9475 41150.0000 25066.6667
-9476 41150.0000 25300.0000
-9477 41150.0000 25316.6667
-9478 41150.0000 25333.3333
-9479 41150.0000 25350.0000
-9480 41150.0000 25433.3333
-9481 41150.0000 25466.6667
-9482 41150.0000 25500.0000
-9483 41150.0000 25533.3333
-9484 41150.0000 25566.6667
-9485 41150.0000 25683.3333
-9486 41150.0000 26216.6667
-9487 41150.0000 26300.0000
-9488 41162.5000 22894.4444
-9489 41164.4444 22668.6111
-9490 41166.6667 22800.0000
-9491 41166.6667 23016.6667
-9492 41166.6667 23266.6667
-9493 41166.6667 23283.3333
-9494 41166.6667 23366.6667
-9495 41166.6667 23850.0000
-9496 41166.6667 24216.6667
-9497 41166.6667 24316.6667
-9498 41166.6667 24333.3333
-9499 41166.6667 24366.6667
-9500 41166.6667 24383.3333
-9501 41166.6667 24400.0000
-9502 41166.6667 24550.0000
-9503 41166.6667 24633.3333
-9504 41166.6667 24733.3333
-9505 41166.6667 24850.0000
-9506 41166.6667 24966.6667
-9507 41166.6667 24983.3333
-9508 41166.6667 25366.6667
-9509 41166.6667 25383.3333
-9510 41166.6667 25466.6667
-9511 41166.6667 25483.3333
-9512 41166.6667 25616.6667
-9513 41166.6667 25633.3333
-9514 41166.6667 26116.6667
-9515 41178.0556 22760.8333
-9516 41183.3333 22850.0000
-9517 41183.3333 22883.3333
-9518 41183.3333 22900.0000
-9519 41183.3333 22916.6667
-9520 41183.3333 23083.3333
-9521 41183.3333 23233.3333
-9522 41183.3333 23250.0000
-9523 41183.3333 23266.6667
-9524 41183.3333 23316.6667
-9525 41183.3333 23400.0000
-9526 41183.3333 23933.3333
-9527 41183.3333 23966.6667
-9528 41183.3333 24166.6667
-9529 41183.3333 24316.6667
-9530 41183.3333 24366.6667
-9531 41183.3333 24383.3333
-9532 41183.3333 24416.6667
-9533 41183.3333 24833.3333
-9534 41183.3333 24900.0000
-9535 41183.3333 24950.0000
-9536 41183.3333 25283.3333
-9537 41183.3333 25333.3333
-9538 41183.3333 25416.6667
-9539 41183.3333 25433.3333
-9540 41183.3333 25883.3333
-9541 41186.6667 22815.8333
-9542 41200.0000 22816.6667
-9543 41200.0000 23200.0000
-9544 41200.0000 23250.0000
-9545 41200.0000 23283.3333
-9546 41200.0000 23366.6667
-9547 41200.0000 23550.0000
-9548 41200.0000 23583.3333
-9549 41200.0000 23600.0000
-9550 41200.0000 23816.6667
-9551 41200.0000 23900.0000
-9552 41200.0000 24016.6667
-9553 41200.0000 24100.0000
-9554 41200.0000 24333.3333
-9555 41200.0000 24383.3333
-9556 41200.0000 24416.6667
-9557 41200.0000 24700.0000
-9558 41200.0000 24816.6667
-9559 41200.0000 24883.3333
-9560 41200.0000 24916.6667
-9561 41200.0000 25016.6667
-9562 41200.0000 25033.3333
-9563 41200.0000 25133.3333
-9564 41200.0000 25166.6667
-9565 41200.0000 25383.3333
-9566 41200.0000 25516.6667
-9567 41200.0000 25583.3333
-9568 41200.0000 26300.0000
-9569 41216.6667 22816.6667
-9570 41216.6667 22900.0000
-9571 41216.6667 23033.3333
-9572 41216.6667 23050.0000
-9573 41216.6667 23083.3333
-9574 41216.6667 23300.0000
-9575 41216.6667 23366.6667
-9576 41216.6667 23400.0000
-9577 41216.6667 23900.0000
-9578 41216.6667 23916.6667
-9579 41216.6667 24266.6667
-9580 41216.6667 24350.0000
-9581 41216.6667 24366.6667
-9582 41216.6667 24433.3333
-9583 41216.6667 24450.0000
-9584 41216.6667 24466.6667
-9585 41216.6667 24550.0000
-9586 41216.6667 24633.3333
-9587 41216.6667 24666.6667
-9588 41216.6667 24783.3333
-9589 41216.6667 24800.0000
-9590 41216.6667 24866.6667
-9591 41216.6667 24900.0000
-9592 41216.6667 24933.3333
-9593 41216.6667 24950.0000
-9594 41216.6667 25450.0000
-9595 41216.6667 25566.6667
-9596 41216.6667 25683.3333
-9597 41216.6667 25700.0000
-9598 41216.6667 25733.3333
-9599 41216.6667 26016.6667
-9600 41216.6667 26200.0000
-9601 41222.5000 22827.7778
-9602 41226.9444 22790.0000
-9603 41233.3333 22983.3333
-9604 41233.3333 23000.0000
-9605 41233.3333 23250.0000
-9606 41233.3333 23383.3333
-9607 41233.3333 24166.6667
-9608 41233.3333 24183.3333
-9609 41233.3333 24200.0000
-9610 41233.3333 24266.6667
-9611 41233.3333 24383.3333
-9612 41233.3333 24400.0000
-9613 41233.3333 24583.3333
-9614 41233.3333 24600.0000
-9615 41233.3333 24616.6667
-9616 41233.3333 24633.3333
-9617 41233.3333 24816.6667
-9618 41233.3333 24866.6667
-9619 41233.3333 24883.3333
-9620 41233.3333 24950.0000
-9621 41233.3333 25033.3333
-9622 41233.3333 25100.0000
-9623 41233.3333 25200.0000
-9624 41233.3333 25250.0000
-9625 41233.3333 25366.6667
-9626 41233.3333 25533.3333
-9627 41233.3333 25600.0000
-9628 41233.3333 25766.6667
-9629 41233.3333 25850.0000
-9630 41233.3333 25900.0000
-9631 41233.3333 25933.3333
-9632 41233.3333 25966.6667
-9633 41236.6667 22946.9444
-9634 41243.6111 22851.1111
-9635 41250.0000 22783.3333
-9636 41250.0000 22800.0000
-9637 41250.0000 22816.6667
-9638 41250.0000 23016.6667
-9639 41250.0000 23083.3333
-9640 41250.0000 23216.6667
-9641 41250.0000 23283.3333
-9642 41250.0000 23333.3333
-9643 41250.0000 23450.0000
-9644 41250.0000 23816.6667
-9645 41250.0000 24033.3333
-9646 41250.0000 24433.3333
-9647 41250.0000 24500.0000
-9648 41250.0000 24516.6667
-9649 41250.0000 24533.3333
-9650 41250.0000 24566.6667
-9651 41250.0000 24583.3333
-9652 41250.0000 24600.0000
-9653 41250.0000 24633.3333
-9654 41250.0000 24700.0000
-9655 41250.0000 24733.3333
-9656 41250.0000 24900.0000
-9657 41250.0000 24916.6667
-9658 41250.0000 25483.3333
-9659 41250.0000 25533.3333
-9660 41250.0000 25633.3333
-9661 41250.0000 25683.3333
-9662 41250.0000 25866.6667
-9663 41250.0000 26133.3333
-9664 41255.0000 22795.2778
-9665 41260.2778 22789.1667
-9666 41264.7222 22842.2222
-9667 41266.6667 22800.0000
-9668 41266.6667 22833.3333
-9669 41266.6667 22933.3333
-9670 41266.6667 23000.0000
-9671 41266.6667 23133.3333
-9672 41266.6667 23183.3333
-9673 41266.6667 23366.6667
-9674 41266.6667 23383.3333
-9675 41266.6667 23400.0000
-9676 41266.6667 24183.3333
-9677 41266.6667 24400.0000
-9678 41266.6667 24483.3333
-9679 41266.6667 24500.0000
-9680 41266.6667 24566.6667
-9681 41266.6667 24666.6667
-9682 41266.6667 24716.6667
-9683 41266.6667 24800.0000
-9684 41266.6667 24833.3333
-9685 41266.6667 24866.6667
-9686 41266.6667 24933.3333
-9687 41266.6667 25466.6667
-9688 41266.6667 25533.3333
-9689 41266.6667 25733.3333
-9690 41266.6667 25866.6667
-9691 41266.6667 25916.6667
-9692 41266.6667 25950.0000
-9693 41266.6667 25983.3333
-9694 41266.6667 26333.3333
-9695 41266.6667 26383.3333
-9696 41266.6667 26400.0000
-9697 41269.7222 22853.6111
-9698 41276.3889 22893.6111
-9699 41283.0556 22932.2222
-9700 41283.3333 23016.6667
-9701 41283.3333 23033.3333
-9702 41283.3333 23233.3333
-9703 41283.3333 23250.0000
-9704 41283.3333 23300.0000
-9705 41283.3333 23333.3333
-9706 41283.3333 23750.0000
-9707 41283.3333 23933.3333
-9708 41283.3333 24216.6667
-9709 41283.3333 24233.3333
-9710 41283.3333 24316.6667
-9711 41283.3333 24400.0000
-9712 41283.3333 24466.6667
-9713 41283.3333 24483.3333
-9714 41283.3333 24800.0000
-9715 41283.3333 24966.6667
-9716 41283.3333 25116.6667
-9717 41283.3333 25183.3333
-9718 41283.3333 25550.0000
-9719 41283.3333 25616.6667
-9720 41283.3333 25783.3333
-9721 41283.3333 25850.0000
-9722 41283.3333 25983.3333
-9723 41283.3333 26283.3333
-9724 41293.0556 22947.2222
-9725 41295.2778 22833.0556
-9726 41295.8333 22985.2778
-9727 41300.0000 22800.0000
-9728 41300.0000 23500.0000
-9729 41300.0000 23683.3333
-9730 41300.0000 23850.0000
-9731 41300.0000 24466.6667
-9732 41300.0000 24516.6667
-9733 41300.0000 24616.6667
-9734 41300.0000 24783.3333
-9735 41300.0000 24900.0000
-9736 41300.0000 25666.6667
-9737 41300.0000 25983.3333
-9738 41300.0000 26183.3333
-9739 41300.0000 26250.0000
-9740 41300.0000 26433.3333
-9741 41316.6667 23550.0000
-9742 41316.6667 23583.3333
-9743 41316.6667 23783.3333
-9744 41316.6667 24000.0000
-9745 41316.6667 24366.6667
-9746 41316.6667 24416.6667
-9747 41316.6667 24450.0000
-9748 41316.6667 24583.3333
-9749 41316.6667 24766.6667
-9750 41316.6667 25100.0000
-9751 41316.6667 25116.6667
-9752 41316.6667 25816.6667
-9753 41316.6667 26100.0000
-9754 41316.6667 26483.3333
-9755 41333.3333 24333.3333
-9756 41333.3333 24533.3333
-9757 41333.3333 24883.3333
-9758 41333.3333 24933.3333
-9759 41333.3333 25050.0000
-9760 41333.3333 26266.6667
-9761 41350.0000 23683.3333
-9762 41350.0000 23716.6667
-9763 41350.0000 23800.0000
-9764 41350.0000 23866.6667
-9765 41350.0000 24083.3333
-9766 41350.0000 24100.0000
-9767 41350.0000 24450.0000
-9768 41350.0000 24533.3333
-9769 41350.0000 24633.3333
-9770 41350.0000 24850.0000
-9771 41350.0000 24983.3333
-9772 41350.0000 26200.0000
-9773 41350.0000 26366.6667
-9774 41350.0000 26433.3333
-9775 41350.0000 26500.0000
-9776 41350.0000 26583.3333
-9777 41350.0000 26600.0000
-9778 41366.6667 23366.6667
-9779 41366.6667 24183.3333
-9780 41366.6667 24233.3333
-9781 41366.6667 24266.6667
-9782 41366.6667 24316.6667
-9783 41366.6667 24550.0000
-9784 41366.6667 24616.6667
-9785 41366.6667 24916.6667
-9786 41366.6667 24966.6667
-9787 41366.6667 25000.0000
-9788 41366.6667 26383.3333
-9789 41366.6667 26466.6667
-9790 41366.6667 26533.3333
-9791 41383.3333 23300.0000
-9792 41383.3333 23450.0000
-9793 41383.3333 23866.6667
-9794 41383.3333 23983.3333
-9795 41383.3333 24050.0000
-9796 41383.3333 24100.0000
-9797 41383.3333 24283.3333
-9798 41383.3333 24916.6667
-9799 41383.3333 24933.3333
-9800 41383.3333 26300.0000
-9801 41383.3333 26616.6667
-9802 41400.0000 23900.0000
-9803 41400.0000 24016.6667
-9804 41400.0000 24033.3333
-9805 41400.0000 24100.0000
-9806 41400.0000 24216.6667
-9807 41400.0000 26283.3333
-9808 41400.0000 26333.3333
-9809 41400.0000 26416.6667
-9810 41400.0000 26566.6667
-9811 41400.0000 26583.3333
-9812 41416.6667 23833.3333
-9813 41416.6667 24000.0000
-9814 41416.6667 24083.3333
-9815 41416.6667 24133.3333
-9816 41416.6667 24166.6667
-9817 41416.6667 24283.3333
-9818 41416.6667 26250.0000
-9819 41416.6667 26383.3333
-9820 41416.6667 26400.0000
-9821 41416.6667 26516.6667
-9822 41416.6667 26550.0000
-9823 41416.6667 26566.6667
-9824 41433.3333 24466.6667
-9825 41433.3333 26316.6667
-9826 41433.3333 26350.0000
-9827 41433.3333 26550.0000
-9828 41450.0000 26266.6667
-9829 41450.0000 26400.0000
-9830 41450.0000 26466.6667
-9831 41450.0000 26550.0000
-9832 41466.6667 26350.0000
-9833 41466.6667 26383.3333
-9834 41466.6667 26566.6667
-9835 41483.3333 24133.3333
-9836 41483.3333 24150.0000
-9837 41483.3333 26283.3333
-9838 41483.3333 26300.0000
-9839 41483.3333 26316.6667
-9840 41483.3333 26400.0000
-9841 41483.3333 26433.3333
-9842 41483.3333 26550.0000
-9843 41500.0000 24133.3333
-9844 41500.0000 26216.6667
-9845 41500.0000 26233.3333
-9846 41500.0000 26466.6667
-9847 41500.0000 26500.0000
-9848 41500.0000 26516.6667
-9849 41516.6667 26250.0000
-9850 41516.6667 26283.3333
-9851 41516.6667 26300.0000
-9852 41516.6667 26450.0000
-9853 41533.3333 26350.0000
-9854 41533.3333 26533.3333
-9855 41533.3333 26550.0000
-9856 41566.6667 26166.6667
-9857 41566.6667 26183.3333
-9858 41566.6667 26450.0000
-9859 41566.6667 26516.6667
-9860 41583.3333 26183.3333
-9861 41583.3333 26233.3333
-9862 41583.3333 26283.3333
-9863 41583.3333 26533.3333
-9864 41600.0000 26300.0000
-9865 41616.6667 26316.6667
-9866 41616.6667 26350.0000
-9867 41616.6667 26433.3333
-9868 41633.3333 26333.3333
-9869 41633.3333 26383.3333
-9870 41650.0000 26083.3333
-9871 41650.0000 26183.3333
-9872 41650.0000 26316.6667
-9873 41650.0000 26416.6667
-9874 41650.0000 26466.6667
-9875 41666.6667 26350.0000
-9876 41666.6667 26466.6667
-9877 41683.3333 26283.3333
-9878 41700.0000 26133.3333
-9879 41700.0000 26233.3333
-9880 41700.0000 26283.3333
-9881 41700.0000 26383.3333
-9882 41716.6667 26216.6667
-\.
-
-UPDATE gr9882 SET the_geom = ST_makePoint(x,y);
-SELECT * into grece from pgr_eucledianDmatrix('gr9882'::regclass);
-SELECT * from pgr_xydtsp($$SELECT * from grece$$, true);
--- SELECT * from pgr_xydtsp($$SELECT * from pgr_eucledianDmatrix('gr9882'::regclass)$$, true, 1);
--- SELECT * from pgr_tsp('SELECT id::integer, x, y from gr9882', 1);
-
+-- http://www.math.uwaterloo.ca/tsp/world/countries.html#GR
+
+-- NAME : gr9882
+-- COMMENT : 9882 locations in Greece
+-- COMMENT : Derived from National Imagery and Mapping Agency data
+-- TYPE : TSP
+-- DIMENSION : 9882
+-- EDGE_WEIGHT_TYPE : EUC_2D
+-- NODE_COORD_SECTION
+
+DROP TABLE IF EXISTS gr9882;
+CREATE TABLE gr9882 (id BIGINT, x FLOAT, y FLOAT, the_geom geometry);
+COPY gr9882 (id, x, y) FROM stdin WITH DELIMITER ' ';
+1 34816.6667 24100.0000
+2 34833.3333 24083.3333
+3 34850.0000 24050.0000
+4 34850.0000 24083.3333
+5 34850.0000 24116.6667
+6 34866.6667 24083.3333
+7 34933.3333 24800.0000
+8 34933.3333 24916.6667
+9 34966.6667 24883.3333
+10 34966.6667 24933.3333
+11 34966.6667 24950.0000
+12 34966.6667 25033.3333
+13 34966.6667 25133.3333
+14 34966.6667 25250.0000
+15 34983.3333 24750.0000
+16 34983.3333 24850.0000
+17 34983.3333 24916.6667
+18 34983.3333 24983.3333
+19 34983.3333 25000.0000
+20 34983.3333 25016.6667
+21 34983.3333 25150.0000
+22 34983.3333 25166.6667
+23 34983.3333 25200.0000
+24 34983.3333 25216.6667
+25 34983.3333 25266.6667
+26 34983.3333 25283.3333
+27 34983.3333 25316.6667
+28 34983.3333 25333.3333
+29 35000.0000 24816.6667
+30 35000.0000 24900.0000
+31 35000.0000 24933.3333
+32 35000.0000 25033.3333
+33 35000.0000 25066.6667
+34 35000.0000 25133.3333
+35 35000.0000 25150.0000
+36 35000.0000 25366.6667
+37 35000.0000 25383.3333
+38 35000.0000 25483.3333
+39 35000.0000 25516.6667
+40 35000.0000 25533.3333
+41 35000.0000 25583.3333
+42 35000.0000 25633.3333
+43 35016.6667 24783.3333
+44 35016.6667 24800.0000
+45 35016.6667 24833.3333
+46 35016.6667 24866.6667
+47 35016.6667 24883.3333
+48 35016.6667 24900.0000
+49 35016.6667 24916.6667
+50 35016.6667 24950.0000
+51 35016.6667 24966.6667
+52 35016.6667 25000.0000
+53 35016.6667 25066.6667
+54 35016.6667 25083.3333
+55 35016.6667 25116.6667
+56 35016.6667 25166.6667
+57 35016.6667 25200.0000
+58 35016.6667 25416.6667
+59 35016.6667 25516.6667
+60 35016.6667 25533.3333
+61 35016.6667 25550.0000
+62 35016.6667 25583.3333
+63 35016.6667 25683.3333
+64 35016.6667 25750.0000
+65 35016.6667 25833.3333
+66 35016.6667 26100.0000
+67 35016.6667 26116.6667
+68 35033.3333 24783.3333
+69 35033.3333 24833.3333
+70 35033.3333 24933.3333
+71 35033.3333 25150.0000
+72 35033.3333 25233.3333
+73 35033.3333 25250.0000
+74 35033.3333 25266.6667
+75 35033.3333 25283.3333
+76 35033.3333 25383.3333
+77 35033.3333 25433.3333
+78 35033.3333 25450.0000
+79 35033.3333 25483.3333
+80 35033.3333 25500.0000
+81 35033.3333 25550.0000
+82 35033.3333 25566.6667
+83 35033.3333 25600.0000
+84 35033.3333 25666.6667
+85 35033.3333 25750.0000
+86 35033.3333 25766.6667
+87 35033.3333 25900.0000
+88 35033.3333 25950.0000
+89 35033.3333 25966.6667
+90 35033.3333 25983.3333
+91 35033.3333 26150.0000
+92 35050.0000 24816.6667
+93 35050.0000 24833.3333
+94 35050.0000 24866.6667
+95 35050.0000 24900.0000
+96 35050.0000 24950.0000
+97 35050.0000 25050.0000
+98 35050.0000 25066.6667
+99 35050.0000 25100.0000
+100 35050.0000 25116.6667
+101 35050.0000 25183.3333
+102 35050.0000 25300.0000
+103 35050.0000 25333.3333
+104 35050.0000 25383.3333
+105 35050.0000 25416.6667
+106 35050.0000 25450.0000
+107 35050.0000 25500.0000
+108 35050.0000 25550.0000
+109 35050.0000 25633.3333
+110 35050.0000 25666.6667
+111 35050.0000 25783.3333
+112 35050.0000 25800.0000
+113 35050.0000 25833.3333
+114 35050.0000 25883.3333
+115 35050.0000 25950.0000
+116 35050.0000 26050.0000
+117 35050.0000 26066.6667
+118 35050.0000 26100.0000
+119 35050.0000 26116.6667
+120 35050.0000 26150.0000
+121 35050.0000 26183.3333
+122 35066.6667 24766.6667
+123 35066.6667 24816.6667
+124 35066.6667 24866.6667
+125 35066.6667 24883.3333
+126 35066.6667 24916.6667
+127 35066.6667 24933.3333
+128 35066.6667 24966.6667
+129 35066.6667 25016.6667
+130 35066.6667 25033.3333
+131 35066.6667 25083.3333
+132 35066.6667 25100.0000
+133 35066.6667 25116.6667
+134 35066.6667 25133.3333
+135 35066.6667 25200.0000
+136 35066.6667 25216.6667
+137 35066.6667 25233.3333
+138 35066.6667 25300.0000
+139 35066.6667 25566.6667
+140 35066.6667 25716.6667
+141 35066.6667 25750.0000
+142 35066.6667 25816.6667
+143 35066.6667 25866.6667
+144 35066.6667 25966.6667
+145 35066.6667 26016.6667
+146 35066.6667 26083.3333
+147 35066.6667 26116.6667
+148 35083.3333 24733.3333
+149 35083.3333 24833.3333
+150 35083.3333 24866.6667
+151 35083.3333 24883.3333
+152 35083.3333 24916.6667
+153 35083.3333 24933.3333
+154 35083.3333 24950.0000
+155 35083.3333 24966.6667
+156 35083.3333 25033.3333
+157 35083.3333 25050.0000
+158 35083.3333 25083.3333
+159 35083.3333 25100.0000
+160 35083.3333 25183.3333
+161 35083.3333 25216.6667
+162 35083.3333 25233.3333
+163 35083.3333 25250.0000
+164 35083.3333 25266.6667
+165 35083.3333 25283.3333
+166 35083.3333 25333.3333
+167 35083.3333 25366.6667
+168 35083.3333 25400.0000
+169 35083.3333 25566.6667
+170 35083.3333 25583.3333
+171 35083.3333 25650.0000
+172 35083.3333 25716.6667
+173 35083.3333 25766.6667
+174 35083.3333 25816.6667
+175 35083.3333 25833.3333
+176 35083.3333 25916.6667
+177 35083.3333 25933.3333
+178 35083.3333 25950.0000
+179 35083.3333 25966.6667
+180 35083.3333 25983.3333
+181 35083.3333 26033.3333
+182 35083.3333 26050.0000
+183 35083.3333 26066.6667
+184 35083.3333 26083.3333
+185 35083.3333 26100.0000
+186 35083.3333 26133.3333
+187 35083.3333 26166.6667
+188 35100.0000 24683.3333
+189 35100.0000 24783.3333
+190 35100.0000 24833.3333
+191 35100.0000 24850.0000
+192 35100.0000 24916.6667
+193 35100.0000 24966.6667
+194 35100.0000 25000.0000
+195 35100.0000 25066.6667
+196 35100.0000 25083.3333
+197 35100.0000 25166.6667
+198 35100.0000 25183.3333
+199 35100.0000 25216.6667
+200 35100.0000 25250.0000
+201 35100.0000 25283.3333
+202 35100.0000 25300.0000
+203 35100.0000 25350.0000
+204 35100.0000 25366.6667
+205 35100.0000 25383.3333
+206 35100.0000 25400.0000
+207 35100.0000 25416.6667
+208 35100.0000 25683.3333
+209 35100.0000 25800.0000
+210 35100.0000 25866.6667
+211 35100.0000 25950.0000
+212 35100.0000 26066.6667
+213 35100.0000 26083.3333
+214 35100.0000 26133.3333
+215 35100.0000 26266.6667
+216 35116.6667 24616.6667
+217 35116.6667 24750.0000
+218 35116.6667 24766.6667
+219 35116.6667 24816.6667
+220 35116.6667 24866.6667
+221 35116.6667 24900.0000
+222 35116.6667 24916.6667
+223 35116.6667 24933.3333
+224 35116.6667 24950.0000
+225 35116.6667 25000.0000
+226 35116.6667 25116.6667
+227 35116.6667 25133.3333
+228 35116.6667 25216.6667
+229 35116.6667 25233.3333
+230 35116.6667 25250.0000
+231 35116.6667 25266.6667
+232 35116.6667 25283.3333
+233 35116.6667 25300.0000
+234 35116.6667 25333.3333
+235 35116.6667 25716.6667
+236 35116.6667 25733.3333
+237 35116.6667 25800.0000
+238 35116.6667 25850.0000
+239 35116.6667 25883.3333
+240 35116.6667 25983.3333
+241 35116.6667 26016.6667
+242 35116.6667 26066.6667
+243 35116.6667 26083.3333
+244 35116.6667 26100.0000
+245 35116.6667 26150.0000
+246 35116.6667 26216.6667
+247 35116.6667 26233.3333
+248 35133.3333 24600.0000
+249 35133.3333 24650.0000
+250 35133.3333 24733.3333
+251 35133.3333 24816.6667
+252 35133.3333 24900.0000
+253 35133.3333 24916.6667
+254 35133.3333 24950.0000
+255 35133.3333 24983.3333
+256 35133.3333 25000.0000
+257 35133.3333 25016.6667
+258 35133.3333 25033.3333
+259 35133.3333 25066.6667
+260 35133.3333 25083.3333
+261 35133.3333 25116.6667
+262 35133.3333 25150.0000
+263 35133.3333 25166.6667
+264 35133.3333 25183.3333
+265 35133.3333 25216.6667
+266 35133.3333 25233.3333
+267 35133.3333 25266.6667
+268 35133.3333 25333.3333
+269 35133.3333 25533.3333
+270 35133.3333 25666.6667
+271 35133.3333 25900.0000
+272 35133.3333 25950.0000
+273 35133.3333 26016.6667
+274 35133.3333 26033.3333
+275 35133.3333 26066.6667
+276 35133.3333 26100.0000
+277 35133.3333 26116.6667
+278 35133.3333 26166.6667
+279 35133.3333 26216.6667
+280 35133.3333 26250.0000
+281 35150.0000 24633.3333
+282 35150.0000 24666.6667
+283 35150.0000 24716.6667
+284 35150.0000 24733.3333
+285 35150.0000 24750.0000
+286 35150.0000 24766.6667
+287 35150.0000 24783.3333
+288 35150.0000 24816.6667
+289 35150.0000 24833.3333
+290 35150.0000 25033.3333
+291 35150.0000 25200.0000
+292 35150.0000 25233.3333
+293 35150.0000 25266.6667
+294 35150.0000 25300.0000
+295 35150.0000 25350.0000
+296 35150.0000 25466.6667
+297 35150.0000 25533.3333
+298 35150.0000 25550.0000
+299 35150.0000 25566.6667
+300 35150.0000 25583.3333
+301 35150.0000 25633.3333
+302 35150.0000 25866.6667
+303 35150.0000 25916.6667
+304 35150.0000 25966.6667
+305 35150.0000 26016.6667
+306 35150.0000 26083.3333
+307 35150.0000 26100.0000
+308 35150.0000 26166.6667
+309 35150.0000 26183.3333
+310 35150.0000 26250.0000
+311 35166.6667 24450.0000
+312 35166.6667 24483.3333
+313 35166.6667 24516.6667
+314 35166.6667 24533.3333
+315 35166.6667 24583.3333
+316 35166.6667 24716.6667
+317 35166.6667 24733.3333
+318 35166.6667 24783.3333
+319 35166.6667 25000.0000
+320 35166.6667 25066.6667
+321 35166.6667 25100.0000
+322 35166.6667 25116.6667
+323 35166.6667 25200.0000
+324 35166.6667 25250.0000
+325 35166.6667 25333.3333
+326 35166.6667 25350.0000
+327 35166.6667 25366.6667
+328 35166.6667 25433.3333
+329 35166.6667 25450.0000
+330 35166.6667 25483.3333
+331 35166.6667 25650.0000
+332 35166.6667 25700.0000
+333 35166.6667 25933.3333
+334 35166.6667 25950.0000
+335 35166.6667 25983.3333
+336 35166.6667 26016.6667
+337 35166.6667 26033.3333
+338 35166.6667 26050.0000
+339 35166.6667 26100.0000
+340 35166.6667 26116.6667
+341 35166.6667 26166.6667
+342 35166.6667 26183.3333
+343 35166.6667 26250.0000
+344 35183.3333 24233.3333
+345 35183.3333 24416.6667
+346 35183.3333 24450.0000
+347 35183.3333 24516.6667
+348 35183.3333 24533.3333
+349 35183.3333 24550.0000
+350 35183.3333 24583.3333
+351 35183.3333 24666.6667
+352 35183.3333 24683.3333
+353 35183.3333 24733.3333
+354 35183.3333 25016.6667
+355 35183.3333 25033.3333
+356 35183.3333 25066.6667
+357 35183.3333 25216.6667
+358 35183.3333 25250.0000
+359 35183.3333 25283.3333
+360 35183.3333 25316.6667
+361 35183.3333 25333.3333
+362 35183.3333 25366.6667
+363 35183.3333 25433.3333
+364 35183.3333 25500.0000
+365 35183.3333 25516.6667
+366 35183.3333 25600.0000
+367 35183.3333 25616.6667
+368 35183.3333 25666.6667
+369 35183.3333 25683.3333
+370 35183.3333 25716.6667
+371 35183.3333 25900.0000
+372 35183.3333 25966.6667
+373 35183.3333 26033.3333
+374 35183.3333 26050.0000
+375 35183.3333 26066.6667
+376 35183.3333 26100.0000
+377 35183.3333 26116.6667
+378 35183.3333 26150.0000
+379 35183.3333 26183.3333
+380 35200.0000 24066.6667
+381 35200.0000 24083.3333
+382 35200.0000 24150.0000
+383 35200.0000 24166.6667
+384 35200.0000 24233.3333
+385 35200.0000 24266.6667
+386 35200.0000 24283.3333
+387 35200.0000 24316.6667
+388 35200.0000 24383.3333
+389 35200.0000 24400.0000
+390 35200.0000 24416.6667
+391 35200.0000 24450.0000
+392 35200.0000 24483.3333
+393 35200.0000 24500.0000
+394 35200.0000 24566.6667
+395 35200.0000 24633.3333
+396 35200.0000 24650.0000
+397 35200.0000 24683.3333
+398 35200.0000 25000.0000
+399 35200.0000 25033.3333
+400 35200.0000 25083.3333
+401 35200.0000 25100.0000
+402 35200.0000 25166.6667
+403 35200.0000 25183.3333
+404 35200.0000 25200.0000
+405 35200.0000 25216.6667
+406 35200.0000 25250.0000
+407 35200.0000 25266.6667
+408 35200.0000 25316.6667
+409 35200.0000 25333.3333
+410 35200.0000 25350.0000
+411 35200.0000 25366.6667
+412 35200.0000 25383.3333
+413 35200.0000 25466.6667
+414 35200.0000 25483.3333
+415 35200.0000 25583.3333
+416 35200.0000 25616.6667
+417 35200.0000 25650.0000
+418 35200.0000 25666.6667
+419 35200.0000 25683.3333
+420 35200.0000 25700.0000
+421 35200.0000 26116.6667
+422 35200.0000 26250.0000
+423 35200.0000 26266.6667
+424 35216.6667 24066.6667
+425 35216.6667 24083.3333
+426 35216.6667 24100.0000
+427 35216.6667 24183.3333
+428 35216.6667 24200.0000
+429 35216.6667 24216.6667
+430 35216.6667 24266.6667
+431 35216.6667 24500.0000
+432 35216.6667 24516.6667
+433 35216.6667 24533.3333
+434 35216.6667 24600.0000
+435 35216.6667 24616.6667
+436 35216.6667 24683.3333
+437 35216.6667 24700.0000
+438 35216.6667 24716.6667
+439 35216.6667 25000.0000
+440 35216.6667 25033.3333
+441 35216.6667 25050.0000
+442 35216.6667 25200.0000
+443 35216.6667 25216.6667
+444 35216.6667 25266.6667
+445 35216.6667 25300.0000
+446 35216.6667 25333.3333
+447 35216.6667 25350.0000
+448 35216.6667 25383.3333
+449 35216.6667 25466.6667
+450 35216.6667 25516.6667
+451 35216.6667 25533.3333
+452 35216.6667 25550.0000
+453 35216.6667 25600.0000
+454 35216.6667 25650.0000
+455 35216.6667 25683.3333
+456 35216.6667 25700.0000
+457 35216.6667 26033.3333
+458 35216.6667 26216.6667
+459 35216.6667 26266.6667
+460 35233.3333 23633.3333
+461 35233.3333 23683.3333
+462 35233.3333 23966.6667
+463 35233.3333 24016.6667
+464 35233.3333 24083.3333
+465 35233.3333 24116.6667
+466 35233.3333 24133.3333
+467 35233.3333 24216.6667
+468 35233.3333 24350.0000
+469 35233.3333 24383.3333
+470 35233.3333 24400.0000
+471 35233.3333 24450.0000
+472 35233.3333 24466.6667
+473 35233.3333 24516.6667
+474 35233.3333 24633.3333
+475 35233.3333 24650.0000
+476 35233.3333 24666.6667
+477 35233.3333 24700.0000
+478 35233.3333 24983.3333
+479 35233.3333 25000.0000
+480 35233.3333 25016.6667
+481 35233.3333 25033.3333
+482 35233.3333 25166.6667
+483 35233.3333 25183.3333
+484 35233.3333 25216.6667
+485 35233.3333 25233.3333
+486 35233.3333 25350.0000
+487 35233.3333 25366.6667
+488 35233.3333 25433.3333
+489 35233.3333 25450.0000
+490 35233.3333 25466.6667
+491 35233.3333 25616.6667
+492 35233.3333 25683.3333
+493 35233.3333 25700.0000
+494 35233.3333 25716.6667
+495 35250.0000 23550.0000
+496 35250.0000 23583.3333
+497 35250.0000 23666.6667
+498 35250.0000 23683.3333
+499 35250.0000 23716.6667
+500 35250.0000 23783.3333
+501 35250.0000 23816.6667
+502 35250.0000 24150.0000
+503 35250.0000 24166.6667
+504 35250.0000 24183.3333
+505 35250.0000 24216.6667
+506 35250.0000 24250.0000
+507 35250.0000 24300.0000
+508 35250.0000 24316.6667
+509 35250.0000 24333.3333
+510 35250.0000 24433.3333
+511 35250.0000 24450.0000
+512 35250.0000 24500.0000
+513 35250.0000 24533.3333
+514 35250.0000 24566.6667
+515 35250.0000 24600.0000
+516 35250.0000 24633.3333
+517 35250.0000 24650.0000
+518 35250.0000 24683.3333
+519 35250.0000 24983.3333
+520 35250.0000 25033.3333
+521 35250.0000 25066.6667
+522 35250.0000 25116.6667
+523 35250.0000 25166.6667
+524 35250.0000 25233.3333
+525 35250.0000 25250.0000
+526 35250.0000 25300.0000
+527 35250.0000 25333.3333
+528 35250.0000 25350.0000
+529 35250.0000 25383.3333
+530 35250.0000 25416.6667
+531 35250.0000 25550.0000
+532 35250.0000 25616.6667
+533 35250.0000 25633.3333
+534 35250.0000 25650.0000
+535 35250.0000 25666.6667
+536 35250.0000 25683.3333
+537 35250.0000 26250.0000
+538 35266.6667 23616.6667
+539 35266.6667 23650.0000
+540 35266.6667 23683.3333
+541 35266.6667 23700.0000
+542 35266.6667 23716.6667
+543 35266.6667 23733.3333
+544 35266.6667 23750.0000
+545 35266.6667 23816.6667
+546 35266.6667 24133.3333
+547 35266.6667 24283.3333
+548 35266.6667 24300.0000
+549 35266.6667 24333.3333
+550 35266.6667 24350.0000
+551 35266.6667 24433.3333
+552 35266.6667 24516.6667
+553 35266.6667 24583.3333
+554 35266.6667 24650.0000
+555 35266.6667 25000.0000
+556 35266.6667 25016.6667
+557 35266.6667 25050.0000
+558 35266.6667 25116.6667
+559 35266.6667 25133.3333
+560 35266.6667 25183.3333
+561 35266.6667 25216.6667
+562 35266.6667 25233.3333
+563 35266.6667 25250.0000
+564 35266.6667 25283.3333
+565 35266.6667 25300.0000
+566 35266.6667 25366.6667
+567 35266.6667 25416.6667
+568 35266.6667 25566.6667
+569 35266.6667 25583.3333
+570 35266.6667 25650.0000
+571 35266.6667 25666.6667
+572 35266.6667 25716.6667
+573 35266.6667 26266.6667
+574 35283.3333 23616.6667
+575 35283.3333 23633.3333
+576 35283.3333 23650.0000
+577 35283.3333 23666.6667
+578 35283.3333 23683.3333
+579 35283.3333 23700.0000
+580 35283.3333 23733.3333
+581 35283.3333 23750.0000
+582 35283.3333 23766.6667
+583 35283.3333 23783.3333
+584 35283.3333 23816.6667
+585 35283.3333 23833.3333
+586 35283.3333 23966.6667
+587 35283.3333 24183.3333
+588 35283.3333 24200.0000
+589 35283.3333 24333.3333
+590 35283.3333 24350.0000
+591 35283.3333 24366.6667
+592 35283.3333 24383.3333
+593 35283.3333 24416.6667
+594 35283.3333 24466.6667
+595 35283.3333 24483.3333
+596 35283.3333 24500.0000
+597 35283.3333 24516.6667
+598 35283.3333 24883.3333
+599 35283.3333 25033.3333
+600 35283.3333 25050.0000
+601 35283.3333 25066.6667
+602 35283.3333 25083.3333
+603 35283.3333 25100.0000
+604 35283.3333 25133.3333
+605 35283.3333 25183.3333
+606 35283.3333 25233.3333
+607 35283.3333 25266.6667
+608 35283.3333 25300.0000
+609 35283.3333 25316.6667
+610 35283.3333 25333.3333
+611 35283.3333 25466.6667
+612 35283.3333 25500.0000
+613 35283.3333 25616.6667
+614 35283.3333 25633.3333
+615 35283.3333 25666.6667
+616 35283.3333 25700.0000
+617 35300.0000 23516.6667
+618 35300.0000 23583.3333
+619 35300.0000 23600.0000
+620 35300.0000 23616.6667
+621 35300.0000 23633.3333
+622 35300.0000 23650.0000
+623 35300.0000 23683.3333
+624 35300.0000 23700.0000
+625 35300.0000 23716.6667
+626 35300.0000 23783.3333
+627 35300.0000 23800.0000
+628 35300.0000 24183.3333
+629 35300.0000 24316.6667
+630 35300.0000 24350.0000
+631 35300.0000 24366.6667
+632 35300.0000 24383.3333
+633 35300.0000 24400.0000
+634 35300.0000 24416.6667
+635 35300.0000 24450.0000
+636 35300.0000 24466.6667
+637 35300.0000 24500.0000
+638 35300.0000 24533.3333
+639 35300.0000 24583.3333
+640 35300.0000 24800.0000
+641 35300.0000 24816.6667
+642 35300.0000 24833.3333
+643 35300.0000 24900.0000
+644 35300.0000 24916.6667
+645 35300.0000 24933.3333
+646 35300.0000 25016.6667
+647 35300.0000 25083.3333
+648 35300.0000 25100.0000
+649 35300.0000 25150.0000
+650 35300.0000 25166.6667
+651 35300.0000 25233.3333
+652 35300.0000 25250.0000
+653 35300.0000 25300.0000
+654 35300.0000 25366.6667
+655 35300.0000 25383.3333
+656 35300.0000 25433.3333
+657 35300.0000 25516.6667
+658 35300.0000 25566.6667
+659 35300.0000 25583.3333
+660 35300.0000 25600.0000
+661 35300.0000 25616.6667
+662 35300.0000 25650.0000
+663 35300.0000 25666.6667
+664 35300.0000 25733.3333
+665 35316.6667 23533.3333
+666 35316.6667 23616.6667
+667 35316.6667 23650.0000
+668 35316.6667 23666.6667
+669 35316.6667 23683.3333
+670 35316.6667 23700.0000
+671 35316.6667 23716.6667
+672 35316.6667 23733.3333
+673 35316.6667 23750.0000
+674 35316.6667 23783.3333
+675 35316.6667 23800.0000
+676 35316.6667 23816.6667
+677 35316.6667 24200.0000
+678 35316.6667 24300.0000
+679 35316.6667 24316.6667
+680 35316.6667 24333.3333
+681 35316.6667 24350.0000
+682 35316.6667 24416.6667
+683 35316.6667 24450.0000
+684 35316.6667 24533.3333
+685 35316.6667 24616.6667
+686 35316.6667 24683.3333
+687 35316.6667 24800.0000
+688 35316.6667 24833.3333
+689 35316.6667 24850.0000
+690 35316.6667 24916.6667
+691 35316.6667 24950.0000
+692 35316.6667 25050.0000
+693 35316.6667 25133.3333
+694 35316.6667 25166.6667
+695 35316.6667 25183.3333
+696 35316.6667 25283.3333
+697 35316.6667 25316.6667
+698 35316.6667 25366.6667
+699 35316.6667 25383.3333
+700 35316.6667 25566.6667
+701 35316.6667 25600.0000
+702 35316.6667 25616.6667
+703 35316.6667 25650.0000
+704 35316.6667 25666.6667
+705 35316.6667 25683.3333
+706 35316.6667 25716.6667
+707 35316.6667 25733.3333
+708 35333.3333 23550.0000
+709 35333.3333 23600.0000
+710 35333.3333 23650.0000
+711 35333.3333 23700.0000
+712 35333.3333 23716.6667
+713 35333.3333 23733.3333
+714 35333.3333 23750.0000
+715 35333.3333 23766.6667
+716 35333.3333 23783.3333
+717 35333.3333 23800.0000
+718 35333.3333 23816.6667
+719 35333.3333 23833.3333
+720 35333.3333 23900.0000
+721 35333.3333 24183.3333
+722 35333.3333 24283.3333
+723 35333.3333 24300.0000
+724 35333.3333 24333.3333
+725 35333.3333 24350.0000
+726 35333.3333 24383.3333
+727 35333.3333 24400.0000
+728 35333.3333 24416.6667
+729 35333.3333 24466.6667
+730 35333.3333 24483.3333
+731 35333.3333 24500.0000
+732 35333.3333 24516.6667
+733 35333.3333 24616.6667
+734 35333.3333 24666.6667
+735 35333.3333 24683.3333
+736 35333.3333 24700.0000
+737 35333.3333 24716.6667
+738 35333.3333 24733.3333
+739 35333.3333 24750.0000
+740 35333.3333 24766.6667
+741 35333.3333 24783.3333
+742 35333.3333 24800.0000
+743 35333.3333 24816.6667
+744 35333.3333 24833.3333
+745 35333.3333 24850.0000
+746 35333.3333 24866.6667
+747 35333.3333 24883.3333
+748 35333.3333 25066.6667
+749 35333.3333 25083.3333
+750 35333.3333 25116.6667
+751 35333.3333 25133.3333
+752 35333.3333 25150.0000
+753 35333.3333 25166.6667
+754 35333.3333 25250.0000
+755 35333.3333 25350.0000
+756 35333.3333 25616.6667
+757 35333.3333 25633.3333
+758 35333.3333 25666.6667
+759 35333.3333 25700.0000
+760 35333.3333 25733.3333
+761 35333.3333 25750.0000
+762 35350.0000 23583.3333
+763 35350.0000 23600.0000
+764 35350.0000 23633.3333
+765 35350.0000 23666.6667
+766 35350.0000 23683.3333
+767 35350.0000 23700.0000
+768 35350.0000 23833.3333
+769 35350.0000 24166.6667
+770 35350.0000 24183.3333
+771 35350.0000 24200.0000
+772 35350.0000 24216.6667
+773 35350.0000 24233.3333
+774 35350.0000 24250.0000
+775 35350.0000 24266.6667
+776 35350.0000 24283.3333
+777 35350.0000 24316.6667
+778 35350.0000 24400.0000
+779 35350.0000 24416.6667
+780 35350.0000 24433.3333
+781 35350.0000 24450.0000
+782 35350.0000 24516.6667
+783 35350.0000 24533.3333
+784 35350.0000 24550.0000
+785 35350.0000 24566.6667
+786 35350.0000 24583.3333
+787 35350.0000 24600.0000
+788 35350.0000 24633.3333
+789 35350.0000 24666.6667
+790 35350.0000 24683.3333
+791 35350.0000 24716.6667
+792 35350.0000 24733.3333
+793 35350.0000 24750.0000
+794 35350.0000 24766.6667
+795 35350.0000 24783.3333
+796 35350.0000 24816.6667
+797 35350.0000 24833.3333
+798 35350.0000 24850.0000
+799 35350.0000 24866.6667
+800 35350.0000 24916.6667
+801 35350.0000 24966.6667
+802 35366.6667 23550.0000
+803 35366.6667 23566.6667
+804 35366.6667 23583.3333
+805 35366.6667 23600.0000
+806 35366.6667 23616.6667
+807 35366.6667 23633.3333
+808 35366.6667 23650.0000
+809 35366.6667 23666.6667
+810 35366.6667 23700.0000
+811 35366.6667 23733.3333
+812 35366.6667 23783.3333
+813 35366.6667 23850.0000
+814 35366.6667 23866.6667
+815 35366.6667 24150.0000
+816 35366.6667 24166.6667
+817 35366.6667 24250.0000
+818 35366.6667 24266.6667
+819 35366.6667 24466.6667
+820 35366.6667 24483.3333
+821 35366.6667 24500.0000
+822 35366.6667 24533.3333
+823 35366.6667 24566.6667
+824 35366.6667 24583.3333
+825 35366.6667 24600.0000
+826 35366.6667 24616.6667
+827 35366.6667 24633.3333
+828 35366.6667 24666.6667
+829 35366.6667 24700.0000
+830 35366.6667 24716.6667
+831 35366.6667 24766.6667
+832 35366.6667 24883.3333
+833 35366.6667 25016.6667
+834 35383.3333 23633.3333
+835 35383.3333 23666.6667
+836 35383.3333 23733.3333
+837 35383.3333 23766.6667
+838 35383.3333 23816.6667
+839 35383.3333 23850.0000
+840 35383.3333 23866.6667
+841 35383.3333 23900.0000
+842 35383.3333 23966.6667
+843 35383.3333 24100.0000
+844 35383.3333 24116.6667
+845 35383.3333 24133.3333
+846 35383.3333 24150.0000
+847 35383.3333 24166.6667
+848 35383.3333 24183.3333
+849 35383.3333 24200.0000
+850 35383.3333 24216.6667
+851 35383.3333 24233.3333
+852 35383.3333 24250.0000
+853 35383.3333 24600.0000
+854 35383.3333 24616.6667
+855 35383.3333 24683.3333
+856 35383.3333 24733.3333
+857 35383.3333 24950.0000
+858 35383.3333 24966.6667
+859 35400.0000 23550.0000
+860 35400.0000 23566.6667
+861 35400.0000 23600.0000
+862 35400.0000 23616.6667
+863 35400.0000 23633.3333
+864 35400.0000 23666.6667
+865 35400.0000 23683.3333
+866 35400.0000 23716.6667
+867 35400.0000 23733.3333
+868 35400.0000 23766.6667
+869 35400.0000 23783.3333
+870 35400.0000 23850.0000
+871 35400.0000 23900.0000
+872 35400.0000 23916.6667
+873 35400.0000 23933.3333
+874 35400.0000 23950.0000
+875 35400.0000 23983.3333
+876 35400.0000 24066.6667
+877 35400.0000 24083.3333
+878 35400.0000 24100.0000
+879 35400.0000 24133.3333
+880 35400.0000 24150.0000
+881 35400.0000 24166.6667
+882 35400.0000 24183.3333
+883 35400.0000 24200.0000
+884 35400.0000 24216.6667
+885 35400.0000 24233.3333
+886 35400.0000 24250.0000
+887 35400.0000 24700.0000
+888 35400.0000 24716.6667
+889 35400.0000 24733.3333
+890 35400.0000 24750.0000
+891 35400.0000 24783.3333
+892 35400.0000 24883.3333
+893 35400.0000 24983.3333
+894 35400.0000 26916.6667
+895 35400.0000 26933.3333
+896 35400.0000 26950.0000
+897 35416.6667 23566.6667
+898 35416.6667 23583.3333
+899 35416.6667 23633.3333
+900 35416.6667 23650.0000
+901 35416.6667 23683.3333
+902 35416.6667 23700.0000
+903 35416.6667 23750.0000
+904 35416.6667 23783.3333
+905 35416.6667 23850.0000
+906 35416.6667 23933.3333
+907 35416.6667 24016.6667
+908 35416.6667 24033.3333
+909 35416.6667 24050.0000
+910 35416.6667 24066.6667
+911 35416.6667 24083.3333
+912 35416.6667 24100.0000
+913 35416.6667 24116.6667
+914 35416.6667 24133.3333
+915 35416.6667 24150.0000
+916 35416.6667 24183.3333
+917 35416.6667 24200.0000
+918 35416.6667 24216.6667
+919 35416.6667 24233.3333
+920 35416.6667 24250.0000
+921 35416.6667 24700.0000
+922 35416.6667 24716.6667
+923 35416.6667 24783.3333
+924 35416.6667 26933.3333
+925 35433.3333 23583.3333
+926 35433.3333 23633.3333
+927 35433.3333 23666.6667
+928 35433.3333 23683.3333
+929 35433.3333 23700.0000
+930 35433.3333 23716.6667
+931 35433.3333 23750.0000
+932 35433.3333 23766.6667
+933 35433.3333 23783.3333
+934 35433.3333 23833.3333
+935 35433.3333 23850.0000
+936 35433.3333 23916.6667
+937 35433.3333 23933.3333
+938 35433.3333 24033.3333
+939 35433.3333 24050.0000
+940 35433.3333 24066.6667
+941 35433.3333 24116.6667
+942 35433.3333 24166.6667
+943 35433.3333 24183.3333
+944 35433.3333 24200.0000
+945 35433.3333 24233.3333
+946 35450.0000 23583.3333
+947 35450.0000 23600.0000
+948 35450.0000 23616.6667
+949 35450.0000 23633.3333
+950 35450.0000 23650.0000
+951 35450.0000 23666.6667
+952 35450.0000 23683.3333
+953 35450.0000 23700.0000
+954 35450.0000 23716.6667
+955 35450.0000 23733.3333
+956 35450.0000 23750.0000
+957 35450.0000 23766.6667
+958 35450.0000 23783.3333
+959 35450.0000 23800.0000
+960 35450.0000 23833.3333
+961 35450.0000 23866.6667
+962 35450.0000 23900.0000
+963 35450.0000 23916.6667
+964 35450.0000 24016.6667
+965 35450.0000 24033.3333
+966 35450.0000 24050.0000
+967 35450.0000 24116.6667
+968 35450.0000 24166.6667
+969 35450.0000 24200.0000
+970 35450.0000 24216.6667
+971 35450.0000 24233.3333
+972 35466.6667 23566.6667
+973 35466.6667 23600.0000
+974 35466.6667 23616.6667
+975 35466.6667 23633.3333
+976 35466.6667 23650.0000
+977 35466.6667 23666.6667
+978 35466.6667 23683.3333
+979 35466.6667 23700.0000
+980 35466.6667 23716.6667
+981 35466.6667 23733.3333
+982 35466.6667 23750.0000
+983 35466.6667 23766.6667
+984 35466.6667 23783.3333
+985 35466.6667 23800.0000
+986 35466.6667 23816.6667
+987 35466.6667 23833.3333
+988 35466.6667 23850.0000
+989 35466.6667 23866.6667
+990 35466.6667 23883.3333
+991 35466.6667 23900.0000
+992 35466.6667 23916.6667
+993 35466.6667 23933.3333
+994 35466.6667 23950.0000
+995 35466.6667 23966.6667
+996 35466.6667 23983.3333
+997 35466.6667 24066.6667
+998 35466.6667 24100.0000
+999 35466.6667 24116.6667
+1000 35466.6667 24133.3333
+1001 35466.6667 24150.0000
+1002 35466.6667 27133.3333
+1003 35483.3333 23583.3333
+1004 35483.3333 23600.0000
+1005 35483.3333 23650.0000
+1006 35483.3333 23666.6667
+1007 35483.3333 23683.3333
+1008 35483.3333 23700.0000
+1009 35483.3333 23716.6667
+1010 35483.3333 23733.3333
+1011 35483.3333 23750.0000
+1012 35483.3333 23766.6667
+1013 35483.3333 23783.3333
+1014 35483.3333 23800.0000
+1015 35483.3333 23816.6667
+1016 35483.3333 23833.3333
+1017 35483.3333 23850.0000
+1018 35483.3333 23866.6667
+1019 35483.3333 23900.0000
+1020 35483.3333 23916.6667
+1021 35483.3333 23950.0000
+1022 35483.3333 23966.6667
+1023 35483.3333 23983.3333
+1024 35483.3333 24000.0000
+1025 35483.3333 24016.6667
+1026 35483.3333 24033.3333
+1027 35483.3333 24066.6667
+1028 35483.3333 27116.6667
+1029 35483.3333 27183.3333
+1030 35500.0000 23600.0000
+1031 35500.0000 23616.6667
+1032 35500.0000 23633.3333
+1033 35500.0000 23650.0000
+1034 35500.0000 23666.6667
+1035 35500.0000 23683.3333
+1036 35500.0000 23700.0000
+1037 35500.0000 23716.6667
+1038 35500.0000 23733.3333
+1039 35500.0000 23750.0000
+1040 35500.0000 23766.6667
+1041 35500.0000 23783.3333
+1042 35500.0000 23800.0000
+1043 35500.0000 23816.6667
+1044 35500.0000 23833.3333
+1045 35500.0000 23850.0000
+1046 35500.0000 23866.6667
+1047 35500.0000 23883.3333
+1048 35500.0000 23900.0000
+1049 35500.0000 23933.3333
+1050 35500.0000 23966.6667
+1051 35500.0000 23983.3333
+1052 35500.0000 24000.0000
+1053 35500.0000 24016.6667
+1054 35500.0000 24033.3333
+1055 35500.0000 27233.3333
+1056 35516.6667 23600.0000
+1057 35516.6667 23616.6667
+1058 35516.6667 23633.3333
+1059 35516.6667 23750.0000
+1060 35516.6667 23783.3333
+1061 35516.6667 23816.6667
+1062 35516.6667 23850.0000
+1063 35516.6667 23866.6667
+1064 35516.6667 23883.3333
+1065 35516.6667 23916.6667
+1066 35516.6667 23933.3333
+1067 35516.6667 23966.6667
+1068 35516.6667 23983.3333
+1069 35516.6667 24000.0000
+1070 35516.6667 24033.3333
+1071 35516.6667 24050.0000
+1072 35516.6667 24083.3333
+1073 35516.6667 24100.0000
+1074 35516.6667 24116.6667
+1075 35516.6667 24133.3333
+1076 35516.6667 24150.0000
+1077 35516.6667 27133.3333
+1078 35533.3333 23733.3333
+1079 35533.3333 23750.0000
+1080 35533.3333 23766.6667
+1081 35533.3333 23783.3333
+1082 35533.3333 23800.0000
+1083 35533.3333 24083.3333
+1084 35533.3333 24100.0000
+1085 35533.3333 24116.6667
+1086 35533.3333 24150.0000
+1087 35533.3333 24183.3333
+1088 35533.3333 27150.0000
+1089 35550.0000 23750.0000
+1090 35550.0000 23766.6667
+1091 35550.0000 23783.3333
+1092 35550.0000 24150.0000
+1093 35550.0000 24166.6667
+1094 35550.0000 27166.6667
+1095 35550.0000 27183.3333
+1096 35566.6667 23600.0000
+1097 35566.6667 23750.0000
+1098 35566.6667 23766.6667
+1099 35566.6667 24100.0000
+1100 35566.6667 24133.3333
+1101 35600.0000 23716.6667
+1102 35616.6667 27116.6667
+1103 35633.3333 27150.0000
+1104 35666.6667 23733.3333
+1105 35683.3333 27150.0000
+1106 35733.3333 27183.3333
+1107 35750.0000 27216.6667
+1108 35766.6667 27183.3333
+1109 35800.0000 27216.6667
+1110 35866.6667 23300.0000
+1111 35883.3333 23283.3333
+1112 35900.0000 27216.6667
+1113 35900.0000 27250.0000
+1114 35950.0000 27766.6667
+1115 35966.6667 27866.6667
+1116 36000.0000 27816.6667
+1117 36016.6667 27933.3333
+1118 36050.0000 27816.6667
+1119 36050.0000 27883.3333
+1120 36066.6667 27933.3333
+1121 36083.3333 27800.0000
+1122 36083.3333 27850.0000
+1123 36083.3333 28083.3333
+1124 36100.0000 27833.3333
+1125 36100.0000 28016.6667
+1126 36116.6667 27750.0000
+1127 36133.3333 29583.3333
+1128 36150.0000 22983.3333
+1129 36150.0000 23016.6667
+1130 36150.0000 23033.3333
+1131 36150.0000 27783.3333
+1132 36150.0000 27850.0000
+1133 36150.0000 27950.0000
+1134 36166.6667 22966.6667
+1135 36166.6667 22983.3333
+1136 36166.6667 23000.0000
+1137 36183.3333 22950.0000
+1138 36183.3333 22966.6667
+1139 36183.3333 22983.3333
+1140 36183.3333 23000.0000
+1141 36183.3333 28133.3333
+1142 36200.0000 22950.0000
+1143 36200.0000 22966.6667
+1144 36200.0000 22983.3333
+1145 36200.0000 23000.0000
+1146 36216.6667 22916.6667
+1147 36216.6667 22950.0000
+1148 36216.6667 22966.6667
+1149 36216.6667 22983.3333
+1150 36216.6667 27600.0000
+1151 36216.6667 27616.6667
+1152 36216.6667 27866.6667
+1153 36233.3333 22950.0000
+1154 36233.3333 22966.6667
+1155 36233.3333 22983.3333
+1156 36233.3333 23000.0000
+1157 36233.3333 23083.3333
+1158 36233.3333 27850.0000
+1159 36250.0000 22933.3333
+1160 36250.0000 22950.0000
+1161 36250.0000 22983.3333
+1162 36250.0000 23000.0000
+1163 36250.0000 27716.6667
+1164 36250.0000 27966.6667
+1165 36250.0000 28016.6667
+1166 36250.0000 28166.6667
+1167 36266.6667 22950.0000
+1168 36266.6667 22966.6667
+1169 36266.6667 22983.3333
+1170 36266.6667 23083.3333
+1171 36266.6667 27900.0000
+1172 36266.6667 27916.6667
+1173 36283.3333 22950.0000
+1174 36283.3333 22966.6667
+1175 36283.3333 27866.6667
+1176 36283.3333 27950.0000
+1177 36300.0000 22966.6667
+1178 36300.0000 22983.3333
+1179 36300.0000 28150.0000
+1180 36316.6667 22933.3333
+1181 36316.6667 22950.0000
+1182 36316.6667 28050.0000
+1183 36333.3333 22950.0000
+1184 36333.3333 22966.6667
+1185 36333.3333 22983.3333
+1186 36333.3333 27950.0000
+1187 36350.0000 22950.0000
+1188 36350.0000 25400.0000
+1189 36350.0000 25450.0000
+1190 36350.0000 25766.6667
+1191 36350.0000 27983.3333
+1192 36366.6667 22950.0000
+1193 36383.3333 25433.3333
+1194 36383.3333 25450.0000
+1195 36383.3333 25466.6667
+1196 36399.1667 27423.6111
+1197 36400.0000 22483.3333
+1198 36400.0000 25450.0000
+1199 36400.0000 25483.3333
+1200 36400.0000 28083.3333
+1201 36400.0000 28116.6667
+1202 36400.0000 28166.6667
+1203 36415.8333 27385.0000
+1204 36416.6667 22483.3333
+1205 36416.6667 25433.3333
+1206 36416.6667 25450.0000
+1207 36416.6667 28183.3333
+1208 36420.8333 27371.3889
+1209 36433.3333 22466.6667
+1210 36433.3333 22483.3333
+1211 36433.3333 25333.3333
+1212 36433.3333 25350.0000
+1213 36433.3333 25416.6667
+1214 36433.3333 25433.3333
+1215 36433.3333 28216.6667
+1216 36449.1667 27348.3333
+1217 36450.0000 22466.6667
+1218 36450.0000 22483.3333
+1219 36450.0000 28250.0000
+1220 36458.6111 27318.6111
+1221 36466.6667 22433.3333
+1222 36466.6667 22450.0000
+1223 36466.6667 22466.6667
+1224 36466.6667 23166.6667
+1225 36466.6667 25366.6667
+1226 36466.6667 25383.3333
+1227 36466.6667 25400.0000
+1228 36483.3333 22366.6667
+1229 36483.3333 22383.3333
+1230 36483.3333 22400.0000
+1231 36483.3333 22416.6667
+1232 36483.3333 22450.0000
+1233 36483.3333 22483.3333
+1234 36483.3333 22500.0000
+1235 36483.3333 22950.0000
+1236 36483.3333 23100.0000
+1237 36483.3333 23150.0000
+1238 36500.0000 22366.6667
+1239 36500.0000 22383.3333
+1240 36500.0000 22400.0000
+1241 36500.0000 22416.6667
+1242 36500.0000 22433.3333
+1243 36500.0000 22466.6667
+1244 36500.0000 22483.3333
+1245 36500.0000 23083.3333
+1246 36516.6667 22366.6667
+1247 36516.6667 22383.3333
+1248 36516.6667 22400.0000
+1249 36516.6667 22416.6667
+1250 36516.6667 22466.6667
+1251 36516.6667 22483.3333
+1252 36516.6667 22983.3333
+1253 36516.6667 23050.0000
+1254 36516.6667 23066.6667
+1255 36516.6667 23083.3333
+1256 36533.3333 22366.6667
+1257 36533.3333 22383.3333
+1258 36533.3333 22400.0000
+1259 36533.3333 22416.6667
+1260 36533.3333 22433.3333
+1261 36533.3333 22450.0000
+1262 36533.3333 22466.6667
+1263 36533.3333 22983.3333
+1264 36533.3333 23083.3333
+1265 36533.3333 23116.6667
+1266 36533.3333 27850.0000
+1267 36550.0000 22400.0000
+1268 36550.0000 22416.6667
+1269 36550.0000 22450.0000
+1270 36550.0000 22983.3333
+1271 36550.0000 23000.0000
+1272 36550.0000 23016.6667
+1273 36550.0000 23033.3333
+1274 36550.0000 23050.0000
+1275 36550.0000 23100.0000
+1276 36550.0000 26350.0000
+1277 36558.6111 27175.5556
+1278 36566.6667 22400.0000
+1279 36566.6667 22416.6667
+1280 36566.6667 22466.6667
+1281 36566.6667 22483.3333
+1282 36566.6667 22966.6667
+1283 36566.6667 22983.3333
+1284 36566.6667 23000.0000
+1285 36566.6667 23016.6667
+1286 36566.6667 23033.3333
+1287 36566.6667 23050.0000
+1288 36574.1667 27177.7778
+1289 36583.3333 22400.0000
+1290 36583.3333 22416.6667
+1291 36583.3333 22466.6667
+1292 36583.3333 23033.3333
+1293 36600.0000 22366.6667
+1294 36600.0000 22383.3333
+1295 36600.0000 22400.0000
+1296 36600.0000 22416.6667
+1297 36600.0000 22966.6667
+1298 36600.0000 23050.0000
+1299 36600.0000 24916.6667
+1300 36600.0000 24933.3333
+1301 36600.0000 27833.3333
+1302 36603.3333 27177.7778
+1303 36611.3889 27133.3333
+1304 36616.6667 22383.3333
+1305 36616.6667 22400.0000
+1306 36616.6667 22466.6667
+1307 36616.6667 22483.3333
+1308 36616.6667 22500.0000
+1309 36616.6667 22916.6667
+1310 36616.6667 22983.3333
+1311 36616.6667 23000.0000
+1312 36616.6667 24950.0000
+1313 36617.7778 27170.8333
+1314 36633.3333 22383.3333
+1315 36633.3333 22400.0000
+1316 36633.3333 22466.6667
+1317 36633.3333 22483.3333
+1318 36633.3333 22500.0000
+1319 36633.3333 22883.3333
+1320 36633.3333 22950.0000
+1321 36633.3333 23000.0000
+1322 36633.3333 23016.6667
+1323 36633.3333 23033.3333
+1324 36633.3333 24900.0000
+1325 36633.3333 24916.6667
+1326 36650.0000 22383.3333
+1327 36650.0000 22400.0000
+1328 36650.0000 22416.6667
+1329 36650.0000 22433.3333
+1330 36650.0000 22466.6667
+1331 36650.0000 22500.0000
+1332 36650.0000 22900.0000
+1333 36650.0000 22966.6667
+1334 36650.0000 23016.6667
+1335 36650.0000 24883.3333
+1336 36662.7778 27119.4444
+1337 36666.6667 22366.6667
+1338 36666.6667 22383.3333
+1339 36666.6667 22433.3333
+1340 36666.6667 22450.0000
+1341 36666.6667 22466.6667
+1342 36666.6667 22483.3333
+1343 36666.6667 22500.0000
+1344 36666.6667 22533.3333
+1345 36666.6667 22550.0000
+1346 36666.6667 22933.3333
+1347 36666.6667 22983.3333
+1348 36666.6667 23016.6667
+1349 36683.3333 22383.3333
+1350 36683.3333 22416.6667
+1351 36683.3333 22433.3333
+1352 36683.3333 22450.0000
+1353 36683.3333 22466.6667
+1354 36683.3333 22483.3333
+1355 36683.3333 22516.6667
+1356 36683.3333 22833.3333
+1357 36683.3333 22916.6667
+1358 36683.3333 22933.3333
+1359 36683.3333 22966.6667
+1360 36683.3333 23033.3333
+1361 36683.3333 23050.0000
+1362 36683.3333 25333.3333
+1363 36700.0000 22383.3333
+1364 36700.0000 22466.6667
+1365 36700.0000 22483.3333
+1366 36700.0000 22533.3333
+1367 36700.0000 22900.0000
+1368 36700.0000 22916.6667
+1369 36700.0000 22933.3333
+1370 36700.0000 22950.0000
+1371 36700.0000 23033.3333
+1372 36700.0000 24483.3333
+1373 36700.0000 24533.3333
+1374 36700.0000 25116.6667
+1375 36716.6667 22350.0000
+1376 36716.6667 22366.6667
+1377 36716.6667 22383.3333
+1378 36716.6667 22400.0000
+1379 36716.6667 22416.6667
+1380 36716.6667 22433.3333
+1381 36716.6667 22466.6667
+1382 36716.6667 22500.0000
+1383 36716.6667 22866.6667
+1384 36716.6667 22950.0000
+1385 36716.6667 22983.3333
+1386 36733.3333 22333.3333
+1387 36733.3333 22350.0000
+1388 36733.3333 22416.6667
+1389 36733.3333 22433.3333
+1390 36733.3333 22450.0000
+1391 36733.3333 22466.6667
+1392 36733.3333 22483.3333
+1393 36733.3333 22500.0000
+1394 36733.3333 22550.0000
+1395 36733.3333 22566.6667
+1396 36733.3333 22866.6667
+1397 36733.3333 22900.0000
+1398 36733.3333 23033.3333
+1399 36733.3333 24433.3333
+1400 36733.3333 25283.3333
+1401 36750.0000 22333.3333
+1402 36750.0000 22450.0000
+1403 36750.0000 22466.6667
+1404 36750.0000 22500.0000
+1405 36750.0000 22516.6667
+1406 36750.0000 22533.3333
+1407 36750.0000 22566.6667
+1408 36750.0000 22800.0000
+1409 36750.0000 22933.3333
+1410 36750.0000 22966.6667
+1411 36750.0000 23000.0000
+1412 36750.0000 23016.6667
+1413 36750.0000 23066.6667
+1414 36750.0000 24416.6667
+1415 36750.0000 24433.3333
+1416 36750.0000 24533.3333
+1417 36766.6667 21900.0000
+1418 36766.6667 22316.6667
+1419 36766.6667 22416.6667
+1420 36766.6667 22433.3333
+1421 36766.6667 22466.6667
+1422 36766.6667 22500.0000
+1423 36766.6667 22933.3333
+1424 36766.6667 23083.3333
+1425 36766.6667 24516.6667
+1426 36766.6667 27083.3333
+1427 36783.3333 21883.3333
+1428 36783.3333 21916.6667
+1429 36783.3333 22333.3333
+1430 36783.3333 22416.6667
+1431 36783.3333 22450.0000
+1432 36783.3333 22466.6667
+1433 36783.3333 22483.3333
+1434 36783.3333 22516.6667
+1435 36783.3333 22533.3333
+1436 36783.3333 22550.0000
+1437 36783.3333 22900.0000
+1438 36783.3333 23050.0000
+1439 36783.3333 23083.3333
+1440 36783.3333 25800.0000
+1441 36783.3333 27150.0000
+1442 36800.0000 21766.6667
+1443 36800.0000 21800.0000
+1444 36800.0000 21833.3333
+1445 36800.0000 21866.6667
+1446 36800.0000 21916.6667
+1447 36800.0000 21950.0000
+1448 36800.0000 22316.6667
+1449 36800.0000 22333.3333
+1450 36800.0000 22416.6667
+1451 36800.0000 22450.0000
+1452 36800.0000 22466.6667
+1453 36800.0000 22483.3333
+1454 36800.0000 22500.0000
+1455 36800.0000 22516.6667
+1456 36800.0000 22533.3333
+1457 36800.0000 22783.3333
+1458 36800.0000 22850.0000
+1459 36800.0000 22916.6667
+1460 36800.0000 23050.0000
+1461 36800.0000 24583.3333
+1462 36800.0000 25783.3333
+1463 36800.0000 25816.6667
+1464 36800.0000 27116.6667
+1465 36816.6667 21700.0000
+1466 36816.6667 21750.0000
+1467 36816.6667 21800.0000
+1468 36816.6667 21833.3333
+1469 36816.6667 21850.0000
+1470 36816.6667 21883.3333
+1471 36816.6667 21900.0000
+1472 36816.6667 21916.6667
+1473 36816.6667 21933.3333
+1474 36816.6667 22283.3333
+1475 36816.6667 22300.0000
+1476 36816.6667 22316.6667
+1477 36816.6667 22416.6667
+1478 36816.6667 22433.3333
+1479 36816.6667 22450.0000
+1480 36816.6667 22550.0000
+1481 36816.6667 23033.3333
+1482 36816.6667 26966.6667
+1483 36833.3333 21766.6667
+1484 36833.3333 21800.0000
+1485 36833.3333 21833.3333
+1486 36833.3333 21866.6667
+1487 36833.3333 21883.3333
+1488 36833.3333 21916.6667
+1489 36833.3333 22300.0000
+1490 36833.3333 22316.6667
+1491 36833.3333 22333.3333
+1492 36833.3333 22350.0000
+1493 36833.3333 22400.0000
+1494 36833.3333 22433.3333
+1495 36833.3333 22483.3333
+1496 36833.3333 22550.0000
+1497 36833.3333 22583.3333
+1498 36833.3333 22616.6667
+1499 36833.3333 22683.3333
+1500 36833.3333 22700.0000
+1501 36833.3333 22733.3333
+1502 36833.3333 22783.3333
+1503 36833.3333 22800.0000
+1504 36833.3333 22850.0000
+1505 36833.3333 23000.0000
+1506 36833.3333 25450.0000
+1507 36833.3333 25866.6667
+1508 36833.3333 25900.0000
+1509 36850.0000 21733.3333
+1510 36850.0000 21750.0000
+1511 36850.0000 21766.6667
+1512 36850.0000 21816.6667
+1513 36850.0000 21833.3333
+1514 36850.0000 21866.6667
+1515 36850.0000 21916.6667
+1516 36850.0000 22266.6667
+1517 36850.0000 22283.3333
+1518 36850.0000 22316.6667
+1519 36850.0000 22350.0000
+1520 36850.0000 22416.6667
+1521 36850.0000 22450.0000
+1522 36850.0000 22466.6667
+1523 36850.0000 22500.0000
+1524 36850.0000 22600.0000
+1525 36850.0000 22666.6667
+1526 36850.0000 22683.3333
+1527 36850.0000 22733.3333
+1528 36850.0000 23000.0000
+1529 36850.0000 27083.3333
+1530 36850.0000 27166.6667
+1531 36850.0000 27216.6667
+1532 36866.6667 21700.0000
+1533 36866.6667 21716.6667
+1534 36866.6667 21750.0000
+1535 36866.6667 21766.6667
+1536 36866.6667 21783.3333
+1537 36866.6667 21816.6667
+1538 36866.6667 21833.3333
+1539 36866.6667 21866.6667
+1540 36866.6667 21900.0000
+1541 36866.6667 22316.6667
+1542 36866.6667 22466.6667
+1543 36866.6667 22500.0000
+1544 36866.6667 22683.3333
+1545 36866.6667 22700.0000
+1546 36866.6667 22900.0000
+1547 36866.6667 23016.6667
+1548 36866.6667 25466.6667
+1549 36866.6667 25516.6667
+1550 36883.3333 21716.6667
+1551 36883.3333 21866.6667
+1552 36883.3333 21900.0000
+1553 36883.3333 22233.3333
+1554 36883.3333 22250.0000
+1555 36883.3333 22283.3333
+1556 36883.3333 22400.0000
+1557 36883.3333 22416.6667
+1558 36883.3333 22483.3333
+1559 36883.3333 22516.6667
+1560 36883.3333 22550.0000
+1561 36883.3333 22566.6667
+1562 36883.3333 22666.6667
+1563 36883.3333 22700.0000
+1564 36883.3333 22800.0000
+1565 36883.3333 22983.3333
+1566 36883.3333 25516.6667
+1567 36883.3333 27150.0000
+1568 36883.3333 27283.3333
+1569 36883.3333 27300.0000
+1570 36900.0000 21750.0000
+1571 36900.0000 21766.6667
+1572 36900.0000 21816.6667
+1573 36900.0000 21850.0000
+1574 36900.0000 21866.6667
+1575 36900.0000 21900.0000
+1576 36900.0000 21916.6667
+1577 36900.0000 22250.0000
+1578 36900.0000 22266.6667
+1579 36900.0000 22450.0000
+1580 36900.0000 22650.0000
+1581 36900.0000 22716.6667
+1582 36900.0000 22850.0000
+1583 36900.0000 22966.6667
+1584 36900.0000 23000.0000
+1585 36900.0000 25566.6667
+1586 36900.0000 25983.3333
+1587 36900.0000 26000.0000
+1588 36916.6667 21700.0000
+1589 36916.6667 21833.3333
+1590 36916.6667 21850.0000
+1591 36916.6667 21866.6667
+1592 36916.6667 21900.0000
+1593 36916.6667 21916.6667
+1594 36916.6667 22150.0000
+1595 36916.6667 22233.3333
+1596 36916.6667 22250.0000
+1597 36916.6667 22266.6667
+1598 36916.6667 22433.3333
+1599 36916.6667 22450.0000
+1600 36916.6667 22750.0000
+1601 36916.6667 23000.0000
+1602 36916.6667 25983.3333
+1603 36933.3333 21833.3333
+1604 36933.3333 21883.3333
+1605 36933.3333 22150.0000
+1606 36933.3333 22166.6667
+1607 36933.3333 22183.3333
+1608 36933.3333 22200.0000
+1609 36933.3333 22466.6667
+1610 36933.3333 22483.3333
+1611 36933.3333 22533.3333
+1612 36933.3333 22816.6667
+1613 36933.3333 24683.3333
+1614 36933.3333 24733.3333
+1615 36933.3333 27150.0000
+1616 36950.0000 21700.0000
+1617 36950.0000 21733.3333
+1618 36950.0000 21750.0000
+1619 36950.0000 21783.3333
+1620 36950.0000 21816.6667
+1621 36950.0000 21850.0000
+1622 36950.0000 21866.6667
+1623 36950.0000 21883.3333
+1624 36950.0000 21933.3333
+1625 36950.0000 22166.6667
+1626 36950.0000 22183.3333
+1627 36950.0000 22216.6667
+1628 36950.0000 22233.3333
+1629 36950.0000 22250.0000
+1630 36950.0000 22416.6667
+1631 36950.0000 22450.0000
+1632 36950.0000 22466.6667
+1633 36950.0000 22766.6667
+1634 36950.0000 24750.0000
+1635 36950.0000 26983.3333
+1636 36966.6667 21700.0000
+1637 36966.6667 21733.3333
+1638 36966.6667 21750.0000
+1639 36966.6667 21816.6667
+1640 36966.6667 21850.0000
+1641 36966.6667 21866.6667
+1642 36966.6667 21900.0000
+1643 36966.6667 22150.0000
+1644 36966.6667 22166.6667
+1645 36966.6667 22200.0000
+1646 36966.6667 22233.3333
+1647 36966.6667 22400.0000
+1648 36966.6667 22416.6667
+1649 36966.6667 22450.0000
+1650 36966.6667 22466.6667
+1651 36966.6667 22650.0000
+1652 36966.6667 22983.3333
+1653 36966.6667 24716.6667
+1654 36966.6667 24733.3333
+1655 36966.6667 24750.0000
+1656 36966.6667 26966.6667
+1657 36966.6667 27016.6667
+1658 36983.3333 21666.6667
+1659 36983.3333 21716.6667
+1660 36983.3333 21766.6667
+1661 36983.3333 21783.3333
+1662 36983.3333 21800.0000
+1663 36983.3333 21833.3333
+1664 36983.3333 21850.0000
+1665 36983.3333 21883.3333
+1666 36983.3333 22150.0000
+1667 36983.3333 22183.3333
+1668 36983.3333 22316.6667
+1669 36983.3333 22400.0000
+1670 36983.3333 22433.3333
+1671 36983.3333 22466.6667
+1672 36983.3333 22500.0000
+1673 36983.3333 22516.6667
+1674 36983.3333 22533.3333
+1675 36983.3333 22566.6667
+1676 36983.3333 22850.0000
+1677 36983.3333 22883.3333
+1678 36983.3333 22983.3333
+1679 36983.3333 24683.3333
+1680 36983.3333 24716.6667
+1681 36983.3333 24733.3333
+1682 36983.3333 25066.6667
+1683 36983.3333 26933.3333
+1684 36983.3333 26950.0000
+1685 36983.3333 27000.0000
+1686 37000.0000 21666.6667
+1687 37000.0000 21683.3333
+1688 37000.0000 21716.6667
+1689 37000.0000 21750.0000
+1690 37000.0000 21850.0000
+1691 37000.0000 21883.3333
+1692 37000.0000 21916.6667
+1693 37000.0000 21933.3333
+1694 37000.0000 22150.0000
+1695 37000.0000 22166.6667
+1696 37000.0000 22183.3333
+1697 37000.0000 22250.0000
+1698 37000.0000 22300.0000
+1699 37000.0000 22383.3333
+1700 37000.0000 22500.0000
+1701 37000.0000 22700.0000
+1702 37000.0000 25166.6667
+1703 37016.6667 21633.3333
+1704 37016.6667 21733.3333
+1705 37016.6667 21750.0000
+1706 37016.6667 21800.0000
+1707 37016.6667 21833.3333
+1708 37016.6667 21883.3333
+1709 37016.6667 21900.0000
+1710 37016.6667 21933.3333
+1711 37016.6667 21950.0000
+1712 37016.6667 21966.6667
+1713 37016.6667 22266.6667
+1714 37016.6667 22416.6667
+1715 37016.6667 22450.0000
+1716 37016.6667 22466.6667
+1717 37016.6667 22483.3333
+1718 37016.6667 22783.3333
+1719 37016.6667 25183.3333
+1720 37016.6667 26983.3333
+1721 37033.3333 21783.3333
+1722 37033.3333 21800.0000
+1723 37033.3333 21866.6667
+1724 37033.3333 21883.3333
+1725 37033.3333 21916.6667
+1726 37033.3333 21933.3333
+1727 37033.3333 21966.6667
+1728 37033.3333 22083.3333
+1729 37033.3333 22116.6667
+1730 37033.3333 22133.3333
+1731 37033.3333 22183.3333
+1732 37033.3333 22216.6667
+1733 37033.3333 22233.3333
+1734 37033.3333 22366.6667
+1735 37033.3333 22416.6667
+1736 37033.3333 22433.3333
+1737 37033.3333 22450.0000
+1738 37033.3333 22466.6667
+1739 37033.3333 22483.3333
+1740 37033.3333 22516.6667
+1741 37033.3333 22566.6667
+1742 37033.3333 22616.6667
+1743 37033.3333 22833.3333
+1744 37033.3333 22983.3333
+1745 37033.3333 25083.3333
+1746 37033.3333 25433.3333
+1747 37033.3333 26966.6667
+1748 37050.0000 21600.0000
+1749 37050.0000 21666.6667
+1750 37050.0000 21700.0000
+1751 37050.0000 21716.6667
+1752 37050.0000 21766.6667
+1753 37050.0000 21800.0000
+1754 37050.0000 21816.6667
+1755 37050.0000 21850.0000
+1756 37050.0000 21883.3333
+1757 37050.0000 21933.3333
+1758 37050.0000 21950.0000
+1759 37050.0000 22016.6667
+1760 37050.0000 22083.3333
+1761 37050.0000 22100.0000
+1762 37050.0000 22166.6667
+1763 37050.0000 22183.3333
+1764 37050.0000 22366.6667
+1765 37050.0000 22400.0000
+1766 37050.0000 22416.6667
+1767 37050.0000 22433.3333
+1768 37050.0000 22450.0000
+1769 37050.0000 22783.3333
+1770 37050.0000 22900.0000
+1771 37050.0000 25133.3333
+1772 37050.0000 25200.0000
+1773 37050.0000 25233.3333
+1774 37050.0000 25250.0000
+1775 37050.0000 25400.0000
+1776 37050.0000 25483.3333
+1777 37050.0000 25500.0000
+1778 37050.0000 25533.3333
+1779 37050.0000 26933.3333
+1780 37066.6667 21583.3333
+1781 37066.6667 21600.0000
+1782 37066.6667 21633.3333
+1783 37066.6667 21700.0000
+1784 37066.6667 21750.0000
+1785 37066.6667 21783.3333
+1786 37066.6667 21816.6667
+1787 37066.6667 21883.3333
+1788 37066.6667 21933.3333
+1789 37066.6667 21966.6667
+1790 37066.6667 21983.3333
+1791 37066.6667 22000.0000
+1792 37066.6667 22066.6667
+1793 37066.6667 22083.3333
+1794 37066.6667 22100.0000
+1795 37066.6667 22166.6667
+1796 37066.6667 22216.6667
+1797 37066.6667 22350.0000
+1798 37066.6667 22366.6667
+1799 37066.6667 22383.3333
+1800 37066.6667 22416.6667
+1801 37066.6667 22433.3333
+1802 37066.6667 22450.0000
+1803 37066.6667 22583.3333
+1804 37066.6667 22783.3333
+1805 37066.6667 22800.0000
+1806 37066.6667 22816.6667
+1807 37066.6667 22850.0000
+1808 37066.6667 22916.6667
+1809 37066.6667 22933.3333
+1810 37066.6667 25116.6667
+1811 37066.6667 25133.3333
+1812 37066.6667 25400.0000
+1813 37066.6667 25433.3333
+1814 37066.6667 25450.0000
+1815 37066.6667 25466.6667
+1816 37066.6667 25483.3333
+1817 37066.6667 25500.0000
+1818 37066.6667 25516.6667
+1819 37083.3333 21666.6667
+1820 37083.3333 21766.6667
+1821 37083.3333 21783.3333
+1822 37083.3333 21800.0000
+1823 37083.3333 21833.3333
+1824 37083.3333 21866.6667
+1825 37083.3333 21900.0000
+1826 37083.3333 21916.6667
+1827 37083.3333 21933.3333
+1828 37083.3333 21950.0000
+1829 37083.3333 21966.6667
+1830 37083.3333 21983.3333
+1831 37083.3333 22000.0000
+1832 37083.3333 22033.3333
+1833 37083.3333 22050.0000
+1834 37083.3333 22100.0000
+1835 37083.3333 22216.6667
+1836 37083.3333 22350.0000
+1837 37083.3333 22366.6667
+1838 37083.3333 22416.6667
+1839 37083.3333 22433.3333
+1840 37083.3333 22566.6667
+1841 37083.3333 22650.0000
+1842 37083.3333 22800.0000
+1843 37083.3333 22833.3333
+1844 37083.3333 22900.0000
+1845 37083.3333 25150.0000
+1846 37083.3333 25166.6667
+1847 37083.3333 25200.0000
+1848 37083.3333 25216.6667
+1849 37083.3333 25416.6667
+1850 37083.3333 25500.0000
+1851 37083.3333 25533.3333
+1852 37083.3333 25583.3333
+1853 37100.0000 21633.3333
+1854 37100.0000 21716.6667
+1855 37100.0000 21750.0000
+1856 37100.0000 21766.6667
+1857 37100.0000 21816.6667
+1858 37100.0000 21833.3333
+1859 37100.0000 21850.0000
+1860 37100.0000 21966.6667
+1861 37100.0000 21983.3333
+1862 37100.0000 22000.0000
+1863 37100.0000 22033.3333
+1864 37100.0000 22050.0000
+1865 37100.0000 22066.6667
+1866 37100.0000 22233.3333
+1867 37100.0000 22250.0000
+1868 37100.0000 22366.6667
+1869 37100.0000 22433.3333
+1870 37100.0000 22450.0000
+1871 37100.0000 22533.3333
+1872 37100.0000 22733.3333
+1873 37100.0000 22800.0000
+1874 37100.0000 22866.6667
+1875 37100.0000 22883.3333
+1876 37100.0000 25383.3333
+1877 37100.0000 25400.0000
+1878 37100.0000 25433.3333
+1879 37100.0000 25483.3333
+1880 37100.0000 26866.6667
+1881 37116.6667 21583.3333
+1882 37116.6667 21733.3333
+1883 37116.6667 21766.6667
+1884 37116.6667 21800.0000
+1885 37116.6667 21833.3333
+1886 37116.6667 21933.3333
+1887 37116.6667 21966.6667
+1888 37116.6667 22033.3333
+1889 37116.6667 22066.6667
+1890 37116.6667 22250.0000
+1891 37116.6667 22333.3333
+1892 37116.6667 22350.0000
+1893 37116.6667 22383.3333
+1894 37116.6667 22866.6667
+1895 37116.6667 25233.3333
+1896 37116.6667 25416.6667
+1897 37116.6667 25433.3333
+1898 37116.6667 25516.6667
+1899 37116.6667 25533.3333
+1900 37116.6667 25816.6667
+1901 37116.6667 26866.6667
+1902 37133.3333 21683.3333
+1903 37133.3333 21750.0000
+1904 37133.3333 21766.6667
+1905 37133.3333 21816.6667
+1906 37133.3333 21866.6667
+1907 37133.3333 21883.3333
+1908 37133.3333 21916.6667
+1909 37133.3333 21966.6667
+1910 37133.3333 21983.3333
+1911 37133.3333 22000.0000
+1912 37133.3333 22016.6667
+1913 37133.3333 22033.3333
+1914 37133.3333 22066.6667
+1915 37133.3333 22333.3333
+1916 37133.3333 22450.0000
+1917 37133.3333 22583.3333
+1918 37133.3333 24450.0000
+1919 37133.3333 24466.6667
+1920 37133.3333 24500.0000
+1921 37133.3333 24516.6667
+1922 37133.3333 26850.0000
+1923 37150.0000 21583.3333
+1924 37150.0000 21766.6667
+1925 37150.0000 21783.3333
+1926 37150.0000 21800.0000
+1927 37150.0000 21833.3333
+1928 37150.0000 21850.0000
+1929 37150.0000 21883.3333
+1930 37150.0000 21966.6667
+1931 37150.0000 22033.3333
+1932 37150.0000 22050.0000
+1933 37150.0000 22083.3333
+1934 37150.0000 22233.3333
+1935 37150.0000 22433.3333
+1936 37150.0000 22900.0000
+1937 37150.0000 24433.3333
+1938 37150.0000 24450.0000
+1939 37150.0000 24500.0000
+1940 37150.0000 24516.6667
+1941 37150.0000 25466.6667
+1942 37150.0000 25533.3333
+1943 37150.0000 25550.0000
+1944 37150.0000 26866.6667
+1945 37166.6667 21616.6667
+1946 37166.6667 21666.6667
+1947 37166.6667 21700.0000
+1948 37166.6667 21716.6667
+1949 37166.6667 21750.0000
+1950 37166.6667 21783.3333
+1951 37166.6667 21833.3333
+1952 37166.6667 21883.3333
+1953 37166.6667 21916.6667
+1954 37166.6667 21983.3333
+1955 37166.6667 22033.3333
+1956 37166.6667 22066.6667
+1957 37166.6667 22083.3333
+1958 37166.6667 22133.3333
+1959 37166.6667 22316.6667
+1960 37166.6667 22416.6667
+1961 37166.6667 22450.0000
+1962 37166.6667 22500.0000
+1963 37166.6667 22666.6667
+1964 37166.6667 22716.6667
+1965 37166.6667 22866.6667
+1966 37166.6667 22900.0000
+1967 37166.6667 24433.3333
+1968 37166.6667 24450.0000
+1969 37166.6667 24483.3333
+1970 37166.6667 26800.0000
+1971 37166.6667 26833.3333
+1972 37183.3333 21600.0000
+1973 37183.3333 21616.6667
+1974 37183.3333 21683.3333
+1975 37183.3333 21750.0000
+1976 37183.3333 21766.6667
+1977 37183.3333 21816.6667
+1978 37183.3333 21850.0000
+1979 37183.3333 21933.3333
+1980 37183.3333 22050.0000
+1981 37183.3333 22183.3333
+1982 37183.3333 22200.0000
+1983 37183.3333 22233.3333
+1984 37183.3333 22300.0000
+1985 37183.3333 22316.6667
+1986 37183.3333 22550.0000
+1987 37183.3333 22600.0000
+1988 37183.3333 22683.3333
+1989 37183.3333 22900.0000
+1990 37183.3333 24483.3333
+1991 37183.3333 24516.6667
+1992 37183.3333 25550.0000
+1993 37200.0000 21616.6667
+1994 37200.0000 21783.3333
+1995 37200.0000 21800.0000
+1996 37200.0000 21883.3333
+1997 37200.0000 21933.3333
+1998 37200.0000 21966.6667
+1999 37200.0000 22000.0000
+2000 37200.0000 22016.6667
+2001 37200.0000 22050.0000
+2002 37200.0000 22083.3333
+2003 37200.0000 22166.6667
+2004 37200.0000 22266.6667
+2005 37200.0000 22283.3333
+2006 37200.0000 22316.6667
+2007 37200.0000 22350.0000
+2008 37200.0000 22366.6667
+2009 37200.0000 22400.0000
+2010 37200.0000 22783.3333
+2011 37200.0000 22883.3333
+2012 37200.0000 24500.0000
+2013 37216.6667 21600.0000
+2014 37216.6667 21633.3333
+2015 37216.6667 21650.0000
+2016 37216.6667 21666.6667
+2017 37216.6667 21683.3333
+2018 37216.6667 21716.6667
+2019 37216.6667 21733.3333
+2020 37216.6667 21750.0000
+2021 37216.6667 21850.0000
+2022 37216.6667 21950.0000
+2023 37216.6667 21966.6667
+2024 37216.6667 22033.3333
+2025 37216.6667 22283.3333
+2026 37216.6667 22300.0000
+2027 37216.6667 22883.3333
+2028 37233.3333 21650.0000
+2029 37233.3333 21666.6667
+2030 37233.3333 21800.0000
+2031 37233.3333 21816.6667
+2032 37233.3333 21850.0000
+2033 37233.3333 21866.6667
+2034 37233.3333 21900.0000
+2035 37233.3333 21933.3333
+2036 37233.3333 21966.6667
+2037 37233.3333 21983.3333
+2038 37233.3333 22016.6667
+2039 37233.3333 22033.3333
+2040 37233.3333 22133.3333
+2041 37233.3333 22166.6667
+2042 37233.3333 22183.3333
+2043 37233.3333 22200.0000
+2044 37233.3333 22250.0000
+2045 37233.3333 22266.6667
+2046 37233.3333 22283.3333
+2047 37233.3333 22500.0000
+2048 37233.3333 22533.3333
+2049 37233.3333 22850.0000
+2050 37250.0000 21666.6667
+2051 37250.0000 21683.3333
+2052 37250.0000 21700.0000
+2053 37250.0000 21716.6667
+2054 37250.0000 21733.3333
+2055 37250.0000 21783.3333
+2056 37250.0000 21816.6667
+2057 37250.0000 21833.3333
+2058 37250.0000 21966.6667
+2059 37250.0000 21983.3333
+2060 37250.0000 22000.0000
+2061 37250.0000 22016.6667
+2062 37250.0000 22116.6667
+2063 37250.0000 22183.3333
+2064 37250.0000 22333.3333
+2065 37250.0000 22550.0000
+2066 37250.0000 22833.3333
+2067 37250.0000 22866.6667
+2068 37250.0000 23150.0000
+2069 37266.6667 21750.0000
+2070 37266.6667 21766.6667
+2071 37266.6667 21866.6667
+2072 37266.6667 21900.0000
+2073 37266.6667 21933.3333
+2074 37266.6667 21950.0000
+2075 37266.6667 21966.6667
+2076 37266.6667 21983.3333
+2077 37266.6667 22000.0000
+2078 37266.6667 22016.6667
+2079 37266.6667 22166.6667
+2080 37266.6667 22250.0000
+2081 37266.6667 22316.6667
+2082 37266.6667 22533.3333
+2083 37266.6667 22650.0000
+2084 37266.6667 22683.3333
+2085 37266.6667 23150.0000
+2086 37283.3333 21700.0000
+2087 37283.3333 21716.6667
+2088 37283.3333 21816.6667
+2089 37283.3333 21850.0000
+2090 37283.3333 21900.0000
+2091 37283.3333 21916.6667
+2092 37283.3333 21933.3333
+2093 37283.3333 21966.6667
+2094 37283.3333 22050.0000
+2095 37283.3333 22066.6667
+2096 37283.3333 22150.0000
+2097 37283.3333 22166.6667
+2098 37283.3333 22200.0000
+2099 37283.3333 22350.0000
+2100 37283.3333 22366.6667
+2101 37283.3333 22650.0000
+2102 37283.3333 26766.6667
+2103 37300.0000 21716.6667
+2104 37300.0000 21750.0000
+2105 37300.0000 21766.6667
+2106 37300.0000 21783.3333
+2107 37300.0000 21816.6667
+2108 37300.0000 21833.3333
+2109 37300.0000 21850.0000
+2110 37300.0000 21883.3333
+2111 37300.0000 21916.6667
+2112 37300.0000 21950.0000
+2113 37300.0000 21966.6667
+2114 37300.0000 21983.3333
+2115 37300.0000 22000.0000
+2116 37300.0000 22050.0000
+2117 37300.0000 22116.6667
+2118 37300.0000 22150.0000
+2119 37300.0000 22250.0000
+2120 37300.0000 22500.0000
+2121 37300.0000 22766.6667
+2122 37300.0000 23183.3333
+2123 37300.0000 26516.6667
+2124 37316.6667 21733.3333
+2125 37316.6667 21816.6667
+2126 37316.6667 21833.3333
+2127 37316.6667 21850.0000
+2128 37316.6667 21866.6667
+2129 37316.6667 21883.3333
+2130 37316.6667 21916.6667
+2131 37316.6667 21933.3333
+2132 37316.6667 21950.0000
+2133 37316.6667 22000.0000
+2134 37316.6667 22066.6667
+2135 37316.6667 22083.3333
+2136 37316.6667 22133.3333
+2137 37316.6667 22150.0000
+2138 37316.6667 22183.3333
+2139 37316.6667 22233.3333
+2140 37316.6667 22283.3333
+2141 37316.6667 22316.6667
+2142 37316.6667 22650.0000
+2143 37316.6667 23150.0000
+2144 37316.6667 23166.6667
+2145 37316.6667 23416.6667
+2146 37316.6667 26533.3333
+2147 37333.3333 21766.6667
+2148 37333.3333 21833.3333
+2149 37333.3333 21866.6667
+2150 37333.3333 21883.3333
+2151 37333.3333 21900.0000
+2152 37333.3333 21933.3333
+2153 37333.3333 21950.0000
+2154 37333.3333 21966.6667
+2155 37333.3333 22033.3333
+2156 37333.3333 22116.6667
+2157 37333.3333 22133.3333
+2158 37333.3333 22200.0000
+2159 37333.3333 22233.3333
+2160 37333.3333 22300.0000
+2161 37333.3333 22316.6667
+2162 37333.3333 22500.0000
+2163 37333.3333 22550.0000
+2164 37333.3333 22683.3333
+2165 37333.3333 22700.0000
+2166 37333.3333 22750.0000
+2167 37333.3333 23150.0000
+2168 37333.3333 23500.0000
+2169 37350.0000 21700.0000
+2170 37350.0000 21733.3333
+2171 37350.0000 21750.0000
+2172 37350.0000 21850.0000
+2173 37350.0000 21866.6667
+2174 37350.0000 21916.6667
+2175 37350.0000 21933.3333
+2176 37350.0000 21950.0000
+2177 37350.0000 21966.6667
+2178 37350.0000 22066.6667
+2179 37350.0000 22150.0000
+2180 37350.0000 22183.3333
+2181 37350.0000 22400.0000
+2182 37350.0000 22433.3333
+2183 37350.0000 22550.0000
+2184 37350.0000 22583.3333
+2185 37350.0000 22600.0000
+2186 37350.0000 22666.6667
+2187 37350.0000 22733.3333
+2188 37350.0000 22766.6667
+2189 37350.0000 23316.6667
+2190 37350.0000 23350.0000
+2191 37350.0000 23450.0000
+2192 37350.0000 23466.6667
+2193 37350.0000 26566.6667
+2194 37366.6667 21700.0000
+2195 37366.6667 21750.0000
+2196 37366.6667 21816.6667
+2197 37366.6667 21900.0000
+2198 37366.6667 21983.3333
+2199 37366.6667 22016.6667
+2200 37366.6667 22050.0000
+2201 37366.6667 22100.0000
+2202 37366.6667 22133.3333
+2203 37366.6667 22150.0000
+2204 37366.6667 22216.6667
+2205 37366.6667 22266.6667
+2206 37366.6667 22283.3333
+2207 37366.6667 22300.0000
+2208 37366.6667 22333.3333
+2209 37366.6667 22383.3333
+2210 37366.6667 22400.0000
+2211 37366.6667 22466.6667
+2212 37366.6667 22500.0000
+2213 37366.6667 22533.3333
+2214 37366.6667 22550.0000
+2215 37366.6667 22633.3333
+2216 37366.6667 22716.6667
+2217 37366.6667 22750.0000
+2218 37366.6667 23216.6667
+2219 37366.6667 24883.3333
+2220 37383.3333 21750.0000
+2221 37383.3333 21766.6667
+2222 37383.3333 21816.6667
+2223 37383.3333 21833.3333
+2224 37383.3333 21850.0000
+2225 37383.3333 21883.3333
+2226 37383.3333 21916.6667
+2227 37383.3333 22033.3333
+2228 37383.3333 22083.3333
+2229 37383.3333 22116.6667
+2230 37383.3333 22133.3333
+2231 37383.3333 22166.6667
+2232 37383.3333 22200.0000
+2233 37383.3333 22233.3333
+2234 37383.3333 22300.0000
+2235 37383.3333 22450.0000
+2236 37383.3333 22500.0000
+2237 37383.3333 22566.6667
+2238 37383.3333 22650.0000
+2239 37383.3333 22683.3333
+2240 37383.3333 22733.3333
+2241 37383.3333 23150.0000
+2242 37383.3333 23250.0000
+2243 37383.3333 24400.0000
+2244 37383.3333 24433.3333
+2245 37383.3333 24883.3333
+2246 37383.3333 24900.0000
+2247 37383.3333 24916.6667
+2248 37400.0000 21683.3333
+2249 37400.0000 21716.6667
+2250 37400.0000 21733.3333
+2251 37400.0000 21816.6667
+2252 37400.0000 21850.0000
+2253 37400.0000 21883.3333
+2254 37400.0000 21916.6667
+2255 37400.0000 21933.3333
+2256 37400.0000 22016.6667
+2257 37400.0000 22100.0000
+2258 37400.0000 22133.3333
+2259 37400.0000 22183.3333
+2260 37400.0000 22216.6667
+2261 37400.0000 22250.0000
+2262 37400.0000 22316.6667
+2263 37400.0000 22600.0000
+2264 37400.0000 22616.6667
+2265 37400.0000 22650.0000
+2266 37400.0000 22716.6667
+2267 37400.0000 22733.3333
+2268 37400.0000 23233.3333
+2269 37400.0000 24400.0000
+2270 37400.0000 24450.0000
+2271 37400.0000 24883.3333
+2272 37400.0000 24900.0000
+2273 37400.0000 24916.6667
+2274 37400.0000 24933.3333
+2275 37400.0000 24950.0000
+2276 37400.0000 25266.6667
+2277 37416.6667 21666.6667
+2278 37416.6667 21700.0000
+2279 37416.6667 21850.0000
+2280 37416.6667 21866.6667
+2281 37416.6667 21950.0000
+2282 37416.6667 21966.6667
+2283 37416.6667 22000.0000
+2284 37416.6667 22033.3333
+2285 37416.6667 22050.0000
+2286 37416.6667 22083.3333
+2287 37416.6667 22100.0000
+2288 37416.6667 22116.6667
+2289 37416.6667 22166.6667
+2290 37416.6667 22233.3333
+2291 37416.6667 22266.6667
+2292 37416.6667 22366.6667
+2293 37416.6667 22400.0000
+2294 37416.6667 22466.6667
+2295 37416.6667 22566.6667
+2296 37416.6667 22583.3333
+2297 37416.6667 22600.0000
+2298 37416.6667 22766.6667
+2299 37416.6667 23133.3333
+2300 37416.6667 23150.0000
+2301 37416.6667 23316.6667
+2302 37416.6667 23350.0000
+2303 37416.6667 23383.3333
+2304 37416.6667 23400.0000
+2305 37416.6667 23466.6667
+2306 37416.6667 24433.3333
+2307 37416.6667 24883.3333
+2308 37416.6667 24900.0000
+2309 37416.6667 24916.6667
+2310 37416.6667 24933.3333
+2311 37416.6667 24950.0000
+2312 37416.6667 24966.6667
+2313 37433.3333 21666.6667
+2314 37433.3333 21716.6667
+2315 37433.3333 21733.3333
+2316 37433.3333 21766.6667
+2317 37433.3333 21833.3333
+2318 37433.3333 21950.0000
+2319 37433.3333 22000.0000
+2320 37433.3333 22050.0000
+2321 37433.3333 22116.6667
+2322 37433.3333 22300.0000
+2323 37433.3333 22416.6667
+2324 37433.3333 22533.3333
+2325 37433.3333 22616.6667
+2326 37433.3333 22633.3333
+2327 37433.3333 22650.0000
+2328 37433.3333 22683.3333
+2329 37433.3333 22733.3333
+2330 37433.3333 23183.3333
+2331 37433.3333 23300.0000
+2332 37433.3333 23400.0000
+2333 37433.3333 23466.6667
+2334 37433.3333 24900.0000
+2335 37433.3333 24916.6667
+2336 37433.3333 24950.0000
+2337 37450.0000 21683.3333
+2338 37450.0000 21733.3333
+2339 37450.0000 21750.0000
+2340 37450.0000 21866.6667
+2341 37450.0000 21916.6667
+2342 37450.0000 21950.0000
+2343 37450.0000 22033.3333
+2344 37450.0000 22066.6667
+2345 37450.0000 22100.0000
+2346 37450.0000 22116.6667
+2347 37450.0000 22150.0000
+2348 37450.0000 22166.6667
+2349 37450.0000 22250.0000
+2350 37450.0000 22366.6667
+2351 37450.0000 22400.0000
+2352 37450.0000 22416.6667
+2353 37450.0000 22433.3333
+2354 37450.0000 22450.0000
+2355 37450.0000 22466.6667
+2356 37450.0000 22566.6667
+2357 37450.0000 22583.3333
+2358 37450.0000 22616.6667
+2359 37450.0000 23233.3333
+2360 37450.0000 23266.6667
+2361 37450.0000 23283.3333
+2362 37450.0000 23483.3333
+2363 37450.0000 24416.6667
+2364 37450.0000 24900.0000
+2365 37450.0000 24933.3333
+2366 37450.0000 25333.3333
+2367 37450.0000 25400.0000
+2368 37466.6667 21650.0000
+2369 37466.6667 21700.0000
+2370 37466.6667 21800.0000
+2371 37466.6667 21966.6667
+2372 37466.6667 22000.0000
+2373 37466.6667 22083.3333
+2374 37466.6667 22116.6667
+2375 37466.6667 22166.6667
+2376 37466.6667 22200.0000
+2377 37466.6667 22333.3333
+2378 37466.6667 22366.6667
+2379 37466.6667 22383.3333
+2380 37466.6667 22400.0000
+2381 37466.6667 22416.6667
+2382 37466.6667 22433.3333
+2383 37466.6667 22450.0000
+2384 37466.6667 22516.6667
+2385 37466.6667 22616.6667
+2386 37466.6667 23166.6667
+2387 37466.6667 24916.6667
+2388 37466.6667 24933.3333
+2389 37483.3333 21650.0000
+2390 37483.3333 21683.3333
+2391 37483.3333 21716.6667
+2392 37483.3333 21733.3333
+2393 37483.3333 21816.6667
+2394 37483.3333 21833.3333
+2395 37483.3333 21900.0000
+2396 37483.3333 21933.3333
+2397 37483.3333 22016.6667
+2398 37483.3333 22033.3333
+2399 37483.3333 22083.3333
+2400 37483.3333 22116.6667
+2401 37483.3333 22133.3333
+2402 37483.3333 22150.0000
+2403 37483.3333 22283.3333
+2404 37483.3333 22366.6667
+2405 37483.3333 22416.6667
+2406 37483.3333 22433.3333
+2407 37483.3333 22466.6667
+2408 37483.3333 22733.3333
+2409 37483.3333 23000.0000
+2410 37483.3333 23016.6667
+2411 37483.3333 23266.6667
+2412 37483.3333 24916.6667
+2413 37483.3333 24933.3333
+2414 37500.0000 21650.0000
+2415 37500.0000 21700.0000
+2416 37500.0000 21766.6667
+2417 37500.0000 21800.0000
+2418 37500.0000 21850.0000
+2419 37500.0000 21866.6667
+2420 37500.0000 21916.6667
+2421 37500.0000 22100.0000
+2422 37500.0000 22116.6667
+2423 37500.0000 22166.6667
+2424 37500.0000 22450.0000
+2425 37500.0000 22466.6667
+2426 37500.0000 22483.3333
+2427 37500.0000 23016.6667
+2428 37500.0000 23033.3333
+2429 37500.0000 23050.0000
+2430 37500.0000 23066.6667
+2431 37500.0000 23183.3333
+2432 37500.0000 23366.6667
+2433 37500.0000 23383.3333
+2434 37500.0000 23450.0000
+2435 37516.6667 21600.0000
+2436 37516.6667 21650.0000
+2437 37516.6667 21733.3333
+2438 37516.6667 21750.0000
+2439 37516.6667 21766.6667
+2440 37516.6667 21883.3333
+2441 37516.6667 21950.0000
+2442 37516.6667 22066.6667
+2443 37516.6667 22116.6667
+2444 37516.6667 22233.3333
+2445 37516.6667 22300.0000
+2446 37516.6667 22316.6667
+2447 37516.6667 22366.6667
+2448 37516.6667 22383.3333
+2449 37516.6667 22416.6667
+2450 37516.6667 22433.3333
+2451 37516.6667 22450.0000
+2452 37516.6667 22583.3333
+2453 37516.6667 22700.0000
+2454 37516.6667 22733.3333
+2455 37516.6667 22850.0000
+2456 37516.6667 23083.3333
+2457 37516.6667 23100.0000
+2458 37516.6667 23116.6667
+2459 37516.6667 23200.0000
+2460 37516.6667 23283.3333
+2461 37516.6667 23300.0000
+2462 37516.6667 23366.6667
+2463 37516.6667 23383.3333
+2464 37516.6667 26016.6667
+2465 37533.3333 21700.0000
+2466 37533.3333 21733.3333
+2467 37533.3333 21750.0000
+2468 37533.3333 21800.0000
+2469 37533.3333 21816.6667
+2470 37533.3333 21850.0000
+2471 37533.3333 21916.6667
+2472 37533.3333 21950.0000
+2473 37533.3333 21983.3333
+2474 37533.3333 22016.6667
+2475 37533.3333 22266.6667
+2476 37533.3333 22283.3333
+2477 37533.3333 22316.6667
+2478 37533.3333 22350.0000
+2479 37533.3333 22416.6667
+2480 37533.3333 22433.3333
+2481 37533.3333 22700.0000
+2482 37533.3333 22716.6667
+2483 37533.3333 22883.3333
+2484 37533.3333 22916.6667
+2485 37533.3333 22966.6667
+2486 37533.3333 23083.3333
+2487 37533.3333 23133.3333
+2488 37533.3333 23150.0000
+2489 37533.3333 23183.3333
+2490 37533.3333 23200.0000
+2491 37533.3333 23233.3333
+2492 37533.3333 23283.3333
+2493 37533.3333 23350.0000
+2494 37533.3333 25166.6667
+2495 37533.3333 26000.0000
+2496 37550.0000 21600.0000
+2497 37550.0000 21683.3333
+2498 37550.0000 21783.3333
+2499 37550.0000 21816.6667
+2500 37550.0000 21866.6667
+2501 37550.0000 21916.6667
+2502 37550.0000 21933.3333
+2503 37550.0000 21983.3333
+2504 37550.0000 22083.3333
+2505 37550.0000 22216.6667
+2506 37550.0000 22283.3333
+2507 37550.0000 22366.6667
+2508 37550.0000 22416.6667
+2509 37550.0000 22716.6667
+2510 37550.0000 22850.0000
+2511 37550.0000 22866.6667
+2512 37550.0000 22883.3333
+2513 37550.0000 22916.6667
+2514 37550.0000 22983.3333
+2515 37550.0000 23116.6667
+2516 37550.0000 23166.6667
+2517 37550.0000 23200.0000
+2518 37550.0000 23366.6667
+2519 37550.0000 26000.0000
+2520 37550.0000 26016.6667
+2521 37566.6667 21583.3333
+2522 37566.6667 21633.3333
+2523 37566.6667 21700.0000
+2524 37566.6667 21750.0000
+2525 37566.6667 21783.3333
+2526 37566.6667 21950.0000
+2527 37566.6667 22033.3333
+2528 37566.6667 22383.3333
+2529 37566.6667 22466.6667
+2530 37566.6667 22683.3333
+2531 37566.6667 22800.0000
+2532 37566.6667 22833.3333
+2533 37566.6667 23066.6667
+2534 37566.6667 23150.0000
+2535 37566.6667 23250.0000
+2536 37566.6667 25150.0000
+2537 37566.6667 25166.6667
+2538 37566.6667 25183.3333
+2539 37566.6667 25200.0000
+2540 37566.6667 26000.0000
+2541 37566.6667 26116.6667
+2542 37583.3333 21566.6667
+2543 37583.3333 21616.6667
+2544 37583.3333 21666.6667
+2545 37583.3333 21733.3333
+2546 37583.3333 21816.6667
+2547 37583.3333 21866.6667
+2548 37583.3333 21916.6667
+2549 37583.3333 21950.0000
+2550 37583.3333 21983.3333
+2551 37583.3333 22016.6667
+2552 37583.3333 22083.3333
+2553 37583.3333 22233.3333
+2554 37583.3333 22283.3333
+2555 37583.3333 22366.6667
+2556 37583.3333 22533.3333
+2557 37583.3333 22566.6667
+2558 37583.3333 22750.0000
+2559 37583.3333 22883.3333
+2560 37583.3333 23166.6667
+2561 37583.3333 23233.3333
+2562 37583.3333 23383.3333
+2563 37583.3333 25150.0000
+2564 37583.3333 25166.6667
+2565 37583.3333 25183.3333
+2566 37583.3333 25200.0000
+2567 37583.3333 25216.6667
+2568 37583.3333 26016.6667
+2569 37583.3333 26233.3333
+2570 37600.0000 21550.0000
+2571 37600.0000 21583.3333
+2572 37600.0000 21683.3333
+2573 37600.0000 21750.0000
+2574 37600.0000 21800.0000
+2575 37600.0000 21816.6667
+2576 37600.0000 21866.6667
+2577 37600.0000 21883.3333
+2578 37600.0000 21900.0000
+2579 37600.0000 21916.6667
+2580 37600.0000 21950.0000
+2581 37600.0000 21983.3333
+2582 37600.0000 22033.3333
+2583 37600.0000 22050.0000
+2584 37600.0000 22400.0000
+2585 37600.0000 22516.6667
+2586 37600.0000 22683.3333
+2587 37600.0000 22800.0000
+2588 37600.0000 22816.6667
+2589 37600.0000 22833.3333
+2590 37600.0000 22950.0000
+2591 37600.0000 22966.6667
+2592 37600.0000 22983.3333
+2593 37600.0000 23050.0000
+2594 37600.0000 23333.3333
+2595 37600.0000 23350.0000
+2596 37600.0000 23366.6667
+2597 37600.0000 24283.3333
+2598 37600.0000 24300.0000
+2599 37600.0000 24333.3333
+2600 37600.0000 25083.3333
+2601 37600.0000 25133.3333
+2602 37600.0000 25150.0000
+2603 37600.0000 25166.6667
+2604 37600.0000 25183.3333
+2605 37600.0000 26250.0000
+2606 37616.6667 21516.6667
+2607 37616.6667 21600.0000
+2608 37616.6667 21633.3333
+2609 37616.6667 21650.0000
+2610 37616.6667 21700.0000
+2611 37616.6667 21716.6667
+2612 37616.6667 21766.6667
+2613 37616.6667 21800.0000
+2614 37616.6667 21833.3333
+2615 37616.6667 21866.6667
+2616 37616.6667 21900.0000
+2617 37616.6667 21916.6667
+2618 37616.6667 21933.3333
+2619 37616.6667 22100.0000
+2620 37616.6667 22216.6667
+2621 37616.6667 22333.3333
+2622 37616.6667 22433.3333
+2623 37616.6667 22466.6667
+2624 37616.6667 22550.0000
+2625 37616.6667 22600.0000
+2626 37616.6667 22666.6667
+2627 37616.6667 22766.6667
+2628 37616.6667 22800.0000
+2629 37616.6667 22850.0000
+2630 37616.6667 22983.3333
+2631 37616.6667 23000.0000
+2632 37616.6667 23033.3333
+2633 37616.6667 23333.3333
+2634 37616.6667 23350.0000
+2635 37616.6667 23400.0000
+2636 37616.6667 24283.3333
+2637 37616.6667 25050.0000
+2638 37616.6667 25116.6667
+2639 37616.6667 25133.3333
+2640 37616.6667 26183.3333
+2641 37628.6111 26791.3889
+2642 37633.3333 21500.0000
+2643 37633.3333 21683.3333
+2644 37633.3333 21750.0000
+2645 37633.3333 21833.3333
+2646 37633.3333 21850.0000
+2647 37633.3333 21866.6667
+2648 37633.3333 21883.3333
+2649 37633.3333 21900.0000
+2650 37633.3333 21933.3333
+2651 37633.3333 21950.0000
+2652 37633.3333 21983.3333
+2653 37633.3333 22083.3333
+2654 37633.3333 22150.0000
+2655 37633.3333 22166.6667
+2656 37633.3333 22300.0000
+2657 37633.3333 22533.3333
+2658 37633.3333 22683.3333
+2659 37633.3333 22733.3333
+2660 37633.3333 22766.6667
+2661 37633.3333 22783.3333
+2662 37633.3333 22800.0000
+2663 37633.3333 22816.6667
+2664 37633.3333 22933.3333
+2665 37633.3333 23066.6667
+2666 37633.3333 23083.3333
+2667 37633.3333 23116.6667
+2668 37633.3333 23150.0000
+2669 37633.3333 23366.6667
+2670 37633.3333 24316.6667
+2671 37633.3333 24350.0000
+2672 37633.3333 24383.3333
+2673 37633.3333 25033.3333
+2674 37633.3333 25050.0000
+2675 37633.3333 26083.3333
+2676 37650.0000 21316.6667
+2677 37650.0000 21433.3333
+2678 37650.0000 21500.0000
+2679 37650.0000 21533.3333
+2680 37650.0000 21616.6667
+2681 37650.0000 21633.3333
+2682 37650.0000 21650.0000
+2683 37650.0000 21683.3333
+2684 37650.0000 21700.0000
+2685 37650.0000 21733.3333
+2686 37650.0000 21750.0000
+2687 37650.0000 21850.0000
+2688 37650.0000 21900.0000
+2689 37650.0000 21933.3333
+2690 37650.0000 21950.0000
+2691 37650.0000 21983.3333
+2692 37650.0000 22333.3333
+2693 37650.0000 22416.6667
+2694 37650.0000 22766.6667
+2695 37650.0000 22800.0000
+2696 37650.0000 22816.6667
+2697 37650.0000 22833.3333
+2698 37650.0000 23066.6667
+2699 37650.0000 23083.3333
+2700 37650.0000 24100.0000
+2701 37650.0000 24300.0000
+2702 37650.0000 24383.3333
+2703 37650.0000 25016.6667
+2704 37658.8889 26780.8333
+2705 37663.8889 26882.5000
+2706 37666.6667 20816.6667
+2707 37666.6667 21316.6667
+2708 37666.6667 21533.3333
+2709 37666.6667 21550.0000
+2710 37666.6667 21616.6667
+2711 37666.6667 21633.3333
+2712 37666.6667 21783.3333
+2713 37666.6667 21816.6667
+2714 37666.6667 21833.3333
+2715 37666.6667 21866.6667
+2716 37666.6667 21916.6667
+2717 37666.6667 21933.3333
+2718 37666.6667 22183.3333
+2719 37666.6667 22366.6667
+2720 37666.6667 22450.0000
+2721 37666.6667 22483.3333
+2722 37666.6667 22583.3333
+2723 37666.6667 22666.6667
+2724 37666.6667 22750.0000
+2725 37666.6667 22766.6667
+2726 37666.6667 22783.3333
+2727 37666.6667 22816.6667
+2728 37666.6667 22850.0000
+2729 37666.6667 23133.3333
+2730 37666.6667 23983.3333
+2731 37666.6667 24016.6667
+2732 37666.6667 24033.3333
+2733 37666.6667 24050.0000
+2734 37666.6667 24316.6667
+2735 37666.6667 24333.3333
+2736 37666.6667 24350.0000
+2737 37672.7778 26831.9444
+2738 37675.5556 26769.1667
+2739 37678.6111 26801.3889
+2740 37679.7222 26861.1111
+2741 37683.3333 21316.6667
+2742 37683.3333 21333.3333
+2743 37683.3333 21366.6667
+2744 37683.3333 21383.3333
+2745 37683.3333 21450.0000
+2746 37683.3333 21483.3333
+2747 37683.3333 21500.0000
+2748 37683.3333 21516.6667
+2749 37683.3333 21550.0000
+2750 37683.3333 21583.3333
+2751 37683.3333 21616.6667
+2752 37683.3333 21650.0000
+2753 37683.3333 21683.3333
+2754 37683.3333 21783.3333
+2755 37683.3333 21833.3333
+2756 37683.3333 21866.6667
+2757 37683.3333 21916.6667
+2758 37683.3333 21966.6667
+2759 37683.3333 22033.3333
+2760 37683.3333 22133.3333
+2761 37683.3333 22183.3333
+2762 37683.3333 22300.0000
+2763 37683.3333 22516.6667
+2764 37683.3333 22616.6667
+2765 37683.3333 22716.6667
+2766 37683.3333 22750.0000
+2767 37683.3333 22816.6667
+2768 37683.3333 22833.3333
+2769 37683.3333 22966.6667
+2770 37683.3333 23150.0000
+2771 37683.3333 23350.0000
+2772 37683.3333 23450.0000
+2773 37683.3333 23483.3333
+2774 37684.7222 26759.1667
+2775 37686.6667 26918.8889
+2776 37691.9444 26948.3333
+2777 37692.5000 26774.1667
+2778 37692.7778 26588.0556
+2779 37698.3333 26618.6111
+2780 37699.4444 26746.1111
+2781 37700.0000 21333.3333
+2782 37700.0000 21416.6667
+2783 37700.0000 21466.6667
+2784 37700.0000 21516.6667
+2785 37700.0000 21566.6667
+2786 37700.0000 21783.3333
+2787 37700.0000 21916.6667
+2788 37700.0000 21950.0000
+2789 37700.0000 21966.6667
+2790 37700.0000 22050.0000
+2791 37700.0000 22133.3333
+2792 37700.0000 22433.3333
+2793 37700.0000 22483.3333
+2794 37700.0000 22550.0000
+2795 37700.0000 22750.0000
+2796 37700.0000 23066.6667
+2797 37700.0000 23366.6667
+2798 37700.0000 23500.0000
+2799 37700.0000 23516.6667
+2800 37700.0000 24116.6667
+2801 37703.6111 26905.5556
+2802 37704.7222 26839.4444
+2803 37706.6667 26771.3889
+2804 37707.7778 26669.1667
+2805 37708.6111 27018.0556
+2806 37709.7222 26749.7222
+2807 37709.7222 27046.9444
+2808 37710.2778 26685.8333
+2809 37710.8333 26700.0000
+2810 37711.6667 26804.1667
+2811 37713.6111 26975.5556
+2812 37714.1667 27059.1667
+2813 37716.1111 26782.2222
+2814 37716.6667 20783.3333
+2815 37716.6667 20833.3333
+2816 37716.6667 20983.3333
+2817 37716.6667 21333.3333
+2818 37716.6667 21350.0000
+2819 37716.6667 21416.6667
+2820 37716.6667 21433.3333
+2821 37716.6667 21483.3333
+2822 37716.6667 21566.6667
+2823 37716.6667 21583.3333
+2824 37716.6667 21616.6667
+2825 37716.6667 21650.0000
+2826 37716.6667 21716.6667
+2827 37716.6667 21833.3333
+2828 37716.6667 21950.0000
+2829 37716.6667 21983.3333
+2830 37716.6667 22100.0000
+2831 37716.6667 22150.0000
+2832 37716.6667 22250.0000
+2833 37716.6667 22316.6667
+2834 37716.6667 22350.0000
+2835 37716.6667 22600.0000
+2836 37716.6667 22650.0000
+2837 37716.6667 22750.0000
+2838 37716.6667 22833.3333
+2839 37716.6667 22883.3333
+2840 37716.6667 23350.0000
+2841 37716.6667 23450.0000
+2842 37716.6667 23466.6667
+2843 37716.6667 23483.3333
+2844 37716.6667 23500.0000
+2845 37716.6667 23516.6667
+2846 37716.6667 23950.0000
+2847 37716.6667 24050.0000
+2848 37716.6667 24116.6667
+2849 37718.0556 26861.9444
+2850 37719.1667 27000.2778
+2851 37726.3889 26690.0000
+2852 37727.2222 26822.2222
+2853 37728.6111 26908.3333
+2854 37730.8333 26829.4444
+2855 37733.3333 20816.6667
+2856 37733.3333 20833.3333
+2857 37733.3333 20916.6667
+2858 37733.3333 21350.0000
+2859 37733.3333 21366.6667
+2860 37733.3333 21383.3333
+2861 37733.3333 21400.0000
+2862 37733.3333 21416.6667
+2863 37733.3333 21466.6667
+2864 37733.3333 21500.0000
+2865 37733.3333 21516.6667
+2866 37733.3333 21533.3333
+2867 37733.3333 21550.0000
+2868 37733.3333 21666.6667
+2869 37733.3333 21700.0000
+2870 37733.3333 21783.3333
+2871 37733.3333 21933.3333
+2872 37733.3333 21950.0000
+2873 37733.3333 21983.3333
+2874 37733.3333 22016.6667
+2875 37733.3333 22200.0000
+2876 37733.3333 22283.3333
+2877 37733.3333 22300.0000
+2878 37733.3333 22500.0000
+2879 37733.3333 22516.6667
+2880 37733.3333 22533.3333
+2881 37733.3333 22683.3333
+2882 37733.3333 22716.6667
+2883 37733.3333 23466.6667
+2884 37733.3333 23483.3333
+2885 37733.3333 23516.6667
+2886 37733.3333 23950.0000
+2887 37733.3333 24000.0000
+2888 37733.3333 24016.6667
+2889 37733.3333 24050.0000
+2890 37733.3333 26583.3333
+2891 37735.2778 26945.0000
+2892 37738.0556 27000.5556
+2893 37738.3333 26745.2778
+2894 37741.3889 26715.5556
+2895 37747.2222 26728.6111
+2896 37750.0000 20783.3333
+2897 37750.0000 20816.6667
+2898 37750.0000 20950.0000
+2899 37750.0000 21316.6667
+2900 37750.0000 21333.3333
+2901 37750.0000 21366.6667
+2902 37750.0000 21433.3333
+2903 37750.0000 21450.0000
+2904 37750.0000 21466.6667
+2905 37750.0000 21516.6667
+2906 37750.0000 21550.0000
+2907 37750.0000 21683.3333
+2908 37750.0000 21883.3333
+2909 37750.0000 21900.0000
+2910 37750.0000 22000.0000
+2911 37750.0000 22016.6667
+2912 37750.0000 22050.0000
+2913 37750.0000 22083.3333
+2914 37750.0000 22100.0000
+2915 37750.0000 22183.3333
+2916 37750.0000 22416.6667
+2917 37750.0000 22483.3333
+2918 37750.0000 22833.3333
+2919 37750.0000 22883.3333
+2920 37750.0000 23000.0000
+2921 37750.0000 23433.3333
+2922 37750.0000 23450.0000
+2923 37750.0000 23483.3333
+2924 37750.0000 23516.6667
+2925 37750.0000 23533.3333
+2926 37750.0000 24916.6667
+2927 37750.0000 24933.3333
+2928 37750.0000 24950.0000
+2929 37750.0000 26983.3333
+2930 37750.2778 26716.1111
+2931 37751.1111 27005.5556
+2932 37751.6667 26592.2222
+2933 37754.4444 26677.2222
+2934 37755.2778 26738.3333
+2935 37755.8333 26715.8333
+2936 37757.2222 26607.2222
+2937 37757.2222 26976.9444
+2938 37758.0556 27024.4444
+2939 37758.8889 26946.3889
+2940 37759.1667 26660.0000
+2941 37761.3889 27009.7222
+2942 37766.6667 20800.0000
+2943 37766.6667 20816.6667
+2944 37766.6667 20866.6667
+2945 37766.6667 20916.6667
+2946 37766.6667 21333.3333
+2947 37766.6667 21500.0000
+2948 37766.6667 21616.6667
+2949 37766.6667 21666.6667
+2950 37766.6667 21833.3333
+2951 37766.6667 21866.6667
+2952 37766.6667 22016.6667
+2953 37766.6667 22083.3333
+2954 37766.6667 22116.6667
+2955 37766.6667 22150.0000
+2956 37766.6667 22183.3333
+2957 37766.6667 22216.6667
+2958 37766.6667 22250.0000
+2959 37766.6667 22383.3333
+2960 37766.6667 22483.3333
+2961 37766.6667 22566.6667
+2962 37766.6667 22966.6667
+2963 37766.6667 23133.3333
+2964 37766.6667 23433.3333
+2965 37766.6667 23483.3333
+2966 37766.6667 23516.6667
+2967 37766.6667 23533.3333
+2968 37766.6667 23966.6667
+2969 37766.6667 24033.3333
+2970 37766.6667 24916.6667
+2971 37766.6667 24933.3333
+2972 37766.6667 24950.0000
+2973 37767.7778 26966.9444
+2974 37769.7222 26919.7222
+2975 37772.2222 26658.8889
+2976 37773.3333 26685.8333
+2977 37776.3889 26893.8889
+2978 37778.0556 26673.3333
+2979 37779.1667 26993.3333
+2980 37779.4444 26751.6667
+2981 37783.3333 20683.3333
+2982 37783.3333 20716.6667
+2983 37783.3333 20783.3333
+2984 37783.3333 20800.0000
+2985 37783.3333 20833.3333
+2986 37783.3333 20850.0000
+2987 37783.3333 20866.6667
+2988 37783.3333 20900.0000
+2989 37783.3333 21300.0000
+2990 37783.3333 21316.6667
+2991 37783.3333 21400.0000
+2992 37783.3333 21466.6667
+2993 37783.3333 21566.6667
+2994 37783.3333 21633.3333
+2995 37783.3333 21683.3333
+2996 37783.3333 21716.6667
+2997 37783.3333 21866.6667
+2998 37783.3333 21933.3333
+2999 37783.3333 22033.3333
+3000 37783.3333 22066.6667
+3001 37783.3333 22116.6667
+3002 37783.3333 22150.0000
+3003 37783.3333 22283.3333
+3004 37783.3333 22316.6667
+3005 37783.3333 22433.3333
+3006 37783.3333 22866.6667
+3007 37783.3333 23900.0000
+3008 37783.3333 23916.6667
+3009 37783.3333 23950.0000
+3010 37783.3333 24066.6667
+3011 37783.3333 24083.3333
+3012 37783.3333 24883.3333
+3013 37783.3333 24933.3333
+3014 37783.3333 24950.0000
+3015 37783.3333 26850.0000
+3016 37784.4444 26828.6111
+3017 37789.4444 26666.3889
+3018 37790.2778 26683.8889
+3019 37790.2778 26704.4444
+3020 37792.2222 26828.8889
+3021 37792.5000 26696.6667
+3022 37796.1111 26812.5000
+3023 37797.5000 26859.1667
+3024 37798.3333 26738.3333
+3025 37798.6111 26706.1111
+3026 37799.1667 26750.8333
+3027 37800.0000 20683.3333
+3028 37800.0000 20733.3333
+3029 37800.0000 20766.6667
+3030 37800.0000 20783.3333
+3031 37800.0000 20800.0000
+3032 37800.0000 20833.3333
+3033 37800.0000 20850.0000
+3034 37800.0000 20866.6667
+3035 37800.0000 21300.0000
+3036 37800.0000 21350.0000
+3037 37800.0000 21383.3333
+3038 37800.0000 21433.3333
+3039 37800.0000 21466.6667
+3040 37800.0000 21533.3333
+3041 37800.0000 21566.6667
+3042 37800.0000 21583.3333
+3043 37800.0000 21616.6667
+3044 37800.0000 21633.3333
+3045 37800.0000 21716.6667
+3046 37800.0000 21750.0000
+3047 37800.0000 21816.6667
+3048 37800.0000 21900.0000
+3049 37800.0000 21950.0000
+3050 37800.0000 22000.0000
+3051 37800.0000 22016.6667
+3052 37800.0000 22200.0000
+3053 37800.0000 22250.0000
+3054 37800.0000 22283.3333
+3055 37800.0000 22583.3333
+3056 37800.0000 22716.6667
+3057 37800.0000 22800.0000
+3058 37800.0000 23050.0000
+3059 37800.0000 23883.3333
+3060 37800.0000 23983.3333
+3061 37800.0000 24050.0000
+3062 37800.0000 24866.6667
+3063 37800.0000 24900.0000
+3064 37800.0000 24916.6667
+3065 37800.0000 24933.3333
+3066 37800.0000 24950.0000
+3067 37801.1111 26803.3333
+3068 37801.3889 26745.5556
+3069 37802.2222 26841.3889
+3070 37802.7778 26812.2222
+3071 37805.8333 26815.2778
+3072 37806.6667 26732.2222
+3073 37808.3333 26794.7222
+3074 37808.6111 26738.8889
+3075 37816.6667 20683.3333
+3076 37816.6667 20766.6667
+3077 37816.6667 20800.0000
+3078 37816.6667 20833.3333
+3079 37816.6667 20850.0000
+3080 37816.6667 21266.6667
+3081 37816.6667 21283.3333
+3082 37816.6667 21350.0000
+3083 37816.6667 21383.3333
+3084 37816.6667 21416.6667
+3085 37816.6667 21583.3333
+3086 37816.6667 21616.6667
+3087 37816.6667 21700.0000
+3088 37816.6667 21850.0000
+3089 37816.6667 21866.6667
+3090 37816.6667 22000.0000
+3091 37816.6667 22133.3333
+3092 37816.6667 22150.0000
+3093 37816.6667 22166.6667
+3094 37816.6667 22333.3333
+3095 37816.6667 22516.6667
+3096 37816.6667 22533.3333
+3097 37816.6667 22666.6667
+3098 37816.6667 22700.0000
+3099 37816.6667 22750.0000
+3100 37816.6667 22866.6667
+3101 37816.6667 22933.3333
+3102 37816.6667 23000.0000
+3103 37816.6667 23783.3333
+3104 37816.6667 23800.0000
+3105 37816.6667 24050.0000
+3106 37816.6667 24833.3333
+3107 37816.6667 24883.3333
+3108 37816.6667 24900.0000
+3109 37816.6667 24916.6667
+3110 37816.6667 24933.3333
+3111 37816.6667 24950.0000
+3112 37833.3333 20750.0000
+3113 37833.3333 20766.6667
+3114 37833.3333 21300.0000
+3115 37833.3333 21383.3333
+3116 37833.3333 21433.3333
+3117 37833.3333 21450.0000
+3118 37833.3333 21533.3333
+3119 37833.3333 21566.6667
+3120 37833.3333 21583.3333
+3121 37833.3333 21600.0000
+3122 37833.3333 21700.0000
+3123 37833.3333 21766.6667
+3124 37833.3333 21833.3333
+3125 37833.3333 21850.0000
+3126 37833.3333 21933.3333
+3127 37833.3333 21983.3333
+3128 37833.3333 22000.0000
+3129 37833.3333 22100.0000
+3130 37833.3333 22116.6667
+3131 37833.3333 22166.6667
+3132 37833.3333 22316.6667
+3133 37833.3333 22383.3333
+3134 37833.3333 22566.6667
+3135 37833.3333 22583.3333
+3136 37833.3333 23016.6667
+3137 37833.3333 23033.3333
+3138 37833.3333 23800.0000
+3139 37833.3333 23866.6667
+3140 37833.3333 23916.6667
+3141 37833.3333 23966.6667
+3142 37833.3333 24816.6667
+3143 37833.3333 24900.0000
+3144 37833.3333 24916.6667
+3145 37833.3333 24933.3333
+3146 37850.0000 20650.0000
+3147 37850.0000 20700.0000
+3148 37850.0000 20783.3333
+3149 37850.0000 21116.6667
+3150 37850.0000 21150.0000
+3151 37850.0000 21216.6667
+3152 37850.0000 21250.0000
+3153 37850.0000 21316.6667
+3154 37850.0000 21366.6667
+3155 37850.0000 21383.3333
+3156 37850.0000 21433.3333
+3157 37850.0000 21450.0000
+3158 37850.0000 21500.0000
+3159 37850.0000 21516.6667
+3160 37850.0000 21566.6667
+3161 37850.0000 21616.6667
+3162 37850.0000 21766.6667
+3163 37850.0000 21800.0000
+3164 37850.0000 21983.3333
+3165 37850.0000 22016.6667
+3166 37850.0000 22066.6667
+3167 37850.0000 22083.3333
+3168 37850.0000 22116.6667
+3169 37850.0000 22150.0000
+3170 37850.0000 22166.6667
+3171 37850.0000 22216.6667
+3172 37850.0000 22316.6667
+3173 37850.0000 22416.6667
+3174 37850.0000 22600.0000
+3175 37850.0000 22666.6667
+3176 37850.0000 22800.0000
+3177 37850.0000 22883.3333
+3178 37850.0000 22916.6667
+3179 37850.0000 22983.3333
+3180 37850.0000 23000.0000
+3181 37850.0000 23766.6667
+3182 37850.0000 24783.3333
+3183 37850.0000 24916.6667
+3184 37850.0000 24933.3333
+3185 37866.6667 20650.0000
+3186 37866.6667 20666.6667
+3187 37866.6667 21116.6667
+3188 37866.6667 21150.0000
+3189 37866.6667 21183.3333
+3190 37866.6667 21200.0000
+3191 37866.6667 21266.6667
+3192 37866.6667 21300.0000
+3193 37866.6667 21350.0000
+3194 37866.6667 21433.3333
+3195 37866.6667 21450.0000
+3196 37866.6667 21483.3333
+3197 37866.6667 21500.0000
+3198 37866.6667 21616.6667
+3199 37866.6667 21650.0000
+3200 37866.6667 21750.0000
+3201 37866.6667 21850.0000
+3202 37866.6667 21900.0000
+3203 37866.6667 21950.0000
+3204 37866.6667 22016.6667
+3205 37866.6667 22033.3333
+3206 37866.6667 22066.6667
+3207 37866.6667 22116.6667
+3208 37866.6667 22166.6667
+3209 37866.6667 22383.3333
+3210 37866.6667 22416.6667
+3211 37866.6667 22450.0000
+3212 37866.6667 22466.6667
+3213 37866.6667 22533.3333
+3214 37866.6667 22783.3333
+3215 37866.6667 22900.0000
+3216 37866.6667 23000.0000
+3217 37866.6667 23750.0000
+3218 37866.6667 23933.3333
+3219 37866.6667 24816.6667
+3220 37866.6667 24833.3333
+3221 37866.6667 24850.0000
+3222 37866.6667 24866.6667
+3223 37866.6667 24883.3333
+3224 37883.3333 20700.0000
+3225 37883.3333 21133.3333
+3226 37883.3333 21200.0000
+3227 37883.3333 21233.3333
+3228 37883.3333 21250.0000
+3229 37883.3333 21283.3333
+3230 37883.3333 21316.6667
+3231 37883.3333 21366.6667
+3232 37883.3333 21383.3333
+3233 37883.3333 21416.6667
+3234 37883.3333 21433.3333
+3235 37883.3333 21450.0000
+3236 37883.3333 21500.0000
+3237 37883.3333 21550.0000
+3238 37883.3333 21583.3333
+3239 37883.3333 21683.3333
+3240 37883.3333 21900.0000
+3241 37883.3333 21916.6667
+3242 37883.3333 21983.3333
+3243 37883.3333 22016.6667
+3244 37883.3333 22050.0000
+3245 37883.3333 22150.0000
+3246 37883.3333 22333.3333
+3247 37883.3333 22466.6667
+3248 37883.3333 22483.3333
+3249 37883.3333 22566.6667
+3250 37883.3333 22633.3333
+3251 37883.3333 22733.3333
+3252 37883.3333 22833.3333
+3253 37883.3333 22883.3333
+3254 37883.3333 22950.0000
+3255 37883.3333 23416.6667
+3256 37883.3333 23433.3333
+3257 37883.3333 23733.3333
+3258 37883.3333 23750.0000
+3259 37883.3333 23933.3333
+3260 37883.3333 24016.6667
+3261 37883.3333 24733.3333
+3262 37900.0000 21233.3333
+3263 37900.0000 21266.6667
+3264 37900.0000 21350.0000
+3265 37900.0000 21383.3333
+3266 37900.0000 21400.0000
+3267 37900.0000 21450.0000
+3268 37900.0000 21466.6667
+3269 37900.0000 21500.0000
+3270 37900.0000 21533.3333
+3271 37900.0000 21550.0000
+3272 37900.0000 21600.0000
+3273 37900.0000 21650.0000
+3274 37900.0000 21766.6667
+3275 37900.0000 21833.3333
+3276 37900.0000 21916.6667
+3277 37900.0000 22000.0000
+3278 37900.0000 22033.3333
+3279 37900.0000 22050.0000
+3280 37900.0000 22083.3333
+3281 37900.0000 22116.6667
+3282 37900.0000 22133.3333
+3283 37900.0000 22150.0000
+3284 37900.0000 22333.3333
+3285 37900.0000 22466.6667
+3286 37900.0000 22600.0000
+3287 37900.0000 22650.0000
+3288 37900.0000 22733.3333
+3289 37900.0000 22933.3333
+3290 37900.0000 23416.6667
+3291 37900.0000 23483.3333
+3292 37900.0000 23733.3333
+3293 37900.0000 23750.0000
+3294 37900.0000 23883.3333
+3295 37900.0000 24733.3333
+3296 37900.0000 24750.0000
+3297 37900.0000 24766.6667
+3298 37900.0000 24783.3333
+3299 37900.0000 24833.3333
+3300 37900.0000 24916.6667
+3301 37916.6667 20700.0000
+3302 37916.6667 21183.3333
+3303 37916.6667 21200.0000
+3304 37916.6667 21233.3333
+3305 37916.6667 21250.0000
+3306 37916.6667 21283.3333
+3307 37916.6667 21333.3333
+3308 37916.6667 21400.0000
+3309 37916.6667 21416.6667
+3310 37916.6667 21433.3333
+3311 37916.6667 21466.6667
+3312 37916.6667 21500.0000
+3313 37916.6667 21533.3333
+3314 37916.6667 21666.6667
+3315 37916.6667 21716.6667
+3316 37916.6667 21750.0000
+3317 37916.6667 21800.0000
+3318 37916.6667 21866.6667
+3319 37916.6667 21933.3333
+3320 37916.6667 22133.3333
+3321 37916.6667 22166.6667
+3322 37916.6667 22200.0000
+3323 37916.6667 22283.3333
+3324 37916.6667 22300.0000
+3325 37916.6667 22316.6667
+3326 37916.6667 22516.6667
+3327 37916.6667 22616.6667
+3328 37916.6667 22700.0000
+3329 37916.6667 22883.3333
+3330 37916.6667 22983.3333
+3331 37916.6667 23000.0000
+3332 37916.6667 23150.0000
+3333 37916.6667 23466.6667
+3334 37916.6667 23500.0000
+3335 37916.6667 23716.6667
+3336 37916.6667 23733.3333
+3337 37916.6667 23966.6667
+3338 37933.3333 21150.0000
+3339 37933.3333 21266.6667
+3340 37933.3333 21316.6667
+3341 37933.3333 21333.3333
+3342 37933.3333 21350.0000
+3343 37933.3333 21400.0000
+3344 37933.3333 21466.6667
+3345 37933.3333 21566.6667
+3346 37933.3333 21616.6667
+3347 37933.3333 21633.3333
+3348 37933.3333 21650.0000
+3349 37933.3333 21750.0000
+3350 37933.3333 21850.0000
+3351 37933.3333 21916.6667
+3352 37933.3333 21966.6667
+3353 37933.3333 22000.0000
+3354 37933.3333 22033.3333
+3355 37933.3333 22050.0000
+3356 37933.3333 22083.3333
+3357 37933.3333 22100.0000
+3358 37933.3333 22166.6667
+3359 37933.3333 22183.3333
+3360 37933.3333 22200.0000
+3361 37933.3333 22333.3333
+3362 37933.3333 22633.3333
+3363 37933.3333 22716.6667
+3364 37933.3333 22800.0000
+3365 37933.3333 22833.3333
+3366 37933.3333 22850.0000
+3367 37933.3333 22933.3333
+3368 37933.3333 23033.3333
+3369 37933.3333 23533.3333
+3370 37933.3333 23700.0000
+3371 37933.3333 23733.3333
+3372 37933.3333 24716.6667
+3373 37933.3333 24766.6667
+3374 37933.3333 24800.0000
+3375 37950.0000 21316.6667
+3376 37950.0000 21350.0000
+3377 37950.0000 21366.6667
+3378 37950.0000 21383.3333
+3379 37950.0000 21400.0000
+3380 37950.0000 21416.6667
+3381 37950.0000 21450.0000
+3382 37950.0000 21483.3333
+3383 37950.0000 21500.0000
+3384 37950.0000 21533.3333
+3385 37950.0000 21550.0000
+3386 37950.0000 21700.0000
+3387 37950.0000 21716.6667
+3388 37950.0000 21766.6667
+3389 37950.0000 21850.0000
+3390 37950.0000 21933.3333
+3391 37950.0000 22016.6667
+3392 37950.0000 22133.3333
+3393 37950.0000 22316.6667
+3394 37950.0000 22350.0000
+3395 37950.0000 22566.6667
+3396 37950.0000 22650.0000
+3397 37950.0000 22750.0000
+3398 37950.0000 22783.3333
+3399 37950.0000 22800.0000
+3400 37950.0000 22833.3333
+3401 37950.0000 22966.6667
+3402 37950.0000 23533.3333
+3403 37950.0000 23633.3333
+3404 37950.0000 23666.6667
+3405 37950.0000 23700.0000
+3406 37950.0000 23716.6667
+3407 37950.0000 23766.6667
+3408 37950.0000 23850.0000
+3409 37950.0000 24750.0000
+3410 37950.0000 24800.0000
+3411 37966.6667 21250.0000
+3412 37966.6667 21266.6667
+3413 37966.6667 21283.3333
+3414 37966.6667 21300.0000
+3415 37966.6667 21333.3333
+3416 37966.6667 21350.0000
+3417 37966.6667 21400.0000
+3418 37966.6667 21516.6667
+3419 37966.6667 21550.0000
+3420 37966.6667 21633.3333
+3421 37966.6667 21666.6667
+3422 37966.6667 21700.0000
+3423 37966.6667 22050.0000
+3424 37966.6667 22083.3333
+3425 37966.6667 22116.6667
+3426 37966.6667 22566.6667
+3427 37966.6667 22633.3333
+3428 37966.6667 22766.6667
+3429 37966.6667 22783.3333
+3430 37966.6667 22816.6667
+3431 37966.6667 23200.0000
+3432 37966.6667 23366.6667
+3433 37966.6667 23450.0000
+3434 37966.6667 23483.3333
+3435 37966.6667 23516.6667
+3436 37966.6667 23566.6667
+3437 37966.6667 23633.3333
+3438 37966.6667 23650.0000
+3439 37966.6667 23683.3333
+3440 37966.6667 23750.0000
+3441 37966.6667 23800.0000
+3442 37966.6667 23916.6667
+3443 37966.6667 24000.0000
+3444 37966.6667 24483.3333
+3445 37966.6667 24733.3333
+3446 37966.6667 24750.0000
+3447 37966.6667 24766.6667
+3448 37983.3333 21266.6667
+3449 37983.3333 21316.6667
+3450 37983.3333 21350.0000
+3451 37983.3333 21400.0000
+3452 37983.3333 21416.6667
+3453 37983.3333 21450.0000
+3454 37983.3333 21466.6667
+3455 37983.3333 21583.3333
+3456 37983.3333 21666.6667
+3457 37983.3333 21733.3333
+3458 37983.3333 21766.6667
+3459 37983.3333 21800.0000
+3460 37983.3333 22000.0000
+3461 37983.3333 22066.6667
+3462 37983.3333 22133.3333
+3463 37983.3333 22266.6667
+3464 37983.3333 22350.0000
+3465 37983.3333 22466.6667
+3466 37983.3333 22483.3333
+3467 37983.3333 22516.6667
+3468 37983.3333 22566.6667
+3469 37983.3333 22650.0000
+3470 37983.3333 22733.3333
+3471 37983.3333 22783.3333
+3472 37983.3333 22966.6667
+3473 37983.3333 23350.0000
+3474 37983.3333 23533.3333
+3475 37983.3333 23666.6667
+3476 37983.3333 23683.3333
+3477 37983.3333 23733.3333
+3478 37983.3333 23766.6667
+3479 37983.3333 23816.6667
+3480 37983.3333 23866.6667
+3481 37983.3333 23883.3333
+3482 37983.3333 23900.0000
+3483 37983.3333 24016.6667
+3484 38000.0000 21316.6667
+3485 38000.0000 21350.0000
+3486 38000.0000 21366.6667
+3487 38000.0000 21383.3333
+3488 38000.0000 21516.6667
+3489 38000.0000 21666.6667
+3490 38000.0000 21716.6667
+3491 38000.0000 21766.6667
+3492 38000.0000 21916.6667
+3493 38000.0000 22000.0000
+3494 38000.0000 22133.3333
+3495 38000.0000 22266.6667
+3496 38000.0000 22366.6667
+3497 38000.0000 22466.6667
+3498 38000.0000 22483.3333
+3499 38000.0000 22533.3333
+3500 38000.0000 22566.6667
+3501 38000.0000 22650.0000
+3502 38000.0000 22733.3333
+3503 38000.0000 22750.0000
+3504 38000.0000 23350.0000
+3505 38000.0000 23433.3333
+3506 38000.0000 23583.3333
+3507 38000.0000 23666.6667
+3508 38000.0000 23683.3333
+3509 38000.0000 23700.0000
+3510 38000.0000 23733.3333
+3511 38000.0000 23800.0000
+3512 38000.0000 23883.3333
+3513 38000.0000 23916.6667
+3514 38000.0000 23950.0000
+3515 38016.6667 21366.6667
+3516 38016.6667 21383.3333
+3517 38016.6667 21400.0000
+3518 38016.6667 21416.6667
+3519 38016.6667 21433.3333
+3520 38016.6667 21466.6667
+3521 38016.6667 21550.0000
+3522 38016.6667 21566.6667
+3523 38016.6667 21600.0000
+3524 38016.6667 21633.3333
+3525 38016.6667 21700.0000
+3526 38016.6667 21733.3333
+3527 38016.6667 21766.6667
+3528 38016.6667 21900.0000
+3529 38016.6667 21966.6667
+3530 38016.6667 21983.3333
+3531 38016.6667 22233.3333
+3532 38016.6667 22250.0000
+3533 38016.6667 22266.6667
+3534 38016.6667 22416.6667
+3535 38016.6667 22483.3333
+3536 38016.6667 22500.0000
+3537 38016.6667 22616.6667
+3538 38016.6667 22650.0000
+3539 38016.6667 22683.3333
+3540 38016.6667 22716.6667
+3541 38016.6667 22733.3333
+3542 38016.6667 22750.0000
+3543 38016.6667 22983.3333
+3544 38016.6667 23666.6667
+3545 38016.6667 23700.0000
+3546 38016.6667 23733.3333
+3547 38016.6667 23750.0000
+3548 38016.6667 23766.6667
+3549 38016.6667 23833.3333
+3550 38016.6667 24000.0000
+3551 38016.6667 24266.6667
+3552 38016.6667 24283.3333
+3553 38016.6667 24333.3333
+3554 38016.6667 24416.6667
+3555 38016.6667 24450.0000
+3556 38016.6667 24466.6667
+3557 38016.6667 24516.6667
+3558 38016.6667 24533.3333
+3559 38016.6667 24550.0000
+3560 38016.6667 24566.6667
+3561 38033.3333 21366.6667
+3562 38033.3333 21466.6667
+3563 38033.3333 21500.0000
+3564 38033.3333 21550.0000
+3565 38033.3333 21633.3333
+3566 38033.3333 21700.0000
+3567 38033.3333 21716.6667
+3568 38033.3333 21733.3333
+3569 38033.3333 21750.0000
+3570 38033.3333 21800.0000
+3571 38033.3333 21866.6667
+3572 38033.3333 21883.3333
+3573 38033.3333 21900.0000
+3574 38033.3333 21933.3333
+3575 38033.3333 21966.6667
+3576 38033.3333 22000.0000
+3577 38033.3333 22116.6667
+3578 38033.3333 22250.0000
+3579 38033.3333 22266.6667
+3580 38033.3333 22333.3333
+3581 38033.3333 22366.6667
+3582 38033.3333 22483.3333
+3583 38033.3333 22533.3333
+3584 38033.3333 22566.6667
+3585 38033.3333 22583.3333
+3586 38033.3333 22600.0000
+3587 38033.3333 22666.6667
+3588 38033.3333 22716.6667
+3589 38033.3333 22733.3333
+3590 38033.3333 22950.0000
+3591 38033.3333 23166.6667
+3592 38033.3333 23500.0000
+3593 38033.3333 23533.3333
+3594 38033.3333 23700.0000
+3595 38033.3333 23733.3333
+3596 38033.3333 23750.0000
+3597 38033.3333 23766.6667
+3598 38033.3333 23783.3333
+3599 38033.3333 23800.0000
+3600 38033.3333 23916.6667
+3601 38033.3333 24316.6667
+3602 38033.3333 24400.0000
+3603 38033.3333 24416.6667
+3604 38033.3333 24433.3333
+3605 38033.3333 24500.0000
+3606 38033.3333 24533.3333
+3607 38050.0000 21316.6667
+3608 38050.0000 21350.0000
+3609 38050.0000 21366.6667
+3610 38050.0000 21383.3333
+3611 38050.0000 21450.0000
+3612 38050.0000 21483.3333
+3613 38050.0000 21550.0000
+3614 38050.0000 21583.3333
+3615 38050.0000 21666.6667
+3616 38050.0000 21700.0000
+3617 38050.0000 21750.0000
+3618 38050.0000 21766.6667
+3619 38050.0000 21783.3333
+3620 38050.0000 21816.6667
+3621 38050.0000 21850.0000
+3622 38050.0000 21866.6667
+3623 38050.0000 21916.6667
+3624 38050.0000 21933.3333
+3625 38050.0000 21983.3333
+3626 38050.0000 22016.6667
+3627 38050.0000 22066.6667
+3628 38050.0000 22316.6667
+3629 38050.0000 22350.0000
+3630 38050.0000 22450.0000
+3631 38050.0000 22500.0000
+3632 38050.0000 22533.3333
+3633 38050.0000 22550.0000
+3634 38050.0000 22583.3333
+3635 38050.0000 22600.0000
+3636 38050.0000 22616.6667
+3637 38050.0000 22650.0000
+3638 38050.0000 22683.3333
+3639 38050.0000 22933.3333
+3640 38050.0000 22966.6667
+3641 38050.0000 23016.6667
+3642 38050.0000 23683.3333
+3643 38050.0000 23766.6667
+3644 38050.0000 23800.0000
+3645 38050.0000 23833.3333
+3646 38050.0000 23866.6667
+3647 38050.0000 24316.6667
+3648 38050.0000 24366.6667
+3649 38050.0000 24383.3333
+3650 38050.0000 24416.6667
+3651 38050.0000 24533.3333
+3652 38050.0000 24550.0000
+3653 38066.6667 20733.3333
+3654 38066.6667 20750.0000
+3655 38066.6667 20783.3333
+3656 38066.6667 21350.0000
+3657 38066.6667 21400.0000
+3658 38066.6667 21433.3333
+3659 38066.6667 21500.0000
+3660 38066.6667 21516.6667
+3661 38066.6667 21550.0000
+3662 38066.6667 21600.0000
+3663 38066.6667 21616.6667
+3664 38066.6667 21650.0000
+3665 38066.6667 21666.6667
+3666 38066.6667 21683.3333
+3667 38066.6667 21716.6667
+3668 38066.6667 21733.3333
+3669 38066.6667 21750.0000
+3670 38066.6667 21766.6667
+3671 38066.6667 21800.0000
+3672 38066.6667 21850.0000
+3673 38066.6667 21900.0000
+3674 38066.6667 21933.3333
+3675 38066.6667 21950.0000
+3676 38066.6667 22033.3333
+3677 38066.6667 22233.3333
+3678 38066.6667 22316.6667
+3679 38066.6667 22333.3333
+3680 38066.6667 22350.0000
+3681 38066.6667 22400.0000
+3682 38066.6667 22450.0000
+3683 38066.6667 22500.0000
+3684 38066.6667 22516.6667
+3685 38066.6667 22633.3333
+3686 38066.6667 22650.0000
+3687 38066.6667 22666.6667
+3688 38066.6667 23500.0000
+3689 38066.6667 23583.3333
+3690 38066.6667 23700.0000
+3691 38066.6667 23766.6667
+3692 38066.6667 23783.3333
+3693 38066.6667 23816.6667
+3694 38066.6667 24000.0000
+3695 38066.6667 24316.6667
+3696 38066.6667 24333.3333
+3697 38066.6667 24350.0000
+3698 38066.6667 24433.3333
+3699 38066.6667 24533.3333
+3700 38083.3333 20716.6667
+3701 38083.3333 20733.3333
+3702 38083.3333 20750.0000
+3703 38083.3333 20783.3333
+3704 38083.3333 21383.3333
+3705 38083.3333 21466.6667
+3706 38083.3333 21483.3333
+3707 38083.3333 21500.0000
+3708 38083.3333 21533.3333
+3709 38083.3333 21566.6667
+3710 38083.3333 21583.3333
+3711 38083.3333 21616.6667
+3712 38083.3333 21633.3333
+3713 38083.3333 21666.6667
+3714 38083.3333 21733.3333
+3715 38083.3333 21766.6667
+3716 38083.3333 21833.3333
+3717 38083.3333 21900.0000
+3718 38083.3333 21916.6667
+3719 38083.3333 22033.3333
+3720 38083.3333 22100.0000
+3721 38083.3333 22133.3333
+3722 38083.3333 22166.6667
+3723 38083.3333 22216.6667
+3724 38083.3333 22333.3333
+3725 38083.3333 22350.0000
+3726 38083.3333 22416.6667
+3727 38083.3333 22433.3333
+3728 38083.3333 22483.3333
+3729 38083.3333 22533.3333
+3730 38083.3333 22583.3333
+3731 38083.3333 22600.0000
+3732 38083.3333 22616.6667
+3733 38083.3333 22633.3333
+3734 38083.3333 23183.3333
+3735 38083.3333 23216.6667
+3736 38083.3333 23516.6667
+3737 38083.3333 23700.0000
+3738 38083.3333 23733.3333
+3739 38083.3333 23983.3333
+3740 38083.3333 24283.3333
+3741 38083.3333 24316.6667
+3742 38083.3333 24333.3333
+3743 38083.3333 24366.6667
+3744 38083.3333 24383.3333
+3745 38083.3333 24533.3333
+3746 38083.3333 24566.6667
+3747 38100.0000 20716.6667
+3748 38100.0000 20750.0000
+3749 38100.0000 20766.6667
+3750 38100.0000 20783.3333
+3751 38100.0000 21416.6667
+3752 38100.0000 21450.0000
+3753 38100.0000 21466.6667
+3754 38100.0000 21483.3333
+3755 38100.0000 21516.6667
+3756 38100.0000 21533.3333
+3757 38100.0000 21550.0000
+3758 38100.0000 21600.0000
+3759 38100.0000 21616.6667
+3760 38100.0000 21633.3333
+3761 38100.0000 21666.6667
+3762 38100.0000 21700.0000
+3763 38100.0000 21716.6667
+3764 38100.0000 21733.3333
+3765 38100.0000 21816.6667
+3766 38100.0000 21833.3333
+3767 38100.0000 21916.6667
+3768 38100.0000 22033.3333
+3769 38100.0000 22100.0000
+3770 38100.0000 22133.3333
+3771 38100.0000 22166.6667
+3772 38100.0000 22233.3333
+3773 38100.0000 22283.3333
+3774 38100.0000 22316.6667
+3775 38100.0000 22333.3333
+3776 38100.0000 22350.0000
+3777 38100.0000 22366.6667
+3778 38100.0000 22450.0000
+3779 38100.0000 22483.3333
+3780 38100.0000 22533.3333
+3781 38100.0000 22566.6667
+3782 38100.0000 22583.3333
+3783 38100.0000 23666.6667
+3784 38100.0000 23816.6667
+3785 38100.0000 23883.3333
+3786 38100.0000 24250.0000
+3787 38100.0000 24333.3333
+3788 38100.0000 24400.0000
+3789 38100.0000 24433.3333
+3790 38100.0000 24483.3333
+3791 38100.0000 24566.6667
+3792 38116.6667 20516.6667
+3793 38116.6667 20533.3333
+3794 38116.6667 20550.0000
+3795 38116.6667 20566.6667
+3796 38116.6667 20583.3333
+3797 38116.6667 20633.3333
+3798 38116.6667 20650.0000
+3799 38116.6667 20750.0000
+3800 38116.6667 20766.6667
+3801 38116.6667 20783.3333
+3802 38116.6667 21466.6667
+3803 38116.6667 21483.3333
+3804 38116.6667 21500.0000
+3805 38116.6667 21516.6667
+3806 38116.6667 21566.6667
+3807 38116.6667 21583.3333
+3808 38116.6667 21600.0000
+3809 38116.6667 21633.3333
+3810 38116.6667 21650.0000
+3811 38116.6667 21666.6667
+3812 38116.6667 21716.6667
+3813 38116.6667 21783.3333
+3814 38116.6667 21900.0000
+3815 38116.6667 21933.3333
+3816 38116.6667 21966.6667
+3817 38116.6667 22066.6667
+3818 38116.6667 22083.3333
+3819 38116.6667 22116.6667
+3820 38116.6667 22216.6667
+3821 38116.6667 22283.3333
+3822 38116.6667 22383.3333
+3823 38116.6667 22400.0000
+3824 38116.6667 22433.3333
+3825 38116.6667 22466.6667
+3826 38116.6667 22483.3333
+3827 38116.6667 22533.3333
+3828 38116.6667 22550.0000
+3829 38116.6667 23400.0000
+3830 38116.6667 23833.3333
+3831 38116.6667 23850.0000
+3832 38116.6667 23866.6667
+3833 38116.6667 23883.3333
+3834 38116.6667 23950.0000
+3835 38116.6667 24216.6667
+3836 38116.6667 24300.0000
+3837 38116.6667 24316.6667
+3838 38116.6667 24483.3333
+3839 38116.6667 24500.0000
+3840 38116.6667 24583.3333
+3841 38133.3333 20500.0000
+3842 38133.3333 20516.6667
+3843 38133.3333 20533.3333
+3844 38133.3333 20550.0000
+3845 38133.3333 20566.6667
+3846 38133.3333 20583.3333
+3847 38133.3333 20616.6667
+3848 38133.3333 20716.6667
+3849 38133.3333 20733.3333
+3850 38133.3333 20750.0000
+3851 38133.3333 21400.0000
+3852 38133.3333 21466.6667
+3853 38133.3333 21533.3333
+3854 38133.3333 21550.0000
+3855 38133.3333 21566.6667
+3856 38133.3333 21583.3333
+3857 38133.3333 21600.0000
+3858 38133.3333 21633.3333
+3859 38133.3333 21700.0000
+3860 38133.3333 21716.6667
+3861 38133.3333 21766.6667
+3862 38133.3333 21783.3333
+3863 38133.3333 21833.3333
+3864 38133.3333 21900.0000
+3865 38133.3333 21916.6667
+3866 38133.3333 21983.3333
+3867 38133.3333 22150.0000
+3868 38133.3333 22200.0000
+3869 38133.3333 22216.6667
+3870 38133.3333 22233.3333
+3871 38133.3333 22283.3333
+3872 38133.3333 22316.6667
+3873 38133.3333 22333.3333
+3874 38133.3333 22366.6667
+3875 38133.3333 22383.3333
+3876 38133.3333 22400.0000
+3877 38133.3333 22416.6667
+3878 38133.3333 22433.3333
+3879 38133.3333 22450.0000
+3880 38133.3333 22466.6667
+3881 38133.3333 22483.3333
+3882 38133.3333 22516.6667
+3883 38133.3333 23800.0000
+3884 38133.3333 23850.0000
+3885 38133.3333 23883.3333
+3886 38133.3333 24000.0000
+3887 38133.3333 24250.0000
+3888 38133.3333 24366.6667
+3889 38133.3333 24383.3333
+3890 38133.3333 24466.6667
+3891 38133.3333 24483.3333
+3892 38133.3333 24533.3333
+3893 38133.3333 24566.6667
+3894 38150.0000 20500.0000
+3895 38150.0000 20550.0000
+3896 38150.0000 20566.6667
+3897 38150.0000 20733.3333
+3898 38150.0000 20750.0000
+3899 38150.0000 20783.3333
+3900 38150.0000 21516.6667
+3901 38150.0000 21550.0000
+3902 38150.0000 21616.6667
+3903 38150.0000 21650.0000
+3904 38150.0000 21666.6667
+3905 38150.0000 21733.3333
+3906 38150.0000 21750.0000
+3907 38150.0000 21800.0000
+3908 38150.0000 21833.3333
+3909 38150.0000 21850.0000
+3910 38150.0000 21866.6667
+3911 38150.0000 21900.0000
+3912 38150.0000 22033.3333
+3913 38150.0000 22066.6667
+3914 38150.0000 22166.6667
+3915 38150.0000 22183.3333
+3916 38150.0000 22200.0000
+3917 38150.0000 22266.6667
+3918 38150.0000 22283.3333
+3919 38150.0000 22300.0000
+3920 38150.0000 22316.6667
+3921 38150.0000 22333.3333
+3922 38150.0000 22350.0000
+3923 38150.0000 23233.3333
+3924 38150.0000 23533.3333
+3925 38150.0000 23716.6667
+3926 38150.0000 23833.3333
+3927 38150.0000 23850.0000
+3928 38150.0000 23866.6667
+3929 38150.0000 23966.6667
+3930 38150.0000 24233.3333
+3931 38150.0000 24316.6667
+3932 38150.0000 24350.0000
+3933 38150.0000 24383.3333
+3934 38150.0000 24400.0000
+3935 38166.6667 20483.3333
+3936 38166.6667 20550.0000
+3937 38166.6667 20600.0000
+3938 38166.6667 20666.6667
+3939 38166.6667 20683.3333
+3940 38166.6667 20700.0000
+3941 38166.6667 20716.6667
+3942 38166.6667 21416.6667
+3943 38166.6667 21450.0000
+3944 38166.6667 21466.6667
+3945 38166.6667 21483.3333
+3946 38166.6667 21666.6667
+3947 38166.6667 21683.3333
+3948 38166.6667 21700.0000
+3949 38166.6667 21716.6667
+3950 38166.6667 21733.3333
+3951 38166.6667 21816.6667
+3952 38166.6667 21850.0000
+3953 38166.6667 22000.0000
+3954 38166.6667 22066.6667
+3955 38166.6667 22100.0000
+3956 38166.6667 22133.3333
+3957 38166.6667 22233.3333
+3958 38166.6667 22266.6667
+3959 38166.6667 22283.3333
+3960 38166.6667 22316.6667
+3961 38166.6667 22333.3333
+3962 38166.6667 22350.0000
+3963 38166.6667 23333.3333
+3964 38166.6667 23416.6667
+3965 38166.6667 23783.3333
+3966 38166.6667 23866.6667
+3967 38166.6667 24000.0000
+3968 38166.6667 24233.3333
+3969 38166.6667 24250.0000
+3970 38166.6667 24266.6667
+3971 38166.6667 24316.6667
+3972 38183.3333 20383.3333
+3973 38183.3333 20400.0000
+3974 38183.3333 20416.6667
+3975 38183.3333 20433.3333
+3976 38183.3333 20483.3333
+3977 38183.3333 20533.3333
+3978 38183.3333 20583.3333
+3979 38183.3333 20683.3333
+3980 38183.3333 20700.0000
+3981 38183.3333 21383.3333
+3982 38183.3333 21416.6667
+3983 38183.3333 21433.3333
+3984 38183.3333 21683.3333
+3985 38183.3333 21700.0000
+3986 38183.3333 21716.6667
+3987 38183.3333 21733.3333
+3988 38183.3333 21750.0000
+3989 38183.3333 21766.6667
+3990 38183.3333 21816.6667
+3991 38183.3333 21950.0000
+3992 38183.3333 21983.3333
+3993 38183.3333 22066.6667
+3994 38183.3333 22133.3333
+3995 38183.3333 22150.0000
+3996 38183.3333 22183.3333
+3997 38183.3333 22266.6667
+3998 38183.3333 23150.0000
+3999 38183.3333 23383.3333
+4000 38183.3333 23500.0000
+4001 38183.3333 23516.6667
+4002 38183.3333 23550.0000
+4003 38183.3333 23850.0000
+4004 38183.3333 23916.6667
+4005 38183.3333 23983.3333
+4006 38183.3333 24033.3333
+4007 38183.3333 24200.0000
+4008 38183.3333 24233.3333
+4009 38183.3333 24266.6667
+4010 38183.3333 26016.6667
+4011 38200.0000 20383.3333
+4012 38200.0000 20400.0000
+4013 38200.0000 20416.6667
+4014 38200.0000 20433.3333
+4015 38200.0000 20516.6667
+4016 38200.0000 20666.6667
+4017 38200.0000 21700.0000
+4018 38200.0000 21733.3333
+4019 38200.0000 22000.0000
+4020 38200.0000 22050.0000
+4021 38200.0000 22083.3333
+4022 38200.0000 22116.6667
+4023 38200.0000 22150.0000
+4024 38200.0000 22166.6667
+4025 38200.0000 22200.0000
+4026 38200.0000 23050.0000
+4027 38200.0000 23116.6667
+4028 38200.0000 23966.6667
+4029 38200.0000 24200.0000
+4030 38216.6667 20383.3333
+4031 38216.6667 20400.0000
+4032 38216.6667 20500.0000
+4033 38216.6667 20516.6667
+4034 38216.6667 20616.6667
+4035 38216.6667 20650.0000
+4036 38216.6667 20666.6667
+4037 38216.6667 21716.6667
+4038 38216.6667 21733.3333
+4039 38216.6667 21750.0000
+4040 38216.6667 21766.6667
+4041 38216.6667 21783.3333
+4042 38216.6667 21800.0000
+4043 38216.6667 21816.6667
+4044 38216.6667 21900.0000
+4045 38216.6667 21966.6667
+4046 38216.6667 22033.3333
+4047 38216.6667 22066.6667
+4048 38216.6667 22100.0000
+4049 38216.6667 22116.6667
+4050 38216.6667 22133.3333
+4051 38216.6667 23266.6667
+4052 38216.6667 23316.6667
+4053 38216.6667 23500.0000
+4054 38216.6667 23550.0000
+4055 38216.6667 23616.6667
+4056 38216.6667 23783.3333
+4057 38216.6667 23833.3333
+4058 38216.6667 23866.6667
+4059 38216.6667 23883.3333
+4060 38216.6667 23916.6667
+4061 38216.6667 24250.0000
+4062 38233.3333 20366.6667
+4063 38233.3333 20383.3333
+4064 38233.3333 20400.0000
+4065 38233.3333 20416.6667
+4066 38233.3333 20483.3333
+4067 38233.3333 20600.0000
+4068 38233.3333 20650.0000
+4069 38233.3333 21733.3333
+4070 38233.3333 21750.0000
+4071 38233.3333 21766.6667
+4072 38233.3333 21783.3333
+4073 38233.3333 21916.6667
+4074 38233.3333 21966.6667
+4075 38233.3333 21983.3333
+4076 38233.3333 22033.3333
+4077 38233.3333 22083.3333
+4078 38233.3333 22100.0000
+4079 38233.3333 22116.6667
+4080 38233.3333 22133.3333
+4081 38233.3333 23216.6667
+4082 38233.3333 23416.6667
+4083 38233.3333 23800.0000
+4084 38233.3333 23900.0000
+4085 38233.3333 24216.6667
+4086 38233.3333 26000.0000
+4087 38233.3333 26050.0000
+4088 38233.3333 26066.6667
+4089 38233.3333 26083.3333
+4090 38233.3333 26100.0000
+4091 38250.0000 20383.3333
+4092 38250.0000 20400.0000
+4093 38250.0000 20600.0000
+4094 38250.0000 20650.0000
+4095 38250.0000 21733.3333
+4096 38250.0000 21750.0000
+4097 38250.0000 21800.0000
+4098 38250.0000 21933.3333
+4099 38250.0000 21950.0000
+4100 38250.0000 21966.6667
+4101 38250.0000 21983.3333
+4102 38250.0000 22000.0000
+4103 38250.0000 22016.6667
+4104 38250.0000 22050.0000
+4105 38250.0000 22083.3333
+4106 38250.0000 22116.6667
+4107 38250.0000 22983.3333
+4108 38250.0000 23066.6667
+4109 38250.0000 23183.3333
+4110 38250.0000 23266.6667
+4111 38250.0000 23466.6667
+4112 38250.0000 23700.0000
+4113 38250.0000 24200.0000
+4114 38250.0000 24216.6667
+4115 38250.0000 25933.3333
+4116 38250.0000 26033.3333
+4117 38250.0000 26066.6667
+4118 38250.0000 26083.3333
+4119 38250.0000 26100.0000
+4120 38266.6667 20466.6667
+4121 38266.6667 20683.3333
+4122 38266.6667 21733.3333
+4123 38266.6667 21750.0000
+4124 38266.6667 21766.6667
+4125 38266.6667 21783.3333
+4126 38266.6667 21816.6667
+4127 38266.6667 21833.3333
+4128 38266.6667 21900.0000
+4129 38266.6667 21916.6667
+4130 38266.6667 21933.3333
+4131 38266.6667 21966.6667
+4132 38266.6667 21983.3333
+4133 38266.6667 22000.0000
+4134 38266.6667 22016.6667
+4135 38266.6667 22050.0000
+4136 38266.6667 22916.6667
+4137 38266.6667 22966.6667
+4138 38266.6667 23116.6667
+4139 38266.6667 23233.3333
+4140 38266.6667 23566.6667
+4141 38266.6667 23800.0000
+4142 38266.6667 23816.6667
+4143 38266.6667 24166.6667
+4144 38266.6667 24183.3333
+4145 38266.6667 25916.6667
+4146 38266.6667 26066.6667
+4147 38266.6667 26083.3333
+4148 38266.6667 26100.0000
+4149 38283.3333 20433.3333
+4150 38283.3333 20466.6667
+4151 38283.3333 20583.3333
+4152 38283.3333 21766.6667
+4153 38283.3333 21800.0000
+4154 38283.3333 21866.6667
+4155 38283.3333 21883.3333
+4156 38283.3333 21900.0000
+4157 38283.3333 21966.6667
+4158 38283.3333 22000.0000
+4159 38283.3333 22033.3333
+4160 38283.3333 22766.6667
+4161 38283.3333 22783.3333
+4162 38283.3333 22800.0000
+4163 38283.3333 23266.6667
+4164 38283.3333 23350.0000
+4165 38283.3333 23583.3333
+4166 38283.3333 23750.0000
+4167 38283.3333 23800.0000
+4168 38283.3333 23816.6667
+4169 38283.3333 23833.3333
+4170 38283.3333 23866.6667
+4171 38283.3333 24133.3333
+4172 38283.3333 25983.3333
+4173 38283.3333 26083.3333
+4174 38300.0000 20483.3333
+4175 38300.0000 20550.0000
+4176 38300.0000 20566.6667
+4177 38300.0000 20583.3333
+4178 38300.0000 20600.0000
+4179 38300.0000 21783.3333
+4180 38300.0000 21800.0000
+4181 38300.0000 21833.3333
+4182 38300.0000 21900.0000
+4183 38300.0000 21950.0000
+4184 38300.0000 21983.3333
+4185 38300.0000 22000.0000
+4186 38300.0000 22016.6667
+4187 38300.0000 22550.0000
+4188 38300.0000 22583.3333
+4189 38300.0000 23116.6667
+4190 38300.0000 23150.0000
+4191 38300.0000 23166.6667
+4192 38300.0000 23266.6667
+4193 38300.0000 23316.6667
+4194 38300.0000 23383.3333
+4195 38300.0000 23500.0000
+4196 38300.0000 23733.3333
+4197 38300.0000 23750.0000
+4198 38300.0000 23900.0000
+4199 38300.0000 24116.6667
+4200 38300.0000 24200.0000
+4201 38300.0000 26016.6667
+4202 38300.0000 26066.6667
+4203 38300.0000 26100.0000
+4204 38300.0000 26116.6667
+4205 38316.6667 20416.6667
+4206 38316.6667 20466.6667
+4207 38316.6667 20550.0000
+4208 38316.6667 20566.6667
+4209 38316.6667 20583.3333
+4210 38316.6667 21816.6667
+4211 38316.6667 21850.0000
+4212 38316.6667 21983.3333
+4213 38316.6667 22583.3333
+4214 38316.6667 22900.0000
+4215 38316.6667 23116.6667
+4216 38316.6667 23183.3333
+4217 38316.6667 23316.6667
+4218 38316.6667 23333.3333
+4219 38316.6667 23450.0000
+4220 38316.6667 23533.3333
+4221 38316.6667 23616.6667
+4222 38316.6667 23633.3333
+4223 38316.6667 23800.0000
+4224 38316.6667 24150.0000
+4225 38316.6667 26050.0000
+4226 38316.6667 26100.0000
+4227 38316.6667 26133.3333
+4228 38333.3333 20550.0000
+4229 38333.3333 21566.6667
+4230 38333.3333 21766.6667
+4231 38333.3333 21850.0000
+4232 38333.3333 21866.6667
+4233 38333.3333 23133.3333
+4234 38333.3333 23316.6667
+4235 38333.3333 23733.3333
+4236 38333.3333 23783.3333
+4237 38333.3333 26000.0000
+4238 38333.3333 26083.3333
+4239 38333.3333 26100.0000
+4240 38333.3333 26116.6667
+4241 38350.0000 20616.6667
+4242 38350.0000 20683.3333
+4243 38350.0000 20716.6667
+4244 38350.0000 21533.3333
+4245 38350.0000 21566.6667
+4246 38350.0000 21600.0000
+4247 38350.0000 21633.3333
+4248 38350.0000 21650.0000
+4249 38350.0000 21700.0000
+4250 38350.0000 21716.6667
+4251 38350.0000 21733.3333
+4252 38350.0000 21750.0000
+4253 38350.0000 22783.3333
+4254 38350.0000 22916.6667
+4255 38350.0000 23016.6667
+4256 38350.0000 23483.3333
+4257 38350.0000 23583.3333
+4258 38350.0000 23666.6667
+4259 38350.0000 24100.0000
+4260 38350.0000 24150.0000
+4261 38350.0000 26083.3333
+4262 38366.6667 20566.6667
+4263 38366.6667 20583.3333
+4264 38366.6667 20600.0000
+4265 38366.6667 20716.6667
+4266 38366.6667 21433.3333
+4267 38366.6667 21533.3333
+4268 38366.6667 21566.6667
+4269 38366.6667 21633.3333
+4270 38366.6667 21666.6667
+4271 38366.6667 21716.6667
+4272 38366.6667 21750.0000
+4273 38366.6667 21766.6667
+4274 38366.6667 21783.3333
+4275 38366.6667 22083.3333
+4276 38366.6667 22133.3333
+4277 38366.6667 22200.0000
+4278 38366.6667 22233.3333
+4279 38366.6667 22250.0000
+4280 38366.6667 22283.3333
+4281 38366.6667 22833.3333
+4282 38366.6667 22933.3333
+4283 38366.6667 22966.6667
+4284 38366.6667 23016.6667
+4285 38366.6667 23066.6667
+4286 38366.6667 23083.3333
+4287 38366.6667 23100.0000
+4288 38366.6667 23450.0000
+4289 38366.6667 24183.3333
+4290 38366.6667 26133.3333
+4291 38383.3333 20533.3333
+4292 38383.3333 20550.0000
+4293 38383.3333 20566.6667
+4294 38383.3333 20583.3333
+4295 38383.3333 20666.6667
+4296 38383.3333 21500.0000
+4297 38383.3333 21533.3333
+4298 38383.3333 21566.6667
+4299 38383.3333 21600.0000
+4300 38383.3333 21633.3333
+4301 38383.3333 21683.3333
+4302 38383.3333 21716.6667
+4303 38383.3333 21800.0000
+4304 38383.3333 21850.0000
+4305 38383.3333 21916.6667
+4306 38383.3333 22116.6667
+4307 38383.3333 22383.3333
+4308 38383.3333 22633.3333
+4309 38383.3333 23000.0000
+4310 38383.3333 23400.0000
+4311 38383.3333 23600.0000
+4312 38383.3333 23633.3333
+4313 38383.3333 24050.0000
+4314 38383.3333 24066.6667
+4315 38383.3333 24083.3333
+4316 38383.3333 24116.6667
+4317 38383.3333 24133.3333
+4318 38383.3333 24166.6667
+4319 38383.3333 26016.6667
+4320 38383.3333 26100.0000
+4321 38400.0000 20550.0000
+4322 38400.0000 20566.6667
+4323 38400.0000 20583.3333
+4324 38400.0000 21266.6667
+4325 38400.0000 21433.3333
+4326 38400.0000 21483.3333
+4327 38400.0000 21533.3333
+4328 38400.0000 21550.0000
+4329 38400.0000 21650.0000
+4330 38400.0000 21733.3333
+4331 38400.0000 21750.0000
+4332 38400.0000 21766.6667
+4333 38400.0000 21783.3333
+4334 38400.0000 21800.0000
+4335 38400.0000 21816.6667
+4336 38400.0000 21833.3333
+4337 38400.0000 21866.6667
+4338 38400.0000 21883.3333
+4339 38400.0000 21900.0000
+4340 38400.0000 22000.0000
+4341 38400.0000 22016.6667
+4342 38400.0000 22050.0000
+4343 38400.0000 22150.0000
+4344 38400.0000 22716.6667
+4345 38400.0000 22933.3333
+4346 38400.0000 22983.3333
+4347 38400.0000 23600.0000
+4348 38400.0000 23616.6667
+4349 38400.0000 23633.3333
+4350 38400.0000 23766.6667
+4351 38400.0000 23800.0000
+4352 38400.0000 23883.3333
+4353 38400.0000 23916.6667
+4354 38400.0000 24050.0000
+4355 38400.0000 24083.3333
+4356 38400.0000 24100.0000
+4357 38400.0000 24133.3333
+4358 38400.0000 24166.6667
+4359 38400.0000 26016.6667
+4360 38416.6667 20550.0000
+4361 38416.6667 20566.6667
+4362 38416.6667 20650.0000
+4363 38416.6667 20666.6667
+4364 38416.6667 21250.0000
+4365 38416.6667 21283.3333
+4366 38416.6667 21316.6667
+4367 38416.6667 21466.6667
+4368 38416.6667 21516.6667
+4369 38416.6667 21566.6667
+4370 38416.6667 21616.6667
+4371 38416.6667 21633.3333
+4372 38416.6667 21750.0000
+4373 38416.6667 21766.6667
+4374 38416.6667 21783.3333
+4375 38416.6667 21816.6667
+4376 38416.6667 21833.3333
+4377 38416.6667 21850.0000
+4378 38416.6667 21866.6667
+4379 38416.6667 21883.3333
+4380 38416.6667 21900.0000
+4381 38416.6667 21933.3333
+4382 38416.6667 21950.0000
+4383 38416.6667 21966.6667
+4384 38416.6667 21983.3333
+4385 38416.6667 22000.0000
+4386 38416.6667 22016.6667
+4387 38416.6667 22050.0000
+4388 38416.6667 22100.0000
+4389 38416.6667 22183.3333
+4390 38416.6667 22216.6667
+4391 38416.6667 22316.6667
+4392 38416.6667 22533.3333
+4393 38416.6667 22816.6667
+4394 38416.6667 22833.3333
+4395 38416.6667 22983.3333
+4396 38416.6667 23000.0000
+4397 38416.6667 23016.6667
+4398 38416.6667 23350.0000
+4399 38416.6667 23516.6667
+4400 38416.6667 23650.0000
+4401 38416.6667 23683.3333
+4402 38416.6667 23816.6667
+4403 38416.6667 23833.3333
+4404 38416.6667 24033.3333
+4405 38416.6667 24100.0000
+4406 38416.6667 24133.3333
+4407 38416.6667 24200.0000
+4408 38416.6667 26133.3333
+4409 38433.3333 20550.0000
+4410 38433.3333 20566.6667
+4411 38433.3333 20583.3333
+4412 38433.3333 21283.3333
+4413 38433.3333 21350.0000
+4414 38433.3333 21416.6667
+4415 38433.3333 21516.6667
+4416 38433.3333 21600.0000
+4417 38433.3333 21633.3333
+4418 38433.3333 21716.6667
+4419 38433.3333 21750.0000
+4420 38433.3333 21766.6667
+4421 38433.3333 21833.3333
+4422 38433.3333 21866.6667
+4423 38433.3333 21950.0000
+4424 38433.3333 21966.6667
+4425 38433.3333 21983.3333
+4426 38433.3333 22066.6667
+4427 38433.3333 22116.6667
+4428 38433.3333 22416.6667
+4429 38433.3333 22450.0000
+4430 38433.3333 22666.6667
+4431 38433.3333 22833.3333
+4432 38433.3333 22883.3333
+4433 38433.3333 22900.0000
+4434 38433.3333 22916.6667
+4435 38433.3333 22966.6667
+4436 38433.3333 22983.3333
+4437 38433.3333 23033.3333
+4438 38433.3333 23300.0000
+4439 38433.3333 23400.0000
+4440 38433.3333 23600.0000
+4441 38433.3333 23633.3333
+4442 38433.3333 23650.0000
+4443 38433.3333 23666.6667
+4444 38433.3333 23683.3333
+4445 38433.3333 23883.3333
+4446 38433.3333 23900.0000
+4447 38433.3333 24033.3333
+4448 38433.3333 24066.6667
+4449 38433.3333 24116.6667
+4450 38433.3333 25966.6667
+4451 38450.0000 20533.3333
+4452 38450.0000 20550.0000
+4453 38450.0000 20566.6667
+4454 38450.0000 20583.3333
+4455 38450.0000 20633.3333
+4456 38450.0000 20650.0000
+4457 38450.0000 20666.6667
+4458 38450.0000 20683.3333
+4459 38450.0000 21116.6667
+4460 38450.0000 21233.3333
+4461 38450.0000 21383.3333
+4462 38450.0000 21400.0000
+4463 38450.0000 21516.6667
+4464 38450.0000 21583.3333
+4465 38450.0000 21600.0000
+4466 38450.0000 21633.3333
+4467 38450.0000 21666.6667
+4468 38450.0000 21683.3333
+4469 38450.0000 21700.0000
+4470 38450.0000 21800.0000
+4471 38450.0000 21816.6667
+4472 38450.0000 21916.6667
+4473 38450.0000 21983.3333
+4474 38450.0000 22000.0000
+4475 38450.0000 22033.3333
+4476 38450.0000 22150.0000
+4477 38450.0000 22233.3333
+4478 38450.0000 22300.0000
+4479 38450.0000 22366.6667
+4480 38450.0000 22816.6667
+4481 38450.0000 22833.3333
+4482 38450.0000 22866.6667
+4483 38450.0000 23000.0000
+4484 38450.0000 23216.6667
+4485 38450.0000 23683.3333
+4486 38450.0000 23816.6667
+4487 38450.0000 24000.0000
+4488 38450.0000 24016.6667
+4489 38450.0000 24083.3333
+4490 38450.0000 24116.6667
+4491 38450.0000 24133.3333
+4492 38450.0000 24150.0000
+4493 38450.0000 24166.6667
+4494 38466.6667 20550.0000
+4495 38466.6667 20566.6667
+4496 38466.6667 20583.3333
+4497 38466.6667 20633.3333
+4498 38466.6667 20650.0000
+4499 38466.6667 21266.6667
+4500 38466.6667 21366.6667
+4501 38466.6667 21500.0000
+4502 38466.6667 21566.6667
+4503 38466.6667 21583.3333
+4504 38466.6667 21600.0000
+4505 38466.6667 21616.6667
+4506 38466.6667 21650.0000
+4507 38466.6667 21700.0000
+4508 38466.6667 21733.3333
+4509 38466.6667 21800.0000
+4510 38466.6667 21816.6667
+4511 38466.6667 21866.6667
+4512 38466.6667 21933.3333
+4513 38466.6667 21950.0000
+4514 38466.6667 22100.0000
+4515 38466.6667 22183.3333
+4516 38466.6667 22466.6667
+4517 38466.6667 22783.3333
+4518 38466.6667 22800.0000
+4519 38466.6667 22866.6667
+4520 38466.6667 22950.0000
+4521 38466.6667 22966.6667
+4522 38466.6667 23000.0000
+4523 38466.6667 23283.3333
+4524 38466.6667 23583.3333
+4525 38466.6667 23600.0000
+4526 38466.6667 23650.0000
+4527 38466.6667 23766.6667
+4528 38466.6667 23966.6667
+4529 38466.6667 24116.6667
+4530 38466.6667 24150.0000
+4531 38466.6667 25916.6667
+4532 38466.6667 25966.6667
+4533 38466.6667 26116.6667
+4534 38483.3333 20666.6667
+4535 38483.3333 21100.0000
+4536 38483.3333 21250.0000
+4537 38483.3333 21283.3333
+4538 38483.3333 21350.0000
+4539 38483.3333 21416.6667
+4540 38483.3333 21450.0000
+4541 38483.3333 21583.3333
+4542 38483.3333 21633.3333
+4543 38483.3333 21650.0000
+4544 38483.3333 21666.6667
+4545 38483.3333 21766.6667
+4546 38483.3333 21833.3333
+4547 38483.3333 21850.0000
+4548 38483.3333 22016.6667
+4549 38483.3333 22033.3333
+4550 38483.3333 22050.0000
+4551 38483.3333 22083.3333
+4552 38483.3333 22166.6667
+4553 38483.3333 22183.3333
+4554 38483.3333 22366.6667
+4555 38483.3333 22400.0000
+4556 38483.3333 22500.0000
+4557 38483.3333 22583.3333
+4558 38483.3333 22883.3333
+4559 38483.3333 22933.3333
+4560 38483.3333 23100.0000
+4561 38483.3333 23233.3333
+4562 38483.3333 23450.0000
+4563 38483.3333 23550.0000
+4564 38483.3333 23750.0000
+4565 38483.3333 23800.0000
+4566 38483.3333 23900.0000
+4567 38483.3333 24116.6667
+4568 38483.3333 24133.3333
+4569 38483.3333 24166.6667
+4570 38483.3333 25916.6667
+4571 38483.3333 26050.0000
+4572 38500.0000 21350.0000
+4573 38500.0000 21383.3333
+4574 38500.0000 21483.3333
+4575 38500.0000 21516.6667
+4576 38500.0000 21550.0000
+4577 38500.0000 21583.3333
+4578 38500.0000 21600.0000
+4579 38500.0000 21616.6667
+4580 38500.0000 21633.3333
+4581 38500.0000 21650.0000
+4582 38500.0000 21666.6667
+4583 38500.0000 21700.0000
+4584 38500.0000 21800.0000
+4585 38500.0000 21833.3333
+4586 38500.0000 21850.0000
+4587 38500.0000 21883.3333
+4588 38500.0000 22133.3333
+4589 38500.0000 22233.3333
+4590 38500.0000 22383.3333
+4591 38500.0000 22800.0000
+4592 38500.0000 22850.0000
+4593 38500.0000 22883.3333
+4594 38500.0000 22933.3333
+4595 38500.0000 22983.3333
+4596 38500.0000 23166.6667
+4597 38500.0000 23266.6667
+4598 38500.0000 23616.6667
+4599 38500.0000 23966.6667
+4600 38500.0000 24016.6667
+4601 38500.0000 24083.3333
+4602 38500.0000 24116.6667
+4603 38500.0000 24133.3333
+4604 38500.0000 25916.6667
+4605 38516.6667 21283.3333
+4606 38516.6667 21383.3333
+4607 38516.6667 21433.3333
+4608 38516.6667 21466.6667
+4609 38516.6667 21533.3333
+4610 38516.6667 21550.0000
+4611 38516.6667 21566.6667
+4612 38516.6667 21666.6667
+4613 38516.6667 21683.3333
+4614 38516.6667 21716.6667
+4615 38516.6667 21766.6667
+4616 38516.6667 21783.3333
+4617 38516.6667 21833.3333
+4618 38516.6667 21866.6667
+4619 38516.6667 21883.3333
+4620 38516.6667 21916.6667
+4621 38516.6667 21950.0000
+4622 38516.6667 21966.6667
+4623 38516.6667 22166.6667
+4624 38516.6667 22383.3333
+4625 38516.6667 22550.0000
+4626 38516.6667 22733.3333
+4627 38516.6667 22783.3333
+4628 38516.6667 22950.0000
+4629 38516.6667 23033.3333
+4630 38516.6667 23633.3333
+4631 38516.6667 23650.0000
+4632 38516.6667 23783.3333
+4633 38516.6667 23850.0000
+4634 38516.6667 23983.3333
+4635 38516.6667 24000.0000
+4636 38516.6667 24033.3333
+4637 38516.6667 24100.0000
+4638 38516.6667 24133.3333
+4639 38516.6667 24150.0000
+4640 38516.6667 24166.6667
+4641 38516.6667 25883.3333
+4642 38516.6667 26216.6667
+4643 38533.3333 21083.3333
+4644 38533.3333 21183.3333
+4645 38533.3333 21216.6667
+4646 38533.3333 21366.6667
+4647 38533.3333 21383.3333
+4648 38533.3333 21400.0000
+4649 38533.3333 21416.6667
+4650 38533.3333 21433.3333
+4651 38533.3333 21450.0000
+4652 38533.3333 21500.0000
+4653 38533.3333 21533.3333
+4654 38533.3333 21550.0000
+4655 38533.3333 21566.6667
+4656 38533.3333 21683.3333
+4657 38533.3333 21700.0000
+4658 38533.3333 21766.6667
+4659 38533.3333 21816.6667
+4660 38533.3333 21833.3333
+4661 38533.3333 21900.0000
+4662 38533.3333 21916.6667
+4663 38533.3333 21933.3333
+4664 38533.3333 21983.3333
+4665 38533.3333 22033.3333
+4666 38533.3333 22100.0000
+4667 38533.3333 22200.0000
+4668 38533.3333 22266.6667
+4669 38533.3333 22383.3333
+4670 38533.3333 22500.0000
+4671 38533.3333 22850.0000
+4672 38533.3333 23016.6667
+4673 38533.3333 23100.0000
+4674 38533.3333 23716.6667
+4675 38533.3333 23816.6667
+4676 38533.3333 23850.0000
+4677 38533.3333 23916.6667
+4678 38533.3333 23933.3333
+4679 38533.3333 23983.3333
+4680 38533.3333 24050.0000
+4681 38533.3333 24066.6667
+4682 38533.3333 24083.3333
+4683 38533.3333 24116.6667
+4684 38533.3333 24133.3333
+4685 38533.3333 25566.6667
+4686 38533.3333 25933.3333
+4687 38533.3333 25950.0000
+4688 38533.3333 26100.0000
+4689 38533.3333 26116.6667
+4690 38550.0000 21233.3333
+4691 38550.0000 21333.3333
+4692 38550.0000 21366.6667
+4693 38550.0000 21383.3333
+4694 38550.0000 21533.3333
+4695 38550.0000 21650.0000
+4696 38550.0000 21666.6667
+4697 38550.0000 21700.0000
+4698 38550.0000 21800.0000
+4699 38550.0000 21816.6667
+4700 38550.0000 21866.6667
+4701 38550.0000 22016.6667
+4702 38550.0000 22066.6667
+4703 38550.0000 22116.6667
+4704 38550.0000 22166.6667
+4705 38550.0000 22416.6667
+4706 38550.0000 22833.3333
+4707 38550.0000 23083.3333
+4708 38550.0000 23783.3333
+4709 38550.0000 23850.0000
+4710 38550.0000 23900.0000
+4711 38550.0000 24000.0000
+4712 38550.0000 24050.0000
+4713 38550.0000 24083.3333
+4714 38550.0000 25850.0000
+4715 38550.0000 25933.3333
+4716 38566.6667 20916.6667
+4717 38566.6667 21100.0000
+4718 38566.6667 21300.0000
+4719 38566.6667 21633.3333
+4720 38566.6667 21650.0000
+4721 38566.6667 21666.6667
+4722 38566.6667 21683.3333
+4723 38566.6667 21700.0000
+4724 38566.6667 21850.0000
+4725 38566.6667 21916.6667
+4726 38566.6667 21966.6667
+4727 38566.6667 22016.6667
+4728 38566.6667 22150.0000
+4729 38566.6667 22700.0000
+4730 38566.6667 22750.0000
+4731 38566.6667 22783.3333
+4732 38566.6667 22866.6667
+4733 38566.6667 23100.0000
+4734 38566.6667 23216.6667
+4735 38566.6667 23283.3333
+4736 38566.6667 23600.0000
+4737 38566.6667 23633.3333
+4738 38566.6667 23766.6667
+4739 38566.6667 23816.6667
+4740 38566.6667 23833.3333
+4741 38566.6667 23850.0000
+4742 38566.6667 24050.0000
+4743 38566.6667 24066.6667
+4744 38566.6667 24083.3333
+4745 38566.6667 25866.6667
+4746 38566.6667 25883.3333
+4747 38566.6667 25916.6667
+4748 38566.6667 25950.0000
+4749 38566.6667 25983.3333
+4750 38566.6667 26033.3333
+4751 38583.3333 20550.0000
+4752 38583.3333 21066.6667
+4753 38583.3333 21150.0000
+4754 38583.3333 21166.6667
+4755 38583.3333 21233.3333
+4756 38583.3333 21383.3333
+4757 38583.3333 21450.0000
+4758 38583.3333 21616.6667
+4759 38583.3333 21633.3333
+4760 38583.3333 21650.0000
+4761 38583.3333 21666.6667
+4762 38583.3333 21683.3333
+4763 38583.3333 21716.6667
+4764 38583.3333 21750.0000
+4765 38583.3333 21833.3333
+4766 38583.3333 21883.3333
+4767 38583.3333 21933.3333
+4768 38583.3333 21983.3333
+4769 38583.3333 22050.0000
+4770 38583.3333 22333.3333
+4771 38583.3333 22416.6667
+4772 38583.3333 22666.6667
+4773 38583.3333 22750.0000
+4774 38583.3333 22800.0000
+4775 38583.3333 22950.0000
+4776 38583.3333 23033.3333
+4777 38583.3333 23550.0000
+4778 38583.3333 23633.3333
+4779 38583.3333 23716.6667
+4780 38583.3333 23766.6667
+4781 38583.3333 23800.0000
+4782 38583.3333 23833.3333
+4783 38583.3333 24050.0000
+4784 38583.3333 24066.6667
+4785 38583.3333 24083.3333
+4786 38583.3333 24100.0000
+4787 38583.3333 24116.6667
+4788 38583.3333 24133.3333
+4789 38583.3333 25916.6667
+4790 38583.3333 25966.6667
+4791 38583.3333 26016.6667
+4792 38600.0000 20883.3333
+4793 38600.0000 21083.3333
+4794 38600.0000 21183.3333
+4795 38600.0000 21316.6667
+4796 38600.0000 21400.0000
+4797 38600.0000 21450.0000
+4798 38600.0000 21483.3333
+4799 38600.0000 21500.0000
+4800 38600.0000 21550.0000
+4801 38600.0000 21566.6667
+4802 38600.0000 21583.3333
+4803 38600.0000 21600.0000
+4804 38600.0000 21650.0000
+4805 38600.0000 21666.6667
+4806 38600.0000 21733.3333
+4807 38600.0000 21800.0000
+4808 38600.0000 21850.0000
+4809 38600.0000 21933.3333
+4810 38600.0000 22050.0000
+4811 38600.0000 22116.6667
+4812 38600.0000 22183.3333
+4813 38600.0000 22500.0000
+4814 38600.0000 22716.6667
+4815 38600.0000 22766.6667
+4816 38600.0000 22850.0000
+4817 38600.0000 23216.6667
+4818 38600.0000 23550.0000
+4819 38600.0000 23666.6667
+4820 38600.0000 23783.3333
+4821 38600.0000 24083.3333
+4822 38600.0000 24100.0000
+4823 38600.0000 24116.6667
+4824 38616.6667 20600.0000
+4825 38616.6667 20666.6667
+4826 38616.6667 20683.3333
+4827 38616.6667 20933.3333
+4828 38616.6667 21216.6667
+4829 38616.6667 21300.0000
+4830 38616.6667 21316.6667
+4831 38616.6667 21383.3333
+4832 38616.6667 21450.0000
+4833 38616.6667 21500.0000
+4834 38616.6667 21516.6667
+4835 38616.6667 21533.3333
+4836 38616.6667 21566.6667
+4837 38616.6667 21600.0000
+4838 38616.6667 21616.6667
+4839 38616.6667 21683.3333
+4840 38616.6667 21700.0000
+4841 38616.6667 21783.3333
+4842 38616.6667 21883.3333
+4843 38616.6667 22200.0000
+4844 38616.6667 22550.0000
+4845 38616.6667 22650.0000
+4846 38616.6667 23116.6667
+4847 38616.6667 23166.6667
+4848 38616.6667 23233.3333
+4849 38616.6667 23533.3333
+4850 38616.6667 23566.6667
+4851 38616.6667 23700.0000
+4852 38616.6667 23733.3333
+4853 38616.6667 23750.0000
+4854 38616.6667 23883.3333
+4855 38616.6667 23950.0000
+4856 38616.6667 24050.0000
+4857 38616.6667 24066.6667
+4858 38616.6667 24083.3333
+4859 38616.6667 24116.6667
+4860 38633.3333 20600.0000
+4861 38633.3333 20633.3333
+4862 38633.3333 20650.0000
+4863 38633.3333 20716.6667
+4864 38633.3333 21150.0000
+4865 38633.3333 21183.3333
+4866 38633.3333 21350.0000
+4867 38633.3333 21366.6667
+4868 38633.3333 21400.0000
+4869 38633.3333 21416.6667
+4870 38633.3333 21433.3333
+4871 38633.3333 21450.0000
+4872 38633.3333 21466.6667
+4873 38633.3333 21483.3333
+4874 38633.3333 21566.6667
+4875 38633.3333 21583.3333
+4876 38633.3333 21616.6667
+4877 38633.3333 21666.6667
+4878 38633.3333 21683.3333
+4879 38633.3333 21700.0000
+4880 38633.3333 21716.6667
+4881 38633.3333 21733.3333
+4882 38633.3333 21800.0000
+4883 38633.3333 21983.3333
+4884 38633.3333 22016.6667
+4885 38633.3333 22100.0000
+4886 38633.3333 22183.3333
+4887 38633.3333 22216.6667
+4888 38633.3333 22500.0000
+4889 38633.3333 22533.3333
+4890 38633.3333 22583.3333
+4891 38633.3333 22733.3333
+4892 38633.3333 22766.6667
+4893 38633.3333 22883.3333
+4894 38633.3333 23083.3333
+4895 38633.3333 23600.0000
+4896 38633.3333 23616.6667
+4897 38633.3333 23633.3333
+4898 38633.3333 23933.3333
+4899 38633.3333 24050.0000
+4900 38633.3333 24066.6667
+4901 38633.3333 24083.3333
+4902 38633.3333 24100.0000
+4903 38633.3333 24133.3333
+4904 38650.0000 20683.3333
+4905 38650.0000 20783.3333
+4906 38650.0000 20933.3333
+4907 38650.0000 21283.3333
+4908 38650.0000 21383.3333
+4909 38650.0000 21416.6667
+4910 38650.0000 21450.0000
+4911 38650.0000 21483.3333
+4912 38650.0000 21533.3333
+4913 38650.0000 21550.0000
+4914 38650.0000 21616.6667
+4915 38650.0000 21650.0000
+4916 38650.0000 21683.3333
+4917 38650.0000 21750.0000
+4918 38650.0000 21766.6667
+4919 38650.0000 21833.3333
+4920 38650.0000 21916.6667
+4921 38650.0000 21966.6667
+4922 38650.0000 22033.3333
+4923 38650.0000 22066.6667
+4924 38650.0000 22416.6667
+4925 38650.0000 22466.6667
+4926 38650.0000 23000.0000
+4927 38650.0000 23166.6667
+4928 38650.0000 23183.3333
+4929 38650.0000 23583.3333
+4930 38650.0000 23900.0000
+4931 38666.6667 20566.6667
+4932 38666.6667 20600.0000
+4933 38666.6667 20650.0000
+4934 38666.6667 20700.0000
+4935 38666.6667 20766.6667
+4936 38666.6667 20783.3333
+4937 38666.6667 20933.3333
+4938 38666.6667 21083.3333
+4939 38666.6667 21150.0000
+4940 38666.6667 21316.6667
+4941 38666.6667 21366.6667
+4942 38666.6667 21383.3333
+4943 38666.6667 21433.3333
+4944 38666.6667 21500.0000
+4945 38666.6667 21516.6667
+4946 38666.6667 21533.3333
+4947 38666.6667 21616.6667
+4948 38666.6667 21633.3333
+4949 38666.6667 21716.6667
+4950 38666.6667 21733.3333
+4951 38666.6667 21816.6667
+4952 38666.6667 21833.3333
+4953 38666.6667 21866.6667
+4954 38666.6667 21900.0000
+4955 38666.6667 22000.0000
+4956 38666.6667 22433.3333
+4957 38666.6667 22566.6667
+4958 38666.6667 22666.6667
+4959 38666.6667 22883.3333
+4960 38666.6667 23083.3333
+4961 38666.6667 23783.3333
+4962 38666.6667 23816.6667
+4963 38683.3333 20583.3333
+4964 38683.3333 20616.6667
+4965 38683.3333 20666.6667
+4966 38683.3333 20683.3333
+4967 38683.3333 20700.0000
+4968 38683.3333 21266.6667
+4969 38683.3333 21366.6667
+4970 38683.3333 21416.6667
+4971 38683.3333 21466.6667
+4972 38683.3333 21483.3333
+4973 38683.3333 21533.3333
+4974 38683.3333 21666.6667
+4975 38683.3333 21750.0000
+4976 38683.3333 21800.0000
+4977 38683.3333 21833.3333
+4978 38683.3333 21866.6667
+4979 38683.3333 21900.0000
+4980 38683.3333 21983.3333
+4981 38683.3333 22200.0000
+4982 38683.3333 22333.3333
+4983 38683.3333 23000.0000
+4984 38683.3333 23583.3333
+4985 38683.3333 23733.3333
+4986 38683.3333 23766.6667
+4987 38683.3333 23783.3333
+4988 38700.0000 20616.6667
+4989 38700.0000 20633.3333
+4990 38700.0000 20683.3333
+4991 38700.0000 20700.0000
+4992 38700.0000 20716.6667
+4993 38700.0000 20933.3333
+4994 38700.0000 20966.6667
+4995 38700.0000 21000.0000
+4996 38700.0000 21033.3333
+4997 38700.0000 21183.3333
+4998 38700.0000 21283.3333
+4999 38700.0000 21333.3333
+5000 38700.0000 21350.0000
+5001 38700.0000 21366.6667
+5002 38700.0000 21450.0000
+5003 38700.0000 21600.0000
+5004 38700.0000 21650.0000
+5005 38700.0000 21700.0000
+5006 38700.0000 21733.3333
+5007 38700.0000 21783.3333
+5008 38700.0000 21933.3333
+5009 38700.0000 22033.3333
+5010 38700.0000 22183.3333
+5011 38700.0000 22250.0000
+5012 38700.0000 22283.3333
+5013 38700.0000 22350.0000
+5014 38700.0000 22416.6667
+5015 38700.0000 22633.3333
+5016 38700.0000 23583.3333
+5017 38716.6667 20583.3333
+5018 38716.6667 20600.0000
+5019 38716.6667 20666.6667
+5020 38716.6667 20683.3333
+5021 38716.6667 20733.3333
+5022 38716.6667 20933.3333
+5023 38716.6667 21083.3333
+5024 38716.6667 21166.6667
+5025 38716.6667 21466.6667
+5026 38716.6667 21516.6667
+5027 38716.6667 21533.3333
+5028 38716.6667 21566.6667
+5029 38716.6667 21650.0000
+5030 38716.6667 21683.3333
+5031 38716.6667 21700.0000
+5032 38716.6667 21800.0000
+5033 38716.6667 21866.6667
+5034 38716.6667 21966.6667
+5035 38716.6667 22366.6667
+5036 38716.6667 22400.0000
+5037 38716.6667 22466.6667
+5038 38716.6667 22483.3333
+5039 38716.6667 22550.0000
+5040 38716.6667 22583.3333
+5041 38716.6667 22700.0000
+5042 38716.6667 22883.3333
+5043 38716.6667 22933.3333
+5044 38716.6667 23050.0000
+5045 38716.6667 23433.3333
+5046 38716.6667 23450.0000
+5047 38716.6667 23733.3333
+5048 38716.6667 23750.0000
+5049 38733.3333 20650.0000
+5050 38733.3333 20666.6667
+5051 38733.3333 20983.3333
+5052 38733.3333 21116.6667
+5053 38733.3333 21350.0000
+5054 38733.3333 21450.0000
+5055 38733.3333 21466.6667
+5056 38733.3333 21516.6667
+5057 38733.3333 21650.0000
+5058 38733.3333 21666.6667
+5059 38733.3333 21700.0000
+5060 38733.3333 21716.6667
+5061 38733.3333 21733.3333
+5062 38733.3333 21916.6667
+5063 38733.3333 21933.3333
+5064 38733.3333 21966.6667
+5065 38733.3333 22000.0000
+5066 38733.3333 22233.3333
+5067 38733.3333 22333.3333
+5068 38733.3333 22400.0000
+5069 38733.3333 22450.0000
+5070 38733.3333 22666.6667
+5071 38733.3333 22733.3333
+5072 38733.3333 22750.0000
+5073 38733.3333 22933.3333
+5074 38733.3333 23333.3333
+5075 38733.3333 23416.6667
+5076 38733.3333 23483.3333
+5077 38750.0000 20600.0000
+5078 38750.0000 20616.6667
+5079 38750.0000 20650.0000
+5080 38750.0000 20683.3333
+5081 38750.0000 20716.6667
+5082 38750.0000 21033.3333
+5083 38750.0000 21066.6667
+5084 38750.0000 21133.3333
+5085 38750.0000 21200.0000
+5086 38750.0000 21400.0000
+5087 38750.0000 21433.3333
+5088 38750.0000 21450.0000
+5089 38750.0000 21516.6667
+5090 38750.0000 21533.3333
+5091 38750.0000 21616.6667
+5092 38750.0000 21666.6667
+5093 38750.0000 21683.3333
+5094 38750.0000 21700.0000
+5095 38750.0000 21750.0000
+5096 38750.0000 21783.3333
+5097 38750.0000 21816.6667
+5098 38750.0000 21850.0000
+5099 38750.0000 21916.6667
+5100 38750.0000 22166.6667
+5101 38750.0000 22216.6667
+5102 38750.0000 22266.6667
+5103 38750.0000 22450.0000
+5104 38750.0000 22616.6667
+5105 38750.0000 22700.0000
+5106 38750.0000 22783.3333
+5107 38750.0000 22950.0000
+5108 38750.0000 23033.3333
+5109 38750.0000 23400.0000
+5110 38750.0000 23433.3333
+5111 38750.0000 23583.3333
+5112 38750.0000 23666.6667
+5113 38750.0000 23733.3333
+5114 38766.6667 20633.3333
+5115 38766.6667 20650.0000
+5116 38766.6667 20716.6667
+5117 38766.6667 20883.3333
+5118 38766.6667 20983.3333
+5119 38766.6667 21400.0000
+5120 38766.6667 21416.6667
+5121 38766.6667 21433.3333
+5122 38766.6667 21483.3333
+5123 38766.6667 21583.3333
+5124 38766.6667 21616.6667
+5125 38766.6667 21700.0000
+5126 38766.6667 21750.0000
+5127 38766.6667 21783.3333
+5128 38766.6667 21800.0000
+5129 38766.6667 21883.3333
+5130 38766.6667 22133.3333
+5131 38766.6667 22366.6667
+5132 38766.6667 22400.0000
+5133 38766.6667 22450.0000
+5134 38766.6667 22616.6667
+5135 38766.6667 22650.0000
+5136 38766.6667 22850.0000
+5137 38766.6667 22900.0000
+5138 38766.6667 23316.6667
+5139 38766.6667 23433.3333
+5140 38766.6667 23550.0000
+5141 38766.6667 23700.0000
+5142 38783.3333 20616.6667
+5143 38783.3333 20650.0000
+5144 38783.3333 20666.6667
+5145 38783.3333 20700.0000
+5146 38783.3333 20833.3333
+5147 38783.3333 20883.3333
+5148 38783.3333 20900.0000
+5149 38783.3333 21033.3333
+5150 38783.3333 21116.6667
+5151 38783.3333 21283.3333
+5152 38783.3333 21433.3333
+5153 38783.3333 21450.0000
+5154 38783.3333 21483.3333
+5155 38783.3333 21533.3333
+5156 38783.3333 21616.6667
+5157 38783.3333 21633.3333
+5158 38783.3333 21683.3333
+5159 38783.3333 21716.6667
+5160 38783.3333 21866.6667
+5161 38783.3333 22083.3333
+5162 38783.3333 22366.6667
+5163 38783.3333 22416.6667
+5164 38783.3333 22583.3333
+5165 38783.3333 22783.3333
+5166 38783.3333 23266.6667
+5167 38783.3333 23300.0000
+5168 38783.3333 23333.3333
+5169 38783.3333 23400.0000
+5170 38783.3333 23433.3333
+5171 38783.3333 23500.0000
+5172 38800.0000 20716.6667
+5173 38800.0000 20766.6667
+5174 38800.0000 21166.6667
+5175 38800.0000 21366.6667
+5176 38800.0000 21450.0000
+5177 38800.0000 21466.6667
+5178 38800.0000 21516.6667
+5179 38800.0000 21583.3333
+5180 38800.0000 21616.6667
+5181 38800.0000 21633.3333
+5182 38800.0000 21650.0000
+5183 38800.0000 21716.6667
+5184 38800.0000 21733.3333
+5185 38800.0000 21800.0000
+5186 38800.0000 22050.0000
+5187 38800.0000 22116.6667
+5188 38800.0000 22200.0000
+5189 38800.0000 22383.3333
+5190 38800.0000 22416.6667
+5191 38800.0000 22450.0000
+5192 38800.0000 22466.6667
+5193 38800.0000 22500.0000
+5194 38800.0000 22533.3333
+5195 38800.0000 22550.0000
+5196 38800.0000 22700.0000
+5197 38800.0000 22716.6667
+5198 38800.0000 23350.0000
+5199 38800.0000 23433.3333
+5200 38800.0000 23483.3333
+5201 38800.0000 23500.0000
+5202 38800.0000 23516.6667
+5203 38800.0000 24583.3333
+5204 38816.6667 20650.0000
+5205 38816.6667 20683.3333
+5206 38816.6667 20716.6667
+5207 38816.6667 20750.0000
+5208 38816.6667 20833.3333
+5209 38816.6667 20916.6667
+5210 38816.6667 21016.6667
+5211 38816.6667 21233.3333
+5212 38816.6667 21333.3333
+5213 38816.6667 21366.6667
+5214 38816.6667 21383.3333
+5215 38816.6667 21400.0000
+5216 38816.6667 21433.3333
+5217 38816.6667 21466.6667
+5218 38816.6667 21500.0000
+5219 38816.6667 21616.6667
+5220 38816.6667 22000.0000
+5221 38816.6667 22016.6667
+5222 38816.6667 22166.6667
+5223 38816.6667 22433.3333
+5224 38816.6667 22600.0000
+5225 38816.6667 22650.0000
+5226 38816.6667 22683.3333
+5227 38816.6667 22733.3333
+5228 38816.6667 23233.3333
+5229 38816.6667 23250.0000
+5230 38816.6667 23266.6667
+5231 38816.6667 23366.6667
+5232 38816.6667 23416.6667
+5233 38816.6667 23450.0000
+5234 38833.3333 20683.3333
+5235 38833.3333 20700.0000
+5236 38833.3333 20750.0000
+5237 38833.3333 20900.0000
+5238 38833.3333 21000.0000
+5239 38833.3333 21066.6667
+5240 38833.3333 21183.3333
+5241 38833.3333 21250.0000
+5242 38833.3333 21416.6667
+5243 38833.3333 21466.6667
+5244 38833.3333 21516.6667
+5245 38833.3333 21533.3333
+5246 38833.3333 21583.3333
+5247 38833.3333 21600.0000
+5248 38833.3333 21616.6667
+5249 38833.3333 21633.3333
+5250 38833.3333 21716.6667
+5251 38833.3333 21733.3333
+5252 38833.3333 21800.0000
+5253 38833.3333 21966.6667
+5254 38833.3333 22050.0000
+5255 38833.3333 22083.3333
+5256 38833.3333 22166.6667
+5257 38833.3333 22400.0000
+5258 38833.3333 22416.6667
+5259 38833.3333 22450.0000
+5260 38833.3333 22883.3333
+5261 38833.3333 23250.0000
+5262 38833.3333 23283.3333
+5263 38833.3333 23333.3333
+5264 38833.3333 23366.6667
+5265 38833.3333 23400.0000
+5266 38833.3333 23466.6667
+5267 38833.3333 24533.3333
+5268 38850.0000 20950.0000
+5269 38850.0000 21333.3333
+5270 38850.0000 21383.3333
+5271 38850.0000 21450.0000
+5272 38850.0000 21466.6667
+5273 38850.0000 21516.6667
+5274 38850.0000 21633.3333
+5275 38850.0000 21916.6667
+5276 38850.0000 21933.3333
+5277 38850.0000 21966.6667
+5278 38850.0000 22183.3333
+5279 38850.0000 22216.6667
+5280 38850.0000 22366.6667
+5281 38850.0000 22383.3333
+5282 38850.0000 22433.3333
+5283 38850.0000 22466.6667
+5284 38850.0000 22866.6667
+5285 38850.0000 22900.0000
+5286 38850.0000 23050.0000
+5287 38850.0000 23066.6667
+5288 38850.0000 23100.0000
+5289 38850.0000 23116.6667
+5290 38850.0000 23133.3333
+5291 38850.0000 23250.0000
+5292 38850.0000 23283.3333
+5293 38850.0000 23300.0000
+5294 38850.0000 23400.0000
+5295 38866.6667 20800.0000
+5296 38866.6667 20983.3333
+5297 38866.6667 21000.0000
+5298 38866.6667 21016.6667
+5299 38866.6667 21033.3333
+5300 38866.6667 21066.6667
+5301 38866.6667 21166.6667
+5302 38866.6667 21283.3333
+5303 38866.6667 21350.0000
+5304 38866.6667 21366.6667
+5305 38866.6667 21500.0000
+5306 38866.6667 21516.6667
+5307 38866.6667 21566.6667
+5308 38866.6667 21583.3333
+5309 38866.6667 21616.6667
+5310 38866.6667 21633.3333
+5311 38866.6667 21666.6667
+5312 38866.6667 21683.3333
+5313 38866.6667 21700.0000
+5314 38866.6667 21733.3333
+5315 38866.6667 21750.0000
+5316 38866.6667 21766.6667
+5317 38866.6667 21783.3333
+5318 38866.6667 21966.6667
+5319 38866.6667 22033.3333
+5320 38866.6667 22133.3333
+5321 38866.6667 22200.0000
+5322 38866.6667 22233.3333
+5323 38866.6667 22350.0000
+5324 38866.6667 22750.0000
+5325 38866.6667 22966.6667
+5326 38866.6667 23216.6667
+5327 38866.6667 23233.3333
+5328 38866.6667 23366.6667
+5329 38866.6667 23400.0000
+5330 38883.3333 21200.0000
+5331 38883.3333 21550.0000
+5332 38883.3333 21566.6667
+5333 38883.3333 21600.0000
+5334 38883.3333 21650.0000
+5335 38883.3333 21700.0000
+5336 38883.3333 21750.0000
+5337 38883.3333 21800.0000
+5338 38883.3333 21833.3333
+5339 38883.3333 21966.6667
+5340 38883.3333 22050.0000
+5341 38883.3333 22100.0000
+5342 38883.3333 22116.6667
+5343 38883.3333 22200.0000
+5344 38883.3333 22216.6667
+5345 38883.3333 22250.0000
+5346 38883.3333 22266.6667
+5347 38883.3333 22316.6667
+5348 38883.3333 22400.0000
+5349 38883.3333 22416.6667
+5350 38883.3333 22433.3333
+5351 38883.3333 22466.6667
+5352 38883.3333 22483.3333
+5353 38883.3333 22716.6667
+5354 38883.3333 22783.3333
+5355 38883.3333 22816.6667
+5356 38883.3333 23050.0000
+5357 38883.3333 23166.6667
+5358 38900.0000 21100.0000
+5359 38900.0000 21316.6667
+5360 38900.0000 21333.3333
+5361 38900.0000 21450.0000
+5362 38900.0000 21566.6667
+5363 38900.0000 21583.3333
+5364 38900.0000 21600.0000
+5365 38900.0000 21633.3333
+5366 38900.0000 21716.6667
+5367 38900.0000 21766.6667
+5368 38900.0000 21866.6667
+5369 38900.0000 22033.3333
+5370 38900.0000 22050.0000
+5371 38900.0000 22066.6667
+5372 38900.0000 22100.0000
+5373 38900.0000 22116.6667
+5374 38900.0000 22166.6667
+5375 38900.0000 22216.6667
+5376 38900.0000 22233.3333
+5377 38900.0000 22283.3333
+5378 38900.0000 22333.3333
+5379 38900.0000 22366.6667
+5380 38900.0000 22433.3333
+5381 38900.0000 22583.3333
+5382 38900.0000 22733.3333
+5383 38900.0000 23033.3333
+5384 38900.0000 23050.0000
+5385 38900.0000 23066.6667
+5386 38900.0000 23133.3333
+5387 38900.0000 23166.6667
+5388 38900.0000 23183.3333
+5389 38900.0000 23216.6667
+5390 38900.0000 23266.6667
+5391 38900.0000 23333.3333
+5392 38900.0000 23350.0000
+5393 38900.0000 23400.0000
+5394 38904.1667 24563.0556
+5395 38916.6667 20883.3333
+5396 38916.6667 20950.0000
+5397 38916.6667 21200.0000
+5398 38916.6667 21216.6667
+5399 38916.6667 21266.6667
+5400 38916.6667 21483.3333
+5401 38916.6667 21633.3333
+5402 38916.6667 21666.6667
+5403 38916.6667 21683.3333
+5404 38916.6667 21783.3333
+5405 38916.6667 21916.6667
+5406 38916.6667 22000.0000
+5407 38916.6667 22166.6667
+5408 38916.6667 22216.6667
+5409 38916.6667 22233.3333
+5410 38916.6667 22300.0000
+5411 38916.6667 22550.0000
+5412 38916.6667 22616.6667
+5413 38916.6667 22650.0000
+5414 38916.6667 22700.0000
+5415 38916.6667 22800.0000
+5416 38916.6667 23116.6667
+5417 38916.6667 23183.3333
+5418 38916.6667 23200.0000
+5419 38916.6667 23216.6667
+5420 38933.3333 20850.0000
+5421 38933.3333 21150.0000
+5422 38933.3333 21400.0000
+5423 38933.3333 21433.3333
+5424 38933.3333 21600.0000
+5425 38933.3333 21700.0000
+5426 38933.3333 21716.6667
+5427 38933.3333 21916.6667
+5428 38933.3333 21983.3333
+5429 38933.3333 22016.6667
+5430 38933.3333 22033.3333
+5431 38933.3333 22116.6667
+5432 38933.3333 22250.0000
+5433 38933.3333 22350.0000
+5434 38933.3333 22400.0000
+5435 38933.3333 22416.6667
+5436 38933.3333 22733.3333
+5437 38933.3333 22783.3333
+5438 38933.3333 23066.6667
+5439 38933.3333 23150.0000
+5440 38933.3333 23166.6667
+5441 38933.3333 23283.3333
+5442 38933.3333 23366.6667
+5443 38933.3333 23416.6667
+5444 38950.0000 20733.3333
+5445 38950.0000 20750.0000
+5446 38950.0000 21183.3333
+5447 38950.0000 21200.0000
+5448 38950.0000 21416.6667
+5449 38950.0000 21516.6667
+5450 38950.0000 21600.0000
+5451 38950.0000 21650.0000
+5452 38950.0000 21666.6667
+5453 38950.0000 21883.3333
+5454 38950.0000 21966.6667
+5455 38950.0000 22050.0000
+5456 38950.0000 22150.0000
+5457 38950.0000 22200.0000
+5458 38950.0000 22216.6667
+5459 38950.0000 22316.6667
+5460 38950.0000 22516.6667
+5461 38950.0000 22633.3333
+5462 38950.0000 22833.3333
+5463 38950.0000 22916.6667
+5464 38950.0000 22966.6667
+5465 38950.0000 23100.0000
+5466 38950.0000 23150.0000
+5467 38950.0000 23183.3333
+5468 38950.0000 23266.6667
+5469 38962.5000 21150.0000
+5470 38966.6667 20783.3333
+5471 38966.6667 21166.6667
+5472 38966.6667 21183.3333
+5473 38966.6667 21200.0000
+5474 38966.6667 21216.6667
+5475 38966.6667 21283.3333
+5476 38966.6667 21316.6667
+5477 38966.6667 21333.3333
+5478 38966.6667 21450.0000
+5479 38966.6667 21483.3333
+5480 38966.6667 21566.6667
+5481 38966.6667 21616.6667
+5482 38966.6667 21716.6667
+5483 38966.6667 21866.6667
+5484 38966.6667 21966.6667
+5485 38966.6667 22000.0000
+5486 38966.6667 22100.0000
+5487 38966.6667 22116.6667
+5488 38966.6667 22166.6667
+5489 38966.6667 22200.0000
+5490 38966.6667 22450.0000
+5491 38966.6667 22500.0000
+5492 38966.6667 22800.0000
+5493 38966.6667 22900.0000
+5494 38966.6667 23150.0000
+5495 38966.6667 23166.6667
+5496 38966.6667 23233.3333
+5497 38966.6667 23300.0000
+5498 38966.6667 23350.0000
+5499 38976.3889 26368.3333
+5500 38983.3333 20783.3333
+5501 38983.3333 21300.0000
+5502 38983.3333 21350.0000
+5503 38983.3333 21366.6667
+5504 38983.3333 21383.3333
+5505 38983.3333 21400.0000
+5506 38983.3333 21433.3333
+5507 38983.3333 21616.6667
+5508 38983.3333 21683.3333
+5509 38983.3333 21816.6667
+5510 38983.3333 21900.0000
+5511 38983.3333 22000.0000
+5512 38983.3333 22566.6667
+5513 38983.3333 22850.0000
+5514 38983.3333 23233.3333
+5515 38983.3333 23316.6667
+5516 38983.3333 26383.3333
+5517 38983.3333 26400.0000
+5518 38988.3333 26311.3889
+5519 39000.0000 20700.0000
+5520 39000.0000 21150.0000
+5521 39000.0000 21166.6667
+5522 39000.0000 21200.0000
+5523 39000.0000 21250.0000
+5524 39000.0000 21300.0000
+5525 39000.0000 21383.3333
+5526 39000.0000 21466.6667
+5527 39000.0000 21600.0000
+5528 39000.0000 21616.6667
+5529 39000.0000 21633.3333
+5530 39000.0000 21716.6667
+5531 39000.0000 21733.3333
+5532 39000.0000 21800.0000
+5533 39000.0000 21850.0000
+5534 39000.0000 21916.6667
+5535 39000.0000 21933.3333
+5536 39000.0000 22000.0000
+5537 39000.0000 22116.6667
+5538 39000.0000 22216.6667
+5539 39000.0000 22266.6667
+5540 39000.0000 22350.0000
+5541 39000.0000 22933.3333
+5542 39000.0000 22950.0000
+5543 39000.0000 23116.6667
+5544 39000.0000 23200.0000
+5545 39000.0000 23250.0000
+5546 39000.0000 23333.3333
+5547 39000.0000 26316.6667
+5548 39016.6667 20916.6667
+5549 39016.6667 21200.0000
+5550 39016.6667 21266.6667
+5551 39016.6667 21316.6667
+5552 39016.6667 21383.3333
+5553 39016.6667 21400.0000
+5554 39016.6667 21550.0000
+5555 39016.6667 21683.3333
+5556 39016.6667 21700.0000
+5557 39016.6667 21766.6667
+5558 39016.6667 21783.3333
+5559 39016.6667 21816.6667
+5560 39016.6667 21900.0000
+5561 39016.6667 22133.3333
+5562 39016.6667 22250.0000
+5563 39016.6667 22616.6667
+5564 39016.6667 22850.0000
+5565 39016.6667 23033.3333
+5566 39016.6667 23233.3333
+5567 39016.6667 23250.0000
+5568 39016.6667 23300.0000
+5569 39019.1667 26365.8333
+5570 39026.3889 26307.7778
+5571 39028.8889 26321.1111
+5572 39029.7222 26448.3333
+5573 39033.3333 20733.3333
+5574 39033.3333 20750.0000
+5575 39033.3333 20866.6667
+5576 39033.3333 21083.3333
+5577 39033.3333 21150.0000
+5578 39033.3333 21300.0000
+5579 39033.3333 21316.6667
+5580 39033.3333 21450.0000
+5581 39033.3333 21583.3333
+5582 39033.3333 21666.6667
+5583 39033.3333 21700.0000
+5584 39033.3333 21733.3333
+5585 39033.3333 21816.6667
+5586 39033.3333 22066.6667
+5587 39033.3333 22116.6667
+5588 39033.3333 22283.3333
+5589 39033.3333 22333.3333
+5590 39033.3333 22400.0000
+5591 39033.3333 22416.6667
+5592 39033.3333 22516.6667
+5593 39033.3333 22800.0000
+5594 39033.3333 22950.0000
+5595 39033.3333 22966.6667
+5596 39033.3333 26316.6667
+5597 39036.3889 26444.4444
+5598 39039.4444 26201.1111
+5599 39039.4444 26454.7222
+5600 39045.5556 26454.4444
+5601 39046.3889 26533.0556
+5602 39048.3333 26497.2222
+5603 39050.0000 21033.3333
+5604 39050.0000 21116.6667
+5605 39050.0000 21150.0000
+5606 39050.0000 21166.6667
+5607 39050.0000 21216.6667
+5608 39050.0000 21250.0000
+5609 39050.0000 21266.6667
+5610 39050.0000 21283.3333
+5611 39050.0000 21300.0000
+5612 39050.0000 21366.6667
+5613 39050.0000 21450.0000
+5614 39050.0000 21466.6667
+5615 39050.0000 21533.3333
+5616 39050.0000 21566.6667
+5617 39050.0000 21583.3333
+5618 39050.0000 21633.3333
+5619 39050.0000 21750.0000
+5620 39050.0000 22316.6667
+5621 39050.0000 22450.0000
+5622 39050.0000 22950.0000
+5623 39050.0000 26266.6667
+5624 39050.0000 26316.6667
+5625 39055.8333 26451.1111
+5626 39056.9444 26545.0000
+5627 39066.6667 20700.0000
+5628 39066.6667 20750.0000
+5629 39066.6667 20933.3333
+5630 39066.6667 21016.6667
+5631 39066.6667 21033.3333
+5632 39066.6667 21050.0000
+5633 39066.6667 21100.0000
+5634 39066.6667 21116.6667
+5635 39066.6667 21150.0000
+5636 39066.6667 21183.3333
+5637 39066.6667 21216.6667
+5638 39066.6667 21233.3333
+5639 39066.6667 21266.6667
+5640 39066.6667 21283.3333
+5641 39066.6667 21400.0000
+5642 39066.6667 21450.0000
+5643 39066.6667 21466.6667
+5644 39066.6667 21483.3333
+5645 39066.6667 21516.6667
+5646 39066.6667 21533.3333
+5647 39066.6667 21550.0000
+5648 39066.6667 21633.3333
+5649 39066.6667 21683.3333
+5650 39066.6667 21733.3333
+5651 39066.6667 21800.0000
+5652 39066.6667 21883.3333
+5653 39066.6667 21983.3333
+5654 39066.6667 22066.6667
+5655 39066.6667 22116.6667
+5656 39066.6667 22183.3333
+5657 39066.6667 22483.3333
+5658 39066.6667 22550.0000
+5659 39066.6667 22800.0000
+5660 39066.6667 26566.6667
+5661 39066.6667 26583.3333
+5662 39081.1111 26183.3333
+5663 39083.3333 20716.6667
+5664 39083.3333 20750.0000
+5665 39083.3333 20866.6667
+5666 39083.3333 20916.6667
+5667 39083.3333 20933.3333
+5668 39083.3333 20950.0000
+5669 39083.3333 21016.6667
+5670 39083.3333 21050.0000
+5671 39083.3333 21083.3333
+5672 39083.3333 21100.0000
+5673 39083.3333 21150.0000
+5674 39083.3333 21200.0000
+5675 39083.3333 21250.0000
+5676 39083.3333 21266.6667
+5677 39083.3333 21283.3333
+5678 39083.3333 21383.3333
+5679 39083.3333 21433.3333
+5680 39083.3333 21483.3333
+5681 39083.3333 21500.0000
+5682 39083.3333 21566.6667
+5683 39083.3333 21583.3333
+5684 39083.3333 21633.3333
+5685 39083.3333 21650.0000
+5686 39083.3333 21833.3333
+5687 39083.3333 22150.0000
+5688 39083.3333 22316.6667
+5689 39083.3333 22350.0000
+5690 39083.3333 22416.6667
+5691 39083.3333 22783.3333
+5692 39083.3333 22866.6667
+5693 39083.3333 26433.3333
+5694 39083.3333 26550.0000
+5695 39083.3333 26566.6667
+5696 39085.0000 26370.0000
+5697 39100.0000 20700.0000
+5698 39100.0000 20883.3333
+5699 39100.0000 20950.0000
+5700 39100.0000 20983.3333
+5701 39100.0000 21000.0000
+5702 39100.0000 21016.6667
+5703 39100.0000 21083.3333
+5704 39100.0000 21100.0000
+5705 39100.0000 21150.0000
+5706 39100.0000 21233.3333
+5707 39100.0000 21266.6667
+5708 39100.0000 21283.3333
+5709 39100.0000 21433.3333
+5710 39100.0000 21500.0000
+5711 39100.0000 21516.6667
+5712 39100.0000 21666.6667
+5713 39100.0000 21783.3333
+5714 39100.0000 21816.6667
+5715 39100.0000 21850.0000
+5716 39100.0000 21866.6667
+5717 39100.0000 21983.3333
+5718 39100.0000 22200.0000
+5719 39100.0000 22233.3333
+5720 39100.0000 22266.6667
+5721 39100.0000 22350.0000
+5722 39100.0000 22416.6667
+5723 39100.0000 22716.6667
+5724 39100.0000 22866.6667
+5725 39100.0000 22900.0000
+5726 39100.0000 23066.6667
+5727 39100.0000 23083.3333
+5728 39100.0000 26166.6667
+5729 39100.0000 26383.3333
+5730 39100.0000 26433.3333
+5731 39100.0000 26516.6667
+5732 39100.0000 26550.0000
+5733 39102.5000 26552.5000
+5734 39103.8889 26241.3889
+5735 39105.0000 26440.2778
+5736 39105.5556 20637.7778
+5737 39105.8333 26218.6111
+5738 39110.5556 26411.1111
+5739 39116.6667 20900.0000
+5740 39116.6667 21016.6667
+5741 39116.6667 21050.0000
+5742 39116.6667 21083.3333
+5743 39116.6667 21133.3333
+5744 39116.6667 21150.0000
+5745 39116.6667 21200.0000
+5746 39116.6667 21216.6667
+5747 39116.6667 21233.3333
+5748 39116.6667 21250.0000
+5749 39116.6667 21416.6667
+5750 39116.6667 21466.6667
+5751 39116.6667 21516.6667
+5752 39116.6667 21583.3333
+5753 39116.6667 21633.3333
+5754 39116.6667 22050.0000
+5755 39116.6667 22100.0000
+5756 39116.6667 22200.0000
+5757 39116.6667 22450.0000
+5758 39116.6667 22466.6667
+5759 39116.6667 23100.0000
+5760 39116.6667 23733.3333
+5761 39116.6667 26413.0556
+5762 39132.7778 20631.3889
+5763 39133.3333 20600.0000
+5764 39133.3333 20633.3333
+5765 39133.3333 20666.6667
+5766 39133.3333 20816.6667
+5767 39133.3333 20916.6667
+5768 39133.3333 20933.3333
+5769 39133.3333 20950.0000
+5770 39133.3333 20983.3333
+5771 39133.3333 21050.0000
+5772 39133.3333 21066.6667
+5773 39133.3333 21116.6667
+5774 39133.3333 21200.0000
+5775 39133.3333 21216.6667
+5776 39133.3333 21250.0000
+5777 39133.3333 21416.6667
+5778 39133.3333 21450.0000
+5779 39133.3333 21483.3333
+5780 39133.3333 21500.0000
+5781 39133.3333 21516.6667
+5782 39133.3333 21566.6667
+5783 39133.3333 21650.0000
+5784 39133.3333 21700.0000
+5785 39133.3333 21783.3333
+5786 39133.3333 21800.0000
+5787 39133.3333 21816.6667
+5788 39133.3333 21950.0000
+5789 39133.3333 22016.6667
+5790 39133.3333 22116.6667
+5791 39133.3333 22150.0000
+5792 39133.3333 22300.0000
+5793 39133.3333 22350.0000
+5794 39133.3333 22383.3333
+5795 39133.3333 23166.6667
+5796 39133.3333 23266.6667
+5797 39133.3333 25933.3333
+5798 39133.3333 26000.0000
+5799 39133.3333 26400.0000
+5800 39133.3333 26416.6667
+5801 39133.3333 26516.6667
+5802 39146.1111 26529.7222
+5803 39148.0556 26514.4444
+5804 39150.0000 20233.3333
+5805 39150.0000 20583.3333
+5806 39150.0000 20666.6667
+5807 39150.0000 20700.0000
+5808 39150.0000 20816.6667
+5809 39150.0000 20866.6667
+5810 39150.0000 20933.3333
+5811 39150.0000 20983.3333
+5812 39150.0000 21116.6667
+5813 39150.0000 21133.3333
+5814 39150.0000 21150.0000
+5815 39150.0000 21183.3333
+5816 39150.0000 21200.0000
+5817 39150.0000 21233.3333
+5818 39150.0000 21250.0000
+5819 39150.0000 21266.6667
+5820 39150.0000 21283.3333
+5821 39150.0000 21383.3333
+5822 39150.0000 21400.0000
+5823 39150.0000 21433.3333
+5824 39150.0000 21450.0000
+5825 39150.0000 21483.3333
+5826 39150.0000 21616.6667
+5827 39150.0000 21650.0000
+5828 39150.0000 21666.6667
+5829 39150.0000 21783.3333
+5830 39150.0000 21833.3333
+5831 39150.0000 21866.6667
+5832 39150.0000 22183.3333
+5833 39150.0000 22250.0000
+5834 39150.0000 22283.3333
+5835 39150.0000 22300.0000
+5836 39150.0000 22366.6667
+5837 39150.0000 22566.6667
+5838 39150.0000 22683.3333
+5839 39150.0000 22716.6667
+5840 39150.0000 22750.0000
+5841 39150.0000 22766.6667
+5842 39150.0000 23083.3333
+5843 39150.0000 23200.0000
+5844 39150.0000 23850.0000
+5845 39150.0000 23866.6667
+5846 39156.6667 26521.6667
+5847 39166.6667 20183.3333
+5848 39166.6667 20566.6667
+5849 39166.6667 20600.0000
+5850 39166.6667 20716.6667
+5851 39166.6667 20750.0000
+5852 39166.6667 20933.3333
+5853 39166.6667 20950.0000
+5854 39166.6667 21000.0000
+5855 39166.6667 21033.3333
+5856 39166.6667 21116.6667
+5857 39166.6667 21133.3333
+5858 39166.6667 21166.6667
+5859 39166.6667 21183.3333
+5860 39166.6667 21200.0000
+5861 39166.6667 21216.6667
+5862 39166.6667 21266.6667
+5863 39166.6667 21433.3333
+5864 39166.6667 21466.6667
+5865 39166.6667 21516.6667
+5866 39166.6667 21700.0000
+5867 39166.6667 21766.6667
+5868 39166.6667 21816.6667
+5869 39166.6667 21833.3333
+5870 39166.6667 22166.6667
+5871 39166.6667 22416.6667
+5872 39166.6667 22466.6667
+5873 39166.6667 22516.6667
+5874 39166.6667 22600.0000
+5875 39166.6667 22616.6667
+5876 39166.6667 22633.3333
+5877 39166.6667 22650.0000
+5878 39166.6667 22783.3333
+5879 39166.6667 22850.0000
+5880 39166.6667 22883.3333
+5881 39166.6667 23216.6667
+5882 39166.6667 23283.3333
+5883 39166.6667 23350.0000
+5884 39166.6667 23483.3333
+5885 39166.6667 23616.6667
+5886 39166.6667 25933.3333
+5887 39166.6667 26050.0000
+5888 39166.6667 26066.6667
+5889 39166.6667 26133.3333
+5890 39166.6667 26500.0000
+5891 39180.5556 26486.3889
+5892 39183.3333 20166.6667
+5893 39183.3333 20183.3333
+5894 39183.3333 20200.0000
+5895 39183.3333 20633.3333
+5896 39183.3333 20716.6667
+5897 39183.3333 20783.3333
+5898 39183.3333 20983.3333
+5899 39183.3333 21083.3333
+5900 39183.3333 21150.0000
+5901 39183.3333 21183.3333
+5902 39183.3333 21333.3333
+5903 39183.3333 21383.3333
+5904 39183.3333 21416.6667
+5905 39183.3333 21433.3333
+5906 39183.3333 21450.0000
+5907 39183.3333 21466.6667
+5908 39183.3333 21483.3333
+5909 39183.3333 21500.0000
+5910 39183.3333 21616.6667
+5911 39183.3333 21650.0000
+5912 39183.3333 21683.3333
+5913 39183.3333 21733.3333
+5914 39183.3333 21766.6667
+5915 39183.3333 21783.3333
+5916 39183.3333 21866.6667
+5917 39183.3333 21966.6667
+5918 39183.3333 22133.3333
+5919 39183.3333 22383.3333
+5920 39183.3333 22600.0000
+5921 39183.3333 22683.3333
+5922 39183.3333 22766.6667
+5923 39183.3333 23216.6667
+5924 39183.3333 23250.0000
+5925 39183.3333 23283.3333
+5926 39183.3333 23333.3333
+5927 39183.3333 23616.6667
+5928 39183.3333 26416.6667
+5929 39183.8889 26406.3889
+5930 39197.2222 20530.2778
+5931 39199.4444 20184.4444
+5932 39200.0000 20166.6667
+5933 39200.0000 20183.3333
+5934 39200.0000 20566.6667
+5935 39200.0000 20616.6667
+5936 39200.0000 20650.0000
+5937 39200.0000 20666.6667
+5938 39200.0000 20733.3333
+5939 39200.0000 20883.3333
+5940 39200.0000 20933.3333
+5941 39200.0000 20983.3333
+5942 39200.0000 21083.3333
+5943 39200.0000 21150.0000
+5944 39200.0000 21166.6667
+5945 39200.0000 21216.6667
+5946 39200.0000 21350.0000
+5947 39200.0000 21400.0000
+5948 39200.0000 21416.6667
+5949 39200.0000 21566.6667
+5950 39200.0000 21616.6667
+5951 39200.0000 21650.0000
+5952 39200.0000 21683.3333
+5953 39200.0000 21750.0000
+5954 39200.0000 21933.3333
+5955 39200.0000 22083.3333
+5956 39200.0000 22100.0000
+5957 39200.0000 22250.0000
+5958 39200.0000 22316.6667
+5959 39200.0000 22333.3333
+5960 39200.0000 22450.0000
+5961 39200.0000 22483.3333
+5962 39200.0000 22516.6667
+5963 39200.0000 22583.3333
+5964 39200.0000 22733.3333
+5965 39200.0000 22750.0000
+5966 39200.0000 23216.6667
+5967 39200.0000 23333.3333
+5968 39200.0000 23916.6667
+5969 39200.0000 23966.6667
+5970 39200.0000 26016.6667
+5971 39206.6667 26212.5000
+5972 39210.8333 26461.3889
+5973 39216.6667 20116.6667
+5974 39216.6667 20133.3333
+5975 39216.6667 20150.0000
+5976 39216.6667 20166.6667
+5977 39216.6667 20500.0000
+5978 39216.6667 20533.3333
+5979 39216.6667 20633.3333
+5980 39216.6667 20783.3333
+5981 39216.6667 20850.0000
+5982 39216.6667 20883.3333
+5983 39216.6667 20900.0000
+5984 39216.6667 20950.0000
+5985 39216.6667 20983.3333
+5986 39216.6667 21033.3333
+5987 39216.6667 21066.6667
+5988 39216.6667 21200.0000
+5989 39216.6667 21233.3333
+5990 39216.6667 21250.0000
+5991 39216.6667 21300.0000
+5992 39216.6667 21316.6667
+5993 39216.6667 21333.3333
+5994 39216.6667 21350.0000
+5995 39216.6667 21366.6667
+5996 39216.6667 21416.6667
+5997 39216.6667 21450.0000
+5998 39216.6667 21616.6667
+5999 39216.6667 21783.3333
+6000 39216.6667 21816.6667
+6001 39216.6667 21866.6667
+6002 39216.6667 21983.3333
+6003 39216.6667 22016.6667
+6004 39216.6667 22050.0000
+6005 39216.6667 22516.6667
+6006 39216.6667 22566.6667
+6007 39216.6667 22600.0000
+6008 39216.6667 22616.6667
+6009 39216.6667 22650.0000
+6010 39216.6667 23933.3333
+6011 39216.6667 25850.0000
+6012 39216.6667 26033.3333
+6013 39216.6667 26050.0000
+6014 39216.6667 26200.0000
+6015 39219.1667 26206.6667
+6016 39219.7222 20518.8889
+6017 39225.5556 26439.4444
+6018 39227.7778 20158.8889
+6019 39229.4444 26457.7778
+6020 39230.0000 26218.6111
+6021 39232.7778 26208.0556
+6022 39233.3333 20133.3333
+6023 39233.3333 20150.0000
+6024 39233.3333 20166.6667
+6025 39233.3333 20600.0000
+6026 39233.3333 20616.6667
+6027 39233.3333 20650.0000
+6028 39233.3333 20683.3333
+6029 39233.3333 20716.6667
+6030 39233.3333 20866.6667
+6031 39233.3333 20883.3333
+6032 39233.3333 20933.3333
+6033 39233.3333 21050.0000
+6034 39233.3333 21100.0000
+6035 39233.3333 21150.0000
+6036 39233.3333 21183.3333
+6037 39233.3333 21216.6667
+6038 39233.3333 21233.3333
+6039 39233.3333 21316.6667
+6040 39233.3333 21333.3333
+6041 39233.3333 21366.6667
+6042 39233.3333 21383.3333
+6043 39233.3333 21433.3333
+6044 39233.3333 21450.0000
+6045 39233.3333 21516.6667
+6046 39233.3333 21600.0000
+6047 39233.3333 21633.3333
+6048 39233.3333 21666.6667
+6049 39233.3333 21683.3333
+6050 39233.3333 21766.6667
+6051 39233.3333 21783.3333
+6052 39233.3333 21800.0000
+6053 39233.3333 21866.6667
+6054 39233.3333 21950.0000
+6055 39233.3333 22250.0000
+6056 39233.3333 22666.6667
+6057 39233.3333 22683.3333
+6058 39233.3333 22700.0000
+6059 39233.3333 22766.6667
+6060 39233.3333 23200.0000
+6061 39233.3333 23216.6667
+6062 39233.3333 23250.0000
+6063 39233.3333 23283.3333
+6064 39233.3333 23300.0000
+6065 39233.3333 23316.6667
+6066 39233.3333 25983.3333
+6067 39233.3333 26000.0000
+6068 39233.3333 26050.0000
+6069 39236.3889 20131.6667
+6070 39236.6667 20539.7222
+6071 39239.1667 20485.0000
+6072 39240.2778 26200.5556
+6073 39248.0556 26271.6667
+6074 39250.0000 20533.3333
+6075 39250.0000 20566.6667
+6076 39250.0000 20583.3333
+6077 39250.0000 20616.6667
+6078 39250.0000 20633.3333
+6079 39250.0000 20750.0000
+6080 39250.0000 20783.3333
+6081 39250.0000 20833.3333
+6082 39250.0000 20983.3333
+6083 39250.0000 21000.0000
+6084 39250.0000 21016.6667
+6085 39250.0000 21033.3333
+6086 39250.0000 21050.0000
+6087 39250.0000 21133.3333
+6088 39250.0000 21166.6667
+6089 39250.0000 21183.3333
+6090 39250.0000 21200.0000
+6091 39250.0000 21233.3333
+6092 39250.0000 21316.6667
+6093 39250.0000 21383.3333
+6094 39250.0000 21400.0000
+6095 39250.0000 21500.0000
+6096 39250.0000 21550.0000
+6097 39250.0000 21666.6667
+6098 39250.0000 21716.6667
+6099 39250.0000 21733.3333
+6100 39250.0000 21833.3333
+6101 39250.0000 22050.0000
+6102 39250.0000 22100.0000
+6103 39250.0000 22183.3333
+6104 39250.0000 22216.6667
+6105 39250.0000 22383.3333
+6106 39250.0000 22450.0000
+6107 39250.0000 22483.3333
+6108 39250.0000 22583.3333
+6109 39250.0000 22616.6667
+6110 39250.0000 22750.0000
+6111 39250.0000 23183.3333
+6112 39250.0000 23266.6667
+6113 39250.0000 23283.3333
+6114 39250.0000 23300.0000
+6115 39250.0000 26100.0000
+6116 39266.6667 20533.3333
+6117 39266.6667 20566.6667
+6118 39266.6667 20600.0000
+6119 39266.6667 20700.0000
+6120 39266.6667 20800.0000
+6121 39266.6667 20850.0000
+6122 39266.6667 20883.3333
+6123 39266.6667 20950.0000
+6124 39266.6667 20983.3333
+6125 39266.6667 21000.0000
+6126 39266.6667 21016.6667
+6127 39266.6667 21166.6667
+6128 39266.6667 21183.3333
+6129 39266.6667 21216.6667
+6130 39266.6667 21300.0000
+6131 39266.6667 21333.3333
+6132 39266.6667 21366.6667
+6133 39266.6667 21383.3333
+6134 39266.6667 21433.3333
+6135 39266.6667 21483.3333
+6136 39266.6667 21533.3333
+6137 39266.6667 21550.0000
+6138 39266.6667 21583.3333
+6139 39266.6667 21600.0000
+6140 39266.6667 21666.6667
+6141 39266.6667 21700.0000
+6142 39266.6667 21716.6667
+6143 39266.6667 21933.3333
+6144 39266.6667 22033.3333
+6145 39266.6667 22083.3333
+6146 39266.6667 22150.0000
+6147 39266.6667 22216.6667
+6148 39266.6667 22333.3333
+6149 39266.6667 22416.6667
+6150 39266.6667 22466.6667
+6151 39266.6667 22516.6667
+6152 39266.6667 22750.0000
+6153 39266.6667 23166.6667
+6154 39266.6667 23950.0000
+6155 39266.6667 25966.6667
+6156 39266.6667 26066.6667
+6157 39266.6667 26150.0000
+6158 39270.0000 26287.5000
+6159 39275.0000 26376.6667
+6160 39280.8333 20427.7778
+6161 39283.3333 20450.0000
+6162 39283.3333 20550.0000
+6163 39283.3333 20600.0000
+6164 39283.3333 20633.3333
+6165 39283.3333 20666.6667
+6166 39283.3333 20683.3333
+6167 39283.3333 20700.0000
+6168 39283.3333 20766.6667
+6169 39283.3333 20800.0000
+6170 39283.3333 20900.0000
+6171 39283.3333 20933.3333
+6172 39283.3333 21000.0000
+6173 39283.3333 21033.3333
+6174 39283.3333 21050.0000
+6175 39283.3333 21066.6667
+6176 39283.3333 21100.0000
+6177 39283.3333 21116.6667
+6178 39283.3333 21133.3333
+6179 39283.3333 21200.0000
+6180 39283.3333 21233.3333
+6181 39283.3333 21266.6667
+6182 39283.3333 21283.3333
+6183 39283.3333 21333.3333
+6184 39283.3333 21366.6667
+6185 39283.3333 21383.3333
+6186 39283.3333 21416.6667
+6187 39283.3333 21433.3333
+6188 39283.3333 21450.0000
+6189 39283.3333 21466.6667
+6190 39283.3333 21483.3333
+6191 39283.3333 21500.0000
+6192 39283.3333 21533.3333
+6193 39283.3333 21566.6667
+6194 39283.3333 21583.3333
+6195 39283.3333 21600.0000
+6196 39283.3333 21700.0000
+6197 39283.3333 21733.3333
+6198 39283.3333 21750.0000
+6199 39283.3333 21783.3333
+6200 39283.3333 21800.0000
+6201 39283.3333 21850.0000
+6202 39283.3333 21900.0000
+6203 39283.3333 21966.6667
+6204 39283.3333 22050.0000
+6205 39283.3333 22116.6667
+6206 39283.3333 22283.3333
+6207 39283.3333 22550.0000
+6208 39283.3333 22650.0000
+6209 39283.3333 22816.6667
+6210 39283.3333 23183.3333
+6211 39283.3333 23216.6667
+6212 39283.3333 23266.6667
+6213 39284.1667 20402.2222
+6214 39300.0000 20366.6667
+6215 39300.0000 20483.3333
+6216 39300.0000 20550.0000
+6217 39300.0000 20683.3333
+6218 39300.0000 20716.6667
+6219 39300.0000 20766.6667
+6220 39300.0000 20800.0000
+6221 39300.0000 20866.6667
+6222 39300.0000 20900.0000
+6223 39300.0000 20983.3333
+6224 39300.0000 21016.6667
+6225 39300.0000 21200.0000
+6226 39300.0000 21216.6667
+6227 39300.0000 21283.3333
+6228 39300.0000 21316.6667
+6229 39300.0000 21400.0000
+6230 39300.0000 21416.6667
+6231 39300.0000 21533.3333
+6232 39300.0000 21683.3333
+6233 39300.0000 21700.0000
+6234 39300.0000 21716.6667
+6235 39300.0000 21733.3333
+6236 39300.0000 21833.3333
+6237 39300.0000 21933.3333
+6238 39300.0000 22050.0000
+6239 39300.0000 22066.6667
+6240 39300.0000 22133.3333
+6241 39300.0000 22200.0000
+6242 39300.0000 22383.3333
+6243 39300.0000 22500.0000
+6244 39300.0000 22600.0000
+6245 39300.0000 22616.6667
+6246 39300.0000 23116.6667
+6247 39300.0000 26133.3333
+6248 39300.0000 26183.3333
+6249 39311.6667 26219.7222
+6250 39311.6667 26333.8889
+6251 39312.7778 20357.7778
+6252 39313.6111 20427.7778
+6253 39316.6667 20333.3333
+6254 39316.6667 20433.3333
+6255 39316.6667 20450.0000
+6256 39316.6667 20500.0000
+6257 39316.6667 20583.3333
+6258 39316.6667 20600.0000
+6259 39316.6667 20616.6667
+6260 39316.6667 20700.0000
+6261 39316.6667 20766.6667
+6262 39316.6667 20800.0000
+6263 39316.6667 20883.3333
+6264 39316.6667 20933.3333
+6265 39316.6667 20950.0000
+6266 39316.6667 21000.0000
+6267 39316.6667 21016.6667
+6268 39316.6667 21033.3333
+6269 39316.6667 21083.3333
+6270 39316.6667 21216.6667
+6271 39316.6667 21300.0000
+6272 39316.6667 21433.3333
+6273 39316.6667 21466.6667
+6274 39316.6667 21500.0000
+6275 39316.6667 21700.0000
+6276 39316.6667 21716.6667
+6277 39316.6667 21783.3333
+6278 39316.6667 21800.0000
+6279 39316.6667 21816.6667
+6280 39316.6667 21866.6667
+6281 39316.6667 21883.3333
+6282 39316.6667 21900.0000
+6283 39316.6667 21916.6667
+6284 39316.6667 22233.3333
+6285 39316.6667 22300.0000
+6286 39316.6667 22316.6667
+6287 39316.6667 22500.0000
+6288 39316.6667 22633.3333
+6289 39316.6667 22683.3333
+6290 39316.6667 22716.6667
+6291 39316.6667 23100.0000
+6292 39316.6667 23133.3333
+6293 39317.5000 26244.1667
+6294 39328.6111 26279.4444
+6295 39333.3333 20450.0000
+6296 39333.3333 20600.0000
+6297 39333.3333 20716.6667
+6298 39333.3333 20733.3333
+6299 39333.3333 20766.6667
+6300 39333.3333 20783.3333
+6301 39333.3333 20883.3333
+6302 39333.3333 20900.0000
+6303 39333.3333 20916.6667
+6304 39333.3333 20933.3333
+6305 39333.3333 20950.0000
+6306 39333.3333 21000.0000
+6307 39333.3333 21050.0000
+6308 39333.3333 21066.6667
+6309 39333.3333 21083.3333
+6310 39333.3333 21183.3333
+6311 39333.3333 21233.3333
+6312 39333.3333 21266.6667
+6313 39333.3333 21300.0000
+6314 39333.3333 21333.3333
+6315 39333.3333 21400.0000
+6316 39333.3333 21416.6667
+6317 39333.3333 21433.3333
+6318 39333.3333 21466.6667
+6319 39333.3333 21483.3333
+6320 39333.3333 21500.0000
+6321 39333.3333 21516.6667
+6322 39333.3333 21683.3333
+6323 39333.3333 21833.3333
+6324 39333.3333 21866.6667
+6325 39333.3333 21950.0000
+6326 39333.3333 21983.3333
+6327 39333.3333 22016.6667
+6328 39333.3333 22100.0000
+6329 39333.3333 22150.0000
+6330 39333.3333 22366.6667
+6331 39333.3333 22383.3333
+6332 39333.3333 22416.6667
+6333 39333.3333 22433.3333
+6334 39333.3333 22450.0000
+6335 39333.3333 22500.0000
+6336 39333.3333 22550.0000
+6337 39333.3333 22583.3333
+6338 39333.3333 22700.0000
+6339 39333.3333 22766.6667
+6340 39333.3333 23016.6667
+6341 39333.3333 23033.3333
+6342 39333.3333 23050.0000
+6343 39333.3333 23116.6667
+6344 39333.3333 23133.3333
+6345 39333.3333 23150.0000
+6346 39333.3333 23216.6667
+6347 39333.3333 26183.3333
+6348 39333.3333 26216.6667
+6349 39334.7222 26311.3889
+6350 39344.7222 26362.5000
+6351 39348.0556 26321.6667
+6352 39350.0000 20416.6667
+6353 39350.0000 20433.3333
+6354 39350.0000 20450.0000
+6355 39350.0000 20550.0000
+6356 39350.0000 20583.3333
+6357 39350.0000 20650.0000
+6358 39350.0000 20700.0000
+6359 39350.0000 20750.0000
+6360 39350.0000 20766.6667
+6361 39350.0000 20800.0000
+6362 39350.0000 20883.3333
+6363 39350.0000 20916.6667
+6364 39350.0000 20950.0000
+6365 39350.0000 20966.6667
+6366 39350.0000 21000.0000
+6367 39350.0000 21016.6667
+6368 39350.0000 21033.3333
+6369 39350.0000 21050.0000
+6370 39350.0000 21066.6667
+6371 39350.0000 21100.0000
+6372 39350.0000 21150.0000
+6373 39350.0000 21183.3333
+6374 39350.0000 21200.0000
+6375 39350.0000 21216.6667
+6376 39350.0000 21266.6667
+6377 39350.0000 21283.3333
+6378 39350.0000 21300.0000
+6379 39350.0000 21316.6667
+6380 39350.0000 21333.3333
+6381 39350.0000 21350.0000
+6382 39350.0000 21450.0000
+6383 39350.0000 21466.6667
+6384 39350.0000 21500.0000
+6385 39350.0000 21533.3333
+6386 39350.0000 21666.6667
+6387 39350.0000 21683.3333
+6388 39350.0000 21750.0000
+6389 39350.0000 21766.6667
+6390 39350.0000 21833.3333
+6391 39350.0000 21900.0000
+6392 39350.0000 22083.3333
+6393 39350.0000 22216.6667
+6394 39350.0000 22266.6667
+6395 39350.0000 22300.0000
+6396 39350.0000 22333.3333
+6397 39350.0000 22500.0000
+6398 39350.0000 22550.0000
+6399 39350.0000 22616.6667
+6400 39350.0000 22833.3333
+6401 39350.0000 22866.6667
+6402 39350.0000 22900.0000
+6403 39350.0000 23066.6667
+6404 39350.0000 23083.3333
+6405 39350.0000 23200.0000
+6406 39360.8333 26263.6111
+6407 39361.3889 26295.8333
+6408 39366.6667 20283.3333
+6409 39366.6667 20400.0000
+6410 39366.6667 20533.3333
+6411 39366.6667 20566.6667
+6412 39366.6667 20583.3333
+6413 39366.6667 20700.0000
+6414 39366.6667 20783.3333
+6415 39366.6667 20866.6667
+6416 39366.6667 20883.3333
+6417 39366.6667 20950.0000
+6418 39366.6667 21016.6667
+6419 39366.6667 21033.3333
+6420 39366.6667 21050.0000
+6421 39366.6667 21066.6667
+6422 39366.6667 21100.0000
+6423 39366.6667 21116.6667
+6424 39366.6667 21133.3333
+6425 39366.6667 21200.0000
+6426 39366.6667 21216.6667
+6427 39366.6667 21233.3333
+6428 39366.6667 21266.6667
+6429 39366.6667 21283.3333
+6430 39366.6667 21300.0000
+6431 39366.6667 21333.3333
+6432 39366.6667 21400.0000
+6433 39366.6667 21416.6667
+6434 39366.6667 21533.3333
+6435 39366.6667 21600.0000
+6436 39366.6667 21616.6667
+6437 39366.6667 21633.3333
+6438 39366.6667 21666.6667
+6439 39366.6667 21816.6667
+6440 39366.6667 21916.6667
+6441 39366.6667 21966.6667
+6442 39366.6667 22000.0000
+6443 39366.6667 22083.3333
+6444 39366.6667 22133.3333
+6445 39366.6667 22400.0000
+6446 39366.6667 22516.6667
+6447 39366.6667 22766.6667
+6448 39366.6667 22950.0000
+6449 39366.6667 22983.3333
+6450 39366.6667 23066.6667
+6451 39366.6667 23183.3333
+6452 39366.6667 26166.6667
+6453 39366.6667 26283.3333
+6454 39368.8889 20303.8889
+6455 39373.6111 26303.6111
+6456 39383.3333 20066.6667
+6457 39383.3333 20083.3333
+6458 39383.3333 20116.6667
+6459 39383.3333 20383.3333
+6460 39383.3333 20483.3333
+6461 39383.3333 20566.6667
+6462 39383.3333 20583.3333
+6463 39383.3333 20700.0000
+6464 39383.3333 20850.0000
+6465 39383.3333 20900.0000
+6466 39383.3333 21000.0000
+6467 39383.3333 21016.6667
+6468 39383.3333 21033.3333
+6469 39383.3333 21050.0000
+6470 39383.3333 21066.6667
+6471 39383.3333 21100.0000
+6472 39383.3333 21133.3333
+6473 39383.3333 21183.3333
+6474 39383.3333 21200.0000
+6475 39383.3333 21216.6667
+6476 39383.3333 21233.3333
+6477 39383.3333 21250.0000
+6478 39383.3333 21266.6667
+6479 39383.3333 21283.3333
+6480 39383.3333 21400.0000
+6481 39383.3333 21466.6667
+6482 39383.3333 21633.3333
+6483 39383.3333 21700.0000
+6484 39383.3333 21766.6667
+6485 39383.3333 21816.6667
+6486 39383.3333 21866.6667
+6487 39383.3333 21916.6667
+6488 39383.3333 21983.3333
+6489 39383.3333 22233.3333
+6490 39383.3333 22266.6667
+6491 39383.3333 22333.3333
+6492 39383.3333 22350.0000
+6493 39383.3333 22500.0000
+6494 39383.3333 22516.6667
+6495 39383.3333 22566.6667
+6496 39383.3333 22750.0000
+6497 39383.3333 22916.6667
+6498 39383.3333 22966.6667
+6499 39383.3333 22983.3333
+6500 39383.3333 23000.0000
+6501 39383.3333 23050.0000
+6502 39383.3333 23183.3333
+6503 39400.0000 20050.0000
+6504 39400.0000 20066.6667
+6505 39400.0000 20083.3333
+6506 39400.0000 20333.3333
+6507 39400.0000 20350.0000
+6508 39400.0000 20366.6667
+6509 39400.0000 20383.3333
+6510 39400.0000 20416.6667
+6511 39400.0000 20483.3333
+6512 39400.0000 20566.6667
+6513 39400.0000 20783.3333
+6514 39400.0000 20816.6667
+6515 39400.0000 20966.6667
+6516 39400.0000 21016.6667
+6517 39400.0000 21050.0000
+6518 39400.0000 21066.6667
+6519 39400.0000 21083.3333
+6520 39400.0000 21100.0000
+6521 39400.0000 21116.6667
+6522 39400.0000 21283.3333
+6523 39400.0000 21333.3333
+6524 39400.0000 21366.6667
+6525 39400.0000 21600.0000
+6526 39400.0000 21633.3333
+6527 39400.0000 21666.6667
+6528 39400.0000 21700.0000
+6529 39400.0000 21733.3333
+6530 39400.0000 21750.0000
+6531 39400.0000 21800.0000
+6532 39400.0000 21816.6667
+6533 39400.0000 21900.0000
+6534 39400.0000 22016.6667
+6535 39400.0000 22066.6667
+6536 39400.0000 22200.0000
+6537 39400.0000 22216.6667
+6538 39400.0000 22416.6667
+6539 39400.0000 22433.3333
+6540 39400.0000 22466.6667
+6541 39400.0000 22716.6667
+6542 39400.0000 22733.3333
+6543 39400.0000 22983.3333
+6544 39400.0000 23133.3333
+6545 39400.0000 23166.6667
+6546 39405.2778 20253.0556
+6547 39416.6667 20016.6667
+6548 39416.6667 20066.6667
+6549 39416.6667 20083.3333
+6550 39416.6667 20300.0000
+6551 39416.6667 20316.6667
+6552 39416.6667 20366.6667
+6553 39416.6667 20383.3333
+6554 39416.6667 20500.0000
+6555 39416.6667 20550.0000
+6556 39416.6667 20566.6667
+6557 39416.6667 20616.6667
+6558 39416.6667 20633.3333
+6559 39416.6667 20700.0000
+6560 39416.6667 20766.6667
+6561 39416.6667 20783.3333
+6562 39416.6667 20816.6667
+6563 39416.6667 20833.3333
+6564 39416.6667 20850.0000
+6565 39416.6667 20866.6667
+6566 39416.6667 20900.0000
+6567 39416.6667 20916.6667
+6568 39416.6667 20933.3333
+6569 39416.6667 20950.0000
+6570 39416.6667 20983.3333
+6571 39416.6667 21016.6667
+6572 39416.6667 21033.3333
+6573 39416.6667 21050.0000
+6574 39416.6667 21066.6667
+6575 39416.6667 21083.3333
+6576 39416.6667 21100.0000
+6577 39416.6667 21116.6667
+6578 39416.6667 21266.6667
+6579 39416.6667 21383.3333
+6580 39416.6667 21483.3333
+6581 39416.6667 21500.0000
+6582 39416.6667 21533.3333
+6583 39416.6667 21583.3333
+6584 39416.6667 21600.0000
+6585 39416.6667 21633.3333
+6586 39416.6667 21700.0000
+6587 39416.6667 21733.3333
+6588 39416.6667 21750.0000
+6589 39416.6667 21783.3333
+6590 39416.6667 21800.0000
+6591 39416.6667 21966.6667
+6592 39416.6667 22100.0000
+6593 39416.6667 22166.6667
+6594 39416.6667 22383.3333
+6595 39416.6667 22433.3333
+6596 39416.6667 22616.6667
+6597 39416.6667 22650.0000
+6598 39416.6667 22933.3333
+6599 39416.6667 23133.3333
+6600 39416.6667 23150.0000
+6601 39419.7222 20084.1667
+6602 39424.4444 20073.0556
+6603 39433.3333 19983.3333
+6604 39433.3333 20000.0000
+6605 39433.3333 20050.0000
+6606 39433.3333 20283.3333
+6607 39433.3333 20333.3333
+6608 39433.3333 20400.0000
+6609 39433.3333 20433.3333
+6610 39433.3333 20466.6667
+6611 39433.3333 20483.3333
+6612 39433.3333 20533.3333
+6613 39433.3333 20550.0000
+6614 39433.3333 20633.3333
+6615 39433.3333 20683.3333
+6616 39433.3333 20716.6667
+6617 39433.3333 20733.3333
+6618 39433.3333 20750.0000
+6619 39433.3333 20766.6667
+6620 39433.3333 20783.3333
+6621 39433.3333 20833.3333
+6622 39433.3333 20883.3333
+6623 39433.3333 20916.6667
+6624 39433.3333 20950.0000
+6625 39433.3333 20983.3333
+6626 39433.3333 21016.6667
+6627 39433.3333 21033.3333
+6628 39433.3333 21050.0000
+6629 39433.3333 21083.3333
+6630 39433.3333 21100.0000
+6631 39433.3333 21116.6667
+6632 39433.3333 21216.6667
+6633 39433.3333 21350.0000
+6634 39433.3333 21366.6667
+6635 39433.3333 21383.3333
+6636 39433.3333 21433.3333
+6637 39433.3333 21516.6667
+6638 39433.3333 21533.3333
+6639 39433.3333 21566.6667
+6640 39433.3333 21666.6667
+6641 39433.3333 21716.6667
+6642 39433.3333 21750.0000
+6643 39433.3333 21766.6667
+6644 39433.3333 21833.3333
+6645 39433.3333 21866.6667
+6646 39433.3333 22050.0000
+6647 39433.3333 22100.0000
+6648 39433.3333 22133.3333
+6649 39433.3333 22183.3333
+6650 39433.3333 22300.0000
+6651 39433.3333 22333.3333
+6652 39433.3333 22683.3333
+6653 39433.3333 22750.0000
+6654 39433.3333 22883.3333
+6655 39433.3333 23116.6667
+6656 39436.1111 19978.3333
+6657 39450.0000 19983.3333
+6658 39450.0000 20000.0000
+6659 39450.0000 20066.6667
+6660 39450.0000 20266.6667
+6661 39450.0000 20283.3333
+6662 39450.0000 20300.0000
+6663 39450.0000 20316.6667
+6664 39450.0000 20400.0000
+6665 39450.0000 20450.0000
+6666 39450.0000 20533.3333
+6667 39450.0000 20600.0000
+6668 39450.0000 20683.3333
+6669 39450.0000 20716.6667
+6670 39450.0000 20733.3333
+6671 39450.0000 20766.6667
+6672 39450.0000 20816.6667
+6673 39450.0000 20833.3333
+6674 39450.0000 21000.0000
+6675 39450.0000 21016.6667
+6676 39450.0000 21033.3333
+6677 39450.0000 21066.6667
+6678 39450.0000 21083.3333
+6679 39450.0000 21100.0000
+6680 39450.0000 21116.6667
+6681 39450.0000 21233.3333
+6682 39450.0000 21250.0000
+6683 39450.0000 21316.6667
+6684 39450.0000 21333.3333
+6685 39450.0000 21366.6667
+6686 39450.0000 21383.3333
+6687 39450.0000 21416.6667
+6688 39450.0000 21466.6667
+6689 39450.0000 21483.3333
+6690 39450.0000 21500.0000
+6691 39450.0000 21516.6667
+6692 39450.0000 21533.3333
+6693 39450.0000 21550.0000
+6694 39450.0000 21566.6667
+6695 39450.0000 21800.0000
+6696 39450.0000 21833.3333
+6697 39450.0000 21966.6667
+6698 39450.0000 22083.3333
+6699 39450.0000 22150.0000
+6700 39450.0000 22250.0000
+6701 39450.0000 22333.3333
+6702 39450.0000 22350.0000
+6703 39450.0000 22483.3333
+6704 39450.0000 22533.3333
+6705 39450.0000 22550.0000
+6706 39450.0000 23100.0000
+6707 39450.0000 23116.6667
+6708 39458.0556 19958.0556
+6709 39466.6667 19916.6667
+6710 39466.6667 19933.3333
+6711 39466.6667 19950.0000
+6712 39466.6667 20316.6667
+6713 39466.6667 20333.3333
+6714 39466.6667 20350.0000
+6715 39466.6667 20366.6667
+6716 39466.6667 20416.6667
+6717 39466.6667 20433.3333
+6718 39466.6667 20516.6667
+6719 39466.6667 20666.6667
+6720 39466.6667 20716.6667
+6721 39466.6667 20750.0000
+6722 39466.6667 20816.6667
+6723 39466.6667 20833.3333
+6724 39466.6667 20850.0000
+6725 39466.6667 20900.0000
+6726 39466.6667 20916.6667
+6727 39466.6667 20966.6667
+6728 39466.6667 21033.3333
+6729 39466.6667 21050.0000
+6730 39466.6667 21083.3333
+6731 39466.6667 21100.0000
+6732 39466.6667 21250.0000
+6733 39466.6667 21283.3333
+6734 39466.6667 21316.6667
+6735 39466.6667 21350.0000
+6736 39466.6667 21366.6667
+6737 39466.6667 21416.6667
+6738 39466.6667 21433.3333
+6739 39466.6667 21450.0000
+6740 39466.6667 21533.3333
+6741 39466.6667 21566.6667
+6742 39466.6667 21616.6667
+6743 39466.6667 21666.6667
+6744 39466.6667 21700.0000
+6745 39466.6667 21733.3333
+6746 39466.6667 21833.3333
+6747 39466.6667 21866.6667
+6748 39466.6667 21900.0000
+6749 39466.6667 22083.3333
+6750 39466.6667 22166.6667
+6751 39466.6667 22216.6667
+6752 39466.6667 22283.3333
+6753 39466.6667 22450.0000
+6754 39466.6667 22500.0000
+6755 39466.6667 22733.3333
+6756 39466.6667 22916.6667
+6757 39474.4444 19931.9444
+6758 39483.3333 19916.6667
+6759 39483.3333 20266.6667
+6760 39483.3333 20300.0000
+6761 39483.3333 20333.3333
+6762 39483.3333 20400.0000
+6763 39483.3333 20466.6667
+6764 39483.3333 20500.0000
+6765 39483.3333 20566.6667
+6766 39483.3333 20666.6667
+6767 39483.3333 20850.0000
+6768 39483.3333 20866.6667
+6769 39483.3333 20883.3333
+6770 39483.3333 20916.6667
+6771 39483.3333 20966.6667
+6772 39483.3333 21033.3333
+6773 39483.3333 21050.0000
+6774 39483.3333 21066.6667
+6775 39483.3333 21083.3333
+6776 39483.3333 21100.0000
+6777 39483.3333 21316.6667
+6778 39483.3333 21333.3333
+6779 39483.3333 21533.3333
+6780 39483.3333 21550.0000
+6781 39483.3333 21716.6667
+6782 39483.3333 21850.0000
+6783 39483.3333 21900.0000
+6784 39483.3333 21983.3333
+6785 39483.3333 22200.0000
+6786 39483.3333 22266.6667
+6787 39483.3333 22600.0000
+6788 39483.3333 22700.0000
+6789 39483.3333 22950.0000
+6790 39483.3333 23100.0000
+6791 39495.8333 19873.0556
+6792 39500.0000 19916.6667
+6793 39500.0000 20266.6667
+6794 39500.0000 20316.6667
+6795 39500.0000 20366.6667
+6796 39500.0000 20383.3333
+6797 39500.0000 20416.6667
+6798 39500.0000 20433.3333
+6799 39500.0000 20466.6667
+6800 39500.0000 20500.0000
+6801 39500.0000 20533.3333
+6802 39500.0000 20650.0000
+6803 39500.0000 20683.3333
+6804 39500.0000 20750.0000
+6805 39500.0000 20866.6667
+6806 39500.0000 20916.6667
+6807 39500.0000 20950.0000
+6808 39500.0000 20966.6667
+6809 39500.0000 20983.3333
+6810 39500.0000 21000.0000
+6811 39500.0000 21033.3333
+6812 39500.0000 21050.0000
+6813 39500.0000 21083.3333
+6814 39500.0000 21316.6667
+6815 39500.0000 21350.0000
+6816 39500.0000 21516.6667
+6817 39500.0000 21533.3333
+6818 39500.0000 21616.6667
+6819 39500.0000 21683.3333
+6820 39500.0000 21783.3333
+6821 39500.0000 21900.0000
+6822 39500.0000 22016.6667
+6823 39500.0000 22050.0000
+6824 39500.0000 22150.0000
+6825 39500.0000 22250.0000
+6826 39500.0000 22450.0000
+6827 39500.0000 22550.0000
+6828 39500.0000 22633.3333
+6829 39500.0000 22650.0000
+6830 39500.0000 22700.0000
+6831 39500.0000 22883.3333
+6832 39500.0000 23066.6667
+6833 39516.6667 19866.6667
+6834 39516.6667 19900.0000
+6835 39516.6667 20350.0000
+6836 39516.6667 20433.3333
+6837 39516.6667 20550.0000
+6838 39516.6667 20566.6667
+6839 39516.6667 20600.0000
+6840 39516.6667 20633.3333
+6841 39516.6667 20683.3333
+6842 39516.6667 20733.3333
+6843 39516.6667 20800.0000
+6844 39516.6667 20816.6667
+6845 39516.6667 20950.0000
+6846 39516.6667 20983.3333
+6847 39516.6667 21050.0000
+6848 39516.6667 21066.6667
+6849 39516.6667 21083.3333
+6850 39516.6667 21150.0000
+6851 39516.6667 21600.0000
+6852 39516.6667 21650.0000
+6853 39516.6667 21666.6667
+6854 39516.6667 21700.0000
+6855 39516.6667 21750.0000
+6856 39516.6667 21800.0000
+6857 39516.6667 21866.6667
+6858 39516.6667 21950.0000
+6859 39516.6667 22083.3333
+6860 39516.6667 22100.0000
+6861 39516.6667 22116.6667
+6862 39516.6667 22316.6667
+6863 39516.6667 22466.6667
+6864 39516.6667 22550.0000
+6865 39516.6667 22683.3333
+6866 39525.5556 20257.2222
+6867 39533.3333 19850.0000
+6868 39533.3333 19866.6667
+6869 39533.3333 19900.0000
+6870 39533.3333 19916.6667
+6871 39533.3333 20283.3333
+6872 39533.3333 20350.0000
+6873 39533.3333 20400.0000
+6874 39533.3333 20466.6667
+6875 39533.3333 20550.0000
+6876 39533.3333 20666.6667
+6877 39533.3333 20716.6667
+6878 39533.3333 20733.3333
+6879 39533.3333 20783.3333
+6880 39533.3333 20850.0000
+6881 39533.3333 20916.6667
+6882 39533.3333 21033.3333
+6883 39533.3333 21050.0000
+6884 39533.3333 21066.6667
+6885 39533.3333 21083.3333
+6886 39533.3333 21100.0000
+6887 39533.3333 21116.6667
+6888 39533.3333 21250.0000
+6889 39533.3333 21300.0000
+6890 39533.3333 21366.6667
+6891 39533.3333 21400.0000
+6892 39533.3333 21433.3333
+6893 39533.3333 21466.6667
+6894 39533.3333 21566.6667
+6895 39533.3333 21583.3333
+6896 39533.3333 21616.6667
+6897 39533.3333 21633.3333
+6898 39533.3333 21683.3333
+6899 39533.3333 21700.0000
+6900 39533.3333 21766.6667
+6901 39533.3333 21800.0000
+6902 39533.3333 21833.3333
+6903 39533.3333 21866.6667
+6904 39533.3333 21933.3333
+6905 39533.3333 21983.3333
+6906 39533.3333 22000.0000
+6907 39533.3333 22166.6667
+6908 39533.3333 22233.3333
+6909 39533.3333 22266.6667
+6910 39533.3333 22366.6667
+6911 39533.3333 22500.0000
+6912 39533.3333 22666.6667
+6913 39538.8889 24991.6667
+6914 39546.3889 19911.1111
+6915 39550.0000 19866.6667
+6916 39550.0000 19883.3333
+6917 39550.0000 20266.6667
+6918 39550.0000 20316.6667
+6919 39550.0000 20366.6667
+6920 39550.0000 20433.3333
+6921 39550.0000 20516.6667
+6922 39550.0000 20550.0000
+6923 39550.0000 20583.3333
+6924 39550.0000 20600.0000
+6925 39550.0000 20633.3333
+6926 39550.0000 20683.3333
+6927 39550.0000 20766.6667
+6928 39550.0000 20900.0000
+6929 39550.0000 20950.0000
+6930 39550.0000 21016.6667
+6931 39550.0000 21033.3333
+6932 39550.0000 21050.0000
+6933 39550.0000 21116.6667
+6934 39550.0000 21366.6667
+6935 39550.0000 21583.3333
+6936 39550.0000 21616.6667
+6937 39550.0000 21633.3333
+6938 39550.0000 21650.0000
+6939 39550.0000 21666.6667
+6940 39550.0000 21683.3333
+6941 39550.0000 21700.0000
+6942 39550.0000 21750.0000
+6943 39550.0000 21766.6667
+6944 39550.0000 21900.0000
+6945 39550.0000 22200.0000
+6946 39550.0000 22616.6667
+6947 39550.0000 22650.0000
+6948 39550.0000 22750.0000
+6949 39550.0000 22983.3333
+6950 39566.6667 19850.0000
+6951 39566.6667 19866.6667
+6952 39566.6667 19883.3333
+6953 39566.6667 19900.0000
+6954 39566.6667 19916.6667
+6955 39566.6667 20200.0000
+6956 39566.6667 20283.3333
+6957 39566.6667 20316.6667
+6958 39566.6667 20433.3333
+6959 39566.6667 20550.0000
+6960 39566.6667 20633.3333
+6961 39566.6667 20700.0000
+6962 39566.6667 20733.3333
+6963 39566.6667 20833.3333
+6964 39566.6667 20883.3333
+6965 39566.6667 20950.0000
+6966 39566.6667 21000.0000
+6967 39566.6667 21083.3333
+6968 39566.6667 21166.6667
+6969 39566.6667 21250.0000
+6970 39566.6667 21366.6667
+6971 39566.6667 21583.3333
+6972 39566.6667 21616.6667
+6973 39566.6667 21700.0000
+6974 39566.6667 21716.6667
+6975 39566.6667 21750.0000
+6976 39566.6667 21766.6667
+6977 39566.6667 21833.3333
+6978 39566.6667 21933.3333
+6979 39566.6667 22000.0000
+6980 39566.6667 22016.6667
+6981 39566.6667 22083.3333
+6982 39566.6667 22216.6667
+6983 39566.6667 22366.6667
+6984 39566.6667 22466.6667
+6985 39566.6667 22533.3333
+6986 39566.6667 22600.0000
+6987 39566.6667 22750.0000
+6988 39566.6667 22766.6667
+6989 39583.3333 19850.0000
+6990 39583.3333 19866.6667
+6991 39583.3333 19883.3333
+6992 39583.3333 19900.0000
+6993 39583.3333 19916.6667
+6994 39583.3333 20333.3333
+6995 39583.3333 20400.0000
+6996 39583.3333 20466.6667
+6997 39583.3333 20550.0000
+6998 39583.3333 20600.0000
+6999 39583.3333 20616.6667
+7000 39583.3333 20666.6667
+7001 39583.3333 20700.0000
+7002 39583.3333 20716.6667
+7003 39583.3333 20800.0000
+7004 39583.3333 20883.3333
+7005 39583.3333 20916.6667
+7006 39583.3333 20933.3333
+7007 39583.3333 20950.0000
+7008 39583.3333 20983.3333
+7009 39583.3333 21000.0000
+7010 39583.3333 21033.3333
+7011 39583.3333 21066.6667
+7012 39583.3333 21083.3333
+7013 39583.3333 21116.6667
+7014 39583.3333 21583.3333
+7015 39583.3333 21683.3333
+7016 39583.3333 21733.3333
+7017 39583.3333 21750.0000
+7018 39583.3333 21783.3333
+7019 39583.3333 21800.0000
+7020 39583.3333 21816.6667
+7021 39583.3333 21850.0000
+7022 39583.3333 21900.0000
+7023 39583.3333 21916.6667
+7024 39583.3333 21966.6667
+7025 39583.3333 22166.6667
+7026 39583.3333 22300.0000
+7027 39583.3333 22333.3333
+7028 39583.3333 22583.3333
+7029 39583.3333 22783.3333
+7030 39583.3333 22916.6667
+7031 39593.8889 19823.6111
+7032 39600.0000 19866.6667
+7033 39600.0000 19900.0000
+7034 39600.0000 19916.6667
+7035 39600.0000 20233.3333
+7036 39600.0000 20266.6667
+7037 39600.0000 20283.3333
+7038 39600.0000 20316.6667
+7039 39600.0000 20433.3333
+7040 39600.0000 20466.6667
+7041 39600.0000 20533.3333
+7042 39600.0000 20566.6667
+7043 39600.0000 20650.0000
+7044 39600.0000 20683.3333
+7045 39600.0000 20750.0000
+7046 39600.0000 20850.0000
+7047 39600.0000 20883.3333
+7048 39600.0000 21000.0000
+7049 39600.0000 21050.0000
+7050 39600.0000 21100.0000
+7051 39600.0000 21283.3333
+7052 39600.0000 21300.0000
+7053 39600.0000 21466.6667
+7054 39600.0000 21500.0000
+7055 39600.0000 21650.0000
+7056 39600.0000 21766.6667
+7057 39600.0000 21816.6667
+7058 39600.0000 21983.3333
+7059 39600.0000 22050.0000
+7060 39600.0000 22066.6667
+7061 39600.0000 22583.3333
+7062 39600.0000 22716.6667
+7063 39616.6667 19800.0000
+7064 39616.6667 19816.6667
+7065 39616.6667 19850.0000
+7066 39616.6667 19900.0000
+7067 39616.6667 19916.6667
+7068 39616.6667 20183.3333
+7069 39616.6667 20333.3333
+7070 39616.6667 20500.0000
+7071 39616.6667 20533.3333
+7072 39616.6667 20583.3333
+7073 39616.6667 20633.3333
+7074 39616.6667 20733.3333
+7075 39616.6667 20833.3333
+7076 39616.6667 20883.3333
+7077 39616.6667 20950.0000
+7078 39616.6667 20966.6667
+7079 39616.6667 20983.3333
+7080 39616.6667 21050.0000
+7081 39616.6667 21350.0000
+7082 39616.6667 21416.6667
+7083 39616.6667 21533.3333
+7084 39616.6667 21650.0000
+7085 39616.6667 21750.0000
+7086 39616.6667 21766.6667
+7087 39616.6667 22016.6667
+7088 39616.6667 22133.3333
+7089 39616.6667 22233.3333
+7090 39616.6667 22266.6667
+7091 39616.6667 22300.0000
+7092 39616.6667 22366.6667
+7093 39616.6667 22433.3333
+7094 39616.6667 22533.3333
+7095 39616.6667 22566.6667
+7096 39616.6667 22616.6667
+7097 39616.6667 22683.3333
+7098 39616.6667 22883.3333
+7099 39620.0000 19919.7222
+7100 39625.0000 19875.5556
+7101 39626.9444 20187.2222
+7102 39633.0556 19764.4444
+7103 39633.3333 19900.0000
+7104 39633.3333 20416.6667
+7105 39633.3333 20450.0000
+7106 39633.3333 20566.6667
+7107 39633.3333 20700.0000
+7108 39633.3333 20716.6667
+7109 39633.3333 20733.3333
+7110 39633.3333 20766.6667
+7111 39633.3333 20783.3333
+7112 39633.3333 20866.6667
+7113 39633.3333 20916.6667
+7114 39633.3333 20966.6667
+7115 39633.3333 21033.3333
+7116 39633.3333 21066.6667
+7117 39633.3333 21250.0000
+7118 39633.3333 21300.0000
+7119 39633.3333 21350.0000
+7120 39633.3333 21583.3333
+7121 39633.3333 21700.0000
+7122 39633.3333 21783.3333
+7123 39633.3333 22016.6667
+7124 39633.3333 22050.0000
+7125 39633.3333 22400.0000
+7126 39633.3333 22416.6667
+7127 39633.3333 22500.0000
+7128 39633.3333 22516.6667
+7129 39650.0000 19766.6667
+7130 39650.0000 19850.0000
+7131 39650.0000 20283.3333
+7132 39650.0000 20316.6667
+7133 39650.0000 20366.6667
+7134 39650.0000 20483.3333
+7135 39650.0000 20516.6667
+7136 39650.0000 20616.6667
+7137 39650.0000 20666.6667
+7138 39650.0000 20700.0000
+7139 39650.0000 20716.6667
+7140 39650.0000 20733.3333
+7141 39650.0000 20800.0000
+7142 39650.0000 20950.0000
+7143 39650.0000 21033.3333
+7144 39650.0000 21483.3333
+7145 39650.0000 21616.6667
+7146 39650.0000 21650.0000
+7147 39650.0000 21816.6667
+7148 39650.0000 22266.6667
+7149 39650.0000 22283.3333
+7150 39650.0000 22433.3333
+7151 39650.0000 22716.6667
+7152 39663.8889 20101.3889
+7153 39666.6667 19816.6667
+7154 39666.6667 20250.0000
+7155 39666.6667 20366.6667
+7156 39666.6667 20433.3333
+7157 39666.6667 20516.6667
+7158 39666.6667 20533.3333
+7159 39666.6667 20550.0000
+7160 39666.6667 20566.6667
+7161 39666.6667 20583.3333
+7162 39666.6667 20650.0000
+7163 39666.6667 20716.6667
+7164 39666.6667 20733.3333
+7165 39666.6667 20833.3333
+7166 39666.6667 20933.3333
+7167 39666.6667 20950.0000
+7168 39666.6667 21033.3333
+7169 39666.6667 21216.6667
+7170 39666.6667 21450.0000
+7171 39666.6667 21566.6667
+7172 39666.6667 21633.3333
+7173 39666.6667 21700.0000
+7174 39666.6667 21733.3333
+7175 39666.6667 21766.6667
+7176 39666.6667 21833.3333
+7177 39666.6667 22383.3333
+7178 39666.6667 22483.3333
+7179 39666.6667 22666.6667
+7180 39666.6667 22733.3333
+7181 39666.6667 22783.3333
+7182 39666.6667 22866.6667
+7183 39670.0000 19740.8333
+7184 39681.6667 19706.9444
+7185 39683.3333 19683.3333
+7186 39683.3333 19700.0000
+7187 39683.3333 19733.3333
+7188 39683.3333 19750.0000
+7189 39683.3333 19816.6667
+7190 39683.3333 20066.6667
+7191 39683.3333 20300.0000
+7192 39683.3333 20466.6667
+7193 39683.3333 20533.3333
+7194 39683.3333 20616.6667
+7195 39683.3333 20666.6667
+7196 39683.3333 20766.6667
+7197 39683.3333 20783.3333
+7198 39683.3333 20866.6667
+7199 39683.3333 20883.3333
+7200 39683.3333 21050.0000
+7201 39683.3333 21183.3333
+7202 39683.3333 21300.0000
+7203 39683.3333 21550.0000
+7204 39683.3333 21583.3333
+7205 39683.3333 21683.3333
+7206 39683.3333 21800.0000
+7207 39683.3333 22300.0000
+7208 39683.3333 22316.6667
+7209 39683.3333 22333.3333
+7210 39683.3333 22500.0000
+7211 39683.3333 22583.3333
+7212 39683.3333 22633.3333
+7213 39683.3333 22700.0000
+7214 39683.3333 22733.3333
+7215 39683.3333 22833.3333
+7216 39694.4444 19836.6667
+7217 39700.0000 19700.0000
+7218 39700.0000 19716.6667
+7219 39700.0000 19733.3333
+7220 39700.0000 19833.3333
+7221 39700.0000 20266.6667
+7222 39700.0000 20333.3333
+7223 39700.0000 20400.0000
+7224 39700.0000 20533.3333
+7225 39700.0000 20566.6667
+7226 39700.0000 20633.3333
+7227 39700.0000 20666.6667
+7228 39700.0000 20783.3333
+7229 39700.0000 20800.0000
+7230 39700.0000 20816.6667
+7231 39700.0000 20850.0000
+7232 39700.0000 20950.0000
+7233 39700.0000 21033.3333
+7234 39700.0000 21066.6667
+7235 39700.0000 21383.3333
+7236 39700.0000 21516.6667
+7237 39700.0000 21633.3333
+7238 39700.0000 21716.6667
+7239 39700.0000 22016.6667
+7240 39700.0000 22083.3333
+7241 39700.0000 22416.6667
+7242 39700.0000 22433.3333
+7243 39700.0000 22700.0000
+7244 39707.7778 19795.5556
+7245 39709.7222 19702.2222
+7246 39716.6667 19666.6667
+7247 39716.6667 19716.6667
+7248 39716.6667 19733.3333
+7249 39716.6667 19750.0000
+7250 39716.6667 19766.6667
+7251 39716.6667 19783.3333
+7252 39716.6667 19833.3333
+7253 39716.6667 19900.0000
+7254 39716.6667 20350.0000
+7255 39716.6667 20450.0000
+7256 39716.6667 20483.3333
+7257 39716.6667 20533.3333
+7258 39716.6667 20600.0000
+7259 39716.6667 20716.6667
+7260 39716.6667 20750.0000
+7261 39716.6667 20833.3333
+7262 39716.6667 21066.6667
+7263 39716.6667 21083.3333
+7264 39716.6667 21383.3333
+7265 39716.6667 21466.6667
+7266 39716.6667 21616.6667
+7267 39716.6667 21683.3333
+7268 39716.6667 21783.3333
+7269 39716.6667 21933.3333
+7270 39716.6667 22166.6667
+7271 39716.6667 22183.3333
+7272 39716.6667 22400.0000
+7273 39716.6667 22550.0000
+7274 39716.6667 22566.6667
+7275 39716.6667 22733.3333
+7276 39716.6667 22766.6667
+7277 39733.3333 19666.6667
+7278 39733.3333 19683.3333
+7279 39733.3333 19700.0000
+7280 39733.3333 19716.6667
+7281 39733.3333 19733.3333
+7282 39733.3333 19750.0000
+7283 39733.3333 19766.6667
+7284 39733.3333 19800.0000
+7285 39733.3333 19816.6667
+7286 39733.3333 19900.0000
+7287 39733.3333 19916.6667
+7288 39733.3333 19933.3333
+7289 39733.3333 20416.6667
+7290 39733.3333 20450.0000
+7291 39733.3333 20516.6667
+7292 39733.3333 20566.6667
+7293 39733.3333 20583.3333
+7294 39733.3333 20616.6667
+7295 39733.3333 20633.3333
+7296 39733.3333 20666.6667
+7297 39733.3333 20766.6667
+7298 39733.3333 20816.6667
+7299 39733.3333 20916.6667
+7300 39733.3333 20933.3333
+7301 39733.3333 21033.3333
+7302 39733.3333 21066.6667
+7303 39733.3333 21100.0000
+7304 39733.3333 21133.3333
+7305 39733.3333 21883.3333
+7306 39733.3333 22350.0000
+7307 39733.3333 22533.3333
+7308 39733.3333 22600.0000
+7309 39733.3333 22733.3333
+7310 39733.3333 22750.0000
+7311 39733.3333 22800.0000
+7312 39736.1111 19928.0556
+7313 39743.6111 19932.2222
+7314 39748.8889 19938.8889
+7315 39750.0000 19683.3333
+7316 39750.0000 19700.0000
+7317 39750.0000 19716.6667
+7318 39750.0000 19733.3333
+7319 39750.0000 19750.0000
+7320 39750.0000 19766.6667
+7321 39750.0000 19783.3333
+7322 39750.0000 19833.3333
+7323 39750.0000 19883.3333
+7324 39750.0000 19916.6667
+7325 39750.0000 19933.3333
+7326 39750.0000 20333.3333
+7327 39750.0000 20416.6667
+7328 39750.0000 20466.6667
+7329 39750.0000 20533.3333
+7330 39750.0000 20566.6667
+7331 39750.0000 20633.3333
+7332 39750.0000 20650.0000
+7333 39750.0000 20716.6667
+7334 39750.0000 20750.0000
+7335 39750.0000 20800.0000
+7336 39750.0000 21050.0000
+7337 39750.0000 21083.3333
+7338 39750.0000 21100.0000
+7339 39750.0000 21333.3333
+7340 39750.0000 21366.6667
+7341 39750.0000 21416.6667
+7342 39750.0000 21500.0000
+7343 39750.0000 21750.0000
+7344 39750.0000 22083.3333
+7345 39750.0000 22100.0000
+7346 39750.0000 22283.3333
+7347 39750.0000 22366.6667
+7348 39750.0000 22433.3333
+7349 39750.0000 22583.3333
+7350 39750.0000 22700.0000
+7351 39750.0000 22800.0000
+7352 39755.8333 19676.3889
+7353 39763.0556 19873.0556
+7354 39766.6667 19533.3333
+7355 39766.6667 19750.0000
+7356 39766.6667 19783.3333
+7357 39766.6667 19816.6667
+7358 39766.6667 19833.3333
+7359 39766.6667 19916.6667
+7360 39766.6667 19933.3333
+7361 39766.6667 20316.6667
+7362 39766.6667 20383.3333
+7363 39766.6667 20533.3333
+7364 39766.6667 20583.3333
+7365 39766.6667 20600.0000
+7366 39766.6667 20783.3333
+7367 39766.6667 20866.6667
+7368 39766.6667 21000.0000
+7369 39766.6667 21033.3333
+7370 39766.6667 21050.0000
+7371 39766.6667 21066.6667
+7372 39766.6667 21116.6667
+7373 39766.6667 21183.3333
+7374 39766.6667 21466.6667
+7375 39766.6667 21666.6667
+7376 39766.6667 21733.3333
+7377 39766.6667 22383.3333
+7378 39766.6667 22533.3333
+7379 39766.6667 22583.3333
+7380 39767.5000 19946.6667
+7381 39775.0000 19662.5000
+7382 39783.3333 19516.6667
+7383 39783.3333 19683.3333
+7384 39783.3333 19750.0000
+7385 39783.3333 19783.3333
+7386 39783.3333 19833.3333
+7387 39783.3333 19850.0000
+7388 39783.3333 19866.6667
+7389 39783.3333 19883.3333
+7390 39783.3333 19916.6667
+7391 39783.3333 20350.0000
+7392 39783.3333 20466.6667
+7393 39783.3333 20616.6667
+7394 39783.3333 20683.3333
+7395 39783.3333 20716.6667
+7396 39783.3333 20750.0000
+7397 39783.3333 20800.0000
+7398 39783.3333 20816.6667
+7399 39783.3333 20833.3333
+7400 39783.3333 20866.6667
+7401 39783.3333 21000.0000
+7402 39783.3333 21083.3333
+7403 39783.3333 21100.0000
+7404 39783.3333 21116.6667
+7405 39783.3333 21283.3333
+7406 39783.3333 21416.6667
+7407 39783.3333 21550.0000
+7408 39783.3333 21800.0000
+7409 39783.3333 21983.3333
+7410 39783.3333 22083.3333
+7411 39783.3333 22400.0000
+7412 39783.3333 22583.3333
+7413 39785.5556 19673.0556
+7414 39788.6111 19787.5000
+7415 39790.5556 19707.5000
+7416 39793.3333 19759.1667
+7417 39795.5556 19811.1111
+7418 39800.0000 19683.3333
+7419 39800.0000 19833.3333
+7420 39800.0000 19850.0000
+7421 39800.0000 19866.6667
+7422 39800.0000 20433.3333
+7423 39800.0000 20516.6667
+7424 39800.0000 20583.3333
+7425 39800.0000 20600.0000
+7426 39800.0000 20666.6667
+7427 39800.0000 20700.0000
+7428 39800.0000 21000.0000
+7429 39800.0000 21333.3333
+7430 39800.0000 21383.3333
+7431 39800.0000 21600.0000
+7432 39800.0000 21633.3333
+7433 39800.0000 21766.6667
+7434 39800.0000 21850.0000
+7435 39800.0000 21900.0000
+7436 39800.0000 22066.6667
+7437 39800.0000 22116.6667
+7438 39800.0000 22183.3333
+7439 39800.0000 22333.3333
+7440 39800.0000 22366.6667
+7441 39800.0000 22483.3333
+7442 39800.0000 22650.0000
+7443 39800.0000 25333.3333
+7444 39816.6667 19850.0000
+7445 39816.6667 20516.6667
+7446 39816.6667 20550.0000
+7447 39816.6667 20633.3333
+7448 39816.6667 20650.0000
+7449 39816.6667 20733.3333
+7450 39816.6667 20916.6667
+7451 39816.6667 20950.0000
+7452 39816.6667 21350.0000
+7453 39816.6667 21733.3333
+7454 39816.6667 22083.3333
+7455 39816.6667 22233.3333
+7456 39816.6667 22533.3333
+7457 39816.6667 25350.0000
+7458 39833.3333 20433.3333
+7459 39833.3333 20483.3333
+7460 39833.3333 20500.0000
+7461 39833.3333 20550.0000
+7462 39833.3333 20583.3333
+7463 39833.3333 20600.0000
+7464 39833.3333 20616.6667
+7465 39833.3333 20750.0000
+7466 39833.3333 20883.3333
+7467 39833.3333 21300.0000
+7468 39833.3333 21433.3333
+7469 39833.3333 21500.0000
+7470 39833.3333 21616.6667
+7471 39833.3333 21866.6667
+7472 39833.3333 21883.3333
+7473 39833.3333 22033.3333
+7474 39833.3333 22050.0000
+7475 39833.3333 22100.0000
+7476 39833.3333 22200.0000
+7477 39833.3333 22300.0000
+7478 39833.3333 22466.6667
+7479 39833.3333 22516.6667
+7480 39833.3333 22766.6667
+7481 39833.3333 22783.3333
+7482 39833.3333 25333.3333
+7483 39843.6111 19402.7778
+7484 39850.0000 19416.6667
+7485 39850.0000 20483.3333
+7486 39850.0000 20516.6667
+7487 39850.0000 20583.3333
+7488 39850.0000 20666.6667
+7489 39850.0000 20683.3333
+7490 39850.0000 20766.6667
+7491 39850.0000 20950.0000
+7492 39850.0000 20983.3333
+7493 39850.0000 21233.3333
+7494 39850.0000 21350.0000
+7495 39850.0000 21450.0000
+7496 39850.0000 21600.0000
+7497 39850.0000 21666.6667
+7498 39850.0000 21700.0000
+7499 39850.0000 21716.6667
+7500 39850.0000 21783.3333
+7501 39850.0000 21800.0000
+7502 39850.0000 22066.6667
+7503 39850.0000 22166.6667
+7504 39850.0000 22183.3333
+7505 39850.0000 22550.0000
+7506 39850.0000 25083.3333
+7507 39866.6667 19383.3333
+7508 39866.6667 19416.6667
+7509 39866.6667 20400.0000
+7510 39866.6667 20516.6667
+7511 39866.6667 20550.0000
+7512 39866.6667 20566.6667
+7513 39866.6667 20750.0000
+7514 39866.6667 20783.3333
+7515 39866.6667 20850.0000
+7516 39866.6667 20966.6667
+7517 39866.6667 20983.3333
+7518 39866.6667 21466.6667
+7519 39866.6667 21566.6667
+7520 39866.6667 21683.3333
+7521 39866.6667 21766.6667
+7522 39866.6667 22116.6667
+7523 39866.6667 22416.6667
+7524 39866.6667 22433.3333
+7525 39866.6667 22466.6667
+7526 39866.6667 22516.6667
+7527 39866.6667 22533.3333
+7528 39866.6667 25066.6667
+7529 39866.6667 25150.0000
+7530 39866.6667 25166.6667
+7531 39866.6667 25266.6667
+7532 39866.6667 25316.6667
+7533 39883.3333 19583.3333
+7534 39883.3333 20466.6667
+7535 39883.3333 20500.0000
+7536 39883.3333 20633.3333
+7537 39883.3333 20650.0000
+7538 39883.3333 20666.6667
+7539 39883.3333 20700.0000
+7540 39883.3333 20750.0000
+7541 39883.3333 20783.3333
+7542 39883.3333 21333.3333
+7543 39883.3333 21366.6667
+7544 39883.3333 21616.6667
+7545 39883.3333 21650.0000
+7546 39883.3333 21733.3333
+7547 39883.3333 21816.6667
+7548 39883.3333 22066.6667
+7549 39883.3333 22233.3333
+7550 39883.3333 22716.6667
+7551 39883.3333 25183.3333
+7552 39883.3333 25316.6667
+7553 39900.0000 20383.3333
+7554 39900.0000 20400.0000
+7555 39900.0000 20466.6667
+7556 39900.0000 20583.3333
+7557 39900.0000 20650.0000
+7558 39900.0000 20683.3333
+7559 39900.0000 20783.3333
+7560 39900.0000 20816.6667
+7561 39900.0000 21283.3333
+7562 39900.0000 21683.3333
+7563 39900.0000 22183.3333
+7564 39900.0000 22550.0000
+7565 39900.0000 22633.3333
+7566 39900.0000 25183.3333
+7567 39900.0000 25200.0000
+7568 39900.0000 25216.6667
+7569 39900.0000 25283.3333
+7570 39916.6667 20383.3333
+7571 39916.6667 20400.0000
+7572 39916.6667 20533.3333
+7573 39916.6667 20566.6667
+7574 39916.6667 20850.0000
+7575 39916.6667 21400.0000
+7576 39916.6667 21450.0000
+7577 39916.6667 21516.6667
+7578 39916.6667 21566.6667
+7579 39916.6667 21766.6667
+7580 39916.6667 21816.6667
+7581 39916.6667 22150.0000
+7582 39916.6667 22583.3333
+7583 39916.6667 22683.3333
+7584 39916.6667 25083.3333
+7585 39916.6667 25116.6667
+7586 39916.6667 25150.0000
+7587 39916.6667 25200.0000
+7588 39916.6667 25266.6667
+7589 39916.6667 25300.0000
+7590 39916.6667 25333.3333
+7591 39933.3333 20366.6667
+7592 39933.3333 20400.0000
+7593 39933.3333 20416.6667
+7594 39933.3333 20466.6667
+7595 39933.3333 20600.0000
+7596 39933.3333 20650.0000
+7597 39933.3333 20666.6667
+7598 39933.3333 21050.0000
+7599 39933.3333 21350.0000
+7600 39933.3333 22050.0000
+7601 39933.3333 22150.0000
+7602 39933.3333 22566.6667
+7603 39933.3333 22683.3333
+7604 39933.3333 25133.3333
+7605 39933.3333 25183.3333
+7606 39933.3333 25233.3333
+7607 39933.3333 25266.6667
+7608 39933.3333 25333.3333
+7609 39950.0000 20350.0000
+7610 39950.0000 20433.3333
+7611 39950.0000 20533.3333
+7612 39950.0000 20616.6667
+7613 39950.0000 20666.6667
+7614 39950.0000 20700.0000
+7615 39950.0000 21233.3333
+7616 39950.0000 21366.6667
+7617 39950.0000 21400.0000
+7618 39950.0000 21616.6667
+7619 39950.0000 21666.6667
+7620 39950.0000 21733.3333
+7621 39950.0000 21966.6667
+7622 39950.0000 22066.6667
+7623 39950.0000 22616.6667
+7624 39950.0000 23533.3333
+7625 39950.0000 23616.6667
+7626 39950.0000 23666.6667
+7627 39950.0000 25166.6667
+7628 39950.0000 25200.0000
+7629 39950.0000 25216.6667
+7630 39950.0000 25300.0000
+7631 39966.6667 20333.3333
+7632 39966.6667 20350.0000
+7633 39966.6667 20383.3333
+7634 39966.6667 20566.6667
+7635 39966.6667 20583.3333
+7636 39966.6667 20633.3333
+7637 39966.6667 20683.3333
+7638 39966.6667 20716.6667
+7639 39966.6667 20950.0000
+7640 39966.6667 21266.6667
+7641 39966.6667 21450.0000
+7642 39966.6667 21500.0000
+7643 39966.6667 21733.3333
+7644 39966.6667 21933.3333
+7645 39966.6667 22116.6667
+7646 39966.6667 22250.0000
+7647 39966.6667 22350.0000
+7648 39966.6667 22583.3333
+7649 39966.6667 23400.0000
+7650 39966.6667 23916.6667
+7651 39966.6667 25150.0000
+7652 39966.6667 25233.3333
+7653 39966.6667 25366.6667
+7654 39983.3333 20433.3333
+7655 39983.3333 20550.0000
+7656 39983.3333 20666.6667
+7657 39983.3333 20916.6667
+7658 39983.3333 21116.6667
+7659 39983.3333 21316.6667
+7660 39983.3333 21416.6667
+7661 39983.3333 21816.6667
+7662 39983.3333 22033.3333
+7663 39983.3333 22150.0000
+7664 39983.3333 22183.3333
+7665 39983.3333 22250.0000
+7666 39983.3333 22333.3333
+7667 39983.3333 22400.0000
+7668 39983.3333 22466.6667
+7669 39983.3333 22616.6667
+7670 39983.3333 23616.6667
+7671 39983.3333 23983.3333
+7672 39983.3333 25400.0000
+7673 40000.0000 20416.6667
+7674 40000.0000 20600.0000
+7675 40000.0000 20683.3333
+7676 40000.0000 20883.3333
+7677 40000.0000 21133.3333
+7678 40000.0000 21283.3333
+7679 40000.0000 21300.0000
+7680 40000.0000 21333.3333
+7681 40000.0000 21600.0000
+7682 40000.0000 21650.0000
+7683 40000.0000 21683.3333
+7684 40000.0000 21966.6667
+7685 40000.0000 22083.3333
+7686 40000.0000 22233.3333
+7687 40000.0000 22283.3333
+7688 40000.0000 22533.3333
+7689 40000.0000 22583.3333
+7690 40000.0000 23383.3333
+7691 40000.0000 23416.6667
+7692 40000.0000 23583.3333
+7693 40000.0000 25416.6667
+7694 40016.6667 20516.6667
+7695 40016.6667 20566.6667
+7696 40016.6667 20633.3333
+7697 40016.6667 20666.6667
+7698 40016.6667 21316.6667
+7699 40016.6667 21433.3333
+7700 40016.6667 21533.3333
+7701 40016.6667 21616.6667
+7702 40016.6667 21850.0000
+7703 40016.6667 22133.3333
+7704 40016.6667 22183.3333
+7705 40016.6667 22200.0000
+7706 40016.6667 22550.0000
+7707 40016.6667 22583.3333
+7708 40016.6667 23450.0000
+7709 40016.6667 23533.3333
+7710 40016.6667 23916.6667
+7711 40033.3333 20433.3333
+7712 40033.3333 20466.6667
+7713 40033.3333 20483.3333
+7714 40033.3333 20666.6667
+7715 40033.3333 20883.3333
+7716 40033.3333 20916.6667
+7717 40033.3333 20966.6667
+7718 40033.3333 21016.6667
+7719 40033.3333 21183.3333
+7720 40033.3333 21200.0000
+7721 40033.3333 21266.6667
+7722 40033.3333 21350.0000
+7723 40033.3333 21616.6667
+7724 40033.3333 21650.0000
+7725 40033.3333 21933.3333
+7726 40033.3333 22050.0000
+7727 40033.3333 22066.6667
+7728 40033.3333 22166.6667
+7729 40033.3333 23366.6667
+7730 40033.3333 23466.6667
+7731 40033.3333 23883.3333
+7732 40033.3333 23933.3333
+7733 40033.3333 24000.0000
+7734 40050.0000 20550.0000
+7735 40050.0000 20600.0000
+7736 40050.0000 20650.0000
+7737 40050.0000 20683.3333
+7738 40050.0000 20700.0000
+7739 40050.0000 20750.0000
+7740 40050.0000 20850.0000
+7741 40050.0000 21200.0000
+7742 40050.0000 21683.3333
+7743 40050.0000 21766.6667
+7744 40050.0000 21866.6667
+7745 40050.0000 22033.3333
+7746 40050.0000 22516.6667
+7747 40050.0000 23416.6667
+7748 40050.0000 23816.6667
+7749 40050.0000 24000.0000
+7750 40066.6667 20433.3333
+7751 40066.6667 20566.6667
+7752 40066.6667 20616.6667
+7753 40066.6667 20750.0000
+7754 40066.6667 20783.3333
+7755 40066.6667 21116.6667
+7756 40066.6667 21216.6667
+7757 40066.6667 21283.3333
+7758 40066.6667 21333.3333
+7759 40066.6667 21400.0000
+7760 40066.6667 21516.6667
+7761 40066.6667 21566.6667
+7762 40066.6667 21616.6667
+7763 40066.6667 21683.3333
+7764 40066.6667 21816.6667
+7765 40066.6667 22050.0000
+7766 40066.6667 22166.6667
+7767 40066.6667 22233.3333
+7768 40066.6667 22566.6667
+7769 40083.3333 20616.6667
+7770 40083.3333 20666.6667
+7771 40083.3333 20716.6667
+7772 40083.3333 20783.3333
+7773 40083.3333 21150.0000
+7774 40083.3333 21200.0000
+7775 40083.3333 21283.3333
+7776 40083.3333 21333.3333
+7777 40083.3333 21416.6667
+7778 40083.3333 21516.6667
+7779 40083.3333 21550.0000
+7780 40083.3333 21650.0000
+7781 40083.3333 21883.3333
+7782 40083.3333 21966.6667
+7783 40083.3333 23450.0000
+7784 40083.3333 23800.0000
+7785 40100.0000 20733.3333
+7786 40100.0000 21016.6667
+7787 40100.0000 21366.6667
+7788 40100.0000 21533.3333
+7789 40100.0000 21600.0000
+7790 40100.0000 21616.6667
+7791 40100.0000 22250.0000
+7792 40100.0000 22500.0000
+7793 40100.0000 23433.3333
+7794 40100.0000 23783.3333
+7795 40100.0000 23983.3333
+7796 40116.6667 20716.6667
+7797 40116.6667 20750.0000
+7798 40116.6667 20800.0000
+7799 40116.6667 20850.0000
+7800 40116.6667 21150.0000
+7801 40116.6667 21266.6667
+7802 40116.6667 21316.6667
+7803 40116.6667 21350.0000
+7804 40116.6667 21416.6667
+7805 40116.6667 21483.3333
+7806 40116.6667 21516.6667
+7807 40116.6667 21933.3333
+7808 40116.6667 23333.3333
+7809 40116.6667 23816.6667
+7810 40133.3333 20683.3333
+7811 40133.3333 20750.0000
+7812 40133.3333 20816.6667
+7813 40133.3333 21133.3333
+7814 40133.3333 21200.0000
+7815 40133.3333 21233.3333
+7816 40133.3333 21666.6667
+7817 40133.3333 21733.3333
+7818 40133.3333 21866.6667
+7819 40133.3333 21950.0000
+7820 40133.3333 22150.0000
+7821 40133.3333 23400.0000
+7822 40133.3333 23766.6667
+7823 40133.3333 24283.3333
+7824 40133.3333 24350.0000
+7825 40150.0000 20733.3333
+7826 40150.0000 20850.0000
+7827 40150.0000 20900.0000
+7828 40150.0000 21250.0000
+7829 40150.0000 21333.3333
+7830 40150.0000 21366.6667
+7831 40150.0000 21433.3333
+7832 40150.0000 21483.3333
+7833 40150.0000 21516.6667
+7834 40150.0000 21550.0000
+7835 40150.0000 21950.0000
+7836 40150.0000 22016.6667
+7837 40150.0000 22233.3333
+7838 40150.0000 22550.0000
+7839 40150.0000 23350.0000
+7840 40150.0000 24300.0000
+7841 40150.0000 24383.3333
+7842 40166.6667 20733.3333
+7843 40166.6667 20783.3333
+7844 40166.6667 20950.0000
+7845 40166.6667 21166.6667
+7846 40166.6667 21183.3333
+7847 40166.6667 21216.6667
+7848 40166.6667 21283.3333
+7849 40166.6667 21466.6667
+7850 40166.6667 21633.3333
+7851 40166.6667 21816.6667
+7852 40166.6667 21866.6667
+7853 40166.6667 21916.6667
+7854 40166.6667 22016.6667
+7855 40166.6667 22483.3333
+7856 40166.6667 23866.6667
+7857 40183.3333 21033.3333
+7858 40183.3333 21516.6667
+7859 40183.3333 21583.3333
+7860 40183.3333 21766.6667
+7861 40183.3333 21850.0000
+7862 40183.3333 21966.6667
+7863 40183.3333 22000.0000
+7864 40183.3333 22433.3333
+7865 40183.3333 22483.3333
+7866 40183.3333 22566.6667
+7867 40200.0000 20850.0000
+7868 40200.0000 21133.3333
+7869 40200.0000 21183.3333
+7870 40200.0000 21233.3333
+7871 40200.0000 21316.6667
+7872 40200.0000 21366.6667
+7873 40200.0000 21400.0000
+7874 40200.0000 21433.3333
+7875 40200.0000 21483.3333
+7876 40200.0000 21600.0000
+7877 40200.0000 21750.0000
+7878 40200.0000 21800.0000
+7879 40200.0000 21866.6667
+7880 40200.0000 21950.0000
+7881 40200.0000 22033.3333
+7882 40200.0000 22233.3333
+7883 40200.0000 22450.0000
+7884 40200.0000 23333.3333
+7885 40200.0000 24316.6667
+7886 40216.6667 20816.6667
+7887 40216.6667 20866.6667
+7888 40216.6667 20916.6667
+7889 40216.6667 21016.6667
+7890 40216.6667 21200.0000
+7891 40216.6667 21250.0000
+7892 40216.6667 21283.3333
+7893 40216.6667 21483.3333
+7894 40216.6667 21783.3333
+7895 40216.6667 21850.0000
+7896 40216.6667 21883.3333
+7897 40216.6667 21900.0000
+7898 40216.6667 22066.6667
+7899 40216.6667 23666.6667
+7900 40216.6667 24216.6667
+7901 40233.3333 20783.3333
+7902 40233.3333 20850.0000
+7903 40233.3333 20933.3333
+7904 40233.3333 21166.6667
+7905 40233.3333 21216.6667
+7906 40233.3333 21283.3333
+7907 40233.3333 21316.6667
+7908 40233.3333 21350.0000
+7909 40233.3333 21383.3333
+7910 40233.3333 21416.6667
+7911 40233.3333 21750.0000
+7912 40233.3333 21833.3333
+7913 40233.3333 21900.0000
+7914 40233.3333 21966.6667
+7915 40233.3333 22300.0000
+7916 40233.3333 22466.6667
+7917 40233.3333 22500.0000
+7918 40233.3333 22583.3333
+7919 40233.3333 23600.0000
+7920 40233.3333 23666.6667
+7921 40250.0000 20816.6667
+7922 40250.0000 21200.0000
+7923 40250.0000 21266.6667
+7924 40250.0000 21433.3333
+7925 40250.0000 21683.3333
+7926 40250.0000 21750.0000
+7927 40250.0000 21800.0000
+7928 40250.0000 21900.0000
+7929 40250.0000 21916.6667
+7930 40250.0000 22066.6667
+7931 40250.0000 22333.3333
+7932 40250.0000 22366.6667
+7933 40250.0000 22383.3333
+7934 40250.0000 22566.6667
+7935 40250.0000 23283.3333
+7936 40250.0000 23550.0000
+7937 40250.0000 23700.0000
+7938 40250.0000 24200.0000
+7939 40250.0000 24250.0000
+7940 40266.6667 20733.3333
+7941 40266.6667 20750.0000
+7942 40266.6667 20766.6667
+7943 40266.6667 20900.0000
+7944 40266.6667 21200.0000
+7945 40266.6667 21283.3333
+7946 40266.6667 21316.6667
+7947 40266.6667 21383.3333
+7948 40266.6667 21416.6667
+7949 40266.6667 21450.0000
+7950 40266.6667 21500.0000
+7951 40266.6667 21550.0000
+7952 40266.6667 21750.0000
+7953 40266.6667 21783.3333
+7954 40266.6667 21816.6667
+7955 40266.6667 21933.3333
+7956 40266.6667 22033.3333
+7957 40266.6667 22083.3333
+7958 40266.6667 22150.0000
+7959 40266.6667 22283.3333
+7960 40266.6667 22300.0000
+7961 40266.6667 22416.6667
+7962 40266.6667 22466.6667
+7963 40266.6667 22500.0000
+7964 40266.6667 22533.3333
+7965 40266.6667 22583.3333
+7966 40266.6667 22600.0000
+7967 40266.6667 23200.0000
+7968 40266.6667 23216.6667
+7969 40266.6667 23266.6667
+7970 40266.6667 23333.3333
+7971 40266.6667 23500.0000
+7972 40266.6667 24250.0000
+7973 40283.3333 20966.6667
+7974 40283.3333 21033.3333
+7975 40283.3333 21150.0000
+7976 40283.3333 21166.6667
+7977 40283.3333 21200.0000
+7978 40283.3333 21216.6667
+7979 40283.3333 21233.3333
+7980 40283.3333 21350.0000
+7981 40283.3333 21483.3333
+7982 40283.3333 21733.3333
+7983 40283.3333 21866.6667
+7984 40283.3333 21966.6667
+7985 40283.3333 22116.6667
+7986 40283.3333 22283.3333
+7987 40283.3333 22433.3333
+7988 40283.3333 22466.6667
+7989 40283.3333 22600.0000
+7990 40283.3333 23150.0000
+7991 40283.3333 23250.0000
+7992 40283.3333 23300.0000
+7993 40283.3333 23350.0000
+7994 40283.3333 23400.0000
+7995 40283.3333 23450.0000
+7996 40283.3333 24250.0000
+7997 40300.0000 20766.6667
+7998 40300.0000 20950.0000
+7999 40300.0000 21133.3333
+8000 40300.0000 21200.0000
+8001 40300.0000 21216.6667
+8002 40300.0000 21233.3333
+8003 40300.0000 21266.6667
+8004 40300.0000 21283.3333
+8005 40300.0000 21300.0000
+8006 40300.0000 21366.6667
+8007 40300.0000 21416.6667
+8008 40300.0000 21650.0000
+8009 40300.0000 21783.3333
+8010 40300.0000 22033.3333
+8011 40300.0000 22500.0000
+8012 40300.0000 23200.0000
+8013 40300.0000 23350.0000
+8014 40300.0000 23550.0000
+8015 40300.0000 24050.0000
+8016 40300.0000 24066.6667
+8017 40300.0000 24216.6667
+8018 40316.6667 20850.0000
+8019 40316.6667 21133.3333
+8020 40316.6667 21183.3333
+8021 40316.6667 21333.3333
+8022 40316.6667 21383.3333
+8023 40316.6667 21433.3333
+8024 40316.6667 21550.0000
+8025 40316.6667 21650.0000
+8026 40316.6667 21666.6667
+8027 40316.6667 21700.0000
+8028 40316.6667 21916.6667
+8029 40316.6667 22116.6667
+8030 40316.6667 22250.0000
+8031 40316.6667 22350.0000
+8032 40316.6667 22466.6667
+8033 40316.6667 22500.0000
+8034 40316.6667 22583.3333
+8035 40316.6667 23066.6667
+8036 40316.6667 23350.0000
+8037 40333.3333 21000.0000
+8038 40333.3333 21133.3333
+8039 40333.3333 21183.3333
+8040 40333.3333 21233.3333
+8041 40333.3333 21250.0000
+8042 40333.3333 21283.3333
+8043 40333.3333 21366.6667
+8044 40333.3333 21666.6667
+8045 40333.3333 21683.3333
+8046 40333.3333 21716.6667
+8047 40333.3333 21733.3333
+8048 40333.3333 21783.3333
+8049 40333.3333 21800.0000
+8050 40333.3333 21866.6667
+8051 40333.3333 21883.3333
+8052 40333.3333 22016.6667
+8053 40333.3333 22166.6667
+8054 40333.3333 22333.3333
+8055 40333.3333 22533.3333
+8056 40333.3333 23066.6667
+8057 40333.3333 23133.3333
+8058 40333.3333 23150.0000
+8059 40333.3333 23166.6667
+8060 40333.3333 23233.3333
+8061 40333.3333 23266.6667
+8062 40333.3333 23400.0000
+8063 40333.3333 23616.6667
+8064 40333.3333 23650.0000
+8065 40333.3333 23716.6667
+8066 40333.3333 23916.6667
+8067 40333.3333 23983.3333
+8068 40350.0000 20933.3333
+8069 40350.0000 21083.3333
+8070 40350.0000 21333.3333
+8071 40350.0000 21400.0000
+8072 40350.0000 21516.6667
+8073 40350.0000 21716.6667
+8074 40350.0000 21816.6667
+8075 40350.0000 21833.3333
+8076 40350.0000 21866.6667
+8077 40350.0000 21916.6667
+8078 40350.0000 21933.3333
+8079 40350.0000 21950.0000
+8080 40350.0000 21966.6667
+8081 40350.0000 22033.3333
+8082 40350.0000 22200.0000
+8083 40350.0000 22433.3333
+8084 40350.0000 22500.0000
+8085 40350.0000 22550.0000
+8086 40350.0000 23016.6667
+8087 40350.0000 23133.3333
+8088 40350.0000 23183.3333
+8089 40350.0000 23233.3333
+8090 40350.0000 23316.6667
+8091 40350.0000 23583.3333
+8092 40350.0000 23733.3333
+8093 40366.6667 21016.6667
+8094 40366.6667 21116.6667
+8095 40366.6667 21150.0000
+8096 40366.6667 21183.3333
+8097 40366.6667 21200.0000
+8098 40366.6667 21233.3333
+8099 40366.6667 21316.6667
+8100 40366.6667 21350.0000
+8101 40366.6667 21433.3333
+8102 40366.6667 21466.6667
+8103 40366.6667 21983.3333
+8104 40366.6667 22066.6667
+8105 40366.6667 22466.6667
+8106 40366.6667 22583.3333
+8107 40366.6667 22616.6667
+8108 40366.6667 23050.0000
+8109 40366.6667 23100.0000
+8110 40366.6667 23166.6667
+8111 40366.6667 23233.3333
+8112 40366.6667 23266.6667
+8113 40366.6667 23283.3333
+8114 40366.6667 23533.3333
+8115 40366.6667 23583.3333
+8116 40366.6667 23650.0000
+8117 40366.6667 23666.6667
+8118 40366.6667 23700.0000
+8119 40366.6667 23833.3333
+8120 40366.6667 23883.3333
+8121 40383.3333 20833.3333
+8122 40383.3333 20950.0000
+8123 40383.3333 21000.0000
+8124 40383.3333 21100.0000
+8125 40383.3333 21166.6667
+8126 40383.3333 21200.0000
+8127 40383.3333 21300.0000
+8128 40383.3333 21316.6667
+8129 40383.3333 21350.0000
+8130 40383.3333 21700.0000
+8131 40383.3333 21716.6667
+8132 40383.3333 21766.6667
+8133 40383.3333 21966.6667
+8134 40383.3333 21983.3333
+8135 40383.3333 22000.0000
+8136 40383.3333 22216.6667
+8137 40383.3333 22516.6667
+8138 40383.3333 22633.3333
+8139 40383.3333 23050.0000
+8140 40383.3333 23083.3333
+8141 40383.3333 23450.0000
+8142 40383.3333 23616.6667
+8143 40383.3333 23916.6667
+8144 40383.3333 23983.3333
+8145 40400.0000 21000.0000
+8146 40400.0000 21133.3333
+8147 40400.0000 21166.6667
+8148 40400.0000 21250.0000
+8149 40400.0000 21933.3333
+8150 40400.0000 22150.0000
+8151 40400.0000 22383.3333
+8152 40400.0000 22550.0000
+8153 40400.0000 22900.0000
+8154 40400.0000 23150.0000
+8155 40400.0000 23200.0000
+8156 40400.0000 23800.0000
+8157 40400.0000 23883.3333
+8158 40416.6667 20883.3333
+8159 40416.6667 20966.6667
+8160 40416.6667 21066.6667
+8161 40416.6667 21233.3333
+8162 40416.6667 21283.3333
+8163 40416.6667 21300.0000
+8164 40416.6667 21383.3333
+8165 40416.6667 21516.6667
+8166 40416.6667 21683.3333
+8167 40416.6667 21766.6667
+8168 40416.6667 21916.6667
+8169 40416.6667 22116.6667
+8170 40416.6667 22233.3333
+8171 40416.6667 22300.0000
+8172 40416.6667 22450.0000
+8173 40416.6667 22466.6667
+8174 40416.6667 22550.0000
+8175 40416.6667 22600.0000
+8176 40416.6667 23000.0000
+8177 40416.6667 23100.0000
+8178 40416.6667 23133.3333
+8179 40416.6667 23250.0000
+8180 40416.6667 23583.3333
+8181 40416.6667 24000.0000
+8182 40433.3333 21033.3333
+8183 40433.3333 21066.6667
+8184 40433.3333 21083.3333
+8185 40433.3333 21116.6667
+8186 40433.3333 21266.6667
+8187 40433.3333 21333.3333
+8188 40433.3333 21500.0000
+8189 40433.3333 21866.6667
+8190 40433.3333 21900.0000
+8191 40433.3333 22183.3333
+8192 40433.3333 22583.3333
+8193 40433.3333 22933.3333
+8194 40433.3333 23033.3333
+8195 40433.3333 23100.0000
+8196 40433.3333 23133.3333
+8197 40433.3333 23316.6667
+8198 40433.3333 23416.6667
+8199 40433.3333 23516.6667
+8200 40433.3333 25533.3333
+8201 40450.0000 20850.0000
+8202 40450.0000 20933.3333
+8203 40450.0000 21133.3333
+8204 40450.0000 21166.6667
+8205 40450.0000 21183.3333
+8206 40450.0000 21216.6667
+8207 40450.0000 21333.3333
+8208 40450.0000 21433.3333
+8209 40450.0000 21516.6667
+8210 40450.0000 21733.3333
+8211 40450.0000 21800.0000
+8212 40450.0000 21833.3333
+8213 40450.0000 22266.6667
+8214 40450.0000 22383.3333
+8215 40450.0000 22450.0000
+8216 40450.0000 22583.3333
+8217 40450.0000 23033.3333
+8218 40450.0000 23683.3333
+8219 40450.0000 25516.6667
+8220 40466.6667 20866.6667
+8221 40466.6667 20900.0000
+8222 40466.6667 20966.6667
+8223 40466.6667 21000.0000
+8224 40466.6667 21066.6667
+8225 40466.6667 21100.0000
+8226 40466.6667 21266.6667
+8227 40466.6667 21300.0000
+8228 40466.6667 21666.6667
+8229 40466.6667 21766.6667
+8230 40466.6667 21866.6667
+8231 40466.6667 22083.3333
+8232 40466.6667 22166.6667
+8233 40466.6667 22550.0000
+8234 40466.6667 22583.3333
+8235 40466.6667 22866.6667
+8236 40466.6667 22950.0000
+8237 40466.6667 22966.6667
+8238 40466.6667 22983.3333
+8239 40466.6667 23000.0000
+8240 40466.6667 23083.3333
+8241 40466.6667 23133.3333
+8242 40466.6667 23183.3333
+8243 40466.6667 23283.3333
+8244 40466.6667 23383.3333
+8245 40466.6667 25500.0000
+8246 40483.3333 20983.3333
+8247 40483.3333 21016.6667
+8248 40483.3333 21133.3333
+8249 40483.3333 21166.6667
+8250 40483.3333 21183.3333
+8251 40483.3333 21216.6667
+8252 40483.3333 21283.3333
+8253 40483.3333 21550.0000
+8254 40483.3333 21566.6667
+8255 40483.3333 21600.0000
+8256 40483.3333 21633.3333
+8257 40483.3333 21716.6667
+8258 40483.3333 21816.6667
+8259 40483.3333 22116.6667
+8260 40483.3333 22216.6667
+8261 40483.3333 22233.3333
+8262 40483.3333 22316.6667
+8263 40483.3333 22350.0000
+8264 40483.3333 22483.3333
+8265 40483.3333 22833.3333
+8266 40483.3333 22866.6667
+8267 40483.3333 23016.6667
+8268 40483.3333 23050.0000
+8269 40483.3333 23133.3333
+8270 40483.3333 23600.0000
+8271 40483.3333 25466.6667
+8272 40483.3333 25516.6667
+8273 40500.0000 21050.0000
+8274 40500.0000 21166.6667
+8275 40500.0000 21216.6667
+8276 40500.0000 21250.0000
+8277 40500.0000 21383.3333
+8278 40500.0000 21533.3333
+8279 40500.0000 21766.6667
+8280 40500.0000 21816.6667
+8281 40500.0000 21850.0000
+8282 40500.0000 22183.3333
+8283 40500.0000 22250.0000
+8284 40500.0000 22416.6667
+8285 40500.0000 22433.3333
+8286 40500.0000 22550.0000
+8287 40500.0000 22833.3333
+8288 40500.0000 22883.3333
+8289 40500.0000 22916.6667
+8290 40500.0000 22933.3333
+8291 40500.0000 22983.3333
+8292 40500.0000 23383.3333
+8293 40500.0000 23433.3333
+8294 40500.0000 23450.0000
+8295 40500.0000 23650.0000
+8296 40500.0000 25533.3333
+8297 40516.6667 21000.0000
+8298 40516.6667 21050.0000
+8299 40516.6667 21083.3333
+8300 40516.6667 21200.0000
+8301 40516.6667 21266.6667
+8302 40516.6667 21316.6667
+8303 40516.6667 21416.6667
+8304 40516.6667 21550.0000
+8305 40516.6667 21683.3333
+8306 40516.6667 21750.0000
+8307 40516.6667 22083.3333
+8308 40516.6667 22200.0000
+8309 40516.6667 22233.3333
+8310 40516.6667 22383.3333
+8311 40516.6667 22400.0000
+8312 40516.6667 22500.0000
+8313 40516.6667 22966.6667
+8314 40516.6667 23116.6667
+8315 40516.6667 23216.6667
+8316 40516.6667 23283.3333
+8317 40516.6667 23683.3333
+8318 40516.6667 23833.3333
+8319 40533.3333 21016.6667
+8320 40533.3333 21033.3333
+8321 40533.3333 21116.6667
+8322 40533.3333 21183.3333
+8323 40533.3333 21216.6667
+8324 40533.3333 21466.6667
+8325 40533.3333 21500.0000
+8326 40533.3333 21600.0000
+8327 40533.3333 22133.3333
+8328 40533.3333 22266.6667
+8329 40533.3333 22316.6667
+8330 40533.3333 22433.3333
+8331 40533.3333 23050.0000
+8332 40533.3333 23750.0000
+8333 40533.3333 23766.6667
+8334 40550.0000 21350.0000
+8335 40550.0000 21400.0000
+8336 40550.0000 21433.3333
+8337 40550.0000 21716.6667
+8338 40550.0000 21750.0000
+8339 40550.0000 22033.3333
+8340 40550.0000 22250.0000
+8341 40550.0000 22266.6667
+8342 40550.0000 22316.6667
+8343 40550.0000 22400.0000
+8344 40550.0000 22416.6667
+8345 40550.0000 22450.0000
+8346 40550.0000 22466.6667
+8347 40550.0000 22500.0000
+8348 40550.0000 23016.6667
+8349 40550.0000 23050.0000
+8350 40550.0000 23133.3333
+8351 40550.0000 23166.6667
+8352 40550.0000 23300.0000
+8353 40550.0000 23416.6667
+8354 40550.0000 23450.0000
+8355 40550.0000 23583.3333
+8356 40550.0000 23850.0000
+8357 40566.6667 21250.0000
+8358 40566.6667 21266.6667
+8359 40566.6667 21316.6667
+8360 40566.6667 21433.3333
+8361 40566.6667 21600.0000
+8362 40566.6667 21700.0000
+8363 40566.6667 22116.6667
+8364 40566.6667 22150.0000
+8365 40566.6667 22183.3333
+8366 40566.6667 22200.0000
+8367 40566.6667 22216.6667
+8368 40566.6667 22233.3333
+8369 40566.6667 22333.3333
+8370 40566.6667 22350.0000
+8371 40566.6667 22366.6667
+8372 40566.6667 22516.6667
+8373 40566.6667 22550.0000
+8374 40566.6667 22583.3333
+8375 40566.6667 23100.0000
+8376 40566.6667 23283.3333
+8377 40566.6667 23350.0000
+8378 40566.6667 23366.6667
+8379 40566.6667 23466.6667
+8380 40566.6667 23666.6667
+8381 40583.3333 21066.6667
+8382 40583.3333 21083.3333
+8383 40583.3333 21150.0000
+8384 40583.3333 21300.0000
+8385 40583.3333 21400.0000
+8386 40583.3333 21483.3333
+8387 40583.3333 22066.6667
+8388 40583.3333 22250.0000
+8389 40583.3333 22300.0000
+8390 40583.3333 22400.0000
+8391 40583.3333 22516.6667
+8392 40583.3333 22600.0000
+8393 40583.3333 22966.6667
+8394 40583.3333 23033.3333
+8395 40583.3333 23216.6667
+8396 40583.3333 23350.0000
+8397 40583.3333 23400.0000
+8398 40583.3333 23416.6667
+8399 40583.3333 23433.3333
+8400 40583.3333 24650.0000
+8401 40600.0000 21266.6667
+8402 40600.0000 21366.6667
+8403 40600.0000 21616.6667
+8404 40600.0000 21783.3333
+8405 40600.0000 22133.3333
+8406 40600.0000 22200.0000
+8407 40600.0000 22216.6667
+8408 40600.0000 22233.3333
+8409 40600.0000 22333.3333
+8410 40600.0000 22350.0000
+8411 40600.0000 22366.6667
+8412 40600.0000 22450.0000
+8413 40600.0000 22483.3333
+8414 40600.0000 22500.0000
+8415 40600.0000 22550.0000
+8416 40600.0000 22983.3333
+8417 40600.0000 23100.0000
+8418 40600.0000 23183.3333
+8419 40600.0000 23450.0000
+8420 40600.0000 23483.3333
+8421 40600.0000 23750.0000
+8422 40600.0000 23783.3333
+8423 40600.0000 24750.0000
+8424 40616.6667 21216.6667
+8425 40616.6667 21316.6667
+8426 40616.6667 21350.0000
+8427 40616.6667 21466.6667
+8428 40616.6667 21500.0000
+8429 40616.6667 21750.0000
+8430 40616.6667 22183.3333
+8431 40616.6667 22366.6667
+8432 40616.6667 22400.0000
+8433 40616.6667 22433.3333
+8434 40616.6667 22683.3333
+8435 40616.6667 22700.0000
+8436 40616.6667 23433.3333
+8437 40616.6667 23566.6667
+8438 40633.3333 21083.3333
+8439 40633.3333 21183.3333
+8440 40633.3333 21233.3333
+8441 40633.3333 21283.3333
+8442 40633.3333 21566.6667
+8443 40633.3333 21583.3333
+8444 40633.3333 21700.0000
+8445 40633.3333 21833.3333
+8446 40633.3333 22066.6667
+8447 40633.3333 22133.3333
+8448 40633.3333 22383.3333
+8449 40633.3333 22450.0000
+8450 40633.3333 22500.0000
+8451 40633.3333 22733.3333
+8452 40633.3333 22933.3333
+8453 40633.3333 22950.0000
+8454 40633.3333 23183.3333
+8455 40633.3333 23216.6667
+8456 40633.3333 23250.0000
+8457 40633.3333 23266.6667
+8458 40633.3333 23350.0000
+8459 40633.3333 23450.0000
+8460 40633.3333 23483.3333
+8461 40633.3333 23616.6667
+8462 40633.3333 24566.6667
+8463 40633.3333 24583.3333
+8464 40650.0000 21066.6667
+8465 40650.0000 21233.3333
+8466 40650.0000 21500.0000
+8467 40650.0000 21700.0000
+8468 40650.0000 21766.6667
+8469 40650.0000 22116.6667
+8470 40650.0000 22166.6667
+8471 40650.0000 22216.6667
+8472 40650.0000 22233.3333
+8473 40650.0000 22433.3333
+8474 40650.0000 22533.3333
+8475 40650.0000 22866.6667
+8476 40650.0000 22883.3333
+8477 40650.0000 22900.0000
+8478 40650.0000 23033.3333
+8479 40650.0000 23300.0000
+8480 40650.0000 23400.0000
+8481 40650.0000 23483.3333
+8482 40650.0000 23616.6667
+8483 40650.0000 23700.0000
+8484 40650.0000 24516.6667
+8485 40666.6667 21100.0000
+8486 40666.6667 21150.0000
+8487 40666.6667 21266.6667
+8488 40666.6667 21333.3333
+8489 40666.6667 21550.0000
+8490 40666.6667 21583.3333
+8491 40666.6667 21600.0000
+8492 40666.6667 21633.3333
+8493 40666.6667 21833.3333
+8494 40666.6667 22050.0000
+8495 40666.6667 22450.0000
+8496 40666.6667 22516.6667
+8497 40666.6667 22600.0000
+8498 40666.6667 22633.3333
+8499 40666.6667 22716.6667
+8500 40666.6667 22800.0000
+8501 40666.6667 22900.0000
+8502 40666.6667 22916.6667
+8503 40666.6667 22933.3333
+8504 40666.6667 22950.0000
+8505 40666.6667 22983.3333
+8506 40666.6667 23116.6667
+8507 40666.6667 23333.3333
+8508 40666.6667 23700.0000
+8509 40666.6667 24650.0000
+8510 40666.6667 24700.0000
+8511 40666.6667 24766.6667
+8512 40683.3333 21450.0000
+8513 40683.3333 21616.6667
+8514 40683.3333 21666.6667
+8515 40683.3333 21683.3333
+8516 40683.3333 21716.6667
+8517 40683.3333 22133.3333
+8518 40683.3333 22200.0000
+8519 40683.3333 22250.0000
+8520 40683.3333 22266.6667
+8521 40683.3333 22300.0000
+8522 40683.3333 22533.3333
+8523 40683.3333 22850.0000
+8524 40683.3333 22950.0000
+8525 40683.3333 23000.0000
+8526 40683.3333 23083.3333
+8527 40683.3333 23250.0000
+8528 40683.3333 23283.3333
+8529 40683.3333 23566.6667
+8530 40683.3333 23616.6667
+8531 40683.3333 24616.6667
+8532 40700.0000 21166.6667
+8533 40700.0000 21266.6667
+8534 40700.0000 21300.0000
+8535 40700.0000 21400.0000
+8536 40700.0000 21466.6667
+8537 40700.0000 21516.6667
+8538 40700.0000 21783.3333
+8539 40700.0000 21900.0000
+8540 40700.0000 21933.3333
+8541 40700.0000 22016.6667
+8542 40700.0000 22100.0000
+8543 40700.0000 22266.6667
+8544 40700.0000 22550.0000
+8545 40700.0000 22600.0000
+8546 40700.0000 23216.6667
+8547 40700.0000 23333.3333
+8548 40700.0000 23433.3333
+8549 40700.0000 23650.0000
+8550 40700.0000 24550.0000
+8551 40700.0000 24766.6667
+8552 40716.6667 21050.0000
+8553 40716.6667 21100.0000
+8554 40716.6667 21150.0000
+8555 40716.6667 21200.0000
+8556 40716.6667 21266.6667
+8557 40716.6667 21366.6667
+8558 40716.6667 21466.6667
+8559 40716.6667 21783.3333
+8560 40716.6667 22000.0000
+8561 40716.6667 22083.3333
+8562 40716.6667 22116.6667
+8563 40716.6667 22150.0000
+8564 40716.6667 22166.6667
+8565 40716.6667 22216.6667
+8566 40716.6667 22300.0000
+8567 40716.6667 22633.3333
+8568 40716.6667 22733.3333
+8569 40716.6667 22783.3333
+8570 40716.6667 23000.0000
+8571 40716.6667 23050.0000
+8572 40716.6667 23183.3333
+8573 40716.6667 23283.3333
+8574 40716.6667 23383.3333
+8575 40716.6667 23700.0000
+8576 40716.6667 24533.3333
+8577 40716.6667 24550.0000
+8578 40716.6667 24583.3333
+8579 40716.6667 24616.6667
+8580 40716.6667 24733.3333
+8581 40733.3333 21016.6667
+8582 40733.3333 21133.3333
+8583 40733.3333 21200.0000
+8584 40733.3333 21400.0000
+8585 40733.3333 21433.3333
+8586 40733.3333 21483.3333
+8587 40733.3333 21666.6667
+8588 40733.3333 21750.0000
+8589 40733.3333 21816.6667
+8590 40733.3333 22133.3333
+8591 40733.3333 22216.6667
+8592 40733.3333 22600.0000
+8593 40733.3333 22700.0000
+8594 40733.3333 22883.3333
+8595 40733.3333 22916.6667
+8596 40733.3333 23250.0000
+8597 40733.3333 23550.0000
+8598 40733.3333 24116.6667
+8599 40733.3333 24616.6667
+8600 40733.3333 24733.3333
+8601 40750.0000 21000.0000
+8602 40750.0000 21066.6667
+8603 40750.0000 21116.6667
+8604 40750.0000 21300.0000
+8605 40750.0000 21466.6667
+8606 40750.0000 21516.6667
+8607 40750.0000 21633.3333
+8608 40750.0000 22016.6667
+8609 40750.0000 22216.6667
+8610 40750.0000 22250.0000
+8611 40750.0000 22283.3333
+8612 40750.0000 22333.3333
+8613 40750.0000 22583.3333
+8614 40750.0000 22633.3333
+8615 40750.0000 22766.6667
+8616 40750.0000 22850.0000
+8617 40750.0000 22983.3333
+8618 40750.0000 23033.3333
+8619 40750.0000 23066.6667
+8620 40750.0000 23133.3333
+8621 40750.0000 23383.3333
+8622 40750.0000 23466.6667
+8623 40750.0000 23583.3333
+8624 40750.0000 23983.3333
+8625 40750.0000 24583.3333
+8626 40750.0000 24633.3333
+8627 40758.0556 24577.5000
+8628 40766.6667 21033.3333
+8629 40766.6667 21150.0000
+8630 40766.6667 21200.0000
+8631 40766.6667 21350.0000
+8632 40766.6667 21400.0000
+8633 40766.6667 21533.3333
+8634 40766.6667 21616.6667
+8635 40766.6667 21900.0000
+8636 40766.6667 22050.0000
+8637 40766.6667 22066.6667
+8638 40766.6667 22116.6667
+8639 40766.6667 22150.0000
+8640 40766.6667 22166.6667
+8641 40766.6667 22183.3333
+8642 40766.6667 22250.0000
+8643 40766.6667 22316.6667
+8644 40766.6667 22500.0000
+8645 40766.6667 22533.3333
+8646 40766.6667 22583.3333
+8647 40766.6667 22716.6667
+8648 40766.6667 22933.3333
+8649 40766.6667 23033.3333
+8650 40766.6667 23083.3333
+8651 40766.6667 23216.6667
+8652 40766.6667 23250.0000
+8653 40766.6667 23383.3333
+8654 40766.6667 23450.0000
+8655 40766.6667 23483.3333
+8656 40766.6667 23583.3333
+8657 40766.6667 24633.3333
+8658 40770.0000 24723.8889
+8659 40778.0556 24709.4444
+8660 40778.8889 24611.6667
+8661 40783.3333 21083.3333
+8662 40783.3333 21133.3333
+8663 40783.3333 21250.0000
+8664 40783.3333 21300.0000
+8665 40783.3333 21400.0000
+8666 40783.3333 21466.6667
+8667 40783.3333 21483.3333
+8668 40783.3333 21550.0000
+8669 40783.3333 21683.3333
+8670 40783.3333 22083.3333
+8671 40783.3333 22166.6667
+8672 40783.3333 22266.6667
+8673 40783.3333 22483.3333
+8674 40783.3333 22583.3333
+8675 40783.3333 22883.3333
+8676 40783.3333 22966.6667
+8677 40783.3333 23533.3333
+8678 40783.3333 23850.0000
+8679 40783.3333 23950.0000
+8680 40783.3333 24033.3333
+8681 40800.0000 21150.0000
+8682 40800.0000 21466.6667
+8683 40800.0000 21516.6667
+8684 40800.0000 21583.3333
+8685 40800.0000 21783.3333
+8686 40800.0000 21833.3333
+8687 40800.0000 21850.0000
+8688 40800.0000 21866.6667
+8689 40800.0000 21916.6667
+8690 40800.0000 22000.0000
+8691 40800.0000 22033.3333
+8692 40800.0000 22050.0000
+8693 40800.0000 22216.6667
+8694 40800.0000 22233.3333
+8695 40800.0000 22333.3333
+8696 40800.0000 22366.6667
+8697 40800.0000 22416.6667
+8698 40800.0000 22466.6667
+8699 40800.0000 22566.6667
+8700 40800.0000 22666.6667
+8701 40800.0000 22766.6667
+8702 40800.0000 22783.3333
+8703 40800.0000 22833.3333
+8704 40800.0000 22866.6667
+8705 40800.0000 22900.0000
+8706 40800.0000 23116.6667
+8707 40800.0000 23466.6667
+8708 40800.0000 23850.0000
+8709 40800.0000 23916.6667
+8710 40800.0000 23950.0000
+8711 40816.6667 21116.6667
+8712 40816.6667 21133.3333
+8713 40816.6667 21300.0000
+8714 40816.6667 21400.0000
+8715 40816.6667 21933.3333
+8716 40816.6667 22066.6667
+8717 40816.6667 22100.0000
+8718 40816.6667 22166.6667
+8719 40816.6667 22183.3333
+8720 40816.6667 22266.6667
+8721 40816.6667 22350.0000
+8722 40816.6667 22416.6667
+8723 40816.6667 22533.3333
+8724 40816.6667 22666.6667
+8725 40816.6667 22700.0000
+8726 40816.6667 22733.3333
+8727 40816.6667 23033.3333
+8728 40816.6667 23116.6667
+8729 40816.6667 23150.0000
+8730 40816.6667 23283.3333
+8731 40816.6667 23300.0000
+8732 40816.6667 23350.0000
+8733 40816.6667 23516.6667
+8734 40816.6667 23566.6667
+8735 40816.6667 23650.0000
+8736 40816.6667 24150.0000
+8737 40816.6667 24250.0000
+8738 40833.3333 21033.3333
+8739 40833.3333 21133.3333
+8740 40833.3333 21150.0000
+8741 40833.3333 21166.6667
+8742 40833.3333 21300.0000
+8743 40833.3333 21400.0000
+8744 40833.3333 21500.0000
+8745 40833.3333 21516.6667
+8746 40833.3333 21533.3333
+8747 40833.3333 21583.3333
+8748 40833.3333 21766.6667
+8749 40833.3333 22000.0000
+8750 40833.3333 22200.0000
+8751 40833.3333 22250.0000
+8752 40833.3333 22300.0000
+8753 40833.3333 22350.0000
+8754 40833.3333 22383.3333
+8755 40833.3333 22450.0000
+8756 40833.3333 22600.0000
+8757 40833.3333 22650.0000
+8758 40833.3333 22783.3333
+8759 40833.3333 22850.0000
+8760 40833.3333 22983.3333
+8761 40833.3333 23200.0000
+8762 40833.3333 23783.3333
+8763 40833.3333 23850.0000
+8764 40833.3333 23933.3333
+8765 40833.3333 24000.0000
+8766 40833.3333 24016.6667
+8767 40833.3333 24200.0000
+8768 40838.8889 24303.6111
+8769 40850.0000 21316.6667
+8770 40850.0000 21383.3333
+8771 40850.0000 21400.0000
+8772 40850.0000 21816.6667
+8773 40850.0000 21850.0000
+8774 40850.0000 21950.0000
+8775 40850.0000 22100.0000
+8776 40850.0000 22216.6667
+8777 40850.0000 22250.0000
+8778 40850.0000 22283.3333
+8779 40850.0000 22300.0000
+8780 40850.0000 22500.0000
+8781 40850.0000 22716.6667
+8782 40850.0000 22833.3333
+8783 40850.0000 22916.6667
+8784 40850.0000 23166.6667
+8785 40850.0000 23650.0000
+8786 40850.0000 23733.3333
+8787 40850.0000 24066.6667
+8788 40850.0000 24150.0000
+8789 40850.0000 24166.6667
+8790 40850.0000 24250.0000
+8791 40850.0000 25750.0000
+8792 40850.0000 25833.3333
+8793 40850.0000 25866.6667
+8794 40850.0000 25933.3333
+8795 40850.0000 26100.0000
+8796 40858.3333 24706.1111
+8797 40864.4444 24315.8333
+8798 40866.6667 21350.0000
+8799 40866.6667 21366.6667
+8800 40866.6667 21450.0000
+8801 40866.6667 21466.6667
+8802 40866.6667 21500.0000
+8803 40866.6667 21600.0000
+8804 40866.6667 21616.6667
+8805 40866.6667 21633.3333
+8806 40866.6667 22050.0000
+8807 40866.6667 22216.6667
+8808 40866.6667 22416.6667
+8809 40866.6667 22466.6667
+8810 40866.6667 22533.3333
+8811 40866.6667 22583.3333
+8812 40866.6667 22683.3333
+8813 40866.6667 22816.6667
+8814 40866.6667 22883.3333
+8815 40866.6667 22916.6667
+8816 40866.6667 22966.6667
+8817 40866.6667 23000.0000
+8818 40866.6667 23583.3333
+8819 40866.6667 23616.6667
+8820 40866.6667 23766.6667
+8821 40866.6667 23900.0000
+8822 40866.6667 23933.3333
+8823 40866.6667 24083.3333
+8824 40866.6667 24116.6667
+8825 40866.6667 24150.0000
+8826 40866.6667 24166.6667
+8827 40866.6667 24183.3333
+8828 40866.6667 24200.0000
+8829 40866.6667 24283.3333
+8830 40866.6667 25683.3333
+8831 40866.6667 25700.0000
+8832 40866.6667 25900.0000
+8833 40866.6667 25983.3333
+8834 40866.6667 26000.0000
+8835 40866.6667 26116.6667
+8836 40875.5556 24706.9444
+8837 40878.6111 24731.3889
+8838 40883.3333 21383.3333
+8839 40883.3333 21400.0000
+8840 40883.3333 21516.6667
+8841 40883.3333 21683.3333
+8842 40883.3333 21966.6667
+8843 40883.3333 22033.3333
+8844 40883.3333 22416.6667
+8845 40883.3333 22516.6667
+8846 40883.3333 22566.6667
+8847 40883.3333 22633.3333
+8848 40883.3333 22650.0000
+8849 40883.3333 22733.3333
+8850 40883.3333 22816.6667
+8851 40883.3333 22866.6667
+8852 40883.3333 22916.6667
+8853 40883.3333 22950.0000
+8854 40883.3333 23100.0000
+8855 40883.3333 23183.3333
+8856 40883.3333 23233.3333
+8857 40883.3333 23250.0000
+8858 40883.3333 23600.0000
+8859 40883.3333 23616.6667
+8860 40883.3333 23633.3333
+8861 40883.3333 23700.0000
+8862 40883.3333 23766.6667
+8863 40883.3333 23950.0000
+8864 40883.3333 24166.6667
+8865 40883.3333 24183.3333
+8866 40883.3333 24200.0000
+8867 40883.3333 24233.3333
+8868 40883.3333 25516.6667
+8869 40883.3333 25733.3333
+8870 40883.3333 25866.6667
+8871 40883.3333 25983.3333
+8872 40883.3333 26050.0000
+8873 40900.0000 21466.6667
+8874 40900.0000 21516.6667
+8875 40900.0000 22050.0000
+8876 40900.0000 22150.0000
+8877 40900.0000 22183.3333
+8878 40900.0000 22333.3333
+8879 40900.0000 22450.0000
+8880 40900.0000 22483.3333
+8881 40900.0000 22550.0000
+8882 40900.0000 22633.3333
+8883 40900.0000 22783.3333
+8884 40900.0000 22966.6667
+8885 40900.0000 22983.3333
+8886 40900.0000 23500.0000
+8887 40900.0000 23550.0000
+8888 40900.0000 23616.6667
+8889 40900.0000 23700.0000
+8890 40900.0000 23750.0000
+8891 40900.0000 23816.6667
+8892 40900.0000 24216.6667
+8893 40900.0000 25616.6667
+8894 40900.0000 25833.3333
+8895 40900.0000 25916.6667
+8896 40900.0000 26000.0000
+8897 40900.0000 26050.0000
+8898 40900.0000 26166.6667
+8899 40900.0000 26216.6667
+8900 40903.3333 24348.0556
+8901 40904.1667 24670.8333
+8902 40907.5000 24708.3333
+8903 40908.8889 24657.2222
+8904 40916.6667 21416.6667
+8905 40916.6667 21683.3333
+8906 40916.6667 21933.3333
+8907 40916.6667 21950.0000
+8908 40916.6667 22400.0000
+8909 40916.6667 22700.0000
+8910 40916.6667 22750.0000
+8911 40916.6667 22766.6667
+8912 40916.6667 22866.6667
+8913 40916.6667 22950.0000
+8914 40916.6667 23050.0000
+8915 40916.6667 23083.3333
+8916 40916.6667 23300.0000
+8917 40916.6667 23483.3333
+8918 40916.6667 23566.6667
+8919 40916.6667 23650.0000
+8920 40916.6667 23866.6667
+8921 40916.6667 23983.3333
+8922 40916.6667 24216.6667
+8923 40916.6667 24250.0000
+8924 40916.6667 25516.6667
+8925 40916.6667 25650.0000
+8926 40916.6667 25666.6667
+8927 40916.6667 25700.0000
+8928 40916.6667 25866.6667
+8929 40916.6667 25983.3333
+8930 40933.3333 21966.6667
+8931 40933.3333 22016.6667
+8932 40933.3333 22100.0000
+8933 40933.3333 22416.6667
+8934 40933.3333 22550.0000
+8935 40933.3333 22566.6667
+8936 40933.3333 22966.6667
+8937 40933.3333 23183.3333
+8938 40933.3333 23233.3333
+8939 40933.3333 23433.3333
+8940 40933.3333 23566.6667
+8941 40933.3333 24300.0000
+8942 40933.3333 24350.0000
+8943 40933.3333 24716.6667
+8944 40933.3333 24733.3333
+8945 40933.3333 24816.6667
+8946 40933.3333 24833.3333
+8947 40933.3333 24983.3333
+8948 40933.3333 25566.6667
+8949 40933.3333 25683.3333
+8950 40933.3333 25916.6667
+8951 40933.3333 26116.6667
+8952 40933.3333 26166.6667
+8953 40933.3333 26216.6667
+8954 40939.7222 24401.9444
+8955 40950.0000 21933.3333
+8956 40950.0000 21966.6667
+8957 40950.0000 22050.0000
+8958 40950.0000 22116.6667
+8959 40950.0000 22200.0000
+8960 40950.0000 22416.6667
+8961 40950.0000 22450.0000
+8962 40950.0000 22500.0000
+8963 40950.0000 22566.6667
+8964 40950.0000 22683.3333
+8965 40950.0000 22750.0000
+8966 40950.0000 22800.0000
+8967 40950.0000 22816.6667
+8968 40950.0000 22900.0000
+8969 40950.0000 22933.3333
+8970 40950.0000 23350.0000
+8971 40950.0000 23400.0000
+8972 40950.0000 23416.6667
+8973 40950.0000 23466.6667
+8974 40950.0000 23500.0000
+8975 40950.0000 23883.3333
+8976 40950.0000 23916.6667
+8977 40950.0000 24000.0000
+8978 40950.0000 24150.0000
+8979 40950.0000 24183.3333
+8980 40950.0000 24216.6667
+8981 40950.0000 24433.3333
+8982 40950.0000 24633.3333
+8983 40950.0000 24783.3333
+8984 40950.0000 24866.6667
+8985 40950.0000 25166.6667
+8986 40950.0000 25433.3333
+8987 40950.0000 25466.6667
+8988 40950.0000 25566.6667
+8989 40950.0000 25650.0000
+8990 40950.0000 26000.0000
+8991 40950.0000 26100.0000
+8992 40950.0000 26233.3333
+8993 40950.0000 26300.0000
+8994 40961.6667 24510.0000
+8995 40966.6667 21950.0000
+8996 40966.6667 22016.6667
+8997 40966.6667 22033.3333
+8998 40966.6667 22083.3333
+8999 40966.6667 22516.6667
+9000 40966.6667 22783.3333
+9001 40966.6667 22866.6667
+9002 40966.6667 22933.3333
+9003 40966.6667 23050.0000
+9004 40966.6667 23200.0000
+9005 40966.6667 23716.6667
+9006 40966.6667 24033.3333
+9007 40966.6667 24316.6667
+9008 40966.6667 24333.3333
+9009 40966.6667 24366.6667
+9010 40966.6667 24583.3333
+9011 40966.6667 24700.0000
+9012 40966.6667 24800.0000
+9013 40966.6667 24933.3333
+9014 40966.6667 25133.3333
+9015 40966.6667 25366.6667
+9016 40966.6667 25716.6667
+9017 40966.6667 26183.3333
+9018 40966.6667 26266.6667
+9019 40966.6667 26333.3333
+9020 40983.3333 21966.6667
+9021 40983.3333 21983.3333
+9022 40983.3333 22066.6667
+9023 40983.3333 22133.3333
+9024 40983.3333 22383.3333
+9025 40983.3333 22416.6667
+9026 40983.3333 22550.0000
+9027 40983.3333 22616.6667
+9028 40983.3333 22650.0000
+9029 40983.3333 22666.6667
+9030 40983.3333 22950.0000
+9031 40983.3333 23000.0000
+9032 40983.3333 23116.6667
+9033 40983.3333 23233.3333
+9034 40983.3333 23283.3333
+9035 40983.3333 23350.0000
+9036 40983.3333 23416.6667
+9037 40983.3333 23433.3333
+9038 40983.3333 23516.6667
+9039 40983.3333 23666.6667
+9040 40983.3333 23866.6667
+9041 40983.3333 23966.6667
+9042 40983.3333 24033.3333
+9043 40983.3333 24050.0000
+9044 40983.3333 24333.3333
+9045 40983.3333 24466.6667
+9046 40983.3333 24500.0000
+9047 40983.3333 24516.6667
+9048 40983.3333 24566.6667
+9049 40983.3333 24616.6667
+9050 40983.3333 24700.0000
+9051 40983.3333 24783.3333
+9052 40983.3333 24800.0000
+9053 40983.3333 24833.3333
+9054 40983.3333 24933.3333
+9055 40983.3333 24950.0000
+9056 40983.3333 24966.6667
+9057 40983.3333 25216.6667
+9058 40983.3333 25233.3333
+9059 40983.3333 25300.0000
+9060 40983.3333 25416.6667
+9061 40983.3333 25566.6667
+9062 40983.3333 25616.6667
+9063 40983.3333 25650.0000
+9064 40983.3333 25666.6667
+9065 40983.3333 25783.3333
+9066 40983.3333 26150.0000
+9067 40983.3333 26216.6667
+9068 40983.3333 26250.0000
+9069 41000.0000 22033.3333
+9070 41000.0000 22050.0000
+9071 41000.0000 22150.0000
+9072 41000.0000 22175.2778
+9073 41000.0000 22573.8889
+9074 41000.0000 22725.5556
+9075 41000.0000 22766.6667
+9076 41000.0000 22933.3333
+9077 41000.0000 23033.3333
+9078 41000.0000 23100.0000
+9079 41000.0000 23133.3333
+9080 41000.0000 23366.6667
+9081 41000.0000 23483.3333
+9082 41000.0000 23566.6667
+9083 41000.0000 23600.0000
+9084 41000.0000 23633.3333
+9085 41000.0000 23783.3333
+9086 41000.0000 23866.6667
+9087 41000.0000 23966.6667
+9088 41000.0000 24633.3333
+9089 41000.0000 24650.0000
+9090 41000.0000 24966.6667
+9091 41000.0000 24983.3333
+9092 41000.0000 25383.3333
+9093 41000.0000 25450.0000
+9094 41000.0000 25466.6667
+9095 41000.0000 25483.3333
+9096 41000.0000 25533.3333
+9097 41000.0000 25550.0000
+9098 41000.0000 25733.3333
+9099 41000.0000 25866.6667
+9100 41000.0000 26266.6667
+9101 41002.7778 22882.2222
+9102 41006.1111 22292.2222
+9103 41008.6111 22796.9444
+9104 41008.8889 22133.8889
+9105 41009.1667 22065.2778
+9106 41010.5556 22177.5000
+9107 41010.5556 22499.7222
+9108 41010.5556 22664.4444
+9109 41014.4444 22595.8333
+9110 41016.6667 22816.6667
+9111 41016.6667 23333.3333
+9112 41016.6667 23400.0000
+9113 41016.6667 23433.3333
+9114 41016.6667 23466.6667
+9115 41016.6667 23483.3333
+9116 41016.6667 23516.6667
+9117 41016.6667 23550.0000
+9118 41016.6667 23616.6667
+9119 41016.6667 23650.0000
+9120 41016.6667 23700.0000
+9121 41016.6667 23766.6667
+9122 41016.6667 24166.6667
+9123 41016.6667 24216.6667
+9124 41016.6667 24316.6667
+9125 41016.6667 24383.3333
+9126 41016.6667 24416.6667
+9127 41016.6667 24633.3333
+9128 41016.6667 24766.6667
+9129 41016.6667 24800.0000
+9130 41016.6667 24900.0000
+9131 41016.6667 24916.6667
+9132 41016.6667 25116.6667
+9133 41016.6667 25200.0000
+9134 41016.6667 25233.3333
+9135 41016.6667 25350.0000
+9136 41016.6667 25366.6667
+9137 41016.6667 25516.6667
+9138 41016.6667 25600.0000
+9139 41016.6667 25683.3333
+9140 41016.6667 25950.0000
+9141 41016.6667 26200.0000
+9142 41020.0000 22953.6111
+9143 41023.6111 22886.6667
+9144 41024.1667 22190.8333
+9145 41026.1111 22007.5000
+9146 41026.1111 22048.3333
+9147 41026.9444 22767.2222
+9148 41028.8889 22100.0000
+9149 41029.4444 22081.1111
+9150 41030.5556 22191.3889
+9151 41030.8333 22598.0556
+9152 41033.3333 22800.0000
+9153 41033.3333 22866.6667
+9154 41033.3333 23366.6667
+9155 41033.3333 23816.6667
+9156 41033.3333 23833.3333
+9157 41033.3333 23916.6667
+9158 41033.3333 23933.3333
+9159 41033.3333 24033.3333
+9160 41033.3333 24283.3333
+9161 41033.3333 24300.0000
+9162 41033.3333 24333.3333
+9163 41033.3333 24383.3333
+9164 41033.3333 24666.6667
+9165 41033.3333 24800.0000
+9166 41033.3333 24850.0000
+9167 41033.3333 24866.6667
+9168 41033.3333 25033.3333
+9169 41033.3333 25066.6667
+9170 41033.3333 25216.6667
+9171 41033.3333 25316.6667
+9172 41033.3333 25400.0000
+9173 41033.3333 25566.6667
+9174 41033.3333 25700.0000
+9175 41033.3333 26250.0000
+9176 41033.3333 26283.3333
+9177 41033.6111 22045.0000
+9178 41035.0000 22154.7222
+9179 41036.9444 22238.8889
+9180 41038.6111 22952.5000
+9181 41041.9444 22578.8889
+9182 41044.1667 22696.1111
+9183 41050.0000 22516.6667
+9184 41050.0000 23000.0000
+9185 41050.0000 23050.0000
+9186 41050.0000 23316.6667
+9187 41050.0000 23550.0000
+9188 41050.0000 23583.3333
+9189 41050.0000 23683.3333
+9190 41050.0000 23766.6667
+9191 41050.0000 23916.6667
+9192 41050.0000 24050.0000
+9193 41050.0000 24100.0000
+9194 41050.0000 24133.3333
+9195 41050.0000 24183.3333
+9196 41050.0000 24266.6667
+9197 41050.0000 24450.0000
+9198 41050.0000 24550.0000
+9199 41050.0000 24583.3333
+9200 41050.0000 24600.0000
+9201 41050.0000 24650.0000
+9202 41050.0000 24700.0000
+9203 41050.0000 24716.6667
+9204 41050.0000 24766.6667
+9205 41050.0000 24783.3333
+9206 41050.0000 24816.6667
+9207 41050.0000 24850.0000
+9208 41050.0000 25016.6667
+9209 41050.0000 25200.0000
+9210 41050.0000 25333.3333
+9211 41050.0000 25366.6667
+9212 41050.0000 25400.0000
+9213 41050.0000 25416.6667
+9214 41050.0000 25466.6667
+9215 41050.0000 25483.3333
+9216 41050.0000 25500.0000
+9217 41050.0000 25533.3333
+9218 41050.0000 25683.3333
+9219 41050.0000 26266.6667
+9220 41057.2222 22175.2778
+9221 41058.6111 22162.2222
+9222 41063.8889 22733.8889
+9223 41066.6667 22083.3333
+9224 41066.6667 22633.3333
+9225 41066.6667 22966.6667
+9226 41066.6667 23066.6667
+9227 41066.6667 23166.6667
+9228 41066.6667 23383.3333
+9229 41066.6667 23400.0000
+9230 41066.6667 23433.3333
+9231 41066.6667 23450.0000
+9232 41066.6667 23600.0000
+9233 41066.6667 23650.0000
+9234 41066.6667 23750.0000
+9235 41066.6667 23816.6667
+9236 41066.6667 23883.3333
+9237 41066.6667 23933.3333
+9238 41066.6667 23950.0000
+9239 41066.6667 24066.6667
+9240 41066.6667 24250.0000
+9241 41066.6667 24266.6667
+9242 41066.6667 24366.6667
+9243 41066.6667 24483.3333
+9244 41066.6667 24566.6667
+9245 41066.6667 24600.0000
+9246 41066.6667 24616.6667
+9247 41066.6667 24733.3333
+9248 41066.6667 24750.0000
+9249 41066.6667 24783.3333
+9250 41066.6667 24833.3333
+9251 41066.6667 24850.0000
+9252 41066.6667 24900.0000
+9253 41066.6667 24916.6667
+9254 41066.6667 24933.3333
+9255 41066.6667 24966.6667
+9256 41066.6667 25066.6667
+9257 41066.6667 25233.3333
+9258 41066.6667 25333.3333
+9259 41066.6667 25450.0000
+9260 41066.6667 25533.3333
+9261 41066.6667 25550.0000
+9262 41066.6667 25583.3333
+9263 41066.6667 25616.6667
+9264 41066.6667 25650.0000
+9265 41066.6667 25716.6667
+9266 41066.6667 25766.6667
+9267 41066.6667 25900.0000
+9268 41066.6667 26266.6667
+9269 41068.0556 22595.8333
+9270 41071.1111 22359.4444
+9271 41071.1111 22572.5000
+9272 41072.2222 22907.2222
+9273 41072.5000 22704.4444
+9274 41072.5000 22761.9444
+9275 41074.4444 22635.0000
+9276 41075.8333 22428.6111
+9277 41076.3889 22851.1111
+9278 41080.8333 22475.8333
+9279 41082.2222 22498.3333
+9280 41083.3333 22900.0000
+9281 41083.3333 23016.6667
+9282 41083.3333 23033.3333
+9283 41083.3333 23133.3333
+9284 41083.3333 23250.0000
+9285 41083.3333 23283.3333
+9286 41083.3333 23350.0000
+9287 41083.3333 23466.6667
+9288 41083.3333 23550.0000
+9289 41083.3333 23716.6667
+9290 41083.3333 23733.3333
+9291 41083.3333 23750.0000
+9292 41083.3333 23833.3333
+9293 41083.3333 23950.0000
+9294 41083.3333 24183.3333
+9295 41083.3333 24300.0000
+9296 41083.3333 24400.0000
+9297 41083.3333 24483.3333
+9298 41083.3333 24500.0000
+9299 41083.3333 24516.6667
+9300 41083.3333 24533.3333
+9301 41083.3333 24566.6667
+9302 41083.3333 24666.6667
+9303 41083.3333 24766.6667
+9304 41083.3333 24800.0000
+9305 41083.3333 24850.0000
+9306 41083.3333 24866.6667
+9307 41083.3333 24900.0000
+9308 41083.3333 24916.6667
+9309 41083.3333 24950.0000
+9310 41083.3333 24966.6667
+9311 41083.3333 25016.6667
+9312 41083.3333 25233.3333
+9313 41083.3333 25266.6667
+9314 41083.3333 25283.3333
+9315 41083.3333 25333.3333
+9316 41083.3333 25416.6667
+9317 41083.3333 25483.3333
+9318 41083.3333 25550.0000
+9319 41083.3333 25566.6667
+9320 41083.3333 25616.6667
+9321 41083.3333 25650.0000
+9322 41083.3333 25700.0000
+9323 41083.3333 25766.6667
+9324 41083.3333 25783.3333
+9325 41083.3333 25800.0000
+9326 41083.3333 26300.0000
+9327 41084.1667 22280.0000
+9328 41085.8333 22678.6111
+9329 41091.1111 22783.6111
+9330 41091.6667 22726.9444
+9331 41095.2778 22382.5000
+9332 41095.5556 22176.1111
+9333 41095.5556 22523.8889
+9334 41100.0000 22900.0000
+9335 41100.0000 23416.6667
+9336 41100.0000 23500.0000
+9337 41100.0000 23583.3333
+9338 41100.0000 23616.6667
+9339 41100.0000 23650.0000
+9340 41100.0000 23683.3333
+9341 41100.0000 23900.0000
+9342 41100.0000 24083.3333
+9343 41100.0000 24116.6667
+9344 41100.0000 24183.3333
+9345 41100.0000 24233.3333
+9346 41100.0000 24283.3333
+9347 41100.0000 24300.0000
+9348 41100.0000 24533.3333
+9349 41100.0000 24600.0000
+9350 41100.0000 24633.3333
+9351 41100.0000 24783.3333
+9352 41100.0000 24800.0000
+9353 41100.0000 24900.0000
+9354 41100.0000 24916.6667
+9355 41100.0000 24933.3333
+9356 41100.0000 25150.0000
+9357 41100.0000 25200.0000
+9358 41100.0000 25300.0000
+9359 41100.0000 25350.0000
+9360 41100.0000 25383.3333
+9361 41100.0000 25450.0000
+9362 41100.0000 25583.3333
+9363 41100.0000 25766.6667
+9364 41100.0000 25783.3333
+9365 41102.5000 22920.8333
+9366 41103.3333 22208.0556
+9367 41103.6111 22262.7778
+9368 41103.6111 22845.0000
+9369 41104.4444 22623.0556
+9370 41105.0000 22481.9444
+9371 41105.5556 22557.7778
+9372 41106.1111 22733.3333
+9373 41108.0556 22993.8889
+9374 41109.7222 22046.9444
+9375 41111.6667 22271.3889
+9376 41114.7222 22897.5000
+9377 41115.5556 22794.7222
+9378 41116.6667 22833.3333
+9379 41116.6667 23066.6667
+9380 41116.6667 23183.3333
+9381 41116.6667 23250.0000
+9382 41116.6667 23300.0000
+9383 41116.6667 23333.3333
+9384 41116.6667 23383.3333
+9385 41116.6667 23466.6667
+9386 41116.6667 23516.6667
+9387 41116.6667 23650.0000
+9388 41116.6667 23916.6667
+9389 41116.6667 24000.0000
+9390 41116.6667 24033.3333
+9391 41116.6667 24050.0000
+9392 41116.6667 24083.3333
+9393 41116.6667 24100.0000
+9394 41116.6667 24133.3333
+9395 41116.6667 24150.0000
+9396 41116.6667 24283.3333
+9397 41116.6667 24300.0000
+9398 41116.6667 24350.0000
+9399 41116.6667 24383.3333
+9400 41116.6667 24433.3333
+9401 41116.6667 24583.3333
+9402 41116.6667 24700.0000
+9403 41116.6667 24783.3333
+9404 41116.6667 24816.6667
+9405 41116.6667 24833.3333
+9406 41116.6667 24850.0000
+9407 41116.6667 24866.6667
+9408 41116.6667 24916.6667
+9409 41116.6667 24950.0000
+9410 41116.6667 25000.0000
+9411 41116.6667 25016.6667
+9412 41116.6667 25066.6667
+9413 41116.6667 25116.6667
+9414 41116.6667 25200.0000
+9415 41116.6667 25300.0000
+9416 41116.6667 25366.6667
+9417 41116.6667 25400.0000
+9418 41116.6667 25433.3333
+9419 41116.6667 25633.3333
+9420 41116.6667 25650.0000
+9421 41116.6667 25683.3333
+9422 41116.6667 25716.6667
+9423 41116.6667 26283.3333
+9424 41120.2778 22661.1111
+9425 41122.7778 22511.9444
+9426 41128.3333 22876.1111
+9427 41133.3333 23066.6667
+9428 41133.3333 23216.6667
+9429 41133.3333 23383.3333
+9430 41133.3333 23933.3333
+9431 41133.3333 24000.0000
+9432 41133.3333 24116.6667
+9433 41133.3333 24150.0000
+9434 41133.3333 24166.6667
+9435 41133.3333 24216.6667
+9436 41133.3333 24266.6667
+9437 41133.3333 24316.6667
+9438 41133.3333 24366.6667
+9439 41133.3333 24700.0000
+9440 41133.3333 24733.3333
+9441 41133.3333 24850.0000
+9442 41133.3333 24866.6667
+9443 41133.3333 24883.3333
+9444 41133.3333 24983.3333
+9445 41133.3333 25000.0000
+9446 41133.3333 25050.0000
+9447 41133.3333 25183.3333
+9448 41133.3333 25216.6667
+9449 41133.3333 25266.6667
+9450 41133.3333 25283.3333
+9451 41133.3333 25550.0000
+9452 41133.3333 25600.0000
+9453 41133.3333 25650.0000
+9454 41133.3333 25716.6667
+9455 41133.3333 26216.6667
+9456 41134.4444 22917.2222
+9457 41139.1667 22668.6111
+9458 41144.7222 22972.7778
+9459 41146.9444 22744.7222
+9460 41150.0000 22833.3333
+9461 41150.0000 23000.0000
+9462 41150.0000 23166.6667
+9463 41150.0000 23283.3333
+9464 41150.0000 23333.3333
+9465 41150.0000 23416.6667
+9466 41150.0000 23450.0000
+9467 41150.0000 23583.3333
+9468 41150.0000 23900.0000
+9469 41150.0000 24066.6667
+9470 41150.0000 24133.3333
+9471 41150.0000 24150.0000
+9472 41150.0000 24483.3333
+9473 41150.0000 24933.3333
+9474 41150.0000 24966.6667
+9475 41150.0000 25066.6667
+9476 41150.0000 25300.0000
+9477 41150.0000 25316.6667
+9478 41150.0000 25333.3333
+9479 41150.0000 25350.0000
+9480 41150.0000 25433.3333
+9481 41150.0000 25466.6667
+9482 41150.0000 25500.0000
+9483 41150.0000 25533.3333
+9484 41150.0000 25566.6667
+9485 41150.0000 25683.3333
+9486 41150.0000 26216.6667
+9487 41150.0000 26300.0000
+9488 41162.5000 22894.4444
+9489 41164.4444 22668.6111
+9490 41166.6667 22800.0000
+9491 41166.6667 23016.6667
+9492 41166.6667 23266.6667
+9493 41166.6667 23283.3333
+9494 41166.6667 23366.6667
+9495 41166.6667 23850.0000
+9496 41166.6667 24216.6667
+9497 41166.6667 24316.6667
+9498 41166.6667 24333.3333
+9499 41166.6667 24366.6667
+9500 41166.6667 24383.3333
+9501 41166.6667 24400.0000
+9502 41166.6667 24550.0000
+9503 41166.6667 24633.3333
+9504 41166.6667 24733.3333
+9505 41166.6667 24850.0000
+9506 41166.6667 24966.6667
+9507 41166.6667 24983.3333
+9508 41166.6667 25366.6667
+9509 41166.6667 25383.3333
+9510 41166.6667 25466.6667
+9511 41166.6667 25483.3333
+9512 41166.6667 25616.6667
+9513 41166.6667 25633.3333
+9514 41166.6667 26116.6667
+9515 41178.0556 22760.8333
+9516 41183.3333 22850.0000
+9517 41183.3333 22883.3333
+9518 41183.3333 22900.0000
+9519 41183.3333 22916.6667
+9520 41183.3333 23083.3333
+9521 41183.3333 23233.3333
+9522 41183.3333 23250.0000
+9523 41183.3333 23266.6667
+9524 41183.3333 23316.6667
+9525 41183.3333 23400.0000
+9526 41183.3333 23933.3333
+9527 41183.3333 23966.6667
+9528 41183.3333 24166.6667
+9529 41183.3333 24316.6667
+9530 41183.3333 24366.6667
+9531 41183.3333 24383.3333
+9532 41183.3333 24416.6667
+9533 41183.3333 24833.3333
+9534 41183.3333 24900.0000
+9535 41183.3333 24950.0000
+9536 41183.3333 25283.3333
+9537 41183.3333 25333.3333
+9538 41183.3333 25416.6667
+9539 41183.3333 25433.3333
+9540 41183.3333 25883.3333
+9541 41186.6667 22815.8333
+9542 41200.0000 22816.6667
+9543 41200.0000 23200.0000
+9544 41200.0000 23250.0000
+9545 41200.0000 23283.3333
+9546 41200.0000 23366.6667
+9547 41200.0000 23550.0000
+9548 41200.0000 23583.3333
+9549 41200.0000 23600.0000
+9550 41200.0000 23816.6667
+9551 41200.0000 23900.0000
+9552 41200.0000 24016.6667
+9553 41200.0000 24100.0000
+9554 41200.0000 24333.3333
+9555 41200.0000 24383.3333
+9556 41200.0000 24416.6667
+9557 41200.0000 24700.0000
+9558 41200.0000 24816.6667
+9559 41200.0000 24883.3333
+9560 41200.0000 24916.6667
+9561 41200.0000 25016.6667
+9562 41200.0000 25033.3333
+9563 41200.0000 25133.3333
+9564 41200.0000 25166.6667
+9565 41200.0000 25383.3333
+9566 41200.0000 25516.6667
+9567 41200.0000 25583.3333
+9568 41200.0000 26300.0000
+9569 41216.6667 22816.6667
+9570 41216.6667 22900.0000
+9571 41216.6667 23033.3333
+9572 41216.6667 23050.0000
+9573 41216.6667 23083.3333
+9574 41216.6667 23300.0000
+9575 41216.6667 23366.6667
+9576 41216.6667 23400.0000
+9577 41216.6667 23900.0000
+9578 41216.6667 23916.6667
+9579 41216.6667 24266.6667
+9580 41216.6667 24350.0000
+9581 41216.6667 24366.6667
+9582 41216.6667 24433.3333
+9583 41216.6667 24450.0000
+9584 41216.6667 24466.6667
+9585 41216.6667 24550.0000
+9586 41216.6667 24633.3333
+9587 41216.6667 24666.6667
+9588 41216.6667 24783.3333
+9589 41216.6667 24800.0000
+9590 41216.6667 24866.6667
+9591 41216.6667 24900.0000
+9592 41216.6667 24933.3333
+9593 41216.6667 24950.0000
+9594 41216.6667 25450.0000
+9595 41216.6667 25566.6667
+9596 41216.6667 25683.3333
+9597 41216.6667 25700.0000
+9598 41216.6667 25733.3333
+9599 41216.6667 26016.6667
+9600 41216.6667 26200.0000
+9601 41222.5000 22827.7778
+9602 41226.9444 22790.0000
+9603 41233.3333 22983.3333
+9604 41233.3333 23000.0000
+9605 41233.3333 23250.0000
+9606 41233.3333 23383.3333
+9607 41233.3333 24166.6667
+9608 41233.3333 24183.3333
+9609 41233.3333 24200.0000
+9610 41233.3333 24266.6667
+9611 41233.3333 24383.3333
+9612 41233.3333 24400.0000
+9613 41233.3333 24583.3333
+9614 41233.3333 24600.0000
+9615 41233.3333 24616.6667
+9616 41233.3333 24633.3333
+9617 41233.3333 24816.6667
+9618 41233.3333 24866.6667
+9619 41233.3333 24883.3333
+9620 41233.3333 24950.0000
+9621 41233.3333 25033.3333
+9622 41233.3333 25100.0000
+9623 41233.3333 25200.0000
+9624 41233.3333 25250.0000
+9625 41233.3333 25366.6667
+9626 41233.3333 25533.3333
+9627 41233.3333 25600.0000
+9628 41233.3333 25766.6667
+9629 41233.3333 25850.0000
+9630 41233.3333 25900.0000
+9631 41233.3333 25933.3333
+9632 41233.3333 25966.6667
+9633 41236.6667 22946.9444
+9634 41243.6111 22851.1111
+9635 41250.0000 22783.3333
+9636 41250.0000 22800.0000
+9637 41250.0000 22816.6667
+9638 41250.0000 23016.6667
+9639 41250.0000 23083.3333
+9640 41250.0000 23216.6667
+9641 41250.0000 23283.3333
+9642 41250.0000 23333.3333
+9643 41250.0000 23450.0000
+9644 41250.0000 23816.6667
+9645 41250.0000 24033.3333
+9646 41250.0000 24433.3333
+9647 41250.0000 24500.0000
+9648 41250.0000 24516.6667
+9649 41250.0000 24533.3333
+9650 41250.0000 24566.6667
+9651 41250.0000 24583.3333
+9652 41250.0000 24600.0000
+9653 41250.0000 24633.3333
+9654 41250.0000 24700.0000
+9655 41250.0000 24733.3333
+9656 41250.0000 24900.0000
+9657 41250.0000 24916.6667
+9658 41250.0000 25483.3333
+9659 41250.0000 25533.3333
+9660 41250.0000 25633.3333
+9661 41250.0000 25683.3333
+9662 41250.0000 25866.6667
+9663 41250.0000 26133.3333
+9664 41255.0000 22795.2778
+9665 41260.2778 22789.1667
+9666 41264.7222 22842.2222
+9667 41266.6667 22800.0000
+9668 41266.6667 22833.3333
+9669 41266.6667 22933.3333
+9670 41266.6667 23000.0000
+9671 41266.6667 23133.3333
+9672 41266.6667 23183.3333
+9673 41266.6667 23366.6667
+9674 41266.6667 23383.3333
+9675 41266.6667 23400.0000
+9676 41266.6667 24183.3333
+9677 41266.6667 24400.0000
+9678 41266.6667 24483.3333
+9679 41266.6667 24500.0000
+9680 41266.6667 24566.6667
+9681 41266.6667 24666.6667
+9682 41266.6667 24716.6667
+9683 41266.6667 24800.0000
+9684 41266.6667 24833.3333
+9685 41266.6667 24866.6667
+9686 41266.6667 24933.3333
+9687 41266.6667 25466.6667
+9688 41266.6667 25533.3333
+9689 41266.6667 25733.3333
+9690 41266.6667 25866.6667
+9691 41266.6667 25916.6667
+9692 41266.6667 25950.0000
+9693 41266.6667 25983.3333
+9694 41266.6667 26333.3333
+9695 41266.6667 26383.3333
+9696 41266.6667 26400.0000
+9697 41269.7222 22853.6111
+9698 41276.3889 22893.6111
+9699 41283.0556 22932.2222
+9700 41283.3333 23016.6667
+9701 41283.3333 23033.3333
+9702 41283.3333 23233.3333
+9703 41283.3333 23250.0000
+9704 41283.3333 23300.0000
+9705 41283.3333 23333.3333
+9706 41283.3333 23750.0000
+9707 41283.3333 23933.3333
+9708 41283.3333 24216.6667
+9709 41283.3333 24233.3333
+9710 41283.3333 24316.6667
+9711 41283.3333 24400.0000
+9712 41283.3333 24466.6667
+9713 41283.3333 24483.3333
+9714 41283.3333 24800.0000
+9715 41283.3333 24966.6667
+9716 41283.3333 25116.6667
+9717 41283.3333 25183.3333
+9718 41283.3333 25550.0000
+9719 41283.3333 25616.6667
+9720 41283.3333 25783.3333
+9721 41283.3333 25850.0000
+9722 41283.3333 25983.3333
+9723 41283.3333 26283.3333
+9724 41293.0556 22947.2222
+9725 41295.2778 22833.0556
+9726 41295.8333 22985.2778
+9727 41300.0000 22800.0000
+9728 41300.0000 23500.0000
+9729 41300.0000 23683.3333
+9730 41300.0000 23850.0000
+9731 41300.0000 24466.6667
+9732 41300.0000 24516.6667
+9733 41300.0000 24616.6667
+9734 41300.0000 24783.3333
+9735 41300.0000 24900.0000
+9736 41300.0000 25666.6667
+9737 41300.0000 25983.3333
+9738 41300.0000 26183.3333
+9739 41300.0000 26250.0000
+9740 41300.0000 26433.3333
+9741 41316.6667 23550.0000
+9742 41316.6667 23583.3333
+9743 41316.6667 23783.3333
+9744 41316.6667 24000.0000
+9745 41316.6667 24366.6667
+9746 41316.6667 24416.6667
+9747 41316.6667 24450.0000
+9748 41316.6667 24583.3333
+9749 41316.6667 24766.6667
+9750 41316.6667 25100.0000
+9751 41316.6667 25116.6667
+9752 41316.6667 25816.6667
+9753 41316.6667 26100.0000
+9754 41316.6667 26483.3333
+9755 41333.3333 24333.3333
+9756 41333.3333 24533.3333
+9757 41333.3333 24883.3333
+9758 41333.3333 24933.3333
+9759 41333.3333 25050.0000
+9760 41333.3333 26266.6667
+9761 41350.0000 23683.3333
+9762 41350.0000 23716.6667
+9763 41350.0000 23800.0000
+9764 41350.0000 23866.6667
+9765 41350.0000 24083.3333
+9766 41350.0000 24100.0000
+9767 41350.0000 24450.0000
+9768 41350.0000 24533.3333
+9769 41350.0000 24633.3333
+9770 41350.0000 24850.0000
+9771 41350.0000 24983.3333
+9772 41350.0000 26200.0000
+9773 41350.0000 26366.6667
+9774 41350.0000 26433.3333
+9775 41350.0000 26500.0000
+9776 41350.0000 26583.3333
+9777 41350.0000 26600.0000
+9778 41366.6667 23366.6667
+9779 41366.6667 24183.3333
+9780 41366.6667 24233.3333
+9781 41366.6667 24266.6667
+9782 41366.6667 24316.6667
+9783 41366.6667 24550.0000
+9784 41366.6667 24616.6667
+9785 41366.6667 24916.6667
+9786 41366.6667 24966.6667
+9787 41366.6667 25000.0000
+9788 41366.6667 26383.3333
+9789 41366.6667 26466.6667
+9790 41366.6667 26533.3333
+9791 41383.3333 23300.0000
+9792 41383.3333 23450.0000
+9793 41383.3333 23866.6667
+9794 41383.3333 23983.3333
+9795 41383.3333 24050.0000
+9796 41383.3333 24100.0000
+9797 41383.3333 24283.3333
+9798 41383.3333 24916.6667
+9799 41383.3333 24933.3333
+9800 41383.3333 26300.0000
+9801 41383.3333 26616.6667
+9802 41400.0000 23900.0000
+9803 41400.0000 24016.6667
+9804 41400.0000 24033.3333
+9805 41400.0000 24100.0000
+9806 41400.0000 24216.6667
+9807 41400.0000 26283.3333
+9808 41400.0000 26333.3333
+9809 41400.0000 26416.6667
+9810 41400.0000 26566.6667
+9811 41400.0000 26583.3333
+9812 41416.6667 23833.3333
+9813 41416.6667 24000.0000
+9814 41416.6667 24083.3333
+9815 41416.6667 24133.3333
+9816 41416.6667 24166.6667
+9817 41416.6667 24283.3333
+9818 41416.6667 26250.0000
+9819 41416.6667 26383.3333
+9820 41416.6667 26400.0000
+9821 41416.6667 26516.6667
+9822 41416.6667 26550.0000
+9823 41416.6667 26566.6667
+9824 41433.3333 24466.6667
+9825 41433.3333 26316.6667
+9826 41433.3333 26350.0000
+9827 41433.3333 26550.0000
+9828 41450.0000 26266.6667
+9829 41450.0000 26400.0000
+9830 41450.0000 26466.6667
+9831 41450.0000 26550.0000
+9832 41466.6667 26350.0000
+9833 41466.6667 26383.3333
+9834 41466.6667 26566.6667
+9835 41483.3333 24133.3333
+9836 41483.3333 24150.0000
+9837 41483.3333 26283.3333
+9838 41483.3333 26300.0000
+9839 41483.3333 26316.6667
+9840 41483.3333 26400.0000
+9841 41483.3333 26433.3333
+9842 41483.3333 26550.0000
+9843 41500.0000 24133.3333
+9844 41500.0000 26216.6667
+9845 41500.0000 26233.3333
+9846 41500.0000 26466.6667
+9847 41500.0000 26500.0000
+9848 41500.0000 26516.6667
+9849 41516.6667 26250.0000
+9850 41516.6667 26283.3333
+9851 41516.6667 26300.0000
+9852 41516.6667 26450.0000
+9853 41533.3333 26350.0000
+9854 41533.3333 26533.3333
+9855 41533.3333 26550.0000
+9856 41566.6667 26166.6667
+9857 41566.6667 26183.3333
+9858 41566.6667 26450.0000
+9859 41566.6667 26516.6667
+9860 41583.3333 26183.3333
+9861 41583.3333 26233.3333
+9862 41583.3333 26283.3333
+9863 41583.3333 26533.3333
+9864 41600.0000 26300.0000
+9865 41616.6667 26316.6667
+9866 41616.6667 26350.0000
+9867 41616.6667 26433.3333
+9868 41633.3333 26333.3333
+9869 41633.3333 26383.3333
+9870 41650.0000 26083.3333
+9871 41650.0000 26183.3333
+9872 41650.0000 26316.6667
+9873 41650.0000 26416.6667
+9874 41650.0000 26466.6667
+9875 41666.6667 26350.0000
+9876 41666.6667 26466.6667
+9877 41683.3333 26283.3333
+9878 41700.0000 26133.3333
+9879 41700.0000 26233.3333
+9880 41700.0000 26283.3333
+9881 41700.0000 26383.3333
+9882 41716.6667 26216.6667
+\.
+
+UPDATE gr9882 SET the_geom = ST_makePoint(x,y);
+SELECT * into grece from pgr_eucledianDmatrix('gr9882'::regclass);
+SELECT * from pgr_xydtsp($$SELECT * from grece$$, true);
+-- SELECT * from pgr_xydtsp($$SELECT * from pgr_eucledianDmatrix('gr9882'::regclass)$$, true, 1);
+-- SELECT * from pgr_tsp('SELECT id::integer, x, y from gr9882', 1);
+
diff --git a/src/tsp/test/doc-pgr_TSP-mac.test.sql b/src/tsp/test/doc-pgr_TSP-mac.test.sql
index e243330..c1a8112 100644
--- a/src/tsp/test/doc-pgr_TSP-mac.test.sql
+++ b/src/tsp/test/doc-pgr_TSP-mac.test.sql
@@ -1,5 +1,3 @@
-
-SET client_min_messages TO WARNING;
\echo -- q1
WITH
diff --git a/src/tsp/test/doc-pgr_TSP-windows.test.sql b/src/tsp/test/doc-pgr_TSP-windows.test.sql
index e243330..c1a8112 100644
--- a/src/tsp/test/doc-pgr_TSP-windows.test.sql
+++ b/src/tsp/test/doc-pgr_TSP-windows.test.sql
@@ -1,5 +1,3 @@
-
-SET client_min_messages TO WARNING;
\echo -- q1
WITH
diff --git a/src/tsp/test/doc-pgr_TSP.test.sql b/src/tsp/test/doc-pgr_TSP.test.sql
index e243330..c1a8112 100644
--- a/src/tsp/test/doc-pgr_TSP.test.sql
+++ b/src/tsp/test/doc-pgr_TSP.test.sql
@@ -1,5 +1,3 @@
-
-SET client_min_messages TO WARNING;
\echo -- q1
WITH
diff --git a/src/tsp/test/doc-pgr_eucledianTSP.result b/src/tsp/test/doc-pgr_eucledianTSP.result
index d40e21e..e34408a 100644
--- a/src/tsp/test/doc-pgr_eucledianTSP.result
+++ b/src/tsp/test/doc-pgr_eucledianTSP.result
@@ -20,7 +20,7 @@ t
17|2|1|17.7795767601752
18|1|0|18.7795767601752
-- q3
-NOTICE: pgr_eucledianTSP Processing Information
+DEBUG: pgr_eucledianTSP Processing Information
Initializing tsp class ---> tsp.greedyInitial ---> tsp.annealing ---> OK
Cycle(100) total changes =0 0 were because delta energy < 0
diff --git a/src/tsp/test/doc-pgr_eucledianTSP.test.sql b/src/tsp/test/doc-pgr_eucledianTSP.test.sql
index 8da7c99..71a7092 100644
--- a/src/tsp/test/doc-pgr_eucledianTSP.test.sql
+++ b/src/tsp/test/doc-pgr_eucledianTSP.test.sql
@@ -1,6 +1,3 @@
-BEGIN;
-
-SET client_min_messages TO WARNING;
\echo -- q1
WITH
query AS (
@@ -22,7 +19,7 @@ SELECT* from pgr_eucledianTSP(
randomize := false
);
\echo -- q3
-SET client_min_messages TO NOTICE;
+SET client_min_messages TO DEBUG1;
SELECT* from pgr_eucledianTSP(
$$
SELECT id, st_X(the_geom) AS x, st_Y(the_geom) AS y FROM edge_table_vertices_pgr
@@ -31,5 +28,3 @@ SELECT* from pgr_eucledianTSP(
randomize := false
);
\echo -- q4
-
-ROLLBACK;
diff --git a/src/tsp/test/doc-tsp-mac.test.sql b/src/tsp/test/doc-tsp-mac.test.sql
index 9f7292e..04a773e 100644
--- a/src/tsp/test/doc-tsp-mac.test.sql
+++ b/src/tsp/test/doc-tsp-mac.test.sql
@@ -1,6 +1,5 @@
BEGIN;
-SET client_min_messages TO WARNING;
\echo -- q1
SELECT * FROM pgr_TSP(
$$
diff --git a/src/tsp/test/doc-tsp-windows.test.sql b/src/tsp/test/doc-tsp-windows.test.sql
index 9f7292e..90dcf6b 100644
--- a/src/tsp/test/doc-tsp-windows.test.sql
+++ b/src/tsp/test/doc-tsp-windows.test.sql
@@ -1,6 +1,5 @@
BEGIN;
-SET client_min_messages TO WARNING;
\echo -- q1
SELECT * FROM pgr_TSP(
$$
@@ -37,4 +36,5 @@ SELECT * FROM pgr_TSP(
randomize := false
);
\echo -- q5
+
ROLLBACK;
diff --git a/src/tsp/test/doc-tsp.result b/src/tsp/test/doc-tsp.result
index a7bbe5a..5d9797d 100644
--- a/src/tsp/test/doc-tsp.result
+++ b/src/tsp/test/doc-tsp.result
@@ -37,32 +37,16 @@ NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
17|2|1|16.2558869162301
18|1|0|17.2558869162301
-- q3
+NOTICE: Deprecated function pgr_vidsToDMatrix
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|2
2|3
-3|8
-4|11
-5|5
-6|10
-7|12
-8|9
-9|6
-10|7
-11|4
-12|0
+3|0
-- q4
-1|1|3|0
-2|4|1|3
-3|9|1|4
-4|12|1|5
-5|11|2|6
-6|13|1|8
-7|10|1|9
-8|5|2|10
-9|7|1|12
-10|8|2|13
-11|6|1|15
-12|3|1|16
-13|2|1|17
-14|1|0|18
+1|8|3|0
+2|11|1|3
+3|12|3|4
+4|13|3|7
+5|8|0|10
-- q5
diff --git a/src/tsp/test/doc-tsp.test.sql b/src/tsp/test/doc-tsp.test.sql
index 9f7292e..4499692 100644
--- a/src/tsp/test/doc-tsp.test.sql
+++ b/src/tsp/test/doc-tsp.test.sql
@@ -1,6 +1,3 @@
-BEGIN;
-
-SET client_min_messages TO WARNING;
\echo -- q1
SELECT * FROM pgr_TSP(
$$
@@ -21,7 +18,7 @@ SELECT * FROM pgr_eucledianTSP(
SELECT * FROM pgr_TSP(
(SELECT * FROM pgr_vidsToDMatrix(
'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost, reverse_cost FROM edge_table',
- (SELECT array_agg(id) from edge_table_vertices_pgr WHERE id < 14)::INTEGER[], false , true, true)
+ ARRAY[8,11,12,13]::INTEGER[], false , true, true)
),
1
);
@@ -31,10 +28,9 @@ SELECT * FROM pgr_TSP(
$$
SELECT * FROM pgr_dijkstraCostMatrix(
'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- (SELECT array_agg(id) from edge_table_vertices_pgr WHERE id < 14), false)
+ ARRAY[8,11,12,13]::INTEGER[], false)
$$,
- 1,
+ 8,
randomize := false
);
\echo -- q5
-ROLLBACK;
diff --git a/src/tsp/test/test.conf b/src/tsp/test/test.conf
index cfe59a2..fe285f0 100644
--- a/src/tsp/test/test.conf
+++ b/src/tsp/test/test.conf
@@ -10,14 +10,13 @@
'linux' => [qw(
doc-pgr_TSP
doc-tsp
+ doc-pgr_eucledianTSP
)],
'macos' => [qw(
doc-pgr_TSP-mac
- doc-tsp-mac
)],
'windows' => [qw(
doc-pgr_TSP-windows
- doc-tsp-windows
)],
'documentation' => [qw(
doc-tsp
diff --git a/src/tsp/test/tsp-v2-0.result b/src/tsp/test/tsp-v2-0.result
index d8ea61c..4e975f1 100644
--- a/src/tsp/test/tsp-v2-0.result
+++ b/src/tsp/test/tsp-v2-0.result
@@ -1,136 +1,158 @@
NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
15.4787
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
OK
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
-1|0
+1|2
2|3
-3|2
+3|0
NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
11.3137
NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
32.4721
NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
23.4706
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+0|0
+1|3
+2|1
+3|4
+4|2
+----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|0
1|2
2|4
3|3
4|1
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|0
-1|1
-2|3
+1|3
+2|1
3|4
4|2
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|0
1|2
2|4
3|1
4|3
----------------------------------
-0|0
-1|1
-2|3
-3|2
-4|4
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+0|1
+1|0
+2|2
+3|4
+4|3
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
-1|3
-2|4
-3|2
-4|0
+1|0
+2|2
+3|4
+4|3
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|4
2|3
3|0
4|2
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|4
2|2
3|0
4|3
----------------------------------
-0|1
-1|3
-2|0
-3|2
-4|4
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+0|2
+1|4
+2|3
+3|1
+4|0
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|2
1|4
2|3
3|1
4|0
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|2
-1|0
+1|4
2|3
-3|4
-4|1
+3|1
+4|0
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|2
1|4
2|1
3|0
4|3
----------------------------------
-0|2
-1|0
-2|1
-3|3
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+0|3
+1|1
+2|0
+3|2
4|4
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|3
1|1
2|4
3|2
4|0
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|3
-1|0
+1|4
2|2
-3|4
+3|0
4|1
----------------------------------
-0|3
-1|0
-2|1
-3|4
-4|2
-----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|3
1|1
2|0
3|2
4|4
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+0|4
+1|3
+2|1
+3|0
+4|2
+----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|4
1|2
2|3
3|1
4|0
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|4
1|2
2|0
3|3
4|1
----------------------------------
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|4
1|3
2|1
3|0
4|2
----------------------------------
-0|4
-1|2
-2|0
-3|1
-4|3
-----------------------------------
NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
0|6|6|2.24
1|11|11|4.12
@@ -144,36 +166,44 @@ NOTICE: Deprecated Signature pgr_tsp(sql, integer, integer)
9|10|10|2.50
10|5|5|3.61
----------------------------------1(in ints)
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
OK
----------------------------------1(in tenths)
-OK
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
+FAIL
----------------------------------1-0
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
1|2
2|3
3|0
----------------------------------1-2
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
-1|0
+1|2
2|3
-3|2
+3|0
----------------------------------1-3
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|1
-1|2
-2|0
-3|3
+1|0
+2|3
+3|2
----------------------------------0-1
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|0
-1|3
+1|1
2|2
-3|1
+3|3
----------------------------------2-1
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|2
1|3
-2|0
-3|1
+2|1
+3|0
----------------------------------3-1
+NOTICE: Deprecated Signature pgr_tsp(float8[][], integer, integer)
0|3
-1|0
-2|2
-3|1
+1|2
+2|1
+3|0
diff --git a/src/tsp/test/tsp-v2-0.test.sql b/src/tsp/test/tsp-v2-0.test.sql
index 7f8e035..49a7ce9 100644
--- a/src/tsp/test/tsp-v2-0.test.sql
+++ b/src/tsp/test/tsp-v2-0.test.sql
@@ -25,7 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
--------------------------------------------------------------------------------
-- PGR_pgr_tsp
--------------------------------------------------------------------------------
-BEGIN;
CREATE TEMP TABLE vertex_table (
id serial,
@@ -71,6 +70,9 @@ insert into tsp_00 (x,y) values
SELECT round(sum(cost)::numeric, 4) as cost
FROM pgr_tsp('SELECT id, x, y FROM vertex_table ORDER BY id', 6, 5);
SELECT case when r=array[1,2,3,0] then 'OK' when r=array[1,0,3,2] then 'OK' else 'FAIL' end from (SELECT array_agg(id) as r from (SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[],1)) as a) as b;
+
+SET client_min_messages TO NOTICE;
+
SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[],1,2);
SELECT round(sum(cost)::numeric, 4) as cost
FROM pgr_tsp('SELECT id::integer, st_x(the_geom) as x,st_x(the_geom) as y FROM edge_table_vertices_pgr ORDER BY id', 6, 5);
@@ -134,4 +136,3 @@ SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[
\echo '----------------------------------3-1'
SELECT seq, id FROM pgr_tsp('{{0,1,2,3},{1,0,4,5},{2,4,0,6},{3,5,6,0}}'::float8[],3,1);
-ROLLBACK;
diff --git a/src/vrp_basic/doc/pgr_vrpOneDepot.rst b/src/vrp_basic/doc/pgr_vrpOneDepot.rst
index 6278605..cd7cfd6 100644
--- a/src/vrp_basic/doc/pgr_vrpOneDepot.rst
+++ b/src/vrp_basic/doc/pgr_vrpOneDepot.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -14,9 +14,9 @@ pgr_vrpOneDepot - Proposed
===============================================================================
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
No documentation available from the original developer
diff --git a/src/vrp_basic/src/CMakeLists.txt b/src/vrp_basic/src/CMakeLists.txt
index ee21d95..1a82681 100644
--- a/src/vrp_basic/src/CMakeLists.txt
+++ b/src/vrp_basic/src/CMakeLists.txt
@@ -2,5 +2,3 @@ add_library(vrp_basic OBJECT
VRP.c
VRP_core.cpp
VRP_Solver.cpp)
-
-
diff --git a/src/vrp_basic/src/VRP.c b/src/vrp_basic/src/VRP.c
index c8afe78..66b9a0e 100644
--- a/src/vrp_basic/src/VRP.c
+++ b/src/vrp_basic/src/VRP.c
@@ -21,21 +21,16 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "./VRP.h"
+#include "./../../common/src/postgres_connection.h"
+#include "catalog/pg_type.h"
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
#include <string.h>
// #include <math.h>
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-#include "fmgr.h"
+
+#include "./VRP.h"
@@ -122,6 +117,7 @@ typedef struct distance_columns {
// float DISTANCE[MAX_TOWNS][MAX_TOWNS];
// float x[MAX_TOWNS], y[MAX_TOWNS];
+#if 0
static char *
text2char(text *in) {
char *out = (char*)palloc(VARSIZE(in));
@@ -130,6 +126,7 @@ text2char(text *in) {
out[VARSIZE(in) - VARHDRSZ] = '\0';
return out;
}
+#endif
static int
finish(int *code) {
@@ -146,6 +143,7 @@ finish(int *code) {
static int
fetch_distance_columns(SPITupleTable *tuptable, distance_columns_t *distance_columns) {
PGR_DBG("Fetching distance");
+ if (tuptable) {}
distance_columns->src_id = SPI_fnumber(SPI_tuptable->tupdesc, "src_id");
distance_columns->dest_id = SPI_fnumber(SPI_tuptable->tupdesc, "dest_id");
@@ -171,6 +169,7 @@ fetch_distance(HeapTuple *tuple, TupleDesc *tupdesc,
distance_columns_t *distance_columns, vrp_cost_element_t *dist, size_t t) {
Datum binval;
bool isnull;
+ if (t) {}
PGR_DBG("fetch_distance: src_id col:%i", distance_columns->src_id);
@@ -230,6 +229,7 @@ fetch_distance(HeapTuple *tuple, TupleDesc *tupdesc,
static int
fetch_order_columns(SPITupleTable *tuptable, order_columns_t *order_columns) {
PGR_DBG("Fetching order");
+ if (tuptable) {}
// order_columns->id = SPI_fnumber(SPI_tuptable->tupdesc, "id");
order_columns->id = SPI_fnumber(SPI_tuptable->tupdesc, "id");
@@ -340,6 +340,7 @@ fetch_order(HeapTuple *tuple, TupleDesc *tupdesc,
static int
fetch_vehicle_columns(SPITupleTable *tuptable, vehicle_columns_t *vehicle_columns) {
PGR_DBG("Fetching order");
+ if (tuptable) {}
vehicle_columns->vehicle_id = SPI_fnumber(SPI_tuptable->tupdesc, "vehicle_id");
vehicle_columns->capacity = SPI_fnumber(SPI_tuptable->tupdesc, "capacity");
@@ -359,6 +360,7 @@ fetch_vehicle(HeapTuple *tuple, TupleDesc *tupdesc,
vehicle_columns_t *vehicle_columns, vrp_vehicles_t *vehicle, size_t t) {
Datum binval;
bool isnull;
+ if (t) {}
PGR_DBG("inside fetch_vehicle\n");
@@ -729,8 +731,6 @@ PG_FUNCTION_INFO_V1(vrp);
PGDLLEXPORT Datum
vrp(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
vrp_result_element_t *path;
@@ -758,10 +758,10 @@ vrp(PG_FUNCTION_ARGS) {
PGR_DBG("Calling solve_vrp ...");
// ret =
- solve_vrp( // text2char(PG_GETARG_TEXT_P(0)), // points sql
- text2char(PG_GETARG_TEXT_P(0)), // orders sql
- text2char(PG_GETARG_TEXT_P(1)), // vehicles sql
- text2char(PG_GETARG_TEXT_P(2)), // distances query
+ solve_vrp( // text_to_cstring(PG_GETARG_TEXT_P(0)), // points sql
+ text_to_cstring(PG_GETARG_TEXT_P(0)), // orders sql
+ text_to_cstring(PG_GETARG_TEXT_P(1)), // vehicles sql
+ text_to_cstring(PG_GETARG_TEXT_P(2)), // distances query
PG_GETARG_INT32(3), // depot id
&path, &path_count);
@@ -771,8 +771,11 @@ vrp(PG_FUNCTION_ARGS) {
/* total number of tuples to be returned */
// PGR_DBG("Counting tuples number\n");
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = path_count;
+#else
funcctx->max_calls = (uint32_t)path_count;
-
+#endif
funcctx->user_fctx = path;
/* Build a tuple descriptor for our result type */
@@ -798,17 +801,14 @@ vrp(PG_FUNCTION_ARGS) {
/* stuff done on every call of the function */
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
-
path = (vrp_result_element_t *)funcctx->user_fctx;
// elog(NOTICE, "Point 1");
// PGR_DBG("Trying to allocate some memory\n");
- // PGR_DBG("call_cntr = %i, max_calls = %i\n", call_cntr, max_calls);
+ // PGR_DBG("funcctx->call_cntr = %i, max_calls = %i\n", funcctx->call_cntr, max_calls);
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
/* do when there is more left to send */
HeapTuple tuple;
Datum result;
@@ -818,20 +818,20 @@ vrp(PG_FUNCTION_ARGS) {
values = palloc(5 * sizeof(Datum));
nulls = palloc(5 * sizeof(char));
- values[0] = Int32GetDatum(path[call_cntr].order_id); // order id
+ values[0] = Int32GetDatum(path[funcctx->call_cntr].order_id); // order id
nulls[0] = ' ';
- values[1] = Int32GetDatum(path[call_cntr].order_pos); // order pos
+ values[1] = Int32GetDatum(path[funcctx->call_cntr].order_pos); // order pos
nulls[1] = ' ';
- values[2] = Int32GetDatum(path[call_cntr].vehicle_id); // vehicle id
+ values[2] = Int32GetDatum(path[funcctx->call_cntr].vehicle_id); // vehicle id
nulls[2] = ' ';
- values[3] = Int32GetDatum(path[call_cntr].arrival_time); // arrival time
+ values[3] = Int32GetDatum(path[funcctx->call_cntr].arrival_time); // arrival time
nulls[3] = ' ';
- // values[4] = TimeTzADTPGetDatum(&path[call_cntr].time);
- values[4] = Int32GetDatum(path[call_cntr].depart_time); // departure time
+ // values[4] = TimeTzADTPGetDatum(&path[funcctx->call_cntr].time);
+ values[4] = Int32GetDatum(path[funcctx->call_cntr].depart_time); // departure time
nulls[4] = ' ';
// PGR_DBG("Heap making\n");
- // elog(NOTICE, "Result %d %d %d", call_cntr, path[call_cntr].order_id, max_calls);
+ // elog(NOTICE, "Result %d %d %d", funcctx->call_cntr, path[funcctx->call_cntr].order_id, max_calls);
tuple = heap_form_tuple(tuple_desc, values, nulls);
// PGR_DBG("Datum making\n");
@@ -855,8 +855,6 @@ vrp(PG_FUNCTION_ARGS) {
profstop("total", prof_total);
PGR_DBG("Profiles stopped\n");
- free(path);
-
PGR_DBG("Itinerary cleared\n");
SRF_RETURN_DONE(funcctx);
diff --git a/src/vrp_basic/src/VRP_Solver.cpp b/src/vrp_basic/src/VRP_Solver.cpp
index 81f9a90..a9ef1d1 100644
--- a/src/vrp_basic/src/VRP_Solver.cpp
+++ b/src/vrp_basic/src/VRP_Solver.cpp
@@ -21,10 +21,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
#include "./VRP_Solver.h"
#include <algorithm>
@@ -51,12 +47,7 @@ bool operator == (const CTourInfo& cur, const CTourInfo& that) {
return false;
if (cur.m_viOrderIds.size() != that.m_viOrderIds.size())
return false;
- auto tot = cur.m_viOrderIds.size();
- for (size_t i = 0; i < tot; i++) {
- if (cur.m_viOrderIds[i] != that.m_viOrderIds[i])
- return false;
- }
- return true;
+ return std::equal(cur.m_viOrderIds.begin(), cur.m_viOrderIds.end(), that.m_viOrderIds.begin());
}
bool operator == (const CMoveInfo& cur, const CMoveInfo& that) {
@@ -167,8 +158,8 @@ bool CSolutionInfo::addTour(CTourInfo& tour) {
m_iOrdersServed += static_cast<int>(vecOrders.size());
- for (unsigned int i = 0; i < vecOrders.size(); i++) {
- int oid = vecOrders[i];
+ for (const auto &order : vecOrders) {
+ int oid = order;
it = std::find(m_vUnservedOrderId.begin(), m_vUnservedOrderId.end(), oid);
if (it != m_vUnservedOrderId.end()) {
m_vUnservedOrderId.erase(it);
@@ -237,12 +228,14 @@ bool CVRPSolver::solveVRP(std::string& strError) {
// }
PGR_LOG("Inside Solve VRP");
std::vector<int> vecOrders, vecVehicles;
- for (unsigned int i = 0; i < m_vOrderInfos.size(); i++) {
- vecOrders.push_back(m_vOrderInfos[i].getOrderId());
+
+ for(auto &rule:m_vOrderInfos)
+ {
+ vecOrders.push_back(rule.getOrderId());
}
- for (unsigned int i = 0; i < m_vVehicleInfos.size(); i++) {
- vecVehicles.push_back(m_vVehicleInfos[i].getId());
+ for (auto &rule:m_vVehicleInfos) {
+ vecVehicles.push_back(rule.getId());
}
m_solutionFinal.init(vecOrders, static_cast<int>(vecOrders.size()), vecVehicles);
@@ -892,5 +885,3 @@ bool CVRPSolver::isTabuMove(CMoveInfo& curMove) {
}
return false;
}
-
-
diff --git a/src/vrp_basic/src/VRP_core.cpp b/src/vrp_basic/src/VRP_core.cpp
index 397a811..7718fe3 100644
--- a/src/vrp_basic/src/VRP_core.cpp
+++ b/src/vrp_basic/src/VRP_core.cpp
@@ -21,11 +21,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
+#ifdef __MINGW32__
#include <winsock2.h>
#include <windows.h>
#endif
+
+#include "../../common/src/pgr_alloc.hpp"
#include "VRP.h"
#include "VRP_Solver.h"
#include <vector>
@@ -176,7 +178,7 @@ int find_vrp_solution(vrp_vehicles_t *vehicles, size_t vehicle_count,
for (size_t i = 0; i < totalRoute; i++) {
totRows += (solution.getTour(static_cast<int>(i)).getServedOrderCount() + 2);
}
- *results = (vrp_result_element_t *) malloc(totRows * sizeof(vrp_result_element_t));
+ *results = pgr_alloc(totRows, *results);
*result_count = totRows;
int cnt = 0;
for (size_t i = 0; i < totalRoute; i++) {
diff --git a/src/vrp_basic/test/CMakeLists.txt b/src/vrp_basic/test/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/src/vrp_basic/test/Distance.txt b/src/vrp_basic/test/Distance.txt
index a8ce2cd..370f68c 100644
--- a/src/vrp_basic/test/Distance.txt
+++ b/src/vrp_basic/test/Distance.txt
@@ -1,10100 +1,10100 @@
-1 2 38.078866
-1 3 30.805844
-1 4 39.357337
-1 5 36.055513
-1 6 40.311289
-1 7 33.301652
-1 8 35.355339
-1 9 39.051248
-1 10 33.541020
-1 11 31.622777
-1 12 33.526109
-1 13 32.388269
-1 14 38.078866
-1 15 35.355339
-1 16 39.293765
-1 17 41.231056
-1 18 40.311289
-1 19 45.177428
-1 20 40.049969
-1 21 35.057096
-1 22 45.000000
-1 23 35.000000
-1 24 45.044423
-1 25 35.057096
-1 26 45.276926
-1 27 58.523500
-1 28 57.008771
-1 29 55.713553
-1 30 52.201533
-1 31 52.000000
-1 32 50.289164
-1 33 51.078371
-1 34 51.478151
-1 35 47.434165
-1 36 44.204072
-1 37 43.011626
-1 38 40.607881
-1 39 37.202150
-1 40 36.055513
-1 41 40.311289
-1 42 30.805844
-1 43 33.541020
-1 44 38.078866
-1 45 35.341194
-1 46 37.735925
-1 47 37.202150
-1 48 38.327536
-1 49 45.044423
-1 50 38.052595
-1 51 35.341194
-1 52 33.541020
-1 53 25.000000
-1 54 20.000000
-1 55 18.027756
-1 56 14.142136
-1 57 18.027756
-1 58 26.925824
-1 59 47.169906
-1 60 42.426407
-1 61 26.925824
-1 62 15.811388
-1 63 29.154759
-1 64 39.051248
-1 65 20.615528
-1 66 11.180340
-1 67 13.038405
-1 68 25.298221
-1 69 10.000000
-1 70 9.219544
-1 71 19.646883
-1 72 25.495098
-1 73 27.459060
-1 74 39.293765
-1 75 36.055513
-1 76 57.008771
-1 77 42.941821
-1 78 49.979996
-1 79 32.557641
-1 80 38.470768
-1 81 7.615773
-1 82 12.041595
-1 83 14.764823
-1 84 19.235384
-1 85 27.018512
-1 86 35.468296
-1 87 32.202484
-1 88 38.209946
-1 89 17.888544
-1 90 52.478567
-1 91 4.242641
-1 92 12.041595
-1 93 14.764823
-1 94 21.095023
-1 95 17.117243
-1 96 20.615528
-1 97 15.524175
-1 98 48.166378
-1 99 14.142136
-1 100 20.518285
-1 101 19.235384
-2 1 38.078866
-2 3 10.440307
-2 4 3.000000
-2 5 7.071068
-2 6 5.000000
-2 7 12.206556
-2 8 14.142136
-2 9 11.180340
-2 10 52.201533
-2 11 47.434165
-2 12 48.104054
-2 13 43.462628
-2 14 53.851648
-2 15 44.721360
-2 16 50.537115
-2 17 51.478151
-2 18 47.169906
-2 19 82.225300
-2 20 76.902536
-2 21 72.034714
-2 22 81.394103
-2 23 71.589105
-2 24 81.049368
-2 25 71.196910
-2 26 80.622577
-2 27 89.022469
-2 28 86.023253
-2 29 86.683332
-2 30 82.006097
-2 31 83.630138
-2 32 80.430094
-2 33 82.879430
-2 34 84.852814
-2 35 78.102497
-2 36 42.000000
-2 37 40.000000
-2 38 40.112342
-2 39 37.336309
-2 40 35.355339
-2 41 35.000000
-2 42 34.481879
-2 43 30.413813
-2 44 30.000000
-2 45 30.149627
-2 46 5.830952
-2 47 8.602325
-2 48 46.141088
-2 49 81.786307
-2 50 74.953319
-2 51 68.622154
-2 52 71.589105
-2 53 55.000000
-2 54 35.355339
-2 55 39.051248
-2 56 25.495098
-2 57 55.901699
-2 58 60.207973
-2 59 75.663730
-2 60 66.708320
-2 61 26.925824
-2 62 28.284271
-2 63 64.031242
-2 64 76.321688
-2 65 58.523500
-2 66 46.097722
-2 67 50.596443
-2 68 58.051701
-2 69 29.154759
-2 70 33.541020
-2 71 18.867962
-2 72 50.000000
-2 73 42.941821
-2 74 33.970576
-2 75 65.192024
-2 76 82.462113
-2 77 80.956779
-2 78 82.024387
-2 79 33.615473
-2 80 25.495098
-2 81 43.908997
-2 82 36.124784
-2 83 42.047592
-2 84 55.317267
-2 85 64.498062
-2 86 72.718636
-2 87 61.131007
-2 88 62.369865
-2 89 27.018512
-2 90 90.354856
-2 91 39.849718
-2 92 49.244289
-2 93 50.477718
-2 94 48.836462
-2 95 48.918299
-2 96 57.140179
-2 97 43.139309
-2 98 70.213959
-2 99 33.015148
-2 100 50.009999
-2 101 18.973666
-3 1 30.805844
-3 2 10.440307
-3 4 10.000000
-3 5 5.385165
-3 6 10.198039
-3 7 4.000000
-3 8 7.000000
-3 9 8.602325
-3 10 41.761226
-3 11 37.000000
-3 12 37.696154
-3 13 33.105891
-3 14 43.462628
-3 15 34.481879
-3 16 40.311289
-3 17 41.340053
-3 18 37.202150
-3 19 73.375745
-3 20 68.007353
-3 21 63.245553
-3 22 72.277244
-3 23 62.641839
-3 24 71.805292
-3 25 62.096699
-3 26 71.196910
-3 27 85.755466
-3 28 83.240615
-3 29 83.216585
-3 30 78.892332
-3 31 79.881162
-3 32 77.175126
-3 33 79.056942
-3 34 80.430094
-3 35 74.625733
-3 36 46.097722
-3 37 44.147480
-3 38 43.566042
-3 39 40.311289
-3 40 38.327536
-3 41 39.293765
-3 42 36.000000
-3 43 33.376639
-3 44 34.481879
-3 45 33.734256
-3 46 7.280110
-3 47 6.403124
-3 48 36.055513
-3 49 72.801099
-3 50 66.098411
-3 51 64.031242
-3 52 64.140471
-3 53 45.099889
-3 54 25.079872
-3 55 36.249138
-3 56 17.000000
-3 57 48.826222
-3 58 50.635956
-3 59 65.375837
-3 60 56.293872
-3 61 16.552945
-3 62 25.079872
-3 63 58.728187
-3 64 69.814039
-3 65 50.537115
-3 66 37.336309
-3 67 42.485292
-3 68 53.413481
-3 69 23.430749
-3 70 24.698178
-3 71 14.317821
-3 72 47.423623
-3 73 42.201896
-3 74 25.000000
-3 75 55.036352
-3 76 72.034714
-3 77 73.573093
-3 78 72.006944
-3 79 23.600847
-3 80 17.464249
-3 81 37.536649
-3 82 31.906112
-3 83 32.388269
-3 84 46.486557
-3 85 57.801384
-3 86 66.219333
-3 87 51.009803
-3 88 51.971146
-3 89 17.117243
-3 90 83.216585
-3 91 31.764760
-3 92 42.638011
-3 93 44.553339
-3 94 45.276926
-3 95 44.204072
-3 96 50.990195
-3 97 39.115214
-3 98 59.774577
-3 99 23.345235
-3 100 40.199502
-3 101 12.041595
-4 1 39.357337
-4 2 3.000000
-4 3 10.000000
-4 5 5.385165
-4 6 2.000000
-4 7 10.770330
-4 8 12.206556
-4 9 8.602325
-4 10 51.419841
-4 11 46.572524
-4 12 47.127487
-4 13 42.379240
-4 14 52.810984
-4 15 43.462628
-4 16 49.244289
-4 17 50.089919
-4 18 45.650849
-4 19 82.969874
-4 20 77.620873
-4 21 72.801099
-4 22 82.000000
-4 23 72.277244
-4 24 81.584312
-4 25 71.805292
-4 26 81.049368
-4 27 91.400219
-4 28 88.481637
-4 29 89.022469
-4 30 84.403791
-4 31 85.912746
-4 32 82.800966
-4 33 85.146932
-4 34 87.000000
-4 35 80.430094
-4 36 45.000000
-4 37 43.000000
-4 38 43.104524
-4 39 40.311289
-4 40 38.327536
-4 41 38.000000
-4 42 37.363083
-4 43 33.376639
-4 44 33.000000
-4 45 33.136083
-4 46 3.605551
-4 47 6.403124
-4 48 44.721360
-4 49 82.462113
-4 50 75.690158
-4 51 70.710678
-4 52 72.897188
-4 53 55.081757
-4 54 35.057096
-4 55 41.400483
-4 56 26.248809
-4 57 57.306195
-4 58 60.530984
-4 59 75.325958
-4 60 66.098411
-4 61 25.961510
-4 62 30.479501
-4 63 65.946948
-4 64 77.935871
-4 65 59.615434
-4 66 46.840154
-4 67 51.623638
-4 68 60.108236
-4 69 30.805844
-4 70 34.205263
-4 71 20.615528
-4 72 52.430907
-4 73 45.617979
-4 74 32.015621
-4 75 65.030762
-4 76 81.786307
-4 77 82.298238
-4 78 82.006097
-4 79 32.202484
-4 80 23.345235
-4 81 45.486262
-4 82 38.183766
-4 83 42.296572
-4 84 56.044625
-4 85 66.037868
-4 86 74.330344
-4 87 61.008196
-4 88 61.814238
-4 89 27.073973
-4 90 91.787799
-4 91 40.853396
-4 92 50.774009
-4 93 52.201533
-4 94 51.088159
-4 95 50.931326
-4 96 58.821765
-4 97 45.276926
-4 98 69.375788
-4 99 33.241540
-4 100 50.159745
-4 101 20.124612
-5 1 36.055513
-5 2 7.071068
-5 3 5.385165
-5 4 5.385165
-5 6 5.000000
-5 7 5.385165
-5 8 7.071068
-5 9 5.000000
-5 10 46.097722
-5 11 41.231056
-5 12 41.761226
-5 13 37.000000
-5 14 47.434165
-5 15 38.078866
-5 16 43.863424
-5 17 44.721360
-5 18 40.311289
-5 19 78.746428
-5 20 73.375745
-5 21 68.622154
-5 22 77.620873
-5 23 68.007353
-5 24 77.129761
-5 25 67.446275
-5 26 76.485293
-5 27 90.138782
-5 28 87.464278
-5 29 87.658428
-5 30 83.216585
-5 31 84.403791
-5 32 81.541401
-5 33 83.600239
-5 34 85.146932
-5 35 79.056942
-5 36 47.265209
-5 37 45.276926
-5 38 45.044423
-5 39 42.000000
-5 40 40.000000
-5 41 40.311289
-5 42 38.327536
-5 43 35.000000
-5 44 35.355339
-5 45 35.057096
-5 46 2.000000
-5 47 2.000000
-5 48 39.357337
-5 49 78.160092
-5 50 71.470274
-5 51 68.767725
-5 52 69.462220
-5 53 50.249378
-5 54 30.000000
-5 55 40.311289
-5 56 22.360680
-5 57 54.083269
-5 58 55.901699
-5 59 70.178344
-5 60 60.827625
-5 61 20.615528
-5 62 29.154759
-5 63 63.639610
-5 64 75.000000
-5 65 55.901699
-5 66 42.720019
-5 67 47.853944
-5 68 58.137767
-5 69 28.284271
-5 70 30.083218
-5 71 18.601075
-5 72 51.478151
-5 73 45.541190
-5 74 26.907248
-5 75 60.000000
-5 76 76.485293
-5 77 78.892332
-5 78 77.058419
-5 79 26.832816
-5 80 18.439089
-5 81 42.638011
-5 82 36.400549
-5 83 37.656341
-5 84 51.865210
-5 85 63.007936
-5 86 71.400280
-5 87 56.008928
-5 88 56.568542
-5 89 22.360680
-5 90 88.509886
-5 91 37.121422
-5 92 47.801674
-5 93 49.578221
-5 94 49.648766
-5 95 48.918299
-5 96 56.080300
-5 97 43.600459
-5 98 64.031242
-5 99 28.635642
-5 100 45.398238
-5 101 17.029386
-6 1 40.311289
-6 2 5.000000
-6 3 10.198039
-6 4 2.000000
-6 5 5.000000
-6 7 10.198039
-6 8 11.180340
-6 9 7.071068
-6 10 50.990195
-6 11 46.097722
-6 12 46.572524
-6 13 41.761226
-6 14 52.201533
-6 15 42.720019
-6 16 48.466483
-6 17 49.244289
-6 18 44.721360
-6 19 83.522452
-6 20 78.160092
-6 21 73.375745
-6 22 82.462113
-6 23 72.801099
-6 24 82.000000
-6 25 72.277244
-6 26 81.394103
-6 27 93.005376
-6 28 90.138782
-6 29 90.603532
-6 30 86.023253
-6 31 87.458562
-6 32 84.403791
-6 33 86.683332
-6 34 88.459030
-6 35 82.006097
-6 36 47.000000
-6 37 45.000000
-6 38 45.099889
-6 39 42.296572
-6 40 40.311289
-6 41 40.000000
-6 42 39.293765
-6 43 35.355339
-6 44 35.000000
-6 45 35.128336
-6 46 3.000000
-6 47 5.385165
-6 48 43.863424
-6 49 82.969874
-6 50 76.243032
-6 51 72.138755
-6 52 73.824115
-6 53 55.226805
-6 54 35.000000
-6 55 43.011626
-6 56 26.925824
-6 57 58.309519
-6 58 60.827625
-6 59 75.166482
-6 60 65.764732
-6 61 25.495098
-6 62 32.015621
-6 63 67.268120
-6 64 79.056942
-6 65 60.415230
-6 66 47.434165
-6 67 52.392748
-6 68 61.522354
-6 69 32.015621
-6 70 34.785054
-6 71 21.931712
-6 72 54.083269
-6 73 47.423623
-6 74 30.805844
-6 75 65.000000
-6 76 81.394103
-6 77 83.240615
-6 78 82.054860
-6 79 31.384710
-6 80 22.022716
-6 81 46.615448
-6 82 39.623226
-6 83 42.579338
-6 84 56.612719
-6 85 67.119297
-6 86 75.451971
-6 87 61.008196
-6 88 61.522354
-6 89 27.294688
-6 90 92.784697
-6 91 41.629317
-6 92 51.865210
-6 93 53.413481
-6 94 52.630789
-6 95 52.325902
-6 96 60.000000
-6 97 46.754679
-6 98 68.883960
-6 99 33.541020
-6 100 50.358713
-6 101 21.095023
-7 1 33.301652
-7 2 12.206556
-7 3 4.000000
-7 4 10.770330
-7 5 5.385165
-7 6 10.198039
-7 8 3.000000
-7 9 5.830952
-7 10 40.792156
-7 11 35.902646
-7 12 36.400549
-7 13 31.622777
-7 14 42.059482
-7 15 32.695565
-7 16 38.483763
-7 17 39.357337
-7 18 34.985711
-7 19 74.672619
-7 20 69.289249
-7 21 64.621978
-7 22 73.375745
-7 23 63.906181
-7 24 72.801099
-7 25 63.245553
-7 26 72.034714
-7 27 89.185201
-7 28 86.769810
-7 29 86.608314
-7 30 82.365041
-7 31 83.216585
-7 32 80.622577
-7 33 82.377181
-7 34 83.600239
-7 35 78.032045
-7 36 50.009999
-7 37 48.052055
-7 38 47.518417
-7 39 44.283180
-7 40 42.296572
-7 41 43.174066
-7 42 40.000000
-7 43 37.336309
-7 44 38.327536
-7 45 37.656341
-7 46 7.280110
-7 47 5.000000
-7 48 34.000000
-7 49 74.000000
-7 50 67.416615
-7 51 67.201190
-7 52 66.287254
-7 53 45.541190
-7 54 25.079872
-7 55 39.924930
-7 56 19.209373
-7 57 51.224994
-7 58 51.419841
-7 59 65.069194
-7 60 55.578773
-7 61 15.297059
-7 62 28.792360
-7 63 61.717096
-7 64 72.346389
-7 65 52.478567
-7 66 38.910153
-7 67 44.418465
-7 68 56.612719
-7 69 26.627054
-7 70 26.419690
-7 71 18.027756
-7 72 51.078371
-7 73 46.097722
-7 74 21.931712
-7 75 55.036352
-7 76 71.196910
-7 77 75.716577
-7 78 72.173402
-7 79 21.470911
-7 80 13.892444
-7 81 40.311289
-7 82 35.355339
-7 83 33.241540
-7 84 47.927028
-7 85 60.307545
-7 86 68.767725
-7 87 51.088159
-7 88 51.351728
-7 89 18.027756
-7 90 85.445889
-7 91 33.837849
-7 92 45.276926
-7 93 47.423623
-7 94 48.764741
-7 95 47.434165
-7 96 53.740115
-7 97 42.544095
-7 98 58.694122
-7 99 24.351591
-7 100 40.792156
-7 101 15.264338
-8 1 35.355339
-8 2 14.142136
-8 3 7.000000
-8 4 12.206556
-8 5 7.071068
-8 6 11.180340
-8 7 3.000000
-8 9 5.000000
-8 10 40.311289
-8 11 35.355339
-8 12 35.693137
-8 13 30.805844
-8 14 41.231056
-8 15 31.622777
-8 16 37.336309
-8 17 38.078866
-8 18 33.541020
-8 19 75.769387
-8 20 70.384657
-8 21 65.795137
-8 22 74.330344
-8 23 65.000000
-8 24 73.681748
-8 25 64.257295
-8 26 72.801099
-8 27 91.787799
-8 28 89.442719
-8 29 89.185201
-8 30 85.000000
-8 31 85.755466
-8 32 83.240615
-8 33 84.905830
-8 34 86.023253
-8 35 80.622577
-8 36 52.952809
-8 37 50.990195
-8 38 50.487622
-8 39 47.265209
-8 40 45.276926
-8 41 46.097722
-8 42 43.000000
-8 43 40.311289
-8 44 41.231056
-8 45 40.607881
-8 46 8.602325
-8 47 5.830952
-8 48 32.695565
-8 49 75.026662
-8 50 68.541958
-8 51 69.634761
-8 52 68.007353
-8 53 46.097722
-8 54 25.495098
-8 55 42.720019
-8 56 21.213203
-8 57 53.150729
-8 58 52.201533
-8 59 65.000000
-8 60 55.226805
-8 61 15.000000
-8 62 31.622777
-8 63 64.031242
-8 64 74.330344
-8 65 54.083269
-8 66 40.311289
-8 67 46.043458
-8 68 59.076222
-8 69 29.154759
-8 70 28.017851
-8 71 20.880613
-8 72 53.851648
-8 73 49.030603
-8 74 19.849433
-8 75 55.226805
-8 76 70.710678
-8 77 77.420927
-8 78 72.443081
-8 79 20.248457
-8 80 11.401754
-8 81 42.520583
-8 82 38.013156
-8 83 34.176015
-8 84 49.193496
-8 85 62.289646
-8 86 70.767224
-8 87 51.351728
-8 88 51.088159
-8 89 19.235384
-8 90 87.200917
-8 91 35.608988
-8 92 47.381431
-8 93 49.678969
-8 94 51.429563
-8 95 49.929951
-8 96 55.901699
-8 97 45.177428
-8 98 58.051701
-8 99 25.495098
-8 100 41.484937
-8 101 17.888544
-9 1 39.051248
-9 2 11.180340
-9 3 8.602325
-9 4 8.602325
-9 5 5.000000
-9 6 7.071068
-9 7 5.830952
-9 8 5.000000
-9 10 45.276926
-9 11 40.311289
-9 12 40.607881
-9 13 35.693137
-9 14 46.097722
-9 15 36.400549
-9 16 42.059482
-9 17 42.720019
-9 18 38.078866
-9 19 80.411442
-9 20 75.026662
-9 21 70.384657
-9 22 79.056942
-9 23 69.641941
-9 24 78.447435
-9 25 68.949257
-9 26 77.620873
-9 27 94.339811
-9 28 91.787799
-9 29 91.809586
-9 30 87.464278
-9 31 88.481637
-9 32 85.755466
-9 33 87.658428
-9 34 89.022469
-9 35 83.216585
-9 36 52.239832
-9 37 50.249378
-9 38 50.039984
-9 39 47.000000
-9 40 45.000000
-9 41 45.276926
-9 42 43.289722
-9 43 40.000000
-9 44 40.311289
-9 45 40.049969
-9 46 5.385165
-9 47 3.000000
-9 48 37.336309
-9 49 79.711982
-9 50 73.164199
-9 51 72.622311
-9 52 72.111026
-9 53 50.990195
-9 54 30.413813
-9 55 44.721360
-9 56 25.000000
-9 57 57.008771
-9 58 57.008771
-9 59 70.000000
-9 60 60.207973
-9 61 20.000000
-9 62 33.541020
-9 63 67.268120
-9 64 78.102497
-9 65 58.309519
-9 66 44.721360
-9 67 50.249378
-9 68 62.008064
-9 69 32.015621
-9 70 32.249031
-9 71 22.825424
-9 72 55.901699
-9 73 50.289164
-9 74 23.853721
-9 75 60.207973
-9 76 75.663730
-9 77 81.541401
-9 78 77.414469
-9 79 25.000000
-9 80 15.000000
-9 81 45.967380
-9 82 40.496913
-9 83 38.897301
-9 84 53.712196
-9 85 66.068147
-9 86 74.518454
-9 87 56.320511
-9 88 56.080300
-9 89 23.769729
-9 90 91.263355
-9 91 39.661064
-9 92 50.990195
-9 93 53.037722
-9 94 53.851648
-9 95 52.801515
-9 96 59.413803
-9 97 47.707442
-9 98 62.968246
-9 99 30.083218
-9 100 46.324939
-9 101 20.615528
-10 1 33.541020
-10 2 52.201533
-10 3 41.761226
-10 4 51.419841
-10 5 46.097722
-10 6 50.990195
-10 7 40.792156
-10 8 40.311289
-10 9 45.276926
-10 11 5.000000
-10 12 5.385165
-10 13 10.198039
-10 14 5.000000
-10 15 11.180340
-10 16 9.433981
-10 17 11.180340
-10 18 14.142136
-10 19 45.343136
-10 20 40.607881
-10 21 37.735925
-10 22 42.426407
-10 23 36.055513
-10 24 41.036569
-10 25 34.409301
-10 26 39.051248
-10 27 85.146932
-10 28 85.000000
-10 29 82.152298
-10 30 80.000000
-10 31 78.160092
-10 32 78.000000
-10 33 77.162167
-10 34 75.663730
-10 35 75.000000
-10 36 75.822160
-10 37 74.330344
-10 38 72.346389
-10 39 68.767725
-10 40 67.268120
-10 41 70.710678
-10 42 62.481997
-10 43 63.639610
-10 44 67.268120
-10 45 65.069194
-10 46 48.052055
-10 47 45.705580
-10 48 12.806248
-10 49 43.863424
-10 50 39.408121
-10 51 62.000000
-10 52 47.434165
-10 53 15.811388
-10 54 18.027756
-10 55 51.478151
-10 56 32.015621
-10 57 40.000000
-10 58 22.360680
-10 59 25.495098
-10 60 15.000000
-10 61 25.495098
-10 62 46.097722
-10 63 55.000000
-10 64 57.008771
-10 65 35.355339
-10 66 25.495098
-10 67 31.064449
-10 68 54.451814
-10 69 39.051248
-10 70 27.018512
-10 71 42.201896
-10 72 58.523500
-10 73 60.901560
-10 74 26.248809
-10 75 18.027756
-10 76 30.413813
-10 77 55.036352
-10 78 34.539832
-10 79 21.095023
-10 80 33.241540
-10 81 38.897301
-10 82 45.276926
-10 83 18.788294
-10 84 27.294688
-10 85 47.381431
-10 86 54.341513
-10 87 15.556349
-10 88 11.180340
-10 89 26.925824
-10 90 64.412732
-10 91 29.546573
-10 92 39.623226
-10 93 43.737855
-10 94 53.758720
-10 95 48.764741
-10 96 46.043458
-10 97 48.846699
-10 98 18.027756
-10 99 23.345235
-10 100 16.000000
-10 101 38.275318
-11 1 31.622777
-11 2 47.434165
-11 3 37.000000
-11 4 46.572524
-11 5 41.231056
-11 6 46.097722
-11 7 35.902646
-11 8 35.355339
-11 9 40.311289
-11 10 5.000000
-11 12 2.000000
-11 13 5.385165
-11 14 7.071068
-11 15 7.071068
-11 16 8.000000
-11 17 10.000000
-11 18 11.180340
-11 19 48.795492
-11 20 43.863424
-11 21 40.607881
-11 22 46.097722
-11 23 39.051248
-11 24 44.821870
-11 25 37.536649
-11 26 43.011626
-11 27 85.586214
-11 28 85.146932
-11 29 82.607506
-11 30 80.156098
-11 31 78.638413
-11 32 78.160092
-11 33 77.646635
-11 34 76.485293
-11 35 75.166482
-11 36 72.622311
-11 37 71.063352
-11 38 69.202601
-11 39 65.604878
-11 40 64.031242
-11 41 67.268120
-11 42 59.405387
-11 43 60.207973
-11 44 63.639610
-11 45 61.554854
-11 46 43.174066
-11 47 40.792156
-11 48 9.433981
-11 49 47.423623
-11 50 42.520583
-11 51 62.201286
-11 52 49.244289
-11 53 18.027756
-11 54 14.142136
-11 55 49.244289
-11 56 28.284271
-11 57 40.311289
-11 58 25.000000
-11 59 30.413813
-11 60 20.000000
-11 61 20.615528
-11 62 43.011626
-11 63 55.226805
-11 64 58.523500
-11 65 36.400549
-11 66 25.000000
-11 67 31.144823
-11 68 54.037024
-11 69 36.055513
-11 70 24.186773
-11 71 38.288379
-11 72 57.008771
-11 73 58.600341
-11 74 21.540659
-11 75 22.360680
-11 76 35.355339
-11 77 57.306195
-11 78 39.217343
-11 79 16.124515
-11 80 28.284271
-11 81 37.656341
-11 82 42.953463
-11 83 17.262677
-11 84 28.460499
-11 85 48.270074
-11 86 55.659680
-11 87 19.416488
-11 88 16.124515
-11 89 22.803509
-11 90 66.887966
-11 91 27.892651
-11 92 39.051248
-11 93 43.104524
-11 94 52.392748
-11 95 47.675990
-11 96 46.097722
-11 97 47.127487
-11 98 22.803509
-11 99 20.000000
-11 100 16.763055
-11 101 34.205263
-12 1 33.526109
-12 2 48.104054
-12 3 37.696154
-12 4 47.127487
-12 5 41.761226
-12 6 46.572524
-12 7 36.400549
-12 8 35.693137
-12 9 40.607881
-12 10 5.385165
-12 11 2.000000
-12 13 5.000000
-12 14 5.830952
-12 15 5.830952
-12 16 6.000000
-12 17 8.000000
-12 18 9.433981
-12 19 50.209561
-12 20 45.343136
-12 21 42.201896
-12 22 47.423623
-12 23 40.607881
-12 24 46.097722
-12 25 39.051248
-12 26 44.204072
-12 27 87.572827
-12 28 87.143560
-12 29 84.593144
-12 30 82.152298
-12 31 80.622577
-12 32 80.156098
-12 33 79.630396
-12 34 78.447435
-12 35 77.162167
-12 36 74.202426
-12 37 72.622311
-12 38 70.802542
-12 39 67.201190
-12 40 65.604878
-12 41 68.767725
-12 42 61.032778
-12 43 61.717096
-12 44 65.069194
-12 45 63.031738
-12 46 43.680659
-12 47 41.231056
-12 48 7.810250
-12 49 48.795492
-12 50 44.045431
-12 51 64.195015
-12 52 51.078371
-12 53 19.723083
-12 54 15.620499
-12 55 51.078371
-12 56 29.732137
-12 57 42.296572
-12 58 26.627054
-12 59 30.805844
-12 60 20.099751
-12 61 21.189620
-12 62 44.654227
-12 63 57.218878
-12 64 60.406953
-12 65 38.327536
-12 66 27.000000
-12 67 33.136083
-12 68 56.035703
-12 69 37.735925
-12 70 25.942244
-12 71 39.623226
-12 72 58.940648
-12 73 60.415230
-12 74 20.880613
-12 75 23.323808
-12 76 35.128336
-12 77 59.059292
-12 78 39.924930
-12 79 16.000000
-12 80 28.071338
-12 81 39.623226
-12 82 44.777226
-12 83 19.235384
-12 84 30.364453
-12 85 50.219518
-12 86 57.567352
-12 87 20.615528
-12 88 16.492423
-12 89 24.083189
-12 90 68.600292
-12 91 29.832868
-12 92 41.048752
-12 93 45.099889
-12 94 54.341513
-12 95 49.648766
-12 96 48.093659
-12 97 49.040799
-12 98 22.360680
-12 99 21.633308
-12 100 18.681542
-12 101 35.468296
-13 1 32.388269
-13 2 43.462628
-13 3 33.105891
-13 4 42.379240
-13 5 37.000000
-13 6 41.761226
-13 7 31.622777
-13 8 30.805844
-13 9 35.693137
-13 10 10.198039
-13 11 5.385165
-13 12 5.000000
-13 14 10.440307
-13 15 3.000000
-13 16 7.810250
-13 17 9.433981
-13 18 8.000000
-13 19 53.814496
-13 20 48.795492
-13 21 45.343136
-13 22 51.224994
-13 23 43.863424
-13 24 50.000000
-13 25 42.426407
-13 26 48.259714
-13 27 88.283634
-13 28 87.572827
-13 29 85.328776
-13 30 82.607506
-13 31 81.394103
-13 32 80.622577
-13 33 80.411442
-13 34 79.555012
-13 35 77.646635
-13 36 71.281134
-13 37 69.634761
-13 38 67.955868
-13 39 64.350602
-13 40 62.681736
-13 41 65.604878
-13 42 58.309519
-13 43 58.600341
-13 44 61.717096
-13 45 59.816386
-13 46 38.897301
-13 47 36.400549
-13 48 6.000000
-13 49 52.497619
-13 50 47.381431
-13 51 64.776539
-13 52 53.235327
-13 53 22.671568
-13 54 13.000000
-13 55 49.335586
-13 56 26.627054
-13 57 43.174066
-13 58 29.732137
-13 59 35.693137
-13 60 25.079872
-13 61 16.552945
-13 62 42.059482
-13 63 57.870545
-13 64 62.241465
-13 65 39.924930
-13 66 27.459060
-13 67 33.955854
-13 68 56.080300
-13 69 35.341194
-13 70 24.041631
-13 71 36.124784
-13 72 57.870545
-13 73 58.523500
-13 74 16.155494
-13 75 27.730849
-13 76 40.112342
-13 77 61.587336
-13 78 44.598206
-13 79 11.000000
-13 80 23.086793
-13 81 39.051248
-13 82 43.011626
-13 83 19.104973
-13 84 32.202484
-13 85 51.546096
-13 86 59.236813
-13 87 24.698178
-13 88 21.377558
-13 89 20.615528
-13 90 71.281134
-13 91 29.068884
-13 92 41.109610
-13 93 45.044423
-13 94 53.460266
-13 95 49.091751
-13 96 48.662100
-13 97 47.853944
-13 98 27.294688
-13 99 19.313208
-13 100 20.591260
-13 101 31.827661
-14 1 38.078866
-14 2 53.851648
-14 3 43.462628
-14 4 52.810984
-14 5 47.434165
-14 6 52.201533
-14 7 42.059482
-14 8 41.231056
-14 9 46.097722
-14 10 5.000000
-14 11 7.071068
-14 12 5.830952
-14 13 10.440307
-14 15 10.000000
-14 16 5.830952
-14 17 7.071068
-14 18 11.180340
-14 19 49.203658
-14 20 44.654227
-14 21 42.059482
-14 22 46.097722
-14 23 40.311289
-14 24 44.598206
-14 25 38.587563
-14 26 42.426407
-14 27 90.138782
-14 28 90.000000
-14 29 87.143560
-14 30 85.000000
-14 31 83.150466
-14 32 83.000000
-14 33 82.152298
-14 34 80.622577
-14 35 80.000000
-14 36 79.649231
-14 37 78.102497
-14 38 76.216796
-14 39 72.622311
-14 40 71.063352
-14 41 74.330344
-14 42 66.400301
-14 43 67.268120
-14 44 70.710678
-14 45 68.622154
-14 46 49.335586
-14 47 46.840154
-14 48 10.440307
-14 49 47.634021
-14 50 43.566042
-14 51 67.000000
-14 52 52.201533
-14 53 20.615528
-14 54 21.213203
-14 55 55.901699
-14 56 35.355339
-14 57 45.000000
-14 58 26.925824
-14 59 26.925824
-14 60 15.811388
-14 61 26.925824
-14 62 50.000000
-14 63 60.000000
-14 64 61.846584
-14 65 40.311289
-14 66 30.413813
-14 67 36.055513
-14 68 59.413803
-14 69 43.011626
-14 70 31.064449
-14 71 45.343136
-14 72 63.245553
-14 73 65.299311
-14 74 25.179357
-14 75 21.213203
-14 76 30.000000
-14 77 59.615434
-14 78 36.715120
-14 79 21.213203
-14 80 33.015148
-14 81 43.680659
-14 82 49.648766
-14 83 23.409400
-14 84 32.249031
-14 85 52.345009
-14 86 59.228372
-14 87 19.416488
-14 88 13.038405
-14 89 29.832868
-14 90 68.876701
-14 91 34.176015
-14 92 44.553339
-14 93 48.662100
-14 94 58.523500
-14 95 53.600373
-14 96 51.039201
-14 97 53.488316
-14 98 17.029386
-14 99 27.018512
-14 100 21.000000
-14 101 41.231056
-15 1 35.355339
-15 2 44.721360
-15 3 34.481879
-15 4 43.462628
-15 5 38.078866
-15 6 42.720019
-15 7 32.695565
-15 8 31.622777
-15 9 36.400549
-15 10 11.180340
-15 11 7.071068
-15 12 5.830952
-15 13 3.000000
-15 14 10.000000
-15 16 5.830952
-15 17 7.071068
-15 18 5.000000
-15 19 55.865911
-15 20 50.931326
-15 21 47.634021
-15 22 53.150729
-15 23 46.097722
-15 24 51.855569
-15 25 44.598206
-15 26 50.000000
-15 27 91.241438
-15 28 90.553851
-15 29 88.283634
-15 30 85.586214
-15 31 84.344532
-15 32 83.600239
-15 33 83.360662
-15 34 82.462113
-15 35 80.622577
-15 36 73.783467
-15 37 72.111026
-15 38 70.491134
-15 39 66.887966
-15 40 65.192024
-15 41 68.007353
-15 42 60.901560
-15 43 61.032778
-15 44 64.031242
-15 45 62.201286
-15 46 39.924930
-15 47 37.336309
-15 48 3.000000
-15 49 54.488531
-15 50 49.578221
-15 51 67.742158
-15 52 55.901699
-15 53 25.000000
-15 54 15.811388
-15 55 52.201533
-15 56 29.154759
-15 57 46.097722
-15 58 32.015621
-15 59 36.400549
-15 60 25.495098
-15 61 18.027756
-15 62 44.721360
-15 63 60.827625
-15 64 65.000000
-15 65 42.720019
-15 66 30.413813
-15 67 36.878178
-15 68 59.076222
-15 69 38.078866
-15 70 26.925824
-15 71 38.418745
-15 72 60.827625
-15 73 61.351447
-15 74 15.297059
-15 75 29.154759
-15 76 40.000000
-15 77 64.140471
-15 78 45.694639
-15 79 11.401754
-15 80 23.021729
-15 81 42.047592
-15 82 45.880279
-15 83 22.090722
-15 84 34.928498
-15 85 54.405882
-15 86 62.032250
-15 87 26.400758
-15 88 22.135944
-15 89 23.021729
-15 90 73.783467
-15 91 32.062439
-15 92 44.102154
-15 93 48.041649
-15 94 56.435804
-15 95 52.086467
-15 96 51.623638
-15 97 50.803543
-15 98 27.018512
-15 99 22.135944
-15 100 23.259407
-15 101 34.058773
-16 1 39.293765
-16 2 50.537115
-16 3 40.311289
-16 4 49.244289
-16 5 43.863424
-16 6 48.466483
-16 7 38.483763
-16 8 37.336309
-16 9 42.059482
-16 10 9.433981
-16 11 8.000000
-16 12 6.000000
-16 13 7.810250
-16 14 5.830952
-16 15 5.830952
-16 17 2.000000
-16 18 5.385165
-16 19 54.671748
-16 20 50.000000
-16 21 47.169906
-16 22 51.662365
-16 23 45.486262
-16 24 50.209561
-16 25 43.829214
-16 26 48.104054
-16 27 93.536089
-16 28 93.134312
-16 29 90.553851
-16 30 88.141931
-16 31 86.579443
-16 32 86.145226
-16 33 85.586214
-16 34 84.344532
-16 35 83.150466
-16 36 79.056942
-16 37 77.420927
-16 38 75.716577
-16 39 72.111026
-16 40 70.455660
-16 41 73.409809
-16 42 66.037868
-16 43 66.400301
-16 44 69.526973
-16 45 67.623960
-16 46 45.694639
-16 47 43.081318
-16 48 5.000000
-16 49 53.150729
-16 50 48.826222
-16 51 70.178344
-16 52 56.648036
-16 53 25.079872
-16 54 20.591260
-16 55 56.648036
-16 56 34.409301
-16 57 48.259714
-16 58 31.764760
-16 59 32.695565
-16 60 21.540659
-16 61 23.853721
-16 62 49.739320
-16 63 63.198101
-16 64 66.098411
-16 65 44.147480
-16 66 33.000000
-16 67 39.115214
-16 68 62.032250
-16 69 42.941821
-16 70 31.384710
-16 71 43.931765
-16 72 64.761099
-16 73 65.924199
-16 74 20.000000
-16 75 26.907248
-16 76 35.128336
-16 77 64.404969
-16 78 42.544095
-16 79 17.088007
-16 80 28.284271
-16 81 45.541190
-16 82 50.328918
-16 83 25.179357
-16 84 36.138622
-16 85 56.089215
-16 86 63.324561
-16 87 24.839485
-16 88 18.867962
-16 89 28.425341
-16 90 73.824115
-16 91 35.693137
-16 92 47.042534
-16 93 51.088159
-16 94 60.207973
-16 95 55.578773
-16 96 54.083269
-16 97 54.817880
-16 98 22.090722
-16 99 26.832816
-16 100 24.515301
-16 101 39.623226
-17 1 41.231056
-17 2 51.478151
-17 3 41.340053
-17 4 50.089919
-17 5 44.721360
-17 6 49.244289
-17 7 39.357337
-17 8 38.078866
-17 9 42.720019
-17 10 11.180340
-17 11 10.000000
-17 12 8.000000
-17 13 9.433981
-17 14 7.071068
-17 15 7.071068
-17 16 2.000000
-17 18 5.000000
-17 19 56.222771
-17 20 51.613952
-17 21 48.877398
-17 22 53.150729
-17 23 47.169906
-17 24 51.662365
-17 25 45.486262
-17 26 49.497475
-17 27 95.524866
-17 28 95.131488
-17 29 92.541882
-17 30 90.138782
-17 31 88.566359
-17 32 88.141931
-17 33 87.572827
-17 34 86.313383
-17 35 85.146932
-17 36 80.709355
-17 37 79.056942
-17 38 77.388630
-17 39 73.783467
-17 40 72.111026
-17 41 75.000000
-17 42 67.742158
-17 43 68.007353
-17 44 71.063352
-17 45 69.202601
-17 46 46.518813
-17 47 43.863424
-17 48 5.385165
-17 49 54.671748
-17 50 50.477718
-17 51 72.173402
-17 52 58.523500
-17 53 26.925824
-17 54 22.360680
-17 55 58.523500
-17 56 36.055513
-17 57 50.249378
-17 58 33.541020
-17 59 33.541020
-17 60 22.360680
-17 61 25.000000
-17 62 51.478151
-17 63 65.192024
-17 64 68.007353
-17 65 46.097722
-17 66 35.000000
-17 67 41.109610
-17 68 64.031242
-17 69 44.721360
-17 70 33.241540
-17 71 45.453273
-17 72 66.708320
-17 73 67.779053
-17 74 20.099751
-17 75 28.284271
-17 76 35.355339
-17 77 66.211781
-17 78 43.566042
-17 79 17.888544
-17 80 28.635642
-17 81 47.518417
-17 82 52.201533
-17 83 27.166155
-17 84 38.078866
-17 85 58.051701
-17 86 65.253352
-17 87 26.400758
-17 88 20.000000
-17 89 30.000000
-17 90 75.591005
-17 91 37.656341
-17 92 49.040799
-17 93 53.084838
-17 94 62.169124
-17 95 57.558666
-17 96 56.080300
-17 97 56.753854
-17 98 22.360680
-17 99 28.635642
-17 100 26.476405
-17 101 41.109610
-18 1 40.311289
-18 2 47.169906
-18 3 37.202150
-18 4 45.650849
-18 5 40.311289
-18 6 44.721360
-18 7 34.985711
-18 8 33.541020
-18 9 38.078866
-18 10 14.142136
-18 11 11.180340
-18 12 9.433981
-18 13 8.000000
-18 14 11.180340
-18 15 5.000000
-18 16 5.385165
-18 17 5.000000
-18 19 59.464275
-18 20 54.671748
-18 21 51.613952
-18 22 56.568542
-18 23 50.000000
-18 24 55.172457
-18 25 48.414874
-18 26 53.150729
-18 27 96.176920
-18 28 95.524866
-18 29 93.214806
-18 30 90.553851
-18 31 89.269256
-18 32 88.566359
-18 33 88.283634
-18 34 87.321246
-18 35 85.586214
-18 36 78.032045
-18 37 76.321688
-18 38 74.793048
-18 39 71.196910
-18 40 69.462220
-18 41 72.111026
-18 42 65.299311
-18 43 65.192024
-18 44 68.007353
-18 45 66.287254
-18 46 42.059482
-18 47 39.357337
-18 48 2.000000
-18 49 58.000000
-18 50 53.413481
-18 51 72.691127
-18 52 60.415230
-18 53 29.154759
-18 54 20.615528
-18 55 57.008771
-18 56 33.541020
-18 57 50.990195
-18 58 36.055513
-18 59 38.078866
-18 60 26.925824
-18 61 21.213203
-18 62 49.244289
-18 63 65.764732
-18 64 69.641941
-18 65 47.434165
-18 66 35.355339
-18 67 41.773197
-18 68 64.070274
-18 69 42.720019
-18 70 31.780497
-18 71 42.438190
-18 72 65.764732
-18 73 66.098411
-18 74 15.132746
-18 75 32.015621
-18 76 40.311289
-18 77 68.476273
-18 78 47.885280
-18 79 13.601471
-18 80 23.769729
-18 81 47.042534
-18 82 50.695167
-18 83 27.073973
-18 84 39.560081
-18 85 59.203040
-18 86 66.730802
-18 87 29.698485
-18 88 24.186773
-18 89 27.294688
-18 90 78.032045
-18 91 37.054015
-18 92 49.091751
-18 93 53.037722
-18 94 61.400326
-18 95 57.078893
-18 96 56.568542
-18 97 55.731499
-18 98 27.294688
-18 99 26.925824
-18 100 27.856777
-18 101 38.013156
-19 1 45.177428
-19 2 82.225300
-19 3 73.375745
-19 4 82.969874
-19 5 78.746428
-19 6 83.522452
-19 7 74.672619
-19 8 75.769387
-19 9 80.411442
-19 10 45.343136
-19 11 48.795492
-19 12 50.209561
-19 13 53.814496
-19 14 49.203658
-19 15 55.865911
-19 16 54.671748
-19 17 56.222771
-19 18 59.464275
-19 20 5.385165
-19 21 10.198039
-19 22 4.000000
-19 23 10.770330
-19 24 6.000000
-19 25 11.661904
-19 26 9.000000
-19 27 56.797887
-19 28 59.169249
-19 29 54.120237
-19 30 54.918121
-19 31 50.606324
-19 32 53.254108
-19 33 49.739320
-19 34 45.617979
-19 35 50.803543
-19 36 83.240615
-19 37 82.710338
-19 38 79.812280
-19 39 77.129761
-19 40 76.687678
-19 41 81.584312
-19 42 71.386273
-19 43 75.802375
-19 44 80.752709
-19 45 77.781746
-19 46 80.653580
-19 47 79.378838
-19 48 58.000000
-19 49 2.000000
-19 50 7.280110
-19 51 41.036569
-19 52 18.601075
-19 53 31.400637
-19 54 51.000000
-19 55 56.089215
-19 56 56.753854
-19 57 30.594117
-19 58 24.413111
-19 59 29.427878
-19 60 37.161808
-19 61 62.177166
-19 62 60.008333
-19 63 36.619667
-19 64 25.806976
-19 65 25.019992
-19 66 36.138622
-19 67 32.140317
-19 68 42.059482
-19 69 55.145263
-19 70 48.764741
-19 71 64.629715
-19 72 54.230987
-19 73 62.936476
-19 74 69.202601
-19 75 28.301943
-19 76 39.000000
-19 77 17.464249
-19 78 21.095023
-19 79 62.425956
-19 80 73.573093
-19 81 42.107007
-19 82 53.235327
-19 83 41.629317
-19 84 26.925824
-19 85 27.294688
-19 86 26.172505
-19 87 29.832868
-19 88 37.215588
-19 89 56.648036
-19 90 23.000000
-19 91 42.579338
-19 92 37.336309
-19 93 39.051248
-19 94 49.979996
-19 95 44.922155
-19 96 34.176015
-19 97 50.219518
-19 98 42.059482
-19 99 50.328918
-19 100 34.985711
-19 101 63.348244
-20 1 40.049969
-20 2 76.902536
-20 3 68.007353
-20 4 77.620873
-20 5 73.375745
-20 6 78.160092
-20 7 69.289249
-20 8 70.384657
-20 9 75.026662
-20 10 40.607881
-20 11 43.863424
-20 12 45.343136
-20 13 48.795492
-20 14 44.654227
-20 15 50.931326
-20 16 50.000000
-20 17 51.613952
-20 18 54.671748
-20 19 5.385165
-20 21 5.000000
-20 22 5.385165
-20 23 5.385165
-20 24 6.403124
-20 25 6.403124
-20 26 8.602325
-20 27 56.648036
-20 28 58.600341
-20 29 53.851648
-20 30 54.120237
-20 31 50.159745
-20 32 52.354560
-20 33 49.244289
-20 34 45.541190
-20 35 49.739320
-20 36 79.056942
-20 37 78.447435
-20 38 75.584390
-20 39 72.801099
-20 40 72.277244
-20 41 77.129761
-20 42 66.940272
-20 43 71.196910
-20 44 76.118329
-20 45 73.164199
-20 46 75.286121
-20 47 74.000000
-20 48 53.150729
-20 49 5.000000
-20 50 2.000000
-20 51 39.051248
-20 52 16.401219
-20 53 26.248809
-20 54 45.650849
-20 55 51.662365
-20 56 51.419841
-20 57 26.248809
-20 58 19.209373
-20 59 27.000000
-20 60 33.526109
-20 61 56.824291
-20 62 55.081757
-20 63 33.970576
-20 64 25.079872
-20 65 20.223748
-20 66 30.805844
-20 67 27.018512
-20 68 38.832976
-20 69 50.039984
-20 70 43.416587
-20 71 59.413803
-20 72 50.537115
-20 73 58.872744
-20 74 64.031242
-20 75 24.166092
-20 76 37.336309
-20 77 18.110770
-20 78 20.248457
-20 79 57.201399
-20 80 68.264193
-20 81 37.336309
-20 82 48.507731
-20 83 36.249138
-20 84 21.587033
-20 85 24.207437
-20 86 24.698178
-20 87 25.238859
-20 88 33.105891
-20 89 51.264022
-20 90 25.495098
-20 91 37.336309
-20 92 32.756679
-20 93 34.785054
-20 94 46.097722
-20 95 40.853396
-20 96 30.413813
-20 97 45.880279
-20 98 38.832976
-20 99 44.944410
-20 100 29.681644
-20 101 58.051701
-21 1 35.057096
-21 2 72.034714
-21 3 63.245553
-21 4 72.801099
-21 5 68.622154
-21 6 73.375745
-21 7 64.621978
-21 8 65.795137
-21 9 70.384657
-21 10 37.735925
-21 11 40.607881
-21 12 42.201896
-21 13 45.343136
-21 14 42.059482
-21 15 47.634021
-21 16 47.169906
-21 17 48.877398
-21 18 51.613952
-21 19 10.198039
-21 20 5.000000
-21 22 10.198039
-21 23 2.000000
-21 24 10.770330
-21 25 4.000000
-21 26 12.206556
-21 27 55.081757
-21 28 56.648036
-21 29 52.201533
-21 30 52.000000
-21 31 48.383882
-21 32 50.159745
-21 33 47.434165
-21 34 44.147480
-21 35 47.423623
-21 36 74.330344
-21 37 73.681748
-21 38 70.837843
-21 39 68.007353
-21 40 67.446275
-21 41 72.277244
-21 42 62.096699
-21 43 66.287254
-21 44 71.196910
-21 45 68.249542
-21 46 70.519501
-21 47 69.289249
-21 48 50.000000
-21 49 10.000000
-21 50 3.000000
-21 51 36.055513
-21 52 13.928388
-21 53 22.671568
-21 54 41.340053
-21 55 46.840154
-21 56 46.572524
-21 57 21.540659
-21 58 15.620499
-21 59 27.459060
-21 60 32.388269
-21 61 52.478567
-21 62 50.089919
-21 63 30.479501
-21 64 23.537205
-21 65 15.297059
-21 66 25.961510
-21 67 22.022716
-21 68 34.828150
-21 69 45.044423
-21 70 38.600518
-21 71 54.451814
-21 72 46.141088
-21 73 54.230987
-21 74 60.207973
-21 75 22.561028
-21 76 38.327536
-21 77 18.248288
-21 78 22.472205
-21 79 53.263496
-21 80 64.070274
-21 81 32.388269
-21 82 43.566042
-21 83 31.764760
-21 84 16.763055
-21 85 20.518285
-21 86 22.472205
-21 87 22.847319
-21 88 31.320920
-21 89 46.615448
-21 90 26.925824
-21 91 32.388269
-21 92 27.892651
-21 93 30.083218
-21 94 41.593269
-21 95 36.249138
-21 96 26.076810
-21 97 41.109610
-21 98 38.118237
-21 99 40.311289
-21 100 25.612497
-21 101 53.150729
-22 1 45.000000
-22 2 81.394103
-22 3 72.277244
-22 4 82.000000
-22 5 77.620873
-22 6 82.462113
-22 7 73.375745
-22 8 74.330344
-22 9 79.056942
-22 10 42.426407
-22 11 46.097722
-22 12 47.423623
-22 13 51.224994
-22 14 46.097722
-22 15 53.150729
-22 16 51.662365
-22 17 53.150729
-22 18 56.568542
-22 19 4.000000
-22 20 5.385165
-22 21 10.198039
-22 23 10.000000
-22 24 2.000000
-22 25 10.198039
-22 26 5.000000
-22 27 60.415230
-22 28 62.649820
-22 29 57.697487
-22 30 58.309519
-22 31 54.120237
-22 32 56.603887
-22 33 53.235327
-22 34 49.244289
-22 35 54.083269
-22 36 84.433406
-22 37 83.815273
-22 38 80.956779
-22 39 78.160092
-22 40 77.620873
-22 41 82.462113
-22 42 72.277244
-22 43 76.485293
-22 44 81.394103
-22 45 78.447435
-22 46 79.555012
-22 47 78.160092
-22 48 55.172457
-22 49 2.000000
-22 50 7.280110
-22 51 43.863424
-22 52 21.213203
-22 53 29.154759
-22 54 49.244289
-22 55 57.008771
-22 56 55.901699
-22 57 31.622777
-22 58 22.360680
-22 59 25.495098
-22 60 33.541020
-22 61 60.415230
-22 62 60.207973
-22 63 39.051248
-22 64 29.154759
-22 65 25.495098
-22 66 35.355339
-22 67 32.015621
-22 68 44.102154
-22 69 55.000000
-22 70 47.853944
-22 71 64.195015
-22 72 55.901699
-22 73 64.257295
-22 74 66.850580
-22 75 25.000000
-22 76 35.000000
-22 77 21.189620
-22 78 17.117243
-22 79 60.207973
-22 80 71.589105
-22 81 42.579338
-22 82 53.758720
-22 83 40.162171
-22 84 26.172505
-22 85 29.410882
-22 86 29.206164
-22 87 26.870058
-22 88 33.837849
-22 89 55.362442
-22 90 27.000000
-22 91 42.107007
-22 92 38.078866
-22 93 40.162171
-22 94 51.478151
-22 95 46.238512
-22 96 35.777088
-22 97 51.244512
-22 98 38.275318
-22 99 49.040799
-22 100 33.105891
-22 101 62.649820
-23 1 35.000000
-23 2 71.589105
-23 3 62.641839
-23 4 72.277244
-23 5 68.007353
-23 6 72.801099
-23 7 63.906181
-23 8 65.000000
-23 9 69.641941
-23 10 36.055513
-23 11 39.051248
-23 12 40.607881
-23 13 43.863424
-23 14 40.311289
-23 15 46.097722
-23 16 45.486262
-23 17 47.169906
-23 18 50.000000
-23 19 10.770330
-23 20 5.385165
-23 21 2.000000
-23 22 10.000000
-23 24 10.198039
-23 25 2.000000
-23 26 11.180340
-23 27 57.008771
-23 28 58.523500
-23 29 54.120237
-23 30 53.851648
-23 31 50.289164
-23 32 52.000000
-23 33 49.335586
-23 34 46.097722
-23 35 49.244289
-23 36 75.026662
-23 37 74.330344
-23 38 71.512237
-23 39 68.622154
-23 40 68.007353
-23 41 72.801099
-23 42 62.641839
-23 43 66.708320
-23 44 71.589105
-23 45 68.658576
-23 46 69.921384
-23 47 68.622154
-23 48 48.414874
-23 49 10.198039
-23 50 3.605551
-23 51 37.735925
-23 52 15.811388
-23 53 21.213203
-23 54 40.311289
-23 55 47.434165
-23 56 46.097722
-23 57 22.360680
-23 58 14.142136
-23 59 25.495098
-23 60 30.413813
-23 61 51.478151
-23 62 50.249378
-23 63 32.015621
-23 64 25.495098
-23 65 15.811388
-23 66 25.495098
-23 67 22.022716
-23 68 36.124784
-23 69 45.000000
-23 70 38.078866
-23 71 54.230987
-23 72 47.169906
-23 73 55.036352
-23 74 58.898217
-23 75 20.615528
-23 76 36.400549
-23 77 20.223748
-23 78 20.808652
-23 79 52.009614
-23 80 62.968246
-23 81 32.756679
-23 82 43.931765
-23 83 30.870698
-23 84 16.278821
-23 85 22.022716
-23 86 24.351591
-23 87 21.023796
-23 88 29.410882
-23 89 45.880279
-23 90 28.792360
-23 91 32.140317
-23 92 28.460499
-23 93 30.870698
-23 94 42.544095
-23 95 37.121422
-23 96 27.202941
-23 97 41.785165
-23 98 36.124784
-23 99 39.560081
-23 100 24.413111
-23 101 52.773099
-24 1 45.044423
-24 2 81.049368
-24 3 71.805292
-24 4 81.584312
-24 5 77.129761
-24 6 82.000000
-24 7 72.801099
-24 8 73.681748
-24 9 78.447435
-24 10 41.036569
-24 11 44.821870
-24 12 46.097722
-24 13 50.000000
-24 14 44.598206
-24 15 51.855569
-24 16 50.209561
-24 17 51.662365
-24 18 55.172457
-24 19 6.000000
-24 20 6.403124
-24 21 10.770330
-24 22 2.000000
-24 23 10.198039
-24 25 10.000000
-24 26 3.000000
-24 27 62.241465
-24 28 64.412732
-24 29 59.506302
-24 30 60.033324
-24 31 55.901699
-24 32 58.309519
-24 33 55.009090
-24 34 51.078371
-24 35 55.758407
-24 36 85.094066
-24 37 84.433406
-24 38 81.596569
-24 39 78.746428
-24 40 78.160092
-24 41 82.969874
-24 42 72.801099
-24 43 76.902536
-24 44 81.786307
-24 45 78.854296
-24 46 79.075913
-24 47 77.620873
-24 48 53.814496
-24 49 4.000000
-24 50 8.062258
-24 51 45.343136
-24 52 22.671568
-24 53 28.178006
-24 54 48.466483
-24 55 57.567352
-24 56 55.578773
-24 57 32.310989
-24 58 21.540659
-24 59 23.537205
-24 60 31.764760
-24 61 59.615434
-24 62 60.406953
-24 63 40.360872
-24 64 30.886890
-24 65 25.961510
-24 66 35.128336
-24 67 32.140317
-24 68 45.221676
-24 69 55.036352
-24 70 47.518417
-24 71 64.070274
-24 72 56.824291
-24 73 65.000000
-24 74 65.734314
-24 75 23.430749
-24 76 33.000000
-24 77 23.086793
-24 78 15.132746
-24 79 59.169249
-24 80 70.661163
-24 81 42.953463
-24 82 54.129474
-24 83 39.560081
-24 84 26.019224
-24 85 30.610456
-24 86 30.805844
-24 87 25.495098
-24 88 32.202484
-24 89 54.817880
-24 90 29.000000
-24 91 42.011903
-24 92 38.600518
-24 93 40.853396
-24 94 52.325902
-24 95 47.010637
-24 96 36.715120
-24 97 51.865210
-24 98 36.400549
-24 99 48.507731
-24 100 32.310989
-24 101 62.393910
-25 1 35.057096
-25 2 71.196910
-25 3 62.096699
-25 4 71.805292
-25 5 67.446275
-25 6 72.277244
-25 7 63.245553
-25 8 64.257295
-25 9 68.949257
-25 10 34.409301
-25 11 37.536649
-25 12 39.051248
-25 13 42.426407
-25 14 38.587563
-25 15 44.598206
-25 16 43.829214
-25 17 45.486262
-25 18 48.414874
-25 19 11.661904
-25 20 6.403124
-25 21 4.000000
-25 22 10.198039
-25 23 2.000000
-25 24 10.000000
-25 26 10.440307
-25 27 58.940648
-25 28 60.406953
-25 29 56.044625
-25 30 55.713553
-25 31 52.201533
-25 32 53.851648
-25 33 51.244512
-25 34 48.052055
-25 35 51.078371
-25 36 75.769387
-25 37 75.026662
-25 38 72.235725
-25 39 69.289249
-25 40 68.622154
-25 41 73.375745
-25 42 63.245553
-25 43 67.186308
-25 44 72.034714
-25 45 69.123079
-25 46 69.375788
-25 47 68.007353
-25 48 46.861498
-25 49 10.770330
-25 50 5.000000
-25 51 39.446166
-25 52 17.720045
-25 53 19.849433
-25 54 39.357337
-25 55 48.104054
-25 56 45.705580
-25 57 23.323808
-25 58 12.806248
-25 59 23.537205
-25 60 28.442925
-25 61 50.537115
-25 62 50.487622
-25 63 33.600595
-25 64 27.459060
-25 65 16.552945
-25 66 25.179357
-25 67 22.203603
-25 68 37.483330
-25 69 45.044423
-25 70 37.656341
-25 71 54.083269
-25 72 48.259714
-25 73 55.901699
-25 74 57.628118
-25 75 18.681542
-25 76 34.481879
-25 77 22.203603
-25 78 19.209373
-25 79 50.803543
-25 80 61.911227
-25 81 33.241540
-25 82 44.384682
-25 83 30.083218
-25 84 16.031220
-25 85 23.600847
-25 86 26.248809
-25 87 19.235384
-25 88 27.513633
-25 89 45.221676
-25 90 30.675723
-25 91 32.015621
-25 92 29.154759
-25 93 31.764760
-25 94 43.566042
-25 95 38.078866
-25 96 28.425341
-25 97 42.544095
-25 98 34.132096
-25 99 38.897301
-25 100 23.323808
-25 101 52.469038
-26 1 45.276926
-26 2 80.622577
-26 3 71.196910
-26 4 81.049368
-26 5 76.485293
-26 6 81.394103
-26 7 72.034714
-26 8 72.801099
-26 9 77.620873
-26 10 39.051248
-26 11 43.011626
-26 12 44.204072
-26 13 48.259714
-26 14 42.426407
-26 15 50.000000
-26 16 48.104054
-26 17 49.497475
-26 18 53.150729
-26 19 9.000000
-26 20 8.602325
-26 21 12.206556
-26 22 5.000000
-26 23 11.180340
-26 24 3.000000
-26 25 10.440307
-26 27 65.000000
-26 28 67.082039
-26 29 62.241465
-26 30 62.649820
-26 31 58.600341
-26 32 60.901560
-26 33 57.697487
-26 34 53.851648
-26 35 58.309519
-26 36 86.162637
-26 37 85.440037
-26 38 82.637764
-26 39 79.711982
-26 40 79.056942
-26 41 83.815273
-26 42 73.681748
-26 43 77.620873
-26 44 82.462113
-26 45 79.555012
-26 46 78.447435
-26 47 76.902536
-26 48 51.855569
-26 49 7.000000
-26 50 9.899495
-26 51 47.634021
-26 52 25.000000
-26 53 26.925824
-26 54 47.434165
-26 55 58.523500
-26 56 55.226805
-26 57 33.541020
-26 58 20.615528
-26 59 20.615528
-26 60 29.154759
-26 61 58.523500
-26 62 60.827625
-26 63 42.426407
-26 64 33.541020
-26 65 26.925824
-26 66 35.000000
-26 67 32.557641
-26 68 47.010637
-26 69 55.226805
-26 70 47.169906
-26 71 64.000000
-26 72 58.309519
-26 73 66.211781
-26 74 64.140471
-26 75 21.213203
-26 76 30.000000
-26 77 25.961510
-26 78 12.165525
-26 79 57.706152
-26 80 69.354164
-26 81 43.680659
-26 82 54.817880
-26 83 38.832976
-26 84 26.076810
-26 85 32.557641
-26 86 33.286634
-26 87 23.600847
-26 88 29.832868
-26 89 54.129474
-26 90 32.000000
-26 91 42.047592
-26 92 39.560081
-26 93 42.047592
-26 94 53.712196
-26 95 48.301139
-26 96 38.275318
-26 97 52.924474
-26 98 33.615473
-26 99 47.853944
-26 100 31.320920
-26 101 62.128898
-27 1 58.523500
-27 2 89.022469
-27 3 85.755466
-27 4 91.400219
-27 5 90.138782
-27 6 93.005376
-27 7 89.185201
-27 8 91.787799
-27 9 94.339811
-27 10 85.146932
-27 11 85.586214
-27 12 87.572827
-27 13 88.283634
-27 14 90.138782
-27 15 91.241438
-27 16 93.536089
-27 17 95.524866
-27 18 96.176920
-27 19 56.797887
-27 20 56.648036
-27 21 55.081757
-27 22 60.415230
-27 23 57.008771
-27 24 62.241465
-27 25 58.940648
-27 26 65.000000
-27 28 5.000000
-27 29 3.000000
-27 30 7.071068
-27 31 7.000000
-27 32 8.602325
-27 33 8.000000
-27 34 11.180340
-27 35 11.180340
-27 36 61.717096
-27 37 62.649820
-27 38 60.033324
-27 39 59.908263
-27 40 61.032778
-27 41 65.192024
-27 42 58.258047
-27 43 64.031242
-27 44 68.007353
-27 45 65.604878
-27 46 91.263355
-27 47 91.809586
-27 48 94.201911
-27 49 58.600341
-27 50 55.973208
-27 51 23.537205
-27 52 41.231056
-27 53 70.000000
-27 54 77.620873
-27 55 50.000000
-27 56 71.589105
-27 57 45.276926
-27 58 65.192024
-27 59 82.462113
-27 60 85.586214
-27 61 85.440037
-27 62 61.032778
-27 63 30.413813
-27 64 31.622777
-27 65 50.000000
-27 66 60.827625
-27 67 54.451814
-27 68 33.241540
-27 69 62.649820
-27 70 67.675697
-27 71 71.561163
-27 72 39.051248
-27 73 47.423623
-27 74 97.718985
-27 75 75.663730
-27 76 93.407708
-27 77 39.357337
-27 78 76.896034
-27 79 90.801982
-27 80 96.772930
-27 81 50.921508
-27 82 53.851648
-27 83 69.231496
-27 84 58.008620
-27 85 38.013156
-27 86 32.756679
-27 87 74.242845
-27 88 83.216585
-27 89 76.321688
-27 90 37.536649
-27 91 60.440053
-27 92 47.539457
-27 93 43.965896
-27 94 40.496913
-27 95 42.047592
-27 96 39.623226
-27 97 46.647615
-27 98 91.787799
-27 99 72.422372
-27 100 69.180922
-27 101 73.925638
-28 1 57.008771
-28 2 86.023253
-28 3 83.240615
-28 4 88.481637
-28 5 87.464278
-28 6 90.138782
-28 7 86.769810
-28 8 89.442719
-28 9 91.787799
-28 10 85.000000
-28 11 85.146932
-28 12 87.143560
-28 13 87.572827
-28 14 90.000000
-28 15 90.553851
-28 16 93.134312
-28 17 95.131488
-28 18 95.524866
-28 19 59.169249
-28 20 58.600341
-28 21 56.648036
-28 22 62.649820
-28 23 58.523500
-28 24 64.412732
-28 25 60.406953
-28 26 67.082039
-28 27 5.000000
-28 29 5.830952
-28 30 5.000000
-28 31 8.602325
-28 32 7.000000
-28 33 9.433981
-28 34 14.142136
-28 35 10.000000
-28 36 57.306195
-28 37 58.309519
-28 38 55.758407
-28 39 55.803226
-28 40 57.008771
-28 41 61.032778
-28 42 54.488531
-28 43 60.207973
-28 44 64.031242
-28 45 61.717096
-28 46 88.509886
-28 47 89.185201
-28 48 93.536089
-28 49 60.901560
-28 50 57.775427
-28 51 23.000000
-28 52 42.720019
-28 53 70.178344
-28 54 76.485293
-28 55 47.169906
-28 56 69.641941
-28 57 45.000000
-28 58 65.764732
-28 59 83.815273
-28 60 86.313383
-28 61 83.815273
-28 62 58.309519
-28 63 30.000000
-28 64 33.541020
-28 65 50.249378
-28 66 60.207973
-28 67 54.037024
-28 68 31.780497
-28 69 60.415230
-28 70 66.219333
-28 71 68.963759
-28 72 36.055513
-28 73 43.863424
-28 74 96.301610
-28 75 76.485293
-28 76 94.868330
-28 77 41.880783
-28 78 78.790862
-28 79 89.498603
-28 80 94.921020
-28 81 49.477268
-28 82 51.429563
-28 83 68.468971
-28 84 58.137767
-28 85 38.470768
-28 86 34.176015
-28 87 74.813100
-28 88 83.725743
-28 89 74.632433
-28 90 41.036569
-28 91 59.228372
-28 92 46.529560
-28 93 42.755117
-28 94 38.013156
-28 95 40.162171
-28 96 39.051248
-28 97 44.283180
-28 98 92.574294
-28 99 71.063352
-28 100 69.000000
-28 101 71.554175
-29 1 55.713553
-29 2 86.683332
-29 3 83.216585
-29 4 89.022469
-29 5 87.658428
-29 6 90.603532
-29 7 86.608314
-29 8 89.185201
-29 9 91.809586
-29 10 82.152298
-29 11 82.607506
-29 12 84.593144
-29 13 85.328776
-29 14 87.143560
-29 15 88.283634
-29 16 90.553851
-29 17 92.541882
-29 18 93.214806
-29 19 54.120237
-29 20 53.851648
-29 21 52.201533
-29 22 57.697487
-29 23 54.120237
-29 24 59.506302
-29 25 56.044625
-29 26 62.241465
-29 27 3.000000
-29 28 5.830952
-29 30 5.385165
-29 31 4.000000
-29 32 6.403124
-29 33 5.000000
-29 34 8.602325
-29 35 8.602325
-29 36 60.415230
-29 37 61.269895
-29 38 58.591808
-29 39 58.309519
-29 40 59.363288
-29 41 63.631753
-29 42 56.400355
-29 43 62.201286
-29 44 66.287254
-29 45 63.820060
-29 46 88.814413
-29 47 89.308454
-29 48 91.241438
-29 49 55.901699
-29 50 53.141321
-29 51 20.615528
-29 52 38.327536
-29 53 67.000000
-29 54 74.726167
-29 55 47.634021
-29 56 68.876701
-29 57 42.296572
-29 58 62.201286
-29 59 79.555012
-29 60 82.607506
-29 61 82.637764
-29 62 58.600341
-29 63 27.459060
-29 64 28.792360
-29 65 47.000000
-29 66 57.870545
-29 67 51.478151
-29 68 30.463092
-29 69 60.033324
-29 70 64.845971
-29 71 69.065187
-29 72 36.796739
-29 73 45.453273
-29 74 94.868330
-29 75 72.691127
-29 76 90.520716
-29 77 36.715120
-29 78 74.094534
-29 79 87.931792
-29 80 94.021274
-29 81 48.104054
-29 82 51.312766
-29 83 66.287254
-29 84 55.009090
-29 85 35.014283
-29 86 29.832868
-29 87 71.253070
-29 88 80.224684
-29 89 73.539105
-29 90 35.355339
-29 91 57.567352
-29 92 44.643029
-29 93 41.109610
-29 94 38.013156
-29 95 39.357337
-29 96 36.674242
-29 97 44.102154
-29 98 88.814413
-29 99 69.570109
-29 100 66.189123
-29 101 71.344236
-30 1 52.201533
-30 2 82.006097
-30 3 78.892332
-30 4 84.403791
-30 5 83.216585
-30 6 86.023253
-30 7 82.365041
-30 8 85.000000
-30 9 87.464278
-30 10 80.000000
-30 11 80.156098
-30 12 82.152298
-30 13 82.607506
-30 14 85.000000
-30 15 85.586214
-30 16 88.141931
-30 17 90.138782
-30 18 90.553851
-30 19 54.918121
-30 20 54.120237
-30 21 52.000000
-30 22 58.309519
-30 23 53.851648
-30 24 60.033324
-30 25 55.713553
-30 26 62.649820
-30 27 7.071068
-30 28 5.000000
-30 29 5.385165
-30 31 5.385165
-30 32 2.000000
-30 33 5.830952
-30 34 11.180340
-30 35 5.000000
-30 36 55.036352
-30 37 55.901699
-30 38 53.235327
-30 39 53.000000
-30 40 54.083269
-30 41 58.309519
-30 42 51.224994
-30 43 57.008771
-30 44 61.032778
-30 45 58.600341
-30 46 84.314886
-30 47 84.905830
-30 48 88.566359
-30 49 56.603887
-30 50 53.225934
-30 51 18.000000
-30 52 38.078866
-30 53 65.192024
-30 54 71.589105
-30 55 43.011626
-30 56 65.000000
-30 57 40.000000
-30 58 60.827625
-30 59 79.056942
-30 60 81.394103
-30 61 79.056942
-30 62 54.083269
-30 63 25.000000
-30 64 29.154759
-30 65 45.276926
-30 66 55.226805
-30 67 49.040799
-30 68 26.925824
-30 69 55.901699
-30 70 61.400326
-30 71 64.660653
-30 72 32.015621
-30 73 40.360872
-30 74 91.482239
-30 75 71.589105
-30 76 90.138782
-30 77 37.802116
-30 78 74.249579
-30 79 84.646323
-30 80 90.249654
-30 81 44.643029
-30 82 47.010637
-30 83 63.505905
-30 84 53.150729
-30 85 33.541020
-30 86 29.546573
-30 87 69.871310
-30 88 78.771822
-30 89 69.892775
-30 90 37.802116
-30 91 54.341513
-30 92 41.593269
-30 93 37.854986
-30 94 33.615473
-30 95 35.468296
-30 96 34.058773
-30 97 39.824616
-30 98 87.664132
-30 99 66.219333
-30 100 64.000000
-30 101 67.119297
-31 1 52.000000
-31 2 83.630138
-31 3 79.881162
-31 4 85.912746
-31 5 84.403791
-31 6 87.458562
-31 7 83.216585
-31 8 85.755466
-31 9 88.481637
-31 10 78.160092
-31 11 78.638413
-31 12 80.622577
-31 13 81.394103
-31 14 83.150466
-31 15 84.344532
-31 16 86.579443
-31 17 88.566359
-31 18 89.269256
-31 19 50.606324
-31 20 50.159745
-31 21 48.383882
-31 22 54.120237
-31 23 50.289164
-31 24 55.901699
-31 25 52.201533
-31 26 58.600341
-31 27 7.000000
-31 28 8.602325
-31 29 4.000000
-31 30 5.385165
-31 32 5.000000
-31 33 1.000000
-31 34 5.830952
-31 35 5.830952
-31 36 58.872744
-31 37 59.615434
-31 38 56.859476
-31 39 56.356011
-31 40 57.306195
-31 41 61.717096
-31 42 54.083269
-31 43 59.908263
-31 44 64.140471
-31 45 61.587336
-31 46 85.603738
-31 47 86.023253
-31 48 87.298339
-31 49 52.354560
-31 50 49.396356
-31 51 16.763055
-31 52 34.481879
-31 53 63.000000
-31 54 70.880181
-31 55 44.598206
-31 56 65.299311
-31 57 38.327536
-31 58 58.215118
-31 59 75.690158
-31 60 78.638413
-31 61 78.924014
-31 62 55.443665
-31 63 23.537205
-31 64 25.079872
-31 65 43.000000
-31 66 53.935146
-31 67 47.518417
-31 68 26.832816
-31 69 56.603887
-31 70 61.098281
-31 71 65.802736
-31 72 33.970576
-31 73 43.011626
-31 74 91.082380
-31 75 68.731361
-31 76 86.683332
-31 77 33.286634
-31 78 70.384657
-31 79 84.118963
-31 80 90.376988
-31 81 44.384682
-31 82 48.010416
-31 83 62.369865
-31 84 51.009803
-31 85 31.016125
-31 86 25.961510
-31 87 67.268120
-31 88 76.236474
-31 89 69.856997
-31 90 32.649655
-31 91 53.758720
-31 92 40.804412
-31 93 37.336309
-31 94 34.828150
-31 95 35.846897
-31 96 32.756679
-31 97 40.804412
-31 98 84.852814
-31 99 65.787537
-31 100 62.201286
-31 101 67.955868
-32 1 50.289164
-32 2 80.430094
-32 3 77.175126
-32 4 82.800966
-32 5 81.541401
-32 6 84.403791
-32 7 80.622577
-32 8 83.240615
-32 9 85.755466
-32 10 78.000000
-32 11 78.160092
-32 12 80.156098
-32 13 80.622577
-32 14 83.000000
-32 15 83.600239
-32 16 86.145226
-32 17 88.141931
-32 18 88.566359
-32 19 53.254108
-32 20 52.354560
-32 21 50.159745
-32 22 56.603887
-32 23 52.000000
-32 24 58.309519
-32 25 53.851648
-32 26 60.901560
-32 27 8.602325
-32 28 7.000000
-32 29 6.403124
-32 30 2.000000
-32 31 5.000000
-32 33 5.099020
-32 34 10.440307
-32 35 3.000000
-32 36 54.230987
-32 37 55.036352
-32 38 52.325902
-32 39 51.971146
-32 40 53.000000
-32 41 57.306195
-32 42 50.000000
-32 43 55.803226
-32 44 59.908263
-32 45 57.428216
-32 46 82.661962
-32 47 83.216585
-32 48 86.579443
-32 49 54.918121
-32 50 51.429563
-32 51 16.000000
-32 52 36.249138
-32 53 63.198101
-32 54 69.634761
-32 55 41.400483
-32 56 63.158531
-32 57 38.000000
-32 58 58.855756
-32 59 77.162167
-32 60 79.429214
-32 61 77.162167
-32 62 52.430907
-32 63 23.000000
-32 64 27.459060
-32 65 43.289722
-32 66 53.235327
-32 67 47.042534
-32 68 25.000000
-32 69 54.120237
-32 70 59.481089
-32 71 62.968246
-32 72 30.479501
-32 73 39.051248
-32 74 89.560036
-32 75 69.634761
-32 76 88.255311
-32 77 36.235342
-32 78 72.449983
-32 79 82.710338
-32 80 88.391176
-32 81 42.720019
-32 82 45.276926
-32 83 61.522354
-32 84 51.156622
-32 85 31.575307
-32 86 27.730849
-32 87 67.896981
-32 88 76.791927
-32 89 68.007353
-32 90 36.619667
-32 91 52.392748
-32 92 39.623226
-32 93 35.902646
-32 94 31.906112
-32 95 33.615473
-32 96 32.062439
-32 97 38.078866
-32 98 85.702975
-32 99 64.288413
-32 100 62.000000
-32 101 65.368188
-33 1 51.078371
-33 2 82.879430
-33 3 79.056942
-33 4 85.146932
-33 5 83.600239
-33 6 86.683332
-33 7 82.377181
-33 8 84.905830
-33 9 87.658428
-33 10 77.162167
-33 11 77.646635
-33 12 79.630396
-33 13 80.411442
-33 14 82.152298
-33 15 83.360662
-33 16 85.586214
-33 17 87.572827
-33 18 88.283634
-33 19 49.739320
-33 20 49.244289
-33 21 47.434165
-33 22 53.235327
-33 23 49.335586
-33 24 55.009090
-33 25 51.244512
-33 26 57.697487
-33 27 8.000000
-33 28 9.433981
-33 29 5.000000
-33 30 5.830952
-33 31 1.000000
-33 32 5.099020
-33 34 5.385165
-33 35 5.385165
-33 36 58.523500
-33 37 59.236813
-33 38 56.462377
-33 39 55.901699
-33 40 56.824291
-33 41 61.269895
-33 42 53.535035
-33 43 59.363288
-33 44 63.631753
-33 45 61.057350
-33 46 84.811556
-33 47 85.211502
-33 48 86.313383
-33 49 51.478151
-33 50 48.466483
-33 51 15.811388
-33 52 33.526109
-33 53 62.000000
-33 54 69.921384
-33 55 43.863424
-33 56 64.412732
-33 57 37.336309
-33 58 57.218878
-33 59 74.726167
-33 60 77.646635
-33 61 78.000000
-33 62 54.671748
-33 63 22.561028
-33 64 24.166092
-33 65 42.000000
-33 66 52.952809
-33 67 46.529560
-33 68 25.942244
-33 69 55.758407
-33 70 60.166436
-33 71 65.000000
-33 72 33.301652
-33 73 42.438190
-33 74 90.138782
-33 75 67.742158
-33 76 85.726309
-33 77 32.449961
-33 78 69.462220
-33 79 83.168504
-33 80 89.470666
-33 81 43.462628
-33 82 47.201695
-33 83 61.392182
-33 84 50.009999
-33 85 30.016662
-33 86 25.000000
-33 87 66.272166
-33 88 75.239617
-33 89 68.942005
-33 90 32.015621
-33 91 52.810984
-33 92 39.849718
-33 93 36.400549
-33 94 34.058773
-33 95 34.985711
-33 96 31.780497
-33 97 40.000000
-33 98 83.862983
-33 99 64.845971
-33 100 61.204575
-33 101 67.119297
-34 1 51.478151
-34 2 84.852814
-34 3 80.430094
-34 4 87.000000
-34 5 85.146932
-34 6 88.459030
-34 7 83.600239
-34 8 86.023253
-34 9 89.022469
-34 10 75.663730
-34 11 76.485293
-34 12 78.447435
-34 13 79.555012
-34 14 80.622577
-34 15 82.462113
-34 16 84.344532
-34 17 86.313383
-34 18 87.321246
-34 19 45.617979
-34 20 45.541190
-34 21 44.147480
-34 22 49.244289
-34 23 46.097722
-34 24 51.078371
-34 25 48.052055
-34 26 53.851648
-34 27 11.180340
-34 28 14.142136
-34 29 8.602325
-34 30 11.180340
-34 31 5.830952
-34 32 10.440307
-34 33 5.385165
-34 35 10.000000
-34 36 62.641839
-34 37 63.245553
-34 38 60.406953
-34 39 59.615434
-34 40 60.415230
-34 41 65.000000
-34 42 56.824291
-34 43 62.649820
-34 44 67.082039
-34 45 64.412732
-34 46 86.452299
-34 47 86.683332
-34 48 85.375641
-34 49 47.423623
-34 50 44.922155
-34 51 16.401219
-34 52 30.413813
-34 53 60.207973
-34 54 69.641941
-34 55 46.097722
-34 56 65.192024
-34 57 36.400549
-34 58 55.000000
-34 59 71.589105
-34 60 75.166482
-34 61 78.262379
-34 62 56.568542
-34 63 22.360680
-34 64 20.615528
-34 65 40.311289
-34 66 52.201533
-34 67 45.607017
-34 68 27.018512
-34 69 57.008771
-34 70 60.373835
-34 71 66.603303
-34 72 36.055513
-34 73 45.650849
-34 74 90.077744
-34 75 65.192024
-34 76 82.462113
-34 77 28.178006
-34 78 65.787537
-34 79 83.006024
-34 80 89.944427
-34 81 43.908997
-34 82 48.836462
-34 83 60.728906
-34 84 48.373546
-34 85 28.284271
-34 86 22.090722
-34 87 64.007812
-34 88 73.006849
-34 89 69.354164
-34 90 26.907248
-34 91 52.801515
-34 92 39.812058
-34 93 36.715120
-34 94 36.124784
-34 95 36.235342
-34 96 31.384710
-34 97 41.725292
-34 98 81.301906
-34 99 64.884513
-34 100 59.841457
-34 101 68.410526
-35 1 47.434165
-35 2 78.102497
-35 3 74.625733
-35 4 80.430094
-35 5 79.056942
-35 6 82.006097
-35 7 78.032045
-35 8 80.622577
-35 9 83.216585
-35 10 75.000000
-35 11 75.166482
-35 12 77.162167
-35 13 77.646635
-35 14 80.000000
-35 15 80.622577
-35 16 83.150466
-35 17 85.146932
-35 18 85.586214
-35 19 50.803543
-35 20 49.739320
-35 21 47.423623
-35 22 54.083269
-35 23 49.244289
-35 24 55.758407
-35 25 51.078371
-35 26 58.309519
-35 27 11.180340
-35 28 10.000000
-35 29 8.602325
-35 30 5.000000
-35 31 5.830952
-35 32 3.000000
-35 33 5.385165
-35 34 10.000000
-35 36 53.141321
-35 37 53.851648
-35 38 51.078371
-35 39 50.537115
-35 40 51.478151
-35 41 55.901699
-35 42 48.259714
-35 43 54.083269
-35 44 58.309519
-35 45 55.758407
-35 46 80.212219
-35 47 80.709355
-35 48 83.600239
-35 49 52.430907
-35 50 48.764741
-35 51 13.000000
-35 52 33.541020
-35 53 60.207973
-35 54 66.708320
-35 55 39.051248
-35 56 60.415230
-35 57 35.000000
-35 58 55.901699
-35 59 74.330344
-35 60 76.485293
-35 61 74.330344
-35 62 50.000000
-35 63 20.000000
-35 64 25.000000
-35 65 40.311289
-35 66 50.249378
-35 67 44.045431
-35 68 22.135944
-35 69 51.478151
-35 70 56.612719
-35 71 60.464866
-35 72 28.284271
-35 73 37.202150
-35 74 86.683332
-35 75 66.708320
-35 76 85.440037
-35 77 33.970576
-35 78 69.771054
-35 79 79.812280
-35 80 85.615419
-35 81 39.849718
-35 82 42.720019
-35 83 58.549125
-35 84 48.166378
-35 85 28.635642
-35 86 25.059928
-35 87 64.938432
-35 88 73.824115
-35 89 65.192024
-35 90 34.985711
-35 91 49.477268
-35 92 36.674242
-35 93 32.984845
-35 94 29.410882
-35 95 30.870698
-35 96 29.068884
-35 97 35.510562
-35 98 82.764727
-35 99 61.400326
-35 100 59.000000
-35 101 62.769419
-36 1 44.204072
-36 2 42.000000
-36 3 46.097722
-36 4 45.000000
-36 5 47.265209
-36 6 47.000000
-36 7 50.009999
-36 8 52.952809
-36 9 52.239832
-36 10 75.822160
-36 11 72.622311
-36 12 74.202426
-36 13 71.281134
-36 14 79.649231
-36 15 73.783467
-36 16 79.056942
-36 17 80.709355
-36 18 78.032045
-36 19 83.240615
-36 20 79.056942
-36 21 74.330344
-36 22 84.433406
-36 23 75.026662
-36 24 85.094066
-36 25 75.769387
-36 26 86.162637
-36 27 61.717096
-36 28 57.306195
-36 29 60.415230
-36 30 55.036352
-36 31 58.872744
-36 32 54.230987
-36 33 58.523500
-36 34 62.641839
-36 35 53.141321
-36 37 2.000000
-36 38 3.605551
-36 39 7.071068
-36 40 8.602325
-36 41 7.000000
-36 42 13.453624
-36 43 13.000000
-36 44 12.000000
-36 45 12.369317
-36 46 47.095647
-36 47 49.254441
-36 48 76.321688
-36 49 83.815273
-36 50 77.162167
-36 51 50.249378
-36 52 66.098411
-36 53 69.202601
-36 54 58.600341
-36 55 27.730849
-36 56 44.654227
-36 57 52.810984
-36 58 70.491134
-36 59 91.263355
-36 60 86.452299
-36 61 57.697487
-36 62 29.732137
-36 63 50.039984
-36 64 65.030762
-36 65 59.236813
-36 66 55.217751
-36 67 54.589376
-36 68 43.104524
-36 69 36.796739
-36 70 48.836462
-36 71 35.777088
-36 72 30.066593
-36 73 20.396078
-36 74 69.641941
-36 75 80.212219
-36 76 101.212647
-36 77 73.334848
-36 78 93.059121
-36 79 65.741920
-36 80 63.324561
-36 81 42.941821
-36 82 32.449961
-36 83 58.000000
-36 84 61.773781
-36 85 56.885851
-36 86 62.128898
-36 87 76.400262
-36 88 82.134037
-36 89 50.774009
-36 90 80.000000
-36 91 48.414874
-36 92 46.615448
-36 93 44.271887
-36 94 33.541020
-36 95 38.327536
-36 96 49.244289
-36 97 33.241540
-36 98 91.967386
-36 99 52.630789
-36 100 64.660653
-36 101 40.249224
-37 1 43.011626
-37 2 40.000000
-37 3 44.147480
-37 4 43.000000
-37 5 45.276926
-37 6 45.000000
-37 7 48.052055
-37 8 50.990195
-37 9 50.249378
-37 10 74.330344
-37 11 71.063352
-37 12 72.622311
-37 13 69.634761
-37 14 78.102497
-37 15 72.111026
-37 16 77.420927
-37 17 79.056942
-37 18 76.321688
-37 19 82.710338
-37 20 78.447435
-37 21 73.681748
-37 22 83.815273
-37 23 74.330344
-37 24 84.433406
-37 25 75.026662
-37 26 85.440037
-37 27 62.649820
-37 28 58.309519
-37 29 61.269895
-37 30 55.901699
-37 31 59.615434
-37 32 55.036352
-37 33 59.236813
-37 34 63.245553
-37 35 53.851648
-37 36 2.000000
-37 38 3.000000
-37 39 5.830952
-37 40 7.071068
-37 41 5.000000
-37 42 12.206556
-37 43 11.180340
-37 44 10.000000
-37 45 10.440307
-37 46 45.099889
-37 47 47.265209
-37 48 74.625733
-37 49 83.240615
-37 50 76.537572
-37 51 50.487622
-37 52 65.764732
-37 53 68.007353
-37 54 57.008771
-37 55 26.925824
-37 56 43.011626
-37 57 52.201533
-37 58 69.462220
-37 59 90.138782
-37 60 85.146932
-37 61 55.901699
-37 62 28.284271
-37 63 50.000000
-37 64 65.000000
-37 65 58.523500
-37 66 54.083269
-37 67 53.665631
-37 68 43.011626
-37 69 35.355339
-37 70 47.381431
-37 71 34.000000
-37 72 30.000000
-37 73 20.099751
-37 74 67.779053
-37 75 79.056942
-37 76 100.000000
-37 77 73.171033
-37 78 92.130342
-37 79 63.953108
-37 80 61.400326
-37 81 42.047592
-37 82 31.384710
-37 83 56.639209
-37 84 60.827625
-37 85 56.568542
-37 86 62.032250
-37 87 75.213031
-37 88 80.808415
-37 89 49.091751
-37 90 80.024996
-37 91 47.201695
-37 92 45.880279
-37 93 43.680659
-37 94 33.241540
-37 95 37.854986
-37 96 48.836462
-37 97 32.572995
-37 98 90.609050
-37 99 51.088159
-37 100 63.411355
-37 101 38.470768
-38 1 40.607881
-38 2 40.112342
-38 3 43.566042
-38 4 43.104524
-38 5 45.044423
-38 6 45.099889
-38 7 47.518417
-38 8 50.487622
-38 9 50.039984
-38 10 72.346389
-38 11 69.202601
-38 12 70.802542
-38 13 67.955868
-38 14 76.216796
-38 15 70.491134
-38 16 75.716577
-38 17 77.388630
-38 18 74.793048
-38 19 79.812280
-38 20 75.584390
-38 21 70.837843
-38 22 80.956779
-38 23 71.512237
-38 24 81.596569
-38 25 72.235725
-38 26 82.637764
-38 27 60.033324
-38 28 55.758407
-38 29 58.591808
-38 30 53.235327
-38 31 56.859476
-38 32 52.325902
-38 33 56.462377
-38 34 60.406953
-38 35 51.078371
-38 36 3.605551
-38 37 3.000000
-38 39 3.605551
-38 40 5.385165
-38 41 5.830952
-38 42 9.899495
-38 43 10.198039
-38 44 10.440307
-38 45 10.000000
-38 46 45.000000
-38 47 47.042534
-38 48 73.061618
-38 49 80.361682
-38 50 73.681748
-38 51 47.518417
-38 52 62.801274
-38 53 65.604878
-38 54 55.217751
-38 55 24.166092
-38 56 41.340053
-38 57 49.335586
-38 58 66.887966
-38 59 87.658428
-38 60 82.879430
-38 61 54.626001
-38 62 26.248809
-38 63 47.000000
-38 64 62.000000
-38 65 55.713553
-38 66 51.613952
-38 67 51.000000
-38 68 40.012498
-38 69 33.301652
-38 70 45.343136
-38 71 32.695565
-38 72 27.000000
-38 73 17.117243
-38 74 66.730802
-38 75 76.609399
-38 76 97.616597
-38 77 70.178344
-38 78 89.470666
-38 79 62.649820
-38 80 60.638272
-38 81 39.357337
-38 82 28.844410
-38 83 54.451814
-38 84 58.180753
-38 85 53.600373
-38 86 59.033889
-38 87 72.801099
-38 88 78.568442
-38 89 47.507894
-38 90 77.025970
-38 91 44.821870
-38 92 43.081318
-38 93 40.804412
-38 94 30.265492
-38 95 34.928498
-38 96 45.891176
-38 97 29.732137
-38 98 88.413800
-38 99 49.203658
-38 100 61.073726
-38 101 37.161808
-39 1 37.202150
-39 2 37.336309
-39 3 40.311289
-39 4 40.311289
-39 5 42.000000
-39 6 42.296572
-39 7 44.283180
-39 8 47.265209
-39 9 47.000000
-39 10 68.767725
-39 11 65.604878
-39 12 67.201190
-39 13 64.350602
-39 14 72.622311
-39 15 66.887966
-39 16 72.111026
-39 17 73.783467
-39 18 71.196910
-39 19 77.129761
-39 20 72.801099
-39 21 68.007353
-39 22 78.160092
-39 23 68.622154
-39 24 78.746428
-39 25 69.289249
-39 26 79.711982
-39 27 59.908263
-39 28 55.803226
-39 29 58.309519
-39 30 53.000000
-39 31 56.356011
-39 32 51.971146
-39 33 55.901699
-39 34 59.615434
-39 35 50.537115
-39 36 7.071068
-39 37 5.830952
-39 38 3.605551
-39 40 2.000000
-39 41 5.385165
-39 42 6.403124
-39 43 7.000000
-39 44 8.602325
-39 45 7.280110
-39 46 42.047592
-39 47 44.000000
-39 48 69.462220
-39 49 77.620873
-39 50 70.880181
-39 51 46.097722
-39 52 60.406953
-39 53 62.201286
-39 54 51.613952
-39 55 21.189620
-39 56 37.735925
-39 57 46.572524
-39 58 63.631753
-39 59 84.314886
-39 60 79.397733
-39 61 51.078371
-39 62 22.671568
-39 63 45.099889
-39 64 60.074953
-39 65 52.810984
-39 66 48.259714
-39 67 47.853944
-39 68 38.052595
-39 69 29.732137
-39 70 41.773197
-39 71 29.154759
-39 72 25.179357
-39 73 15.033296
-39 74 63.245553
-39 75 73.239334
-39 76 94.201911
-39 77 68.029405
-39 78 86.313383
-39 79 59.093147
-39 80 57.271284
-39 81 36.249138
-39 82 25.553865
-39 83 50.931326
-39 84 55.009090
-39 85 51.244512
-39 86 57.008771
-39 87 69.404611
-39 88 75.073298
-39 89 43.908997
-39 90 75.166482
-39 91 41.400483
-39 92 40.162171
-39 93 38.078866
-39 94 28.017851
-39 95 32.388269
-39 96 43.416587
-39 97 26.925824
-39 98 84.899941
-39 99 45.607017
-39 100 57.628118
-39 101 33.615473
-40 1 36.055513
-40 2 35.355339
-40 3 38.327536
-40 4 38.327536
-40 5 40.000000
-40 6 40.311289
-40 7 42.296572
-40 8 45.276926
-40 9 45.000000
-40 10 67.268120
-40 11 64.031242
-40 12 65.604878
-40 13 62.681736
-40 14 71.063352
-40 15 65.192024
-40 16 70.455660
-40 17 72.111026
-40 18 69.462220
-40 19 76.687678
-40 20 72.277244
-40 21 67.446275
-40 22 77.620873
-40 23 68.007353
-40 24 78.160092
-40 25 68.622154
-40 26 79.056942
-40 27 61.032778
-40 28 57.008771
-40 29 59.363288
-40 30 54.083269
-40 31 57.306195
-40 32 53.000000
-40 33 56.824291
-40 34 60.415230
-40 35 51.478151
-40 36 8.602325
-40 37 7.071068
-40 38 5.385165
-40 39 2.000000
-40 41 5.000000
-40 42 5.385165
-40 43 5.000000
-40 44 7.071068
-40 45 5.385165
-40 46 40.049969
-40 47 42.000000
-40 48 67.742158
-40 49 77.129761
-40 50 70.342022
-40 51 46.572524
-40 52 60.207973
-40 53 61.032778
-40 54 50.000000
-40 55 20.615528
-40 56 36.055513
-40 57 46.097722
-40 58 62.649820
-40 59 83.216585
-40 60 78.102497
-40 61 49.244289
-40 62 21.213203
-40 63 45.276926
-40 64 60.207973
-40 65 52.201533
-40 66 47.169906
-40 67 47.010637
-40 68 38.209946
-40 69 28.284271
-40 70 40.311289
-40 71 27.313001
-40 72 25.495098
-40 73 15.297059
-40 74 61.351447
-40 75 72.111026
-40 76 93.005376
-40 77 68.000000
-40 78 85.428333
-40 79 57.271284
-40 80 55.317267
-40 81 35.468296
-40 82 24.596748
-40 83 49.578221
-40 84 54.129474
-40 85 51.088159
-40 86 57.078893
-40 87 68.242216
-40 88 73.756356
-40 89 42.190046
-40 90 75.325958
-40 91 40.224371
-40 92 39.560081
-40 93 37.656341
-40 94 28.017851
-40 95 32.140317
-40 96 43.185646
-40 97 26.476405
-40 98 83.546394
-40 99 44.045431
-40 100 56.400355
-40 101 31.780497
-41 1 40.311289
-41 2 35.000000
-41 3 39.293765
-41 4 38.000000
-41 5 40.311289
-41 6 40.000000
-41 7 43.174066
-41 8 46.097722
-41 9 45.276926
-41 10 70.710678
-41 11 67.268120
-41 12 68.767725
-41 13 65.604878
-41 14 74.330344
-41 15 68.007353
-41 16 73.409809
-41 17 75.000000
-41 18 72.111026
-41 19 81.584312
-41 20 77.129761
-41 21 72.277244
-41 22 82.462113
-41 23 72.801099
-41 24 82.969874
-41 25 73.375745
-41 26 83.815273
-41 27 65.192024
-41 28 61.032778
-41 29 63.631753
-41 30 58.309519
-41 31 61.717096
-41 32 57.306195
-41 33 61.269895
-41 34 65.000000
-41 35 55.901699
-41 36 7.000000
-41 37 5.000000
-41 38 5.830952
-41 39 5.385165
-41 40 5.000000
-41 42 10.198039
-41 43 7.071068
-41 44 5.000000
-41 45 5.830952
-41 46 40.112342
-41 47 42.296572
-41 48 70.455660
-41 49 82.000000
-41 50 75.186435
-41 51 51.419841
-41 52 65.192024
-41 53 65.192024
-41 54 53.150729
-41 55 25.495098
-41 56 39.051248
-41 57 50.990195
-41 58 67.082039
-41 59 87.464278
-41 60 82.006097
-41 61 51.478151
-41 62 25.000000
-41 63 50.249378
-41 64 65.192024
-41 65 57.008771
-41 66 51.478151
-41 67 51.623638
-41 68 43.185646
-41 69 32.015621
-41 70 43.931765
-41 71 29.681644
-41 72 30.413813
-41 73 20.223748
-41 74 63.158531
-41 75 76.321688
-41 76 97.082439
-41 77 73.000000
-41 78 89.961103
-41 79 59.539903
-41 80 56.612719
-41 81 40.162171
-41 82 29.154759
-41 83 53.413481
-41 84 58.694122
-41 85 56.080300
-41 86 62.072538
-41 87 72.401657
-41 88 77.620873
-41 89 45.000000
-41 90 80.305666
-41 91 44.418465
-41 92 44.384682
-41 93 42.579338
-41 94 33.015148
-41 95 37.121422
-41 96 48.166378
-41 97 31.400637
-41 98 87.321246
-41 99 47.381431
-41 100 60.464866
-41 101 34.132096
-42 1 30.805844
-42 2 34.481879
-42 3 36.000000
-42 4 37.363083
-42 5 38.327536
-42 6 39.293765
-42 7 40.000000
-42 8 43.000000
-42 9 43.289722
-42 10 62.481997
-42 11 59.405387
-42 12 61.032778
-42 13 58.309519
-42 14 66.400301
-42 15 60.901560
-42 16 66.037868
-42 17 67.742158
-42 18 65.299311
-42 19 71.386273
-42 20 66.940272
-42 21 62.096699
-42 22 72.277244
-42 23 62.641839
-42 24 72.801099
-42 25 63.245553
-42 26 73.681748
-42 27 58.258047
-42 28 54.488531
-42 29 56.400355
-42 30 51.224994
-42 31 54.083269
-42 32 50.000000
-42 33 53.535035
-42 34 56.824291
-42 35 48.259714
-42 36 13.453624
-42 37 12.206556
-42 38 9.899495
-42 39 6.403124
-42 40 5.385165
-42 41 10.198039
-42 43 5.830952
-42 44 10.440307
-42 45 7.615773
-42 46 38.639358
-42 47 40.311289
-42 48 63.529521
-42 49 71.805292
-42 50 65.000000
-42 51 42.379240
-42 52 55.081757
-42 53 55.803226
-42 54 45.486262
-42 55 15.297059
-42 56 31.764760
-42 57 40.792156
-42 58 57.306195
-42 59 77.935871
-42 60 73.000000
-42 61 45.541190
-42 62 16.401219
-42 63 40.607881
-42 64 55.443665
-42 65 46.840154
-42 66 41.880783
-42 67 41.629317
-42 68 33.541020
-42 69 23.430749
-42 70 35.468296
-42 71 23.769729
-42 72 21.189620
-42 73 11.180340
-42 74 57.974132
-42 75 66.850580
-42 76 87.800911
-42 77 63.031738
-42 78 80.056230
-42 79 53.488316
-42 80 52.469038
-42 81 30.083218
-42 82 19.235384
-42 83 44.553339
-42 84 48.754487
-42 85 46.010868
-42 86 52.239832
-42 87 63.007936
-42 88 68.680419
-42 89 38.013156
-42 90 70.576200
-42 91 35.000000
-42 92 34.205263
-42 93 32.388269
-42 94 23.194827
-42 95 27.018512
-42 96 38.052595
-42 97 21.213203
-42 98 78.517514
-42 99 39.408121
-42 100 51.224994
-42 101 28.160256
-43 1 33.541020
-43 2 30.413813
-43 3 33.376639
-43 4 33.376639
-43 5 35.000000
-43 6 35.355339
-43 7 37.336309
-43 8 40.311289
-43 9 40.000000
-43 10 63.639610
-43 11 60.207973
-43 12 61.717096
-43 13 58.600341
-43 14 67.268120
-43 15 61.032778
-43 16 66.400301
-43 17 68.007353
-43 18 65.192024
-43 19 75.802375
-43 20 71.196910
-43 21 66.287254
-43 22 76.485293
-43 23 66.708320
-43 24 76.902536
-43 25 67.186308
-43 26 77.620873
-43 27 64.031242
-43 28 60.207973
-43 29 62.201286
-43 30 57.008771
-43 31 59.908263
-43 32 55.803226
-43 33 59.363288
-43 34 62.649820
-43 35 54.083269
-43 36 13.000000
-43 37 11.180340
-43 38 10.198039
-43 39 7.000000
-43 40 5.000000
-43 41 7.071068
-43 42 5.830952
-43 44 5.000000
-43 45 2.000000
-43 46 35.057096
-43 47 37.000000
-43 48 63.513778
-43 49 76.118329
-43 50 69.231496
-43 51 48.104054
-43 52 60.000000
-43 53 58.309519
-43 54 46.097722
-43 55 20.000000
-43 56 32.015621
-43 57 45.276926
-43 58 60.415230
-43 59 80.622577
-43 60 75.000000
-43 61 44.721360
-43 62 18.027756
-43 63 46.097722
-43 64 60.827625
-43 65 50.990195
-43 66 44.721360
-43 67 45.221676
-43 68 39.051248
-43 69 25.000000
-43 70 36.878178
-43 71 22.825424
-43 72 26.925824
-43 73 17.000000
-43 74 56.648036
-43 75 69.462220
-43 76 90.138782
-43 77 68.183576
-43 78 83.384651
-43 79 52.773099
-43 80 50.447993
-43 81 33.955854
-43 82 22.803509
-43 83 46.400431
-43 84 52.201533
-43 85 51.039201
-43 86 57.558666
-43 87 65.513357
-43 88 70.604532
-43 89 38.013156
-43 90 75.953933
-43 91 37.589892
-43 92 38.470768
-43 93 37.054015
-43 94 28.635642
-43 95 32.062439
-43 96 43.011626
-43 97 26.000000
-43 98 80.280757
-43 99 40.311289
-43 100 53.535035
-43 101 27.294688
-44 1 38.078866
-44 2 30.000000
-44 3 34.481879
-44 4 33.000000
-44 5 35.355339
-44 6 35.000000
-44 7 38.327536
-44 8 41.231056
-44 9 40.311289
-44 10 67.268120
-44 11 63.639610
-44 12 65.069194
-44 13 61.717096
-44 14 70.710678
-44 15 64.031242
-44 16 69.526973
-44 17 71.063352
-44 18 68.007353
-44 19 80.752709
-44 20 76.118329
-44 21 71.196910
-44 22 81.394103
-44 23 71.589105
-44 24 81.786307
-44 25 72.034714
-44 26 82.462113
-44 27 68.007353
-44 28 64.031242
-44 29 66.287254
-44 30 61.032778
-44 31 64.140471
-44 32 59.908263
-44 33 63.631753
-44 34 67.082039
-44 35 58.309519
-44 36 12.000000
-44 37 10.000000
-44 38 10.440307
-44 39 8.602325
-44 40 7.071068
-44 41 5.000000
-44 42 10.440307
-44 43 5.000000
-44 45 3.000000
-44 46 35.128336
-44 47 37.336309
-44 48 66.400301
-44 49 81.049368
-44 50 74.148500
-44 51 52.810984
-44 52 65.000000
-44 53 62.649820
-44 54 49.497475
-44 55 25.000000
-44 56 35.355339
-44 57 50.249378
-44 58 65.000000
-44 59 85.000000
-44 60 79.056942
-44 61 47.169906
-44 62 22.360680
-44 63 50.990195
-44 64 65.764732
-44 65 55.901699
-44 66 49.244289
-44 67 50.000000
-44 68 43.931765
-44 69 29.154759
-44 70 40.804412
-44 71 25.612497
-44 72 31.622777
-44 73 21.540659
-44 74 58.600341
-44 75 73.824115
-44 76 94.339811
-44 77 73.171033
-44 78 88.022724
-44 79 55.226805
-44 80 51.865210
-44 81 38.832976
-44 82 27.658633
-44 83 50.477718
-44 84 56.920998
-44 85 56.035703
-44 86 62.513998
-44 87 69.835521
-44 88 74.632433
-44 89 41.109610
-44 90 80.894994
-44 91 42.047592
-44 92 43.416587
-44 93 42.047592
-44 94 33.541020
-44 95 37.054015
-44 96 48.010416
-44 97 31.000000
-44 98 84.202138
-44 99 43.931765
-44 100 57.801384
-44 101 30.000000
-45 1 35.341194
-45 2 30.149627
-45 3 33.734256
-45 4 33.136083
-45 5 35.057096
-45 6 35.128336
-45 7 37.656341
-45 8 40.607881
-45 9 40.049969
-45 10 65.069194
-45 11 61.554854
-45 12 63.031738
-45 13 59.816386
-45 14 68.622154
-45 15 62.201286
-45 16 67.623960
-45 17 69.202601
-45 18 66.287254
-45 19 77.781746
-45 20 73.164199
-45 21 68.249542
-45 22 78.447435
-45 23 68.658576
-45 24 78.854296
-45 25 69.123079
-45 26 79.555012
-45 27 65.604878
-45 28 61.717096
-45 29 63.820060
-45 30 58.600341
-45 31 61.587336
-45 32 57.428216
-45 33 61.057350
-45 34 64.412732
-45 35 55.758407
-45 36 12.369317
-45 37 10.440307
-45 38 10.000000
-45 39 7.280110
-45 40 5.385165
-45 41 5.830952
-45 42 7.615773
-45 43 2.000000
-45 44 3.000000
-45 46 35.000000
-45 47 37.054015
-45 48 64.637450
-45 49 78.089692
-45 50 71.196910
-45 51 49.979996
-45 52 62.000000
-45 53 60.033324
-45 54 47.423623
-45 55 22.000000
-45 56 33.301652
-45 57 47.265209
-45 58 62.241465
-45 59 82.365041
-45 60 76.609399
-45 61 45.650849
-45 62 19.723083
-45 63 48.052055
-45 64 62.801274
-45 65 52.952809
-45 66 46.518813
-45 67 47.127487
-45 68 41.000000
-45 69 26.627054
-45 70 38.418745
-45 71 23.853721
-45 72 28.792360
-45 73 18.788294
-45 74 57.384667
-45 75 71.196910
-45 76 91.809586
-45 77 70.178344
-45 78 85.234969
-45 79 53.712196
-45 80 50.960769
-45 81 35.902646
-45 82 24.738634
-45 83 48.010416
-45 84 54.083269
-45 85 53.037722
-45 86 59.539903
-45 87 67.230945
-45 88 72.201108
-45 89 39.204592
-45 90 77.929455
-45 91 39.357337
-45 92 40.447497
-45 93 39.051248
-45 94 30.594117
-45 95 34.058773
-45 96 45.011110
-45 97 28.000000
-45 98 81.835200
-45 99 41.725292
-45 100 55.226805
-45 101 28.301943
-46 1 37.735925
-46 2 5.830952
-46 3 7.280110
-46 4 3.605551
-46 5 2.000000
-46 6 3.000000
-46 7 7.280110
-46 8 8.602325
-46 9 5.385165
-46 10 48.052055
-46 11 43.174066
-46 12 43.680659
-46 13 38.897301
-46 14 49.335586
-46 15 39.924930
-46 16 45.694639
-46 17 46.518813
-46 18 42.059482
-46 19 80.653580
-46 20 75.286121
-46 21 70.519501
-46 22 79.555012
-46 23 69.921384
-46 24 79.075913
-46 25 69.375788
-46 26 78.447435
-46 27 91.263355
-46 28 88.509886
-46 29 88.814413
-46 30 84.314886
-46 31 85.603738
-46 32 82.661962
-46 33 84.811556
-46 34 86.452299
-46 35 80.212219
-46 36 47.095647
-46 37 45.099889
-46 38 45.000000
-46 39 42.047592
-46 40 40.049969
-46 41 40.112342
-46 42 38.639358
-46 43 35.057096
-46 44 35.128336
-46 45 35.000000
-46 47 2.828427
-46 48 41.146081
-46 49 80.081209
-46 50 73.375745
-46 51 70.092796
-46 52 71.196910
-46 53 52.239832
-46 54 32.000000
-46 55 41.340053
-46 56 24.166092
-46 57 55.758407
-46 58 57.870545
-46 59 72.173402
-46 60 62.801274
-46 61 22.561028
-46 62 30.232433
-46 63 65.069194
-46 64 76.609399
-46 65 57.697487
-46 66 44.598206
-46 67 49.658836
-46 68 59.464275
-46 69 29.732137
-46 70 31.953091
-46 71 19.849433
-46 72 52.478567
-46 73 46.238512
-46 74 28.425341
-46 75 62.000000
-46 76 78.447435
-46 77 80.622577
-46 78 79.056942
-46 79 28.635642
-46 80 19.798990
-46 81 44.204072
-46 82 37.643060
-46 83 39.623226
-46 84 53.758720
-46 85 64.637450
-46 86 73.006849
-46 87 58.008620
-46 88 58.549125
-46 89 24.331050
-46 90 90.210864
-46 91 38.910153
-46 92 49.406477
-46 93 51.088159
-46 94 50.803543
-46 95 50.249378
-46 96 57.628118
-46 97 44.821870
-46 98 65.969690
-46 99 30.594117
-46 100 47.381431
-46 101 18.601075
-47 1 37.202150
-47 2 8.602325
-47 3 6.403124
-47 4 6.403124
-47 5 2.000000
-47 6 5.385165
-47 7 5.000000
-47 8 5.830952
-47 9 3.000000
-47 10 45.705580
-47 11 40.792156
-47 12 41.231056
-47 13 36.400549
-47 14 46.840154
-47 15 37.336309
-47 16 43.081318
-47 17 43.863424
-47 18 39.357337
-47 19 79.378838
-47 20 74.000000
-47 21 69.289249
-47 22 78.160092
-47 23 68.622154
-47 24 77.620873
-47 25 68.007353
-47 26 76.902536
-47 27 91.809586
-47 28 89.185201
-47 29 89.308454
-47 30 84.905830
-47 31 86.023253
-47 32 83.216585
-47 33 85.211502
-47 34 86.683332
-47 35 80.709355
-47 36 49.254441
-47 37 47.265209
-47 38 47.042534
-47 39 44.000000
-47 40 42.000000
-47 41 42.296572
-47 42 40.311289
-47 43 37.000000
-47 44 37.336309
-47 45 37.054015
-47 46 2.828427
-47 48 38.483763
-47 49 78.746428
-47 50 72.111026
-47 51 70.292247
-47 52 70.491134
-47 53 50.487622
-47 54 30.066593
-47 55 42.059482
-47 56 23.323808
-47 57 55.217751
-47 58 56.293872
-47 59 70.064256
-47 60 60.530984
-47 61 20.223748
-47 62 30.886890
-47 63 65.069194
-47 64 76.216796
-47 65 56.824291
-47 66 43.462628
-47 67 48.764741
-47 68 59.665736
-47 69 29.732137
-47 70 30.870698
-47 71 20.248457
-47 72 53.235327
-47 73 47.434165
-47 74 25.612497
-47 75 60.033324
-47 76 76.118329
-47 77 79.924965
-47 78 77.162167
-47 79 26.000000
-47 80 16.970563
-47 81 43.931765
-47 82 38.013156
-47 83 38.078866
-47 84 52.554733
-47 85 64.202804
-47 86 72.622311
-47 87 56.080300
-47 88 56.320511
-47 89 22.803509
-47 90 89.587946
-47 91 38.078866
-47 92 49.040799
-47 93 50.931326
-47 94 51.312766
-47 95 50.447993
-47 96 57.384667
-47 97 45.221676
-47 98 63.560994
-47 99 29.120440
-47 100 45.705580
-47 101 18.384776
-48 1 38.327536
-48 2 46.141088
-48 3 36.055513
-48 4 44.721360
-48 5 39.357337
-48 6 43.863424
-48 7 34.000000
-48 8 32.695565
-48 9 37.336309
-48 10 12.806248
-48 11 9.433981
-48 12 7.810250
-48 13 6.000000
-48 14 10.440307
-48 15 3.000000
-48 16 5.000000
-48 17 5.385165
-48 18 2.000000
-48 19 58.000000
-48 20 53.150729
-48 21 50.000000
-48 22 55.172457
-48 23 48.414874
-48 24 53.814496
-48 25 46.861498
-48 26 51.855569
-48 27 94.201911
-48 28 93.536089
-48 29 91.241438
-48 30 88.566359
-48 31 87.298339
-48 32 86.579443
-48 33 86.313383
-48 34 85.375641
-48 35 83.600239
-48 36 76.321688
-48 37 74.625733
-48 38 73.061618
-48 39 69.462220
-48 40 67.742158
-48 41 70.455660
-48 42 63.529521
-48 43 63.513778
-48 44 66.400301
-48 45 64.637450
-48 46 41.146081
-48 47 38.483763
-48 49 56.568542
-48 50 51.855569
-48 51 70.710678
-48 52 58.600341
-48 53 27.459060
-48 54 18.681542
-48 55 55.081757
-48 56 31.764760
-48 57 49.030603
-48 58 34.409301
-48 59 37.336309
-48 60 26.248809
-48 61 19.849433
-48 62 47.423623
-48 63 63.788714
-48 64 67.779053
-48 65 45.541190
-48 66 33.376639
-48 67 39.812058
-48 68 62.072538
-48 69 40.853396
-48 70 29.832868
-48 71 40.804412
-48 72 63.788714
-48 73 64.195015
-48 74 15.000000
-48 75 30.805844
-48 76 40.112342
-48 77 66.730802
-48 78 46.957428
-48 79 12.529964
-48 80 23.345235
-48 81 45.044423
-48 82 48.764741
-48 83 25.079872
-48 84 37.696154
-48 85 57.280014
-48 86 64.845971
-48 87 28.319605
-48 88 23.259407
-48 89 25.553865
-48 90 76.321688
-48 91 35.057096
-48 92 47.095647
-48 93 51.039201
-48 94 59.413803
-48 95 55.081757
-48 96 54.589376
-48 97 53.758720
-48 98 27.073973
-48 99 25.000000
-48 100 26.000000
-48 101 36.400549
-49 1 45.044423
-49 2 81.786307
-49 3 72.801099
-49 4 82.462113
-49 5 78.160092
-49 6 82.969874
-49 7 74.000000
-49 8 75.026662
-49 9 79.711982
-49 10 43.863424
-49 11 47.423623
-49 12 48.795492
-49 13 52.497619
-49 14 47.634021
-49 15 54.488531
-49 16 53.150729
-49 17 54.671748
-49 18 58.000000
-49 19 2.000000
-49 20 5.000000
-49 21 10.000000
-49 22 2.000000
-49 23 10.198039
-49 24 4.000000
-49 25 10.770330
-49 26 7.000000
-49 27 58.600341
-49 28 60.901560
-49 29 55.901699
-49 30 56.603887
-49 31 52.354560
-49 32 54.918121
-49 33 51.478151
-49 34 47.423623
-49 35 52.430907
-49 36 83.815273
-49 37 83.240615
-49 38 80.361682
-49 39 77.620873
-49 40 77.129761
-49 41 82.000000
-49 42 71.805292
-49 43 76.118329
-49 44 81.049368
-49 45 78.089692
-49 46 80.081209
-49 47 78.746428
-49 48 56.568542
-49 50 7.000000
-49 51 42.426407
-49 52 19.849433
-49 53 30.232433
-49 54 50.089919
-49 55 56.515485
-49 56 56.293872
-49 57 31.048349
-49 58 23.323808
-49 59 27.459060
-49 60 35.341194
-49 61 61.269895
-49 62 60.074953
-49 63 37.802116
-49 64 27.459060
-49 65 25.179357
-49 66 35.693137
-49 67 32.015621
-49 68 43.046487
-49 69 55.036352
-49 70 48.270074
-49 71 64.381674
-49 72 55.036352
-49 73 63.568860
-49 74 68.007353
-49 75 26.627054
-49 76 37.000000
-49 77 19.313208
-49 78 19.104973
-49 79 61.294372
-49 80 72.560320
-49 81 42.296572
-49 82 53.460266
-49 83 40.853396
-49 84 26.476405
-49 85 28.301943
-49 86 27.658633
-49 87 28.319605
-49 88 35.510562
-49 89 55.973208
-49 90 25.000000
-49 91 42.296572
-49 92 37.656341
-49 93 39.560081
-49 94 50.695167
-49 95 45.541190
-49 96 34.928498
-49 97 50.695167
-49 98 40.162171
-49 99 49.648766
-49 100 34.000000
-49 101 62.968246
-50 1 38.052595
-50 2 74.953319
-50 3 66.098411
-50 4 75.690158
-50 5 71.470274
-50 6 76.243032
-50 7 67.416615
-50 8 68.541958
-50 9 73.164199
-50 10 39.408121
-50 11 42.520583
-50 12 44.045431
-50 13 47.381431
-50 14 43.566042
-50 15 49.578221
-50 16 48.826222
-50 17 50.477718
-50 18 53.413481
-50 19 7.280110
-50 20 2.000000
-50 21 3.000000
-50 22 7.280110
-50 23 3.605551
-50 24 8.062258
-50 25 5.000000
-50 26 9.899495
-50 27 55.973208
-50 28 57.775427
-50 29 53.141321
-50 30 53.225934
-50 31 49.396356
-50 32 51.429563
-50 33 48.466483
-50 34 44.922155
-50 35 48.764741
-50 36 77.162167
-50 37 76.537572
-50 38 73.681748
-50 39 70.880181
-50 40 70.342022
-50 41 75.186435
-50 42 65.000000
-50 43 69.231496
-50 44 74.148500
-50 45 71.196910
-50 46 73.375745
-50 47 72.111026
-50 48 51.855569
-50 49 7.000000
-50 51 37.802116
-50 52 15.264338
-50 53 24.758837
-50 54 43.908997
-50 55 49.729267
-50 56 49.477268
-50 57 24.351591
-50 58 17.691806
-50 59 27.073973
-50 60 32.984845
-50 61 55.072679
-50 62 53.084838
-50 63 32.526912
-50 64 24.351591
-50 65 18.248288
-50 66 28.861739
-50 67 25.019992
-50 68 37.202150
-50 69 48.041649
-50 70 41.484937
-50 71 57.428216
-50 72 48.764741
-50 73 57.008771
-50 74 62.481997
-50 75 23.409400
-50 76 37.656341
-50 77 18.000000
-50 78 21.023796
-50 79 55.605755
-50 80 66.573268
-50 81 35.355339
-50 82 46.529560
-50 83 34.438351
-50 84 19.646883
-50 85 22.671568
-50 86 23.706539
-50 87 24.186773
-50 88 32.310989
-50 89 49.396356
-50 90 25.961510
-50 91 35.355339
-50 92 30.805844
-50 93 32.893768
-50 94 44.283180
-50 95 39.000000
-50 96 28.653098
-50 97 43.965896
-50 98 38.470768
-50 99 43.081318
-50 100 28.017851
-50 101 56.089215
-51 1 35.341194
-51 2 68.622154
-51 3 64.031242
-51 4 70.710678
-51 5 68.767725
-51 6 72.138755
-51 7 67.201190
-51 8 69.634761
-51 9 72.622311
-51 10 62.000000
-51 11 62.201286
-51 12 64.195015
-51 13 64.776539
-51 14 67.000000
-51 15 67.742158
-51 16 70.178344
-51 17 72.173402
-51 18 72.691127
-51 19 41.036569
-51 20 39.051248
-51 21 36.055513
-51 22 43.863424
-51 23 37.735925
-51 24 45.343136
-51 25 39.446166
-51 26 47.634021
-51 27 23.537205
-51 28 23.000000
-51 29 20.615528
-51 30 18.000000
-51 31 16.763055
-51 32 16.000000
-51 33 15.811388
-51 34 16.401219
-51 35 13.000000
-51 36 50.249378
-51 37 50.487622
-51 38 47.518417
-51 39 46.097722
-51 40 46.572524
-51 41 51.419841
-51 42 42.379240
-51 43 48.104054
-51 44 52.810984
-51 45 49.979996
-51 46 70.092796
-51 47 70.292247
-51 48 70.710678
-51 49 42.426407
-51 50 37.802116
-51 52 22.671568
-51 53 47.265209
-51 54 54.120237
-51 55 30.232433
-51 56 48.877398
-51 57 22.000000
-51 58 43.174066
-51 59 62.241465
-51 60 63.788714
-51 61 62.241465
-51 62 40.360872
-51 63 7.000000
-51 64 16.552945
-51 65 27.459060
-51 66 37.336309
-51 67 31.064449
-51 68 10.630146
-51 69 40.607881
-51 70 44.384682
-51 71 50.249378
-51 72 21.189620
-51 73 31.320920
-51 74 74.330344
-51 75 54.120237
-51 76 73.409809
-51 77 25.942244
-51 78 58.523500
-51 79 67.357256
-51 80 73.790243
-51 81 27.730849
-51 82 32.526912
-51 83 45.705580
-51 84 35.227830
-51 85 16.155494
-51 86 15.000000
-51 87 52.172790
-51 88 61.000000
-51 89 53.225934
-51 90 30.413813
-51 91 37.000000
-51 92 24.041631
-51 93 20.615528
-51 94 20.248457
-51 95 19.849433
-51 96 16.124515
-51 97 25.495098
-51 98 70.092796
-51 99 49.040799
-51 100 46.000000
-51 101 52.009614
-52 1 33.541020
-52 2 71.589105
-52 3 64.140471
-52 4 72.897188
-52 5 69.462220
-52 6 73.824115
-52 7 66.287254
-52 8 68.007353
-52 9 72.111026
-52 10 47.434165
-52 11 49.244289
-52 12 51.078371
-52 13 53.235327
-52 14 52.201533
-52 15 55.901699
-52 16 56.648036
-52 17 58.523500
-52 18 60.415230
-52 19 18.601075
-52 20 16.401219
-52 21 13.928388
-52 22 21.213203
-52 23 15.811388
-52 24 22.671568
-52 25 17.720045
-52 26 25.000000
-52 27 41.231056
-52 28 42.720019
-52 29 38.327536
-52 30 38.078866
-52 31 34.481879
-52 32 36.249138
-52 33 33.526109
-52 34 30.413813
-52 35 33.541020
-52 36 66.098411
-52 37 65.764732
-52 38 62.801274
-52 39 60.406953
-52 40 60.207973
-52 41 65.192024
-52 42 55.081757
-52 43 60.000000
-52 44 65.000000
-52 45 62.000000
-52 46 71.196910
-52 47 70.491134
-52 48 58.600341
-52 49 19.849433
-52 50 15.264338
-52 51 22.671568
-52 53 31.622777
-52 54 46.097722
-52 55 40.000000
-52 56 47.169906
-52 57 15.811388
-52 58 25.495098
-52 59 41.231056
-52 60 45.000000
-52 61 56.568542
-52 62 46.097722
-52 63 18.027756
-52 64 10.000000
-52 65 14.142136
-52 66 28.284271
-52 67 22.022716
-52 68 23.769729
-52 69 42.720019
-52 70 40.000000
-52 71 52.924474
-52 72 36.400549
-52 73 45.705580
-52 74 66.400301
-52 75 35.000000
-52 76 52.201533
-52 77 9.433981
-52 78 36.235342
-52 79 59.203040
-52 80 68.593003
-52 81 28.160256
-52 82 38.470768
-52 83 36.235342
-52 84 21.095023
-52 85 9.219544
-52 86 8.544004
-52 87 34.234486
-52 88 43.185646
-52 89 49.040799
-52 90 19.209373
-52 91 32.449961
-52 92 22.803509
-52 93 23.086793
-52 94 32.557641
-52 95 28.071338
-52 96 17.029386
-52 97 34.000000
-52 98 51.039201
-52 99 43.185646
-52 100 32.649655
-52 101 52.773099
-53 1 25.000000
-53 2 55.000000
-53 3 45.099889
-53 4 55.081757
-53 5 50.249378
-53 6 55.226805
-53 7 45.541190
-53 8 46.097722
-53 9 50.990195
-53 10 15.811388
-53 11 18.027756
-53 12 19.723083
-53 13 22.671568
-53 14 20.615528
-53 15 25.000000
-53 16 25.079872
-53 17 26.925824
-53 18 29.154759
-53 19 31.400637
-53 20 26.248809
-53 21 22.671568
-53 22 29.154759
-53 23 21.213203
-53 24 28.178006
-53 25 19.849433
-53 26 26.925824
-53 27 70.000000
-53 28 70.178344
-53 29 67.000000
-53 30 65.192024
-53 31 63.000000
-53 32 63.198101
-53 33 62.000000
-53 34 60.207973
-53 35 60.207973
-53 36 69.202601
-53 37 68.007353
-53 38 65.604878
-53 39 62.201286
-53 40 61.032778
-53 41 65.192024
-53 42 55.803226
-53 43 58.309519
-53 44 62.649820
-53 45 60.033324
-53 46 52.239832
-53 47 50.487622
-53 48 27.459060
-53 49 30.232433
-53 50 24.758837
-53 51 47.265209
-53 52 31.622777
-53 54 20.615528
-53 55 42.426407
-53 56 30.413813
-53 57 25.495098
-53 58 7.071068
-53 59 22.360680
-53 60 18.027756
-53 61 31.622777
-53 62 40.311289
-53 63 40.311289
-53 64 41.231056
-53 65 20.000000
-53 66 14.142136
-53 67 17.464249
-53 68 40.804412
-53 69 33.541020
-53 70 22.803509
-53 71 40.261644
-53 72 47.169906
-53 73 51.662365
-53 74 37.802116
-53 75 11.180340
-53 76 32.015621
-53 77 39.357337
-53 78 27.073973
-53 79 31.064449
-53 80 42.485292
-53 81 27.802878
-53 82 36.878178
-53 83 13.152946
-53 84 12.041595
-53 85 32.015621
-53 86 38.639358
-53 87 7.211103
-53 88 14.317821
-53 89 28.017851
-53 90 48.877398
-53 91 20.808652
-53 92 26.832816
-53 93 30.870698
-53 94 42.190046
-53 95 36.715120
-53 96 31.780497
-53 97 38.418745
-53 98 24.186773
-53 99 22.022716
-53 100 5.099020
-53 101 37.483330
-54 1 20.000000
-54 2 35.355339
-54 3 25.079872
-54 4 35.057096
-54 5 30.000000
-54 6 35.000000
-54 7 25.079872
-54 8 25.495098
-54 9 30.413813
-54 10 18.027756
-54 11 14.142136
-54 12 15.620499
-54 13 13.000000
-54 14 21.213203
-54 15 15.811388
-54 16 20.591260
-54 17 22.360680
-54 18 20.615528
-54 19 51.000000
-54 20 45.650849
-54 21 41.340053
-54 22 49.244289
-54 23 40.311289
-54 24 48.466483
-54 25 39.357337
-54 26 47.434165
-54 27 77.620873
-54 28 76.485293
-54 29 74.726167
-54 30 71.589105
-54 31 70.880181
-54 32 69.634761
-54 33 69.921384
-54 34 69.641941
-54 35 66.708320
-54 36 58.600341
-54 37 57.008771
-54 38 55.217751
-54 39 51.613952
-54 40 50.000000
-54 41 53.150729
-54 42 45.486262
-54 43 46.097722
-54 44 49.497475
-54 45 47.423623
-54 46 32.000000
-54 47 30.066593
-54 48 18.681542
-54 49 50.089919
-54 50 43.908997
-54 51 54.120237
-54 52 46.097722
-54 53 20.615528
-54 55 36.400549
-54 56 14.142136
-54 57 33.541020
-54 58 26.925824
-54 59 40.311289
-54 60 31.622777
-54 61 11.180340
-54 62 29.154759
-54 63 47.434165
-54 64 54.083269
-54 65 32.015621
-54 66 18.027756
-54 67 24.698178
-54 68 44.721360
-54 69 22.360680
-54 70 11.180340
-54 71 24.207437
-54 72 45.276926
-54 73 45.541190
-54 74 20.591260
-54 75 30.000000
-54 76 47.434165
-54 77 55.172457
-54 78 47.095647
-54 79 13.416408
-54 80 22.803509
-54 81 27.166155
-54 82 30.083218
-54 83 9.899495
-54 84 25.495098
-54 85 42.544095
-54 86 50.774009
-54 87 26.019224
-54 88 27.202941
-54 89 8.944272
-54 90 65.069194
-54 91 17.262677
-54 92 30.083218
-54 93 33.734256
-54 94 41.048752
-54 95 37.054015
-54 96 38.275318
-54 97 35.227830
-54 98 35.777088
-54 99 6.324555
-54 100 16.155494
-54 101 20.248457
-55 1 18.027756
-55 2 39.051248
-55 3 36.249138
-55 4 41.400483
-55 5 40.311289
-55 6 43.011626
-55 7 39.924930
-55 8 42.720019
-55 9 44.721360
-55 10 51.478151
-55 11 49.244289
-55 12 51.078371
-55 13 49.335586
-55 14 55.901699
-55 15 52.201533
-55 16 56.648036
-55 17 58.523500
-55 18 57.008771
-55 19 56.089215
-55 20 51.662365
-55 21 46.840154
-55 22 57.008771
-55 23 47.434165
-55 24 57.567352
-55 25 48.104054
-55 26 58.523500
-55 27 50.000000
-55 28 47.169906
-55 29 47.634021
-55 30 43.011626
-55 31 44.598206
-55 32 41.400483
-55 33 43.863424
-55 34 46.097722
-55 35 39.051248
-55 36 27.730849
-55 37 26.925824
-55 38 24.166092
-55 39 21.189620
-55 40 20.615528
-55 41 25.495098
-55 42 15.297059
-55 43 20.000000
-55 44 25.000000
-55 45 22.000000
-55 46 41.340053
-55 47 42.059482
-55 48 55.081757
-55 49 56.515485
-55 50 49.729267
-55 51 30.232433
-55 52 40.000000
-55 53 42.426407
-55 54 36.400549
-55 56 25.000000
-55 57 25.495098
-55 58 43.011626
-55 59 64.031242
-55 60 60.207973
-55 61 40.000000
-55 62 11.180340
-55 63 26.925824
-55 64 41.231056
-55 65 31.622777
-55 66 28.284271
-55 67 26.925824
-55 68 20.124612
-55 69 15.000000
-55 70 25.298221
-55 71 21.931712
-55 72 11.180340
-55 73 9.433981
-55 74 53.000000
-55 75 53.150729
-55 76 74.330344
-55 77 48.259714
-55 78 65.368188
-55 79 47.169906
-55 80 49.648766
-55 81 15.264338
-55 82 6.324555
-55 83 32.756679
-55 84 34.132096
-55 85 31.064449
-55 86 37.854986
-55 87 49.517674
-55 88 56.080300
-55 89 31.064449
-55 90 56.293872
-55 91 22.203603
-55 92 18.973666
-55 93 17.117243
-55 94 10.000000
-55 95 12.165525
-55 96 23.021729
-55 97 6.000000
-55 98 66.068147
-55 99 30.083218
-55 100 38.288379
-55 101 25.000000
-56 1 14.142136
-56 2 25.495098
-56 3 17.000000
-56 4 26.248809
-56 5 22.360680
-56 6 26.925824
-56 7 19.209373
-56 8 21.213203
-56 9 25.000000
-56 10 32.015621
-56 11 28.284271
-56 12 29.732137
-56 13 26.627054
-56 14 35.355339
-56 15 29.154759
-56 16 34.409301
-56 17 36.055513
-56 18 33.541020
-56 19 56.753854
-56 20 51.419841
-56 21 46.572524
-56 22 55.901699
-56 23 46.097722
-56 24 55.578773
-56 25 45.705580
-56 26 55.226805
-56 27 71.589105
-56 28 69.641941
-56 29 68.876701
-56 30 65.000000
-56 31 65.299311
-56 32 63.158531
-56 33 64.412732
-56 34 65.192024
-56 35 60.415230
-56 36 44.654227
-56 37 43.011626
-56 38 41.340053
-56 39 37.735925
-56 40 36.055513
-56 41 39.051248
-56 42 31.764760
-56 43 32.015621
-56 44 35.355339
-56 45 33.301652
-56 46 24.166092
-56 47 23.323808
-56 48 31.764760
-56 49 56.293872
-56 50 49.477268
-56 51 48.877398
-56 52 47.169906
-56 53 30.413813
-56 54 14.142136
-56 55 25.000000
-56 57 32.015621
-56 58 35.000000
-56 59 52.201533
-56 60 44.721360
-56 61 15.000000
-56 62 15.811388
-56 63 43.011626
-56 64 53.150729
-56 65 33.541020
-56 66 20.615528
-56 67 25.495098
-56 68 38.470768
-56 69 10.000000
-56 70 8.062258
-56 71 10.295630
-56 72 35.355339
-56 73 33.376639
-56 74 28.000000
-56 75 41.231056
-56 76 60.415230
-56 77 56.603887
-56 78 57.428216
-56 79 22.360680
-56 80 25.298221
-56 81 21.400935
-56 82 19.104973
-56 83 17.262677
-56 84 29.832868
-56 85 41.109610
-56 86 49.578221
-56 87 37.107951
-56 88 40.249224
-56 89 6.324555
-56 90 66.287254
-56 91 14.764823
-56 92 26.172505
-56 93 28.600699
-56 94 32.015621
-56 95 29.546573
-56 96 34.713110
-56 97 25.709920
-56 98 49.396356
-56 99 8.944272
-56 100 25.317978
-56 101 7.071068
-57 1 18.027756
-57 2 55.901699
-57 3 48.826222
-57 4 57.306195
-57 5 54.083269
-57 6 58.309519
-57 7 51.224994
-57 8 53.150729
-57 9 57.008771
-57 10 40.000000
-57 11 40.311289
-57 12 42.296572
-57 13 43.174066
-57 14 45.000000
-57 15 46.097722
-57 16 48.259714
-57 17 50.249378
-57 18 50.990195
-57 19 30.594117
-57 20 26.248809
-57 21 21.540659
-57 22 31.622777
-57 23 22.360680
-57 24 32.310989
-57 25 23.323808
-57 26 33.541020
-57 27 45.276926
-57 28 45.000000
-57 29 42.296572
-57 30 40.000000
-57 31 38.327536
-57 32 38.000000
-57 33 37.336309
-57 34 36.400549
-57 35 35.000000
-57 36 52.810984
-57 37 52.201533
-57 38 49.335586
-57 39 46.572524
-57 40 46.097722
-57 41 50.990195
-57 42 40.792156
-57 43 45.276926
-57 44 50.249378
-57 45 47.265209
-57 46 55.758407
-57 47 55.217751
-57 48 49.030603
-57 49 31.048349
-57 50 24.351591
-57 51 22.000000
-57 52 15.811388
-57 53 25.495098
-57 54 33.541020
-57 55 25.495098
-57 56 32.015621
-57 58 22.360680
-57 59 43.011626
-57 60 42.720019
-57 61 43.011626
-57 62 30.413813
-57 63 15.000000
-57 64 21.213203
-57 65 7.071068
-57 66 15.811388
-57 67 9.219544
-57 68 15.652476
-57 69 26.925824
-57 70 25.495098
-57 71 37.161808
-57 72 25.000000
-57 73 32.695565
-57 74 54.120237
-57 75 33.541020
-57 76 54.083269
-57 77 25.079872
-57 78 41.868843
-57 79 46.957428
-57 80 55.000000
-57 81 12.369317
-57 82 23.021729
-57 83 24.351591
-57 84 13.601471
-57 85 9.219544
-57 86 17.691806
-57 87 31.016125
-57 88 39.560081
-57 89 34.713110
-57 90 34.481879
-57 91 17.691806
-57 92 7.071068
-57 93 8.544004
-57 94 20.248457
-57 95 14.764823
-57 96 6.324555
-57 97 19.646883
-57 98 49.040799
-57 99 29.410882
-57 100 24.000000
-57 101 37.215588
-58 1 26.925824
-58 2 60.207973
-58 3 50.635956
-58 4 60.530984
-58 5 55.901699
-58 6 60.827625
-58 7 51.419841
-58 8 52.201533
-58 9 57.008771
-58 10 22.360680
-58 11 25.000000
-58 12 26.627054
-58 13 29.732137
-58 14 26.925824
-58 15 32.015621
-58 16 31.764760
-58 17 33.541020
-58 18 36.055513
-58 19 24.413111
-58 20 19.209373
-58 21 15.620499
-58 22 22.360680
-58 23 14.142136
-58 24 21.540659
-58 25 12.806248
-58 26 20.615528
-58 27 65.192024
-58 28 65.764732
-58 29 62.201286
-58 30 60.827625
-58 31 58.215118
-58 32 58.855756
-58 33 57.218878
-58 34 55.000000
-58 35 55.901699
-58 36 70.491134
-58 37 69.462220
-58 38 66.887966
-58 39 63.631753
-58 40 62.649820
-58 41 67.082039
-58 42 57.306195
-58 43 60.415230
-58 44 65.000000
-58 45 62.241465
-58 46 57.870545
-58 47 56.293872
-58 48 34.409301
-58 49 23.323808
-58 50 17.691806
-58 51 43.174066
-58 52 25.495098
-58 53 7.071068
-58 54 26.925824
-58 55 43.011626
-58 56 35.000000
-58 57 22.360680
-58 59 21.213203
-58 60 20.615528
-58 61 38.078866
-58 62 42.720019
-58 63 36.400549
-58 64 35.355339
-58 65 15.811388
-58 66 15.811388
-58 67 16.278821
-58 68 38.013156
-58 69 36.400549
-58 70 27.018512
-58 71 44.283180
-58 72 46.097722
-58 73 51.855569
-58 74 44.821870
-58 75 11.180340
-58 76 32.015621
-58 77 32.695565
-58 78 23.086793
-58 79 38.013156
-58 80 49.244289
-58 81 27.802878
-58 82 38.078866
-58 83 18.248288
-58 84 9.219544
-58 85 27.294688
-58 86 33.060551
-58 87 9.055385
-58 88 18.027756
-58 89 33.541020
-58 90 42.059482
-58 91 23.086793
-58 92 25.495098
-58 93 29.206164
-58 94 41.109610
-58 95 35.468296
-58 96 28.635642
-58 97 38.288379
-58 98 26.925824
-58 99 27.294688
-58 100 10.770330
-58 101 42.011903
-59 1 47.169906
-59 2 75.663730
-59 3 65.375837
-59 4 75.325958
-59 5 70.178344
-59 6 75.166482
-59 7 65.069194
-59 8 65.000000
-59 9 70.000000
-59 10 25.495098
-59 11 30.413813
-59 12 30.805844
-59 13 35.693137
-59 14 26.925824
-59 15 36.400549
-59 16 32.695565
-59 17 33.541020
-59 18 38.078866
-59 19 29.427878
-59 20 27.000000
-59 21 27.459060
-59 22 25.495098
-59 23 25.495098
-59 24 23.537205
-59 25 23.537205
-59 26 20.615528
-59 27 82.462113
-59 28 83.815273
-59 29 79.555012
-59 30 79.056942
-59 31 75.690158
-59 32 77.162167
-59 33 74.726167
-59 34 71.589105
-59 35 74.330344
-59 36 91.263355
-59 37 90.138782
-59 38 87.658428
-59 39 84.314886
-59 40 83.216585
-59 41 87.464278
-59 42 77.935871
-59 43 80.622577
-59 44 85.000000
-59 45 82.365041
-59 46 72.173402
-59 47 70.064256
-59 48 37.336309
-59 49 27.459060
-59 50 27.073973
-59 51 62.241465
-59 52 41.231056
-59 53 22.360680
-59 54 40.311289
-59 55 64.031242
-59 56 52.201533
-59 57 43.011626
-59 58 21.213203
-59 60 11.180340
-59 61 50.000000
-59 62 62.649820
-59 63 55.901699
-59 64 50.990195
-59 65 36.055513
-59 66 36.055513
-59 67 37.483330
-59 68 58.523500
-59 69 55.901699
-59 70 44.944410
-59 71 62.297673
-59 72 67.268120
-59 73 73.000000
-59 74 51.662365
-59 75 11.180340
-59 76 11.180340
-59 77 45.044423
-59 78 10.630146
-59 79 46.529560
-59 80 58.694122
-59 81 48.918299
-59 82 58.821765
-59 83 35.114100
-59 84 30.413813
-59 85 46.097722
-59 86 49.729267
-59 87 15.231546
-59 88 14.317821
-59 89 48.836462
-59 90 52.239832
-59 91 43.046487
-59 92 46.690470
-59 93 50.328918
-59 94 62.289646
-59 95 56.639209
-59 96 49.091751
-59 97 59.464275
-59 98 13.601471
-59 99 43.416587
-59 100 27.313001
-59 101 59.203040
-60 1 42.426407
-60 2 66.708320
-60 3 56.293872
-60 4 66.098411
-60 5 60.827625
-60 6 65.764732
-60 7 55.578773
-60 8 55.226805
-60 9 60.207973
-60 10 15.000000
-60 11 20.000000
-60 12 20.099751
-60 13 25.079872
-60 14 15.811388
-60 15 25.495098
-60 16 21.540659
-60 17 22.360680
-60 18 26.925824
-60 19 37.161808
-60 20 33.526109
-60 21 32.388269
-60 22 33.541020
-60 23 30.413813
-60 24 31.764760
-60 25 28.442925
-60 26 29.154759
-60 27 85.586214
-60 28 86.313383
-60 29 82.607506
-60 30 81.394103
-60 31 78.638413
-60 32 79.429214
-60 33 77.646635
-60 34 75.166482
-60 35 76.485293
-60 36 86.452299
-60 37 85.146932
-60 38 82.879430
-60 39 79.397733
-60 40 78.102497
-60 41 82.006097
-60 42 73.000000
-60 43 75.000000
-60 44 79.056942
-60 45 76.609399
-60 46 62.801274
-60 47 60.530984
-60 48 26.248809
-60 49 35.341194
-60 50 32.984845
-60 51 63.788714
-60 52 45.000000
-60 53 18.027756
-60 54 31.622777
-60 55 60.207973
-60 56 44.721360
-60 57 42.720019
-60 58 20.615528
-60 59 11.180340
-60 61 40.311289
-60 62 57.008771
-60 63 57.008771
-60 64 55.000000
-60 65 36.400549
-60 66 32.015621
-60 67 35.355339
-60 68 58.309519
-60 69 50.000000
-60 70 38.275318
-60 71 55.009090
-60 72 65.192024
-60 73 69.526973
-60 74 40.792156
-60 75 10.000000
-60 76 15.811388
-60 77 50.635956
-60 78 21.400935
-60 79 36.055513
-60 80 48.166378
-60 81 45.803930
-60 82 54.451814
-60 83 28.600699
-60 84 29.154759
-60 85 47.853944
-60 86 53.084838
-60 87 11.704700
-60 88 4.472136
-60 89 40.496913
-60 90 58.940648
-60 91 38.183766
-60 92 44.777226
-60 93 48.764741
-60 94 60.207973
-60 95 54.708317
-60 96 49.040799
-60 97 56.400355
-60 98 6.324555
-60 99 35.777088
-60 100 21.931712
-60 101 51.478151
-61 1 26.925824
-61 2 26.925824
-61 3 16.552945
-61 4 25.961510
-61 5 20.615528
-61 6 25.495098
-61 7 15.297059
-61 8 15.000000
-61 9 20.000000
-61 10 25.495098
-61 11 20.615528
-61 12 21.189620
-61 13 16.552945
-61 14 26.925824
-61 15 18.027756
-61 16 23.853721
-61 17 25.000000
-61 18 21.213203
-61 19 62.177166
-61 20 56.824291
-61 21 52.478567
-61 22 60.415230
-61 23 51.478151
-61 24 59.615434
-61 25 50.537115
-61 26 58.523500
-61 27 85.440037
-61 28 83.815273
-61 29 82.637764
-61 30 79.056942
-61 31 78.924014
-61 32 77.162167
-61 33 78.000000
-61 34 78.262379
-61 35 74.330344
-61 36 57.697487
-61 37 55.901699
-61 38 54.626001
-61 39 51.078371
-61 40 49.244289
-61 41 51.478151
-61 42 45.541190
-61 43 44.721360
-61 44 47.169906
-61 45 45.650849
-61 46 22.561028
-61 47 20.223748
-61 48 19.849433
-61 49 61.269895
-61 50 55.072679
-61 51 62.241465
-61 52 56.568542
-61 53 31.622777
-61 54 11.180340
-61 55 40.000000
-61 56 15.000000
-61 57 43.011626
-61 58 38.078866
-61 59 50.000000
-61 60 40.311289
-61 62 30.413813
-61 63 55.901699
-61 64 64.031242
-61 65 42.426407
-61 66 28.284271
-61 67 34.713110
-61 68 52.201533
-61 69 25.000000
-61 70 17.888544
-61 71 21.931712
-61 72 50.249378
-61 73 48.259714
-61 74 13.000000
-61 75 40.311289
-61 76 55.901699
-61 77 65.795137
-61 78 57.558666
-61 79 8.062258
-61 80 12.041595
-61 81 34.539832
-61 82 34.058773
-61 83 20.808652
-61 84 36.400549
-61 85 52.201533
-61 86 60.605280
-61 87 36.496575
-61 88 36.124784
-61 89 9.219544
-61 90 75.690158
-61 91 25.553865
-61 92 38.470768
-61 93 41.629317
-61 94 46.690470
-61 95 43.680659
-61 96 47.010637
-61 97 40.447497
-61 98 43.416587
-61 99 13.601471
-61 100 27.313001
-61 101 17.464249
-62 1 15.811388
-62 2 28.284271
-62 3 25.079872
-62 4 30.479501
-62 5 29.154759
-62 6 32.015621
-62 7 28.792360
-62 8 31.622777
-62 9 33.541020
-62 10 46.097722
-62 11 43.011626
-62 12 44.654227
-62 13 42.059482
-62 14 50.000000
-62 15 44.721360
-62 16 49.739320
-62 17 51.478151
-62 18 49.244289
-62 19 60.008333
-62 20 55.081757
-62 21 50.089919
-62 22 60.207973
-62 23 50.249378
-62 24 60.406953
-62 25 50.487622
-62 26 60.827625
-62 27 61.032778
-62 28 58.309519
-62 29 58.600341
-62 30 54.083269
-62 31 55.443665
-62 32 52.430907
-62 33 54.671748
-62 34 56.568542
-62 35 50.000000
-62 36 29.732137
-62 37 28.284271
-62 38 26.248809
-62 39 22.671568
-62 40 21.213203
-62 41 25.000000
-62 42 16.401219
-62 43 18.027756
-62 44 22.360680
-62 45 19.723083
-62 46 30.232433
-62 47 30.886890
-62 48 47.423623
-62 49 60.074953
-62 50 53.084838
-62 51 40.360872
-62 52 46.097722
-62 53 40.311289
-62 54 29.154759
-62 55 11.180340
-62 56 15.811388
-62 57 30.413813
-62 58 42.720019
-62 59 62.649820
-62 60 57.008771
-62 61 30.413813
-62 63 36.055513
-62 64 49.244289
-62 65 35.000000
-62 66 26.925824
-62 67 28.284271
-62 68 29.832868
-62 69 7.071068
-62 70 19.104973
-62 71 10.770330
-62 72 22.360680
-62 73 18.000000
-62 74 43.289722
-62 75 51.478151
-62 76 72.111026
-62 77 55.081757
-62 78 65.787537
-62 79 38.078866
-62 80 39.115214
-62 81 18.110770
-62 82 8.062258
-62 83 28.425341
-62 84 34.928498
-62 85 37.947332
-62 86 45.694639
-62 87 47.507894
-62 88 52.630789
-62 89 22.135944
-62 90 63.906181
-62 91 19.697716
-62 92 23.345235
-62 93 23.409400
-62 94 20.615528
-62 95 20.808652
-62 96 30.083218
-62 97 14.866069
-62 98 62.369865
-62 99 23.021729
-62 100 35.510562
-62 101 14.142136
-63 1 29.154759
-63 2 64.031242
-63 3 58.728187
-63 4 65.946948
-63 5 63.639610
-63 6 67.268120
-63 7 61.717096
-63 8 64.031242
-63 9 67.268120
-63 10 55.000000
-63 11 55.226805
-63 12 57.218878
-63 13 57.870545
-63 14 60.000000
-63 15 60.827625
-63 16 63.198101
-63 17 65.192024
-63 18 65.764732
-63 19 36.619667
-63 20 33.970576
-63 21 30.479501
-63 22 39.051248
-63 23 32.015621
-63 24 40.360872
-63 25 33.600595
-63 26 42.426407
-63 27 30.413813
-63 28 30.000000
-63 29 27.459060
-63 30 25.000000
-63 31 23.537205
-63 32 23.000000
-63 33 22.561028
-63 34 22.360680
-63 35 20.000000
-63 36 50.039984
-63 37 50.000000
-63 38 47.000000
-63 39 45.099889
-63 40 45.276926
-63 41 50.249378
-63 42 40.607881
-63 43 46.097722
-63 44 50.990195
-63 45 48.052055
-63 46 65.069194
-63 47 65.069194
-63 48 63.788714
-63 49 37.802116
-63 50 32.526912
-63 51 7.000000
-63 52 18.027756
-63 53 40.311289
-63 54 47.434165
-63 55 26.925824
-63 56 43.011626
-63 57 15.000000
-63 58 36.400549
-63 59 55.901699
-63 60 57.008771
-63 61 55.901699
-63 62 36.055513
-63 64 15.000000
-63 65 20.615528
-63 66 30.413813
-63 67 24.083189
-63 68 7.071068
-63 69 35.355339
-63 70 38.013156
-63 71 45.343136
-63 72 20.000000
-63 73 30.066593
-63 74 67.779053
-63 75 47.434165
-63 76 67.082039
-63 77 23.537205
-63 78 52.801515
-63 79 60.745370
-63 80 67.601775
-63 81 21.633308
-63 82 28.017851
-63 83 38.832976
-63 84 28.284271
-63 85 10.000000
-63 86 12.165525
-63 87 45.354162
-63 88 54.129474
-63 89 47.010637
-63 90 30.066593
-63 91 30.463092
-63 92 17.464249
-63 93 14.422205
-63 94 17.464249
-63 95 15.264338
-63 96 9.219544
-63 97 21.470911
-63 98 63.324561
-63 99 42.544095
-63 100 39.000000
-63 101 46.690470
-64 1 39.051248
-64 2 76.321688
-64 3 69.814039
-64 4 77.935871
-64 5 75.000000
-64 6 79.056942
-64 7 72.346389
-64 8 74.330344
-64 9 78.102497
-64 10 57.008771
-64 11 58.523500
-64 12 60.406953
-64 13 62.241465
-64 14 61.846584
-64 15 65.000000
-64 16 66.098411
-64 17 68.007353
-64 18 69.641941
-64 19 25.806976
-64 20 25.079872
-64 21 23.537205
-64 22 29.154759
-64 23 25.495098
-64 24 30.886890
-64 25 27.459060
-64 26 33.541020
-64 27 31.622777
-64 28 33.541020
-64 29 28.792360
-64 30 29.154759
-64 31 25.079872
-64 32 27.459060
-64 33 24.166092
-64 34 20.615528
-64 35 25.000000
-64 36 65.030762
-64 37 65.000000
-64 38 62.000000
-64 39 60.074953
-64 40 60.207973
-64 41 65.192024
-64 42 55.443665
-64 43 60.827625
-64 44 65.764732
-64 45 62.801274
-64 46 76.609399
-64 47 76.216796
-64 48 67.779053
-64 49 27.459060
-64 50 24.351591
-64 51 16.552945
-64 52 10.000000
-64 53 41.231056
-64 54 54.083269
-64 55 41.231056
-64 56 53.150729
-64 57 21.213203
-64 58 35.355339
-64 59 50.990195
-64 60 55.000000
-64 61 64.031242
-64 62 49.244289
-64 63 15.000000
-64 65 22.360680
-64 66 36.055513
-64 67 29.410882
-64 68 22.022716
-64 69 47.169906
-64 70 46.690470
-64 71 57.454330
-64 72 35.000000
-64 73 45.044423
-64 74 74.625733
-64 75 45.000000
-64 76 61.846584
-64 77 9.433981
-64 78 45.310043
-64 79 67.416615
-64 80 76.059187
-64 81 32.449961
-64 82 41.231056
-64 83 44.418465
-64 84 30.083218
-64 85 12.041595
-64 86 3.605551
-64 87 44.181444
-64 88 53.150729
-64 89 55.901699
-64 90 15.132746
-64 91 38.897301
-64 92 27.202941
-64 93 25.942244
-64 94 32.249031
-64 95 29.120440
-64 96 19.235384
-64 97 35.440090
-64 98 61.032778
-64 99 50.447993
-64 100 41.785165
-64 101 58.008620
-65 1 20.615528
-65 2 58.523500
-65 3 50.537115
-65 4 59.615434
-65 5 55.901699
-65 6 60.415230
-65 7 52.478567
-65 8 54.083269
-65 9 58.309519
-65 10 35.355339
-65 11 36.400549
-65 12 38.327536
-65 13 39.924930
-65 14 40.311289
-65 15 42.720019
-65 16 44.147480
-65 17 46.097722
-65 18 47.434165
-65 19 25.019992
-65 20 20.223748
-65 21 15.297059
-65 22 25.495098
-65 23 15.811388
-65 24 25.961510
-65 25 16.552945
-65 26 26.925824
-65 27 50.000000
-65 28 50.249378
-65 29 47.000000
-65 30 45.276926
-65 31 43.000000
-65 32 43.289722
-65 33 42.000000
-65 34 40.311289
-65 35 40.311289
-65 36 59.236813
-65 37 58.523500
-65 38 55.713553
-65 39 52.810984
-65 40 52.201533
-65 41 57.008771
-65 42 46.840154
-65 43 50.990195
-65 44 55.901699
-65 45 52.952809
-65 46 57.697487
-65 47 56.824291
-65 48 45.541190
-65 49 25.179357
-65 50 18.248288
-65 51 27.459060
-65 52 14.142136
-65 53 20.000000
-65 54 32.015621
-65 55 31.622777
-65 56 33.541020
-65 57 7.071068
-65 58 15.811388
-65 59 36.055513
-65 60 36.400549
-65 61 42.426407
-65 62 35.000000
-65 63 20.615528
-65 64 22.360680
-65 66 14.142136
-65 67 8.062258
-65 68 22.472205
-65 69 30.413813
-65 70 26.076810
-65 71 40.261644
-65 72 32.015621
-65 73 39.357337
-65 74 52.430907
-65 75 26.925824
-65 76 47.169906
-65 77 23.430749
-65 78 34.828150
-65 79 45.221676
-65 80 54.451814
-65 81 17.117243
-65 82 28.284271
-65 83 22.203603
-65 84 8.062258
-65 85 12.041595
-65 86 19.313208
-65 87 24.738634
-65 88 33.541020
-65 89 35.000000
-65 90 33.301652
-65 91 18.788294
-65 92 12.649111
-65 93 15.264338
-65 94 27.202941
-65 95 21.633308
-65 96 13.038405
-65 97 26.000000
-65 98 42.720019
-65 99 29.068884
-65 100 19.646883
-65 101 39.560081
-66 1 11.180340
-66 2 46.097722
-66 3 37.336309
-66 4 46.840154
-66 5 42.720019
-66 6 47.434165
-66 7 38.910153
-66 8 40.311289
-66 9 44.721360
-66 10 25.495098
-66 11 25.000000
-66 12 27.000000
-66 13 27.459060
-66 14 30.413813
-66 15 30.413813
-66 16 33.000000
-66 17 35.000000
-66 18 35.355339
-66 19 36.138622
-66 20 30.805844
-66 21 25.961510
-66 22 35.355339
-66 23 25.495098
-66 24 35.128336
-66 25 25.179357
-66 26 35.000000
-66 27 60.827625
-66 28 60.207973
-66 29 57.870545
-66 30 55.226805
-66 31 53.935146
-66 32 53.235327
-66 33 52.952809
-66 34 52.201533
-66 35 50.249378
-66 36 55.217751
-66 37 54.083269
-66 38 51.613952
-66 39 48.259714
-66 40 47.169906
-66 41 51.478151
-66 42 41.880783
-66 43 44.721360
-66 44 49.244289
-66 45 46.518813
-66 46 44.598206
-66 47 43.462628
-66 48 33.376639
-66 49 35.693137
-66 50 28.861739
-66 51 37.336309
-66 52 28.284271
-66 53 14.142136
-66 54 18.027756
-66 55 28.284271
-66 56 20.615528
-66 57 15.811388
-66 58 15.811388
-66 59 36.055513
-66 60 32.015621
-66 61 28.284271
-66 62 26.925824
-66 63 30.413813
-66 64 36.055513
-66 65 14.142136
-66 67 6.708204
-66 68 29.068884
-66 69 20.615528
-66 70 12.649111
-66 71 29.000000
-66 72 33.541020
-66 73 37.536649
-66 74 38.587563
-66 75 25.000000
-66 76 46.097722
-66 77 37.536649
-66 78 38.897301
-66 79 31.384710
-66 80 40.311289
-66 81 13.892444
-66 82 22.803509
-66 83 8.544004
-66 84 9.219544
-66 85 24.596748
-66 86 32.756679
-66 87 21.260292
-66 88 28.017851
-66 89 21.095023
-66 90 47.423623
-66 91 7.280110
-66 92 14.142136
-66 93 18.248288
-66 94 28.635642
-66 95 23.409400
-66 96 21.213203
-66 97 24.413111
-66 98 38.013156
-66 99 15.000000
-66 100 10.295630
-66 101 27.294688
-67 1 13.038405
-67 2 50.596443
-67 3 42.485292
-67 4 51.623638
-67 5 47.853944
-67 6 52.392748
-67 7 44.418465
-67 8 46.043458
-67 9 50.249378
-67 10 31.064449
-67 11 31.144823
-67 12 33.136083
-67 13 33.955854
-67 14 36.055513
-67 15 36.878178
-67 16 39.115214
-67 17 41.109610
-67 18 41.773197
-67 19 32.140317
-67 20 27.018512
-67 21 22.022716
-67 22 32.015621
-67 23 22.022716
-67 24 32.140317
-67 25 22.203603
-67 26 32.557641
-67 27 54.451814
-67 28 54.037024
-67 29 51.478151
-67 30 49.040799
-67 31 47.518417
-67 32 47.042534
-67 33 46.529560
-67 34 45.607017
-67 35 44.045431
-67 36 54.589376
-67 37 53.665631
-67 38 51.000000
-67 39 47.853944
-67 40 47.010637
-67 41 51.623638
-67 42 41.629317
-67 43 45.221676
-67 44 50.000000
-67 45 47.127487
-67 46 49.658836
-67 47 48.764741
-67 48 39.812058
-67 49 32.015621
-67 50 25.019992
-67 51 31.064449
-67 52 22.022716
-67 53 17.464249
-67 54 24.698178
-67 55 26.925824
-67 56 25.495098
-67 57 9.219544
-67 58 16.278821
-67 59 37.483330
-67 60 35.355339
-67 61 34.713110
-67 62 28.284271
-67 63 24.083189
-67 64 29.410882
-67 65 8.062258
-67 66 6.708204
-67 68 23.537205
-67 69 23.021729
-67 70 18.027756
-67 71 32.557641
-67 72 30.000000
-67 73 35.608988
-67 74 45.276926
-67 75 27.018512
-67 76 48.166378
-67 77 31.400637
-67 78 38.470768
-67 79 38.078866
-67 80 46.754679
-67 81 11.661904
-67 82 22.472205
-67 83 15.231546
-67 84 7.211103
-67 85 17.888544
-67 86 26.076810
-67 87 23.853721
-67 88 31.780497
-67 89 27.018512
-67 90 41.231056
-67 91 10.770330
-67 92 9.433981
-67 93 13.416408
-67 94 25.000000
-67 95 19.416488
-67 96 15.000000
-67 97 22.022716
-67 98 41.593269
-67 99 21.213203
-67 100 15.132746
-67 101 31.622777
-68 1 25.298221
-68 2 58.051701
-68 3 53.413481
-68 4 60.108236
-68 5 58.137767
-68 6 61.522354
-68 7 56.612719
-68 8 59.076222
-68 9 62.008064
-68 10 54.451814
-68 11 54.037024
-68 12 56.035703
-68 13 56.080300
-68 14 59.413803
-68 15 59.076222
-68 16 62.032250
-68 17 64.031242
-68 18 64.070274
-68 19 42.059482
-68 20 38.832976
-68 21 34.828150
-68 22 44.102154
-68 23 36.124784
-68 24 45.221676
-68 25 37.483330
-68 26 47.010637
-68 27 33.241540
-68 28 31.780497
-68 29 30.463092
-68 30 26.925824
-68 31 26.832816
-68 32 25.000000
-68 33 25.942244
-68 34 27.018512
-68 35 22.135944
-68 36 43.104524
-68 37 43.011626
-68 38 40.012498
-68 39 38.052595
-68 40 38.209946
-68 41 43.185646
-68 42 33.541020
-68 43 39.051248
-68 44 43.931765
-68 45 41.000000
-68 46 59.464275
-68 47 59.665736
-68 48 62.072538
-68 49 43.046487
-68 50 37.202150
-68 51 10.630146
-68 52 23.769729
-68 53 40.804412
-68 54 44.721360
-68 55 20.124612
-68 56 38.470768
-68 57 15.652476
-68 58 38.013156
-68 59 58.523500
-68 60 58.309519
-68 61 52.201533
-68 62 29.832868
-68 63 7.071068
-68 64 22.022716
-68 65 22.472205
-68 66 29.068884
-68 67 23.537205
-68 69 30.000000
-68 70 34.481879
-68 71 39.623226
-68 72 13.038405
-68 73 23.021729
-68 74 64.560050
-68 75 49.193496
-68 76 69.641941
-68 77 30.265492
-68 78 56.586217
-68 79 57.723479
-68 80 63.560994
-68 81 17.720045
-68 82 21.931712
-68 83 37.013511
-68 84 29.154759
-68 85 14.764823
-68 86 19.026298
-68 87 46.615448
-68 88 55.027266
-68 89 43.081318
-68 90 37.121422
-68 91 27.459060
-68 92 15.000000
-68 93 11.045361
-68 94 10.440307
-68 95 9.219544
-68 96 9.433981
-68 97 15.000000
-68 98 64.621978
-68 99 39.293765
-68 100 38.639358
-68 101 41.400483
-69 1 10.000000
-69 2 29.154759
-69 3 23.430749
-69 4 30.805844
-69 5 28.284271
-69 6 32.015621
-69 7 26.627054
-69 8 29.154759
-69 9 32.015621
-69 10 39.051248
-69 11 36.055513
-69 12 37.735925
-69 13 35.341194
-69 14 43.011626
-69 15 38.078866
-69 16 42.941821
-69 17 44.721360
-69 18 42.720019
-69 19 55.145263
-69 20 50.039984
-69 21 45.044423
-69 22 55.000000
-69 23 45.000000
-69 24 55.036352
-69 25 45.044423
-69 26 55.226805
-69 27 62.649820
-69 28 60.415230
-69 29 60.033324
-69 30 55.901699
-69 31 56.603887
-69 32 54.120237
-69 33 55.758407
-69 34 57.008771
-69 35 51.478151
-69 36 36.796739
-69 37 35.355339
-69 38 33.301652
-69 39 29.732137
-69 40 28.284271
-69 41 32.015621
-69 42 23.430749
-69 43 25.000000
-69 44 29.154759
-69 45 26.627054
-69 46 29.732137
-69 47 29.732137
-69 48 40.853396
-69 49 55.036352
-69 50 48.041649
-69 51 40.607881
-69 52 42.720019
-69 53 33.541020
-69 54 22.360680
-69 55 15.000000
-69 56 10.000000
-69 57 26.925824
-69 58 36.400549
-69 59 55.901699
-69 60 50.000000
-69 61 25.000000
-69 62 7.071068
-69 63 35.355339
-69 64 47.169906
-69 65 30.413813
-69 66 20.615528
-69 67 23.021729
-69 68 30.000000
-69 70 12.041595
-69 71 10.295630
-69 72 25.495098
-69 73 23.537205
-69 74 38.000000
-69 75 44.721360
-69 76 65.192024
-69 77 52.000000
-69 78 59.481089
-69 79 32.249031
-69 80 34.928498
-69 81 14.764823
-69 82 9.219544
-69 83 21.400935
-69 84 29.154759
-69 85 35.355339
-69 86 43.566042
-69 87 40.706265
-69 88 45.607017
-69 89 16.124515
-69 90 61.269895
-69 91 13.341664
-69 92 20.124612
-69 93 21.400935
-69 94 22.472205
-69 95 20.808652
-69 96 28.017851
-69 97 16.155494
-69 98 55.317267
-69 99 16.124515
-69 100 28.653098
-69 101 11.401754
-70 1 9.219544
-70 2 33.541020
-70 3 24.698178
-70 4 34.205263
-70 5 30.083218
-70 6 34.785054
-70 7 26.419690
-70 8 28.017851
-70 9 32.249031
-70 10 27.018512
-70 11 24.186773
-70 12 25.942244
-70 13 24.041631
-70 14 31.064449
-70 15 26.925824
-70 16 31.384710
-70 17 33.241540
-70 18 31.780497
-70 19 48.764741
-70 20 43.416587
-70 21 38.600518
-70 22 47.853944
-70 23 38.078866
-70 24 47.518417
-70 25 37.656341
-70 26 47.169906
-70 27 67.675697
-70 28 66.219333
-70 29 64.845971
-70 30 61.400326
-70 31 61.098281
-70 32 59.481089
-70 33 60.166436
-70 34 60.373835
-70 35 56.612719
-70 36 48.836462
-70 37 47.381431
-70 38 45.343136
-70 39 41.773197
-70 40 40.311289
-70 41 43.931765
-70 42 35.468296
-70 43 36.878178
-70 44 40.804412
-70 45 38.418745
-70 46 31.953091
-70 47 30.870698
-70 48 29.832868
-70 49 48.270074
-70 50 41.484937
-70 51 44.384682
-70 52 40.000000
-70 53 22.803509
-70 54 11.180340
-70 55 25.298221
-70 56 8.062258
-70 57 25.495098
-70 58 27.018512
-70 59 44.944410
-70 60 38.275318
-70 61 17.888544
-70 62 19.104973
-70 63 38.013156
-70 64 46.690470
-70 65 26.076810
-70 66 12.649111
-70 67 18.027756
-70 68 34.481879
-70 69 12.041595
-70 71 17.464249
-70 72 34.132096
-70 73 34.539832
-70 74 30.083218
-70 75 33.837849
-70 76 53.712196
-70 77 49.406477
-70 78 49.648766
-70 79 23.345235
-70 80 29.681644
-70 81 16.763055
-70 82 18.973666
-70 83 9.848858
-70 84 21.840330
-70 85 34.713110
-70 86 43.185646
-70 87 29.732137
-70 88 33.837849
-70 89 9.219544
-70 90 59.203040
-70 91 7.810250
-70 92 20.591260
-70 93 23.769729
-70 94 30.000000
-70 95 26.305893
-70 96 29.154759
-70 97 24.083189
-70 98 43.416587
-70 99 5.000000
-70 100 17.720045
-70 101 15.000000
-71 1 19.646883
-71 2 18.867962
-71 3 14.317821
-71 4 20.615528
-71 5 18.601075
-71 6 21.931712
-71 7 18.027756
-71 8 20.880613
-71 9 22.825424
-71 10 42.201896
-71 11 38.288379
-71 12 39.623226
-71 13 36.124784
-71 14 45.343136
-71 15 38.418745
-71 16 43.931765
-71 17 45.453273
-71 18 42.438190
-71 19 64.629715
-71 20 59.413803
-71 21 54.451814
-71 22 64.195015
-71 23 54.230987
-71 24 64.070274
-71 25 54.083269
-71 26 64.000000
-71 27 71.561163
-71 28 68.963759
-71 29 69.065187
-71 30 64.660653
-71 31 65.802736
-71 32 62.968246
-71 33 65.000000
-71 34 66.603303
-71 35 60.464866
-71 36 35.777088
-71 37 34.000000
-71 38 32.695565
-71 39 29.154759
-71 40 27.313001
-71 41 29.681644
-71 42 23.769729
-71 43 22.825424
-71 44 25.612497
-71 45 23.853721
-71 46 19.849433
-71 47 20.248457
-71 48 40.804412
-71 49 64.381674
-71 50 57.428216
-71 51 50.249378
-71 52 52.924474
-71 53 40.261644
-71 54 24.207437
-71 55 21.931712
-71 56 10.295630
-71 57 37.161808
-71 58 44.283180
-71 59 62.297673
-71 60 55.009090
-71 61 21.931712
-71 62 10.770330
-71 63 45.343136
-71 64 57.454330
-71 65 40.261644
-71 66 29.000000
-71 67 32.557641
-71 68 39.623226
-71 69 10.295630
-71 70 17.464249
-71 72 33.105891
-71 73 28.284271
-71 74 34.205263
-71 75 51.244512
-71 76 70.682388
-71 77 62.241465
-71 78 67.082039
-71 79 29.966648
-71 80 29.017236
-71 81 25.059928
-71 82 17.804494
-71 83 27.202941
-71 84 38.052595
-71 85 45.650849
-71 86 53.851648
-71 87 47.127487
-71 88 50.537115
-71 89 15.556349
-71 90 71.554175
-71 91 22.090722
-71 92 30.413813
-71 93 31.622777
-71 94 31.064449
-71 95 30.413813
-71 96 38.275318
-71 97 25.000000
-71 98 59.682493
-71 99 19.235384
-71 100 35.171011
-71 101 4.472136
-72 1 25.495098
-72 2 50.000000
-72 3 47.423623
-72 4 52.430907
-72 5 51.478151
-72 6 54.083269
-72 7 51.078371
-72 8 53.851648
-72 9 55.901699
-72 10 58.523500
-72 11 57.008771
-72 12 58.940648
-72 13 57.870545
-72 14 63.245553
-72 15 60.827625
-72 16 64.761099
-72 17 66.708320
-72 18 65.764732
-72 19 54.230987
-72 20 50.537115
-72 21 46.141088
-72 22 55.901699
-72 23 47.169906
-72 24 56.824291
-72 25 48.259714
-72 26 58.309519
-72 27 39.051248
-72 28 36.055513
-72 29 36.796739
-72 30 32.015621
-72 31 33.970576
-72 32 30.479501
-72 33 33.301652
-72 34 36.055513
-72 35 28.284271
-72 36 30.066593
-72 37 30.000000
-72 38 27.000000
-72 39 25.179357
-72 40 25.495098
-72 41 30.413813
-72 42 21.189620
-72 43 26.925824
-72 44 31.622777
-72 45 28.792360
-72 46 52.478567
-72 47 53.235327
-72 48 63.788714
-72 49 55.036352
-72 50 48.764741
-72 51 21.189620
-72 52 36.400549
-72 53 47.169906
-72 54 45.276926
-72 55 11.180340
-72 56 35.355339
-72 57 25.000000
-72 58 46.097722
-72 59 67.268120
-72 60 65.192024
-72 61 50.249378
-72 62 22.360680
-72 63 20.000000
-72 64 35.000000
-72 65 32.015621
-72 66 33.541020
-72 67 30.000000
-72 68 13.038405
-72 69 25.495098
-72 70 34.132096
-72 71 33.105891
-72 73 10.198039
-72 74 63.198101
-72 75 57.008771
-72 76 78.102497
-72 77 43.289722
-72 78 66.843100
-72 79 57.008771
-72 80 60.415230
-72 81 19.697716
-72 82 16.278821
-72 83 39.849718
-72 84 36.878178
-72 85 27.202941
-72 86 32.062439
-72 87 53.823787
-72 88 61.400326
-72 89 41.109610
-72 90 50.039984
-72 91 29.120440
-72 92 20.615528
-72 93 16.970563
-72 94 5.000000
-72 95 10.630146
-72 96 20.124612
-72 97 10.049876
-72 98 71.344236
-72 99 39.115214
-72 100 43.829214
-72 101 36.055513
-73 1 27.459060
-73 2 42.941821
-73 3 42.201896
-73 4 45.617979
-73 5 45.541190
-73 6 47.423623
-73 7 46.097722
-73 8 49.030603
-73 9 50.289164
-73 10 60.901560
-73 11 58.600341
-73 12 60.415230
-73 13 58.523500
-73 14 65.299311
-73 15 61.351447
-73 16 65.924199
-73 17 67.779053
-73 18 66.098411
-73 19 62.936476
-73 20 58.872744
-73 21 54.230987
-73 22 64.257295
-73 23 55.036352
-73 24 65.000000
-73 25 55.901699
-73 26 66.211781
-73 27 47.423623
-73 28 43.863424
-73 29 45.453273
-73 30 40.360872
-73 31 43.011626
-73 32 39.051248
-73 33 42.438190
-73 34 45.650849
-73 35 37.202150
-73 36 20.396078
-73 37 20.099751
-73 38 17.117243
-73 39 15.033296
-73 40 15.297059
-73 41 20.223748
-73 42 11.180340
-73 43 17.000000
-73 44 21.540659
-73 45 18.788294
-73 46 46.238512
-73 47 47.434165
-73 48 64.195015
-73 49 63.568860
-73 50 57.008771
-73 51 31.320920
-73 52 45.705580
-73 53 51.662365
-73 54 45.541190
-73 55 9.433981
-73 56 33.376639
-73 57 32.695565
-73 58 51.855569
-73 59 73.000000
-73 60 69.526973
-73 61 48.259714
-73 62 18.000000
-73 63 30.066593
-73 64 45.044423
-73 65 39.357337
-73 66 37.536649
-73 67 35.608988
-73 68 23.021729
-73 69 23.537205
-73 70 34.539832
-73 71 28.284271
-73 72 10.198039
-73 74 61.204575
-73 75 62.241465
-73 76 83.450584
-73 77 53.084838
-73 78 73.783467
-73 79 55.731499
-73 80 57.078893
-73 81 24.083189
-73 82 15.652476
-73 83 42.190046
-73 84 42.801869
-73 85 36.496575
-73 86 42.000000
-73 87 58.694122
-73 88 65.436993
-73 89 39.623226
-73 90 60.133186
-73 91 31.622777
-73 92 26.925824
-73 93 24.166092
-73 94 13.152946
-73 95 18.027756
-73 96 28.861739
-73 97 13.601471
-73 98 75.432089
-73 99 39.217343
-73 100 47.634021
-73 101 32.062439
-74 1 39.293765
-74 2 33.970576
-74 3 25.000000
-74 4 32.015621
-74 5 26.907248
-74 6 30.805844
-74 7 21.931712
-74 8 19.849433
-74 9 23.853721
-74 10 26.248809
-74 11 21.540659
-74 12 20.880613
-74 13 16.155494
-74 14 25.179357
-74 15 15.297059
-74 16 20.000000
-74 17 20.099751
-74 18 15.132746
-74 19 69.202601
-74 20 64.031242
-74 21 60.207973
-74 22 66.850580
-74 23 58.898217
-74 24 65.734314
-74 25 57.628118
-74 26 64.140471
-74 27 97.718985
-74 28 96.301610
-74 29 94.868330
-74 30 91.482239
-74 31 91.082380
-74 32 89.560036
-74 33 90.138782
-74 34 90.077744
-74 35 86.683332
-74 36 69.641941
-74 37 67.779053
-74 38 66.730802
-74 39 63.245553
-74 40 61.351447
-74 41 63.158531
-74 42 57.974132
-74 43 56.648036
-74 44 58.600341
-74 45 57.384667
-74 46 28.425341
-74 47 25.612497
-74 48 15.000000
-74 49 68.007353
-74 50 62.481997
-74 51 74.330344
-74 52 66.400301
-74 53 37.802116
-74 54 20.591260
-74 55 53.000000
-74 56 28.000000
-74 57 54.120237
-74 58 44.821870
-74 59 51.662365
-74 60 40.792156
-74 61 13.000000
-74 62 43.289722
-74 63 67.779053
-74 64 74.625733
-74 65 52.430907
-74 66 38.587563
-74 67 45.276926
-74 68 64.560050
-74 69 38.000000
-74 70 30.083218
-74 71 34.205263
-74 72 63.198101
-74 73 61.204575
-74 75 43.863424
-74 76 55.081757
-74 77 75.286121
-74 78 60.745370
-74 79 7.211103
-74 80 8.944272
-74 81 46.840154
-74 82 47.042534
-74 83 30.232433
-74 84 45.453273
-74 85 63.134776
-74 86 71.344236
-74 87 40.706265
-74 88 37.363083
-74 89 22.090722
-74 90 85.146932
-74 91 37.336309
-74 92 50.328918
-74 93 53.758720
-74 94 59.539903
-74 95 56.293872
-74 96 58.694122
-74 97 53.338541
-74 98 42.047592
-74 99 25.298221
-74 100 34.655447
-74 101 29.832868
-75 1 36.055513
-75 2 65.192024
-75 3 55.036352
-75 4 65.030762
-75 5 60.000000
-75 6 65.000000
-75 7 55.036352
-75 8 55.226805
-75 9 60.207973
-75 10 18.027756
-75 11 22.360680
-75 12 23.323808
-75 13 27.730849
-75 14 21.213203
-75 15 29.154759
-75 16 26.907248
-75 17 28.284271
-75 18 32.015621
-75 19 28.301943
-75 20 24.166092
-75 21 22.561028
-75 22 25.000000
-75 23 20.615528
-75 24 23.430749
-75 25 18.681542
-75 26 21.213203
-75 27 75.663730
-75 28 76.485293
-75 29 72.691127
-75 30 71.589105
-75 31 68.731361
-75 32 69.634761
-75 33 67.742158
-75 34 65.192024
-75 35 66.708320
-75 36 80.212219
-75 37 79.056942
-75 38 76.609399
-75 39 73.239334
-75 40 72.111026
-75 41 76.321688
-75 42 66.850580
-75 43 69.462220
-75 44 73.824115
-75 45 71.196910
-75 46 62.000000
-75 47 60.033324
-75 48 30.805844
-75 49 26.627054
-75 50 23.409400
-75 51 54.120237
-75 52 35.000000
-75 53 11.180340
-75 54 30.000000
-75 55 53.150729
-75 56 41.231056
-75 57 33.541020
-75 58 11.180340
-75 59 11.180340
-75 60 10.000000
-75 61 40.311289
-75 62 51.478151
-75 63 47.434165
-75 64 45.000000
-75 65 26.925824
-75 66 25.000000
-75 67 27.018512
-75 68 49.193496
-75 69 44.721360
-75 70 33.837849
-75 71 51.244512
-75 72 57.008771
-75 73 62.241465
-75 74 43.863424
-75 76 21.213203
-75 77 40.792156
-75 78 17.262677
-75 79 37.947332
-75 80 50.000000
-75 81 38.183766
-75 82 47.801674
-75 83 24.041631
-75 84 20.248457
-75 85 38.078866
-75 86 43.104524
-75 87 4.123106
-75 88 8.944272
-75 89 38.209946
-75 90 49.335586
-75 91 31.906112
-75 92 36.400549
-75 93 40.224371
-75 94 52.009614
-75 95 46.400431
-75 96 39.812058
-75 97 48.795492
-75 98 16.124515
-75 99 32.557641
-75 100 16.155494
-75 101 48.270074
-76 1 57.008771
-76 2 82.462113
-76 3 72.034714
-76 4 81.786307
-76 5 76.485293
-76 6 81.394103
-76 7 71.196910
-76 8 70.710678
-76 9 75.663730
-76 10 30.413813
-76 11 35.355339
-76 12 35.128336
-76 13 40.112342
-76 14 30.000000
-76 15 40.000000
-76 16 35.128336
-76 17 35.355339
-76 18 40.311289
-76 19 39.000000
-76 20 37.336309
-76 21 38.327536
-76 22 35.000000
-76 23 36.400549
-76 24 33.000000
-76 25 34.481879
-76 26 30.000000
-76 27 93.407708
-76 28 94.868330
-76 29 90.520716
-76 30 90.138782
-76 31 86.683332
-76 32 88.255311
-76 33 85.726309
-76 34 82.462113
-76 35 85.440037
-76 36 101.212647
-76 37 100.000000
-76 38 97.616597
-76 39 94.201911
-76 40 93.005376
-76 41 97.082439
-76 42 87.800911
-76 43 90.138782
-76 44 94.339811
-76 45 91.809586
-76 46 78.447435
-76 47 76.118329
-76 48 40.112342
-76 49 37.000000
-76 50 37.656341
-76 51 73.409809
-76 52 52.201533
-76 53 32.015621
-76 54 47.434165
-76 55 74.330344
-76 56 60.415230
-76 57 54.083269
-76 58 32.015621
-76 59 11.180340
-76 60 15.811388
-76 61 55.901699
-76 62 72.111026
-76 63 67.082039
-76 64 61.846584
-76 65 47.169906
-76 66 46.097722
-76 67 48.166378
-76 68 69.641941
-76 69 65.192024
-76 70 53.712196
-76 71 70.682388
-76 72 78.102497
-76 73 83.450584
-76 74 55.081757
-76 75 21.213203
-76 77 55.443665
-76 78 18.110770
-76 79 51.088159
-76 80 63.007936
-76 81 59.396970
-76 82 68.883960
-76 83 43.908997
-76 84 41.231056
-76 85 57.271284
-76 86 60.728906
-76 87 24.839485
-76 88 20.248457
-76 89 56.302753
-76 90 62.000000
-76 91 52.801515
-76 92 57.489129
-76 93 61.220911
-76 94 73.109507
-76 95 67.475922
-76 96 60.207973
-76 97 70.007142
-76 98 13.038405
-76 99 51.478151
-76 100 36.619667
-76 101 67.230945
-77 1 42.941821
-77 2 80.956779
-77 3 73.573093
-77 4 82.298238
-77 5 78.892332
-77 6 83.240615
-77 7 75.716577
-77 8 77.420927
-77 9 81.541401
-77 10 55.036352
-77 11 57.306195
-77 12 59.059292
-77 13 61.587336
-77 14 59.615434
-77 15 64.140471
-77 16 64.404969
-77 17 66.211781
-77 18 68.476273
-77 19 17.464249
-77 20 18.110770
-77 21 18.248288
-77 22 21.189620
-77 23 20.223748
-77 24 23.086793
-77 25 22.203603
-77 26 25.961510
-77 27 39.357337
-77 28 41.880783
-77 29 36.715120
-77 30 37.802116
-77 31 33.286634
-77 32 36.235342
-77 33 32.449961
-77 34 28.178006
-77 35 33.970576
-77 36 73.334848
-77 37 73.171033
-77 38 70.178344
-77 39 68.029405
-77 40 68.000000
-77 41 73.000000
-77 42 63.031738
-77 43 68.183576
-77 44 73.171033
-77 45 70.178344
-77 46 80.622577
-77 47 79.924965
-77 48 66.730802
-77 49 19.313208
-77 50 18.000000
-77 51 25.942244
-77 52 9.433981
-77 53 39.357337
-77 54 55.172457
-77 55 48.259714
-77 56 56.603887
-77 57 25.079872
-77 58 32.695565
-77 59 45.044423
-77 60 50.635956
-77 61 65.795137
-77 62 55.081757
-77 63 23.537205
-77 64 9.433981
-77 65 23.430749
-77 66 37.536649
-77 67 31.400637
-77 68 30.265492
-77 69 52.000000
-77 70 49.406477
-77 71 62.241465
-77 72 43.289722
-77 73 53.084838
-77 74 75.286121
-77 75 40.792156
-77 76 55.443665
-77 78 38.078866
-77 79 68.117545
-77 80 77.794601
-77 81 37.336309
-77 82 47.296934
-77 83 45.276926
-77 84 29.832868
-77 85 17.262677
-77 86 11.401754
-77 87 40.804412
-77 88 49.477268
-77 89 58.412327
-77 90 9.899495
-77 91 41.880783
-77 92 31.953091
-77 93 31.780497
-77 94 40.012498
-77 95 36.124784
-77 96 25.317978
-77 97 42.296572
-77 98 56.320511
-77 99 52.497619
-77 100 41.048752
-77 101 62.177166
-78 1 49.979996
-78 2 82.024387
-78 3 72.006944
-78 4 82.006097
-78 5 77.058419
-78 6 82.054860
-78 7 72.173402
-78 8 72.443081
-78 9 77.414469
-78 10 34.539832
-78 11 39.217343
-78 12 39.924930
-78 13 44.598206
-78 14 36.715120
-78 15 45.694639
-78 16 42.544095
-78 17 43.566042
-78 18 47.885280
-78 19 21.095023
-78 20 20.248457
-78 21 22.472205
-78 22 17.117243
-78 23 20.808652
-78 24 15.132746
-78 25 19.209373
-78 26 12.165525
-78 27 76.896034
-78 28 78.790862
-78 29 74.094534
-78 30 74.249579
-78 31 70.384657
-78 32 72.449983
-78 33 69.462220
-78 34 65.787537
-78 35 69.771054
-78 36 93.059121
-78 37 92.130342
-78 38 89.470666
-78 39 86.313383
-78 40 85.428333
-78 41 89.961103
-78 42 80.056230
-78 43 83.384651
-78 44 88.022724
-78 45 85.234969
-78 46 79.056942
-78 47 77.162167
-78 48 46.957428
-78 49 19.104973
-78 50 21.023796
-78 51 58.523500
-78 52 36.235342
-78 53 27.073973
-78 54 47.095647
-78 55 65.368188
-78 56 57.428216
-78 57 41.868843
-78 58 23.086793
-78 59 10.630146
-78 60 21.400935
-78 61 57.558666
-78 62 65.787537
-78 63 52.801515
-78 64 45.310043
-78 65 34.828150
-78 66 38.897301
-78 67 38.470768
-78 68 56.586217
-78 69 59.481089
-78 70 49.648766
-78 71 67.082039
-78 72 66.843100
-78 73 73.783467
-78 74 60.745370
-78 75 17.262677
-78 76 18.110770
-78 77 38.078866
-78 79 55.081757
-78 80 67.186308
-78 81 50.119856
-78 82 60.835845
-78 83 40.199502
-78 84 31.304952
-78 85 42.801869
-78 86 44.721360
-78 87 21.095023
-78 88 23.706539
-78 89 55.009090
-78 90 44.045431
-78 91 46.173586
-78 92 46.872167
-78 93 50.000000
-78 94 62.008064
-78 95 56.400355
-78 96 47.381431
-78 97 60.207973
-78 98 24.207437
-78 99 49.091751
-78 100 32.140317
-78 101 64.498062
-79 1 32.557641
-79 2 33.615473
-79 3 23.600847
-79 4 32.202484
-79 5 26.832816
-79 6 31.384710
-79 7 21.470911
-79 8 20.248457
-79 9 25.000000
-79 10 21.095023
-79 11 16.124515
-79 12 16.000000
-79 13 11.000000
-79 14 21.213203
-79 15 11.401754
-79 16 17.088007
-79 17 17.888544
-79 18 13.601471
-79 19 62.425956
-79 20 57.201399
-79 21 53.263496
-79 22 60.207973
-79 23 52.009614
-79 24 59.169249
-79 25 50.803543
-79 26 57.706152
-79 27 90.801982
-79 28 89.498603
-79 29 87.931792
-79 30 84.646323
-79 31 84.118963
-79 32 82.710338
-79 33 83.168504
-79 34 83.006024
-79 35 79.812280
-79 36 65.741920
-79 37 63.953108
-79 38 62.649820
-79 39 59.093147
-79 40 57.271284
-79 41 59.539903
-79 42 53.488316
-79 43 52.773099
-79 44 55.226805
-79 45 53.712196
-79 46 28.635642
-79 47 26.000000
-79 48 12.529964
-79 49 61.294372
-79 50 55.605755
-79 51 67.357256
-79 52 59.203040
-79 53 31.064449
-79 54 13.416408
-79 55 47.169906
-79 56 22.360680
-79 57 46.957428
-79 58 38.013156
-79 59 46.529560
-79 60 36.055513
-79 61 8.062258
-79 62 38.078866
-79 63 60.745370
-79 64 67.416615
-79 65 45.221676
-79 66 31.384710
-79 67 38.078866
-79 68 57.723479
-79 69 32.249031
-79 70 23.345235
-79 71 29.966648
-79 72 57.008771
-79 73 55.731499
-79 74 7.211103
-79 75 37.947332
-79 76 51.088159
-79 77 68.117545
-79 78 55.081757
-79 80 12.165525
-79 81 40.024992
-79 82 41.048752
-79 83 23.021729
-79 84 38.288379
-79 85 55.946403
-79 86 64.140471
-79 87 34.539832
-79 88 32.249031
-79 89 16.124515
-79 90 77.987178
-79 91 30.364453
-79 92 43.324358
-79 93 46.840154
-79 94 53.150729
-79 95 49.648766
-79 96 51.623638
-79 97 47.042534
-79 98 38.209946
-79 99 18.439089
-79 100 27.658633
-79 101 25.495098
-80 1 38.470768
-80 2 25.495098
-80 3 17.464249
-80 4 23.345235
-80 5 18.439089
-80 6 22.022716
-80 7 13.892444
-80 8 11.401754
-80 9 15.000000
-80 10 33.241540
-80 11 28.284271
-80 12 28.071338
-80 13 23.086793
-80 14 33.015148
-80 15 23.021729
-80 16 28.284271
-80 17 28.635642
-80 18 23.769729
-80 19 73.573093
-80 20 68.264193
-80 21 64.070274
-80 22 71.589105
-80 23 62.968246
-80 24 70.661163
-80 25 61.911227
-80 26 69.354164
-80 27 96.772930
-80 28 94.921020
-80 29 94.021274
-80 30 90.249654
-80 31 90.376988
-80 32 88.391176
-80 33 89.470666
-80 34 89.944427
-80 35 85.615419
-80 36 63.324561
-80 37 61.400326
-80 38 60.638272
-80 39 57.271284
-80 40 55.317267
-80 41 56.612719
-80 42 52.469038
-80 43 50.447993
-80 44 51.865210
-80 45 50.960769
-80 46 19.798990
-80 47 16.970563
-80 48 23.345235
-80 49 72.560320
-80 50 66.573268
-80 51 73.790243
-80 52 68.593003
-80 53 42.485292
-80 54 22.803509
-80 55 49.648766
-80 56 25.298221
-80 57 55.000000
-80 58 49.244289
-80 59 58.694122
-80 60 48.166378
-80 61 12.041595
-80 62 39.115214
-80 63 67.601775
-80 64 76.059187
-80 65 54.451814
-80 66 40.311289
-80 67 46.754679
-80 68 63.560994
-80 69 34.928498
-80 70 29.681644
-80 71 29.017236
-80 72 60.415230
-80 73 57.078893
-80 74 8.944272
-80 75 50.000000
-80 76 63.007936
-80 77 77.794601
-80 78 67.186308
-80 79 12.165525
-80 81 46.065171
-80 82 44.147480
-80 83 32.649655
-80 84 48.270074
-80 85 64.202804
-80 86 72.622311
-80 87 46.486557
-80 88 44.407207
-80 89 20.591260
-80 90 87.692645
-80 91 37.443290
-80 92 50.249378
-80 93 53.235327
-80 94 57.280014
-80 95 54.781384
-80 96 58.830264
-80 97 50.960769
-80 98 50.039984
-80 99 25.612497
-80 100 38.587563
-80 101 25.019992
-81 1 7.615773
-81 2 43.908997
-81 3 37.536649
-81 4 45.486262
-81 5 42.638011
-81 6 46.615448
-81 7 40.311289
-81 8 42.520583
-81 9 45.967380
-81 10 38.897301
-81 11 37.656341
-81 12 39.623226
-81 13 39.051248
-81 14 43.680659
-81 15 42.047592
-81 16 45.541190
-81 17 47.518417
-81 18 47.042534
-81 19 42.107007
-81 20 37.336309
-81 21 32.388269
-81 22 42.579338
-81 23 32.756679
-81 24 42.953463
-81 25 33.241540
-81 26 43.680659
-81 27 50.921508
-81 28 49.477268
-81 29 48.104054
-81 30 44.643029
-81 31 44.384682
-81 32 42.720019
-81 33 43.462628
-81 34 43.908997
-81 35 39.849718
-81 36 42.941821
-81 37 42.047592
-81 38 39.357337
-81 39 36.249138
-81 40 35.468296
-81 41 40.162171
-81 42 30.083218
-81 43 33.955854
-81 44 38.832976
-81 45 35.902646
-81 46 44.204072
-81 47 43.931765
-81 48 45.044423
-81 49 42.296572
-81 50 35.355339
-81 51 27.730849
-81 52 28.160256
-81 53 27.802878
-81 54 27.166155
-81 55 15.264338
-81 56 21.400935
-81 57 12.369317
-81 58 27.802878
-81 59 48.918299
-81 60 45.803930
-81 61 34.539832
-81 62 18.110770
-81 63 21.633308
-81 64 32.449961
-81 65 17.117243
-81 66 13.892444
-81 67 11.661904
-81 68 17.720045
-81 69 14.764823
-81 70 16.763055
-81 71 25.059928
-81 72 19.697716
-81 73 24.083189
-81 74 46.840154
-81 75 38.183766
-81 76 59.396970
-81 77 37.336309
-81 78 50.119856
-81 79 40.024992
-81 80 46.065171
-81 82 11.180340
-81 83 20.396078
-81 84 18.867962
-81 85 20.591260
-81 86 28.844410
-81 87 34.713110
-81 88 41.880783
-81 89 25.495098
-81 90 46.518813
-81 91 10.000000
-81 92 5.385165
-81 93 7.211103
-81 94 14.866069
-81 95 10.049876
-81 96 13.453624
-81 97 10.630146
-81 98 51.865210
-81 99 21.587033
-81 100 24.186773
-81 101 25.612497
-82 1 12.041595
-82 2 36.124784
-82 3 31.906112
-82 4 38.183766
-82 5 36.400549
-82 6 39.623226
-82 7 35.355339
-82 8 38.013156
-82 9 40.496913
-82 10 45.276926
-82 11 42.953463
-82 12 44.777226
-82 13 43.011626
-82 14 49.648766
-82 15 45.880279
-82 16 50.328918
-82 17 52.201533
-82 18 50.695167
-82 19 53.235327
-82 20 48.507731
-82 21 43.566042
-82 22 53.758720
-82 23 43.931765
-82 24 54.129474
-82 25 44.384682
-82 26 54.817880
-82 27 53.851648
-82 28 51.429563
-82 29 51.312766
-82 30 47.010637
-82 31 48.010416
-82 32 45.276926
-82 33 47.201695
-82 34 48.836462
-82 35 42.720019
-82 36 32.449961
-82 37 31.384710
-82 38 28.844410
-82 39 25.553865
-82 40 24.596748
-82 41 29.154759
-82 42 19.235384
-82 43 22.803509
-82 44 27.658633
-82 45 24.738634
-82 46 37.643060
-82 47 38.013156
-82 48 48.764741
-82 49 53.460266
-82 50 46.529560
-82 51 32.526912
-82 52 38.470768
-82 53 36.878178
-82 54 30.083218
-82 55 6.324555
-82 56 19.104973
-82 57 23.021729
-82 58 38.078866
-82 59 58.821765
-82 60 54.451814
-82 61 34.058773
-82 62 8.062258
-82 63 28.017851
-82 64 41.231056
-82 65 28.284271
-82 66 22.803509
-82 67 22.472205
-82 68 21.931712
-82 69 9.219544
-82 70 18.973666
-82 71 17.804494
-82 72 16.278821
-82 73 15.652476
-82 74 47.042534
-82 75 47.801674
-82 76 68.883960
-82 77 47.296934
-82 78 60.835845
-82 79 41.048752
-82 80 44.147480
-82 81 11.180340
-82 83 26.627054
-82 84 29.546573
-82 85 30.083218
-82 86 37.696154
-82 87 44.045431
-82 88 50.249378
-82 89 25.000000
-82 90 55.973208
-82 91 16.278821
-82 92 16.000000
-82 93 15.524175
-82 94 13.416408
-82 95 12.806248
-82 96 22.135944
-82 97 7.211103
-82 98 60.207973
-82 99 23.769729
-82 100 32.526912
-82 101 20.124612
-83 1 14.764823
-83 2 42.047592
-83 3 32.388269
-83 4 42.296572
-83 5 37.656341
-83 6 42.579338
-83 7 33.241540
-83 8 34.176015
-83 9 38.897301
-83 10 18.788294
-83 11 17.262677
-83 12 19.235384
-83 13 19.104973
-83 14 23.409400
-83 15 22.090722
-83 16 25.179357
-83 17 27.166155
-83 18 27.073973
-83 19 41.629317
-83 20 36.249138
-83 21 31.764760
-83 22 40.162171
-83 23 30.870698
-83 24 39.560081
-83 25 30.083218
-83 26 38.832976
-83 27 69.231496
-83 28 68.468971
-83 29 66.287254
-83 30 63.505905
-83 31 62.369865
-83 32 61.522354
-83 33 61.392182
-83 34 60.728906
-83 35 58.549125
-83 36 58.000000
-83 37 56.639209
-83 38 54.451814
-83 39 50.931326
-83 40 49.578221
-83 41 53.413481
-83 42 44.553339
-83 43 46.400431
-83 44 50.477718
-83 45 48.010416
-83 46 39.623226
-83 47 38.078866
-83 48 25.079872
-83 49 40.853396
-83 50 34.438351
-83 51 45.705580
-83 52 36.235342
-83 53 13.152946
-83 54 9.899495
-83 55 32.756679
-83 56 17.262677
-83 57 24.351591
-83 58 18.248288
-83 59 35.114100
-83 60 28.600699
-83 61 20.808652
-83 62 28.425341
-83 63 38.832976
-83 64 44.418465
-83 65 22.203603
-83 66 8.544004
-83 67 15.231546
-83 68 37.013511
-83 69 21.400935
-83 70 9.848858
-83 71 27.202941
-83 72 39.849718
-83 73 42.190046
-83 74 30.232433
-83 75 24.041631
-83 76 43.908997
-83 77 45.276926
-83 78 40.199502
-83 79 23.021729
-83 80 32.649655
-83 81 20.396078
-83 82 26.627054
-83 84 15.620499
-83 85 33.105891
-83 86 41.182521
-83 87 19.924859
-83 88 24.207437
-83 89 15.297059
-83 90 55.172457
-83 91 10.770330
-83 92 22.022716
-83 93 26.000000
-83 94 35.171011
-83 95 30.413813
-83 96 29.614186
-83 97 30.083218
-83 98 33.970576
-83 99 9.055385
-83 100 8.062258
-83 101 24.331050
-84 1 19.235384
-84 2 55.317267
-84 3 46.486557
-84 4 56.044625
-84 5 51.865210
-84 6 56.612719
-84 7 47.927028
-84 8 49.193496
-84 9 53.712196
-84 10 27.294688
-84 11 28.460499
-84 12 30.364453
-84 13 32.202484
-84 14 32.249031
-84 15 34.928498
-84 16 36.138622
-84 17 38.078866
-84 18 39.560081
-84 19 26.925824
-84 20 21.587033
-84 21 16.763055
-84 22 26.172505
-84 23 16.278821
-84 24 26.019224
-84 25 16.031220
-84 26 26.076810
-84 27 58.008620
-84 28 58.137767
-84 29 55.009090
-84 30 53.150729
-84 31 51.009803
-84 32 51.156622
-84 33 50.009999
-84 34 48.373546
-84 35 48.166378
-84 36 61.773781
-84 37 60.827625
-84 38 58.180753
-84 39 55.009090
-84 40 54.129474
-84 41 58.694122
-84 42 48.754487
-84 43 52.201533
-84 44 56.920998
-84 45 54.083269
-84 46 53.758720
-84 47 52.554733
-84 48 37.696154
-84 49 26.476405
-84 50 19.646883
-84 51 35.227830
-84 52 21.095023
-84 53 12.041595
-84 54 25.495098
-84 55 34.132096
-84 56 29.832868
-84 57 13.601471
-84 58 9.219544
-84 59 30.413813
-84 60 29.154759
-84 61 36.400549
-84 62 34.928498
-84 63 28.284271
-84 64 30.083218
-84 65 8.062258
-84 66 9.219544
-84 67 7.211103
-84 68 29.154759
-84 69 29.154759
-84 70 21.840330
-84 71 38.052595
-84 72 36.878178
-84 73 42.801869
-84 74 45.453273
-84 75 20.248457
-84 76 41.231056
-84 77 29.832868
-84 78 31.304952
-84 79 38.288379
-84 80 48.270074
-84 81 18.867962
-84 82 29.546573
-84 83 15.620499
-84 85 20.099751
-84 86 27.202941
-84 87 17.464249
-84 88 25.961510
-84 89 29.966648
-84 90 39.698866
-84 91 16.000000
-84 92 16.278821
-84 93 20.000000
-84 94 31.890437
-84 95 26.248809
-84 96 19.924859
-84 97 29.206164
-84 98 35.468296
-84 99 23.706539
-84 100 11.704700
-84 101 36.496575
-85 1 27.018512
-85 2 64.498062
-85 3 57.801384
-85 4 66.037868
-85 5 63.007936
-85 6 67.119297
-85 7 60.307545
-85 8 62.289646
-85 9 66.068147
-85 10 47.381431
-85 11 48.270074
-85 12 50.219518
-85 13 51.546096
-85 14 52.345009
-85 15 54.405882
-85 16 56.089215
-85 17 58.051701
-85 18 59.203040
-85 19 27.294688
-85 20 24.207437
-85 21 20.518285
-85 22 29.410882
-85 23 22.022716
-85 24 30.610456
-85 25 23.600847
-85 26 32.557641
-85 27 38.013156
-85 28 38.470768
-85 29 35.014283
-85 30 33.541020
-85 31 31.016125
-85 32 31.575307
-85 33 30.016662
-85 34 28.284271
-85 35 28.635642
-85 36 56.885851
-85 37 56.568542
-85 38 53.600373
-85 39 51.244512
-85 40 51.088159
-85 41 56.080300
-85 42 46.010868
-85 43 51.039201
-85 44 56.035703
-85 45 53.037722
-85 46 64.637450
-85 47 64.202804
-85 48 57.280014
-85 49 28.301943
-85 50 22.671568
-85 51 16.155494
-85 52 9.219544
-85 53 32.015621
-85 54 42.544095
-85 55 31.064449
-85 56 41.109610
-85 57 9.219544
-85 58 27.294688
-85 59 46.097722
-85 60 47.853944
-85 61 52.201533
-85 62 37.947332
-85 63 10.000000
-85 64 12.041595
-85 65 12.041595
-85 66 24.596748
-85 67 17.888544
-85 68 14.764823
-85 69 35.355339
-85 70 34.713110
-85 71 45.650849
-85 72 27.202941
-85 73 36.496575
-85 74 63.134776
-85 75 38.078866
-85 76 57.271284
-85 77 17.262677
-85 78 42.801869
-85 79 55.946403
-85 80 64.202804
-85 81 20.591260
-85 82 30.083218
-85 83 33.105891
-85 84 20.099751
-85 86 8.485281
-85 87 36.345564
-85 88 45.276926
-85 89 43.931765
-85 90 26.000000
-85 91 26.907248
-85 92 15.264338
-85 93 14.560220
-85 94 23.345235
-85 95 19.000000
-85 96 8.062258
-85 97 25.079872
-85 98 54.129474
-85 99 38.600518
-85 100 31.575307
-85 101 46.043458
-86 1 35.468296
-86 2 72.718636
-86 3 66.219333
-86 4 74.330344
-86 5 71.400280
-86 6 75.451971
-86 7 68.767725
-86 8 70.767224
-86 9 74.518454
-86 10 54.341513
-86 11 55.659680
-86 12 57.567352
-86 13 59.236813
-86 14 59.228372
-86 15 62.032250
-86 16 63.324561
-86 17 65.253352
-86 18 66.730802
-86 19 26.172505
-86 20 24.698178
-86 21 22.472205
-86 22 29.206164
-86 23 24.351591
-86 24 30.805844
-86 25 26.248809
-86 26 33.286634
-86 27 32.756679
-86 28 34.176015
-86 29 29.832868
-86 30 29.546573
-86 31 25.961510
-86 32 27.730849
-86 33 25.000000
-86 34 22.090722
-86 35 25.059928
-86 36 62.128898
-86 37 62.032250
-86 38 59.033889
-86 39 57.008771
-86 40 57.078893
-86 41 62.072538
-86 42 52.239832
-86 43 57.558666
-86 44 62.513998
-86 45 59.539903
-86 46 73.006849
-86 47 72.622311
-86 48 64.845971
-86 49 27.658633
-86 50 23.706539
-86 51 15.000000
-86 52 8.544004
-86 53 38.639358
-86 54 50.774009
-86 55 37.854986
-86 56 49.578221
-86 57 17.691806
-86 58 33.060551
-86 59 49.729267
-86 60 53.084838
-86 61 60.605280
-86 62 45.694639
-86 63 12.165525
-86 64 3.605551
-86 65 19.313208
-86 66 32.756679
-86 67 26.076810
-86 68 19.026298
-86 69 43.566042
-86 70 43.185646
-86 71 53.851648
-86 72 32.062439
-86 73 42.000000
-86 74 71.344236
-86 75 43.104524
-86 76 60.728906
-86 77 11.401754
-86 78 44.721360
-86 79 64.140471
-86 80 72.622311
-86 81 28.844410
-86 82 37.696154
-86 83 41.182521
-86 84 27.202941
-86 85 8.485281
-86 87 42.011903
-86 88 51.009803
-86 89 52.402290
-86 90 18.439089
-86 91 35.383612
-86 92 23.600847
-86 93 22.360680
-86 94 29.068884
-86 95 25.709920
-86 96 15.652476
-86 97 32.015621
-86 98 59.211485
-86 99 47.010637
-86 100 38.897301
-86 101 54.405882
-87 1 32.202484
-87 2 61.131007
-87 3 51.009803
-87 4 61.008196
-87 5 56.008928
-87 6 61.008196
-87 7 51.088159
-87 8 51.351728
-87 9 56.320511
-87 10 15.556349
-87 11 19.416488
-87 12 20.615528
-87 13 24.698178
-87 14 19.416488
-87 15 26.400758
-87 16 24.839485
-87 17 26.400758
-87 18 29.698485
-87 19 29.832868
-87 20 25.238859
-87 21 22.847319
-87 22 26.870058
-87 23 21.023796
-87 24 25.495098
-87 25 19.235384
-87 26 23.600847
-87 27 74.242845
-87 28 74.813100
-87 29 71.253070
-87 30 69.871310
-87 31 67.268120
-87 32 67.896981
-87 33 66.272166
-87 34 64.007812
-87 35 64.938432
-87 36 76.400262
-87 37 75.213031
-87 38 72.801099
-87 39 69.404611
-87 40 68.242216
-87 41 72.401657
-87 42 63.007936
-87 43 65.513357
-87 44 69.835521
-87 45 67.230945
-87 46 58.008620
-87 47 56.080300
-87 48 28.319605
-87 49 28.319605
-87 50 24.186773
-87 51 52.172790
-87 52 34.234486
-87 53 7.211103
-87 54 26.019224
-87 55 49.517674
-87 56 37.107951
-87 57 31.016125
-87 58 9.055385
-87 59 15.231546
-87 60 11.704700
-87 61 36.496575
-87 62 47.507894
-87 63 45.354162
-87 64 44.181444
-87 65 24.738634
-87 66 21.260292
-87 67 23.853721
-87 68 46.615448
-87 69 40.706265
-87 70 29.732137
-87 71 47.127487
-87 72 53.823787
-87 73 58.694122
-87 74 40.706265
-87 75 4.123106
-87 76 24.839485
-87 77 40.804412
-87 78 21.095023
-87 79 34.539832
-87 80 46.486557
-87 81 34.713110
-87 82 44.045431
-87 83 19.924859
-87 84 17.464249
-87 85 36.345564
-87 86 42.011903
-87 88 9.000000
-87 89 34.132096
-87 90 49.769469
-87 91 28.017851
-87 92 33.286634
-87 93 37.215588
-87 94 48.826222
-87 95 43.266615
-87 96 37.336309
-87 97 45.343136
-87 98 18.027756
-87 99 28.442925
-87 100 12.083046
-87 101 44.147480
-88 1 38.209946
-88 2 62.369865
-88 3 51.971146
-88 4 61.814238
-88 5 56.568542
-88 6 61.522354
-88 7 51.351728
-88 8 51.088159
-88 9 56.080300
-88 10 11.180340
-88 11 16.124515
-88 12 16.492423
-88 13 21.377558
-88 14 13.038405
-88 15 22.135944
-88 16 18.867962
-88 17 20.000000
-88 18 24.186773
-88 19 37.215588
-88 20 33.105891
-88 21 31.320920
-88 22 33.837849
-88 23 29.410882
-88 24 32.202484
-88 25 27.513633
-88 26 29.832868
-88 27 83.216585
-88 28 83.725743
-88 29 80.224684
-88 30 78.771822
-88 31 76.236474
-88 32 76.791927
-88 33 75.239617
-88 34 73.006849
-88 35 73.824115
-88 36 82.134037
-88 37 80.808415
-88 38 78.568442
-88 39 75.073298
-88 40 73.756356
-88 41 77.620873
-88 42 68.680419
-88 43 70.604532
-88 44 74.632433
-88 45 72.201108
-88 46 58.549125
-88 47 56.320511
-88 48 23.259407
-88 49 35.510562
-88 50 32.310989
-88 51 61.000000
-88 52 43.185646
-88 53 14.317821
-88 54 27.202941
-88 55 56.080300
-88 56 40.249224
-88 57 39.560081
-88 58 18.027756
-88 59 14.317821
-88 60 4.472136
-88 61 36.124784
-88 62 52.630789
-88 63 54.129474
-88 64 53.150729
-88 65 33.541020
-88 66 28.017851
-88 67 31.780497
-88 68 55.027266
-88 69 45.607017
-88 70 33.837849
-88 71 50.537115
-88 72 61.400326
-88 73 65.436993
-88 74 37.363083
-88 75 8.944272
-88 76 20.248457
-88 77 49.477268
-88 78 23.706539
-88 79 32.249031
-88 80 44.407207
-88 81 41.880783
-88 82 50.249378
-88 83 24.207437
-88 84 25.961510
-88 85 45.276926
-88 86 51.009803
-88 87 9.000000
-88 89 36.055513
-88 90 58.189346
-88 91 33.970576
-88 92 41.146081
-88 93 45.188494
-88 94 56.435804
-88 95 51.000000
-88 96 45.880279
-88 97 52.430907
-88 98 10.000000
-88 99 31.304952
-88 100 17.804494
-88 101 47.010637
-89 1 17.888544
-89 2 27.018512
-89 3 17.117243
-89 4 27.073973
-89 5 22.360680
-89 6 27.294688
-89 7 18.027756
-89 8 19.235384
-89 9 23.769729
-89 10 26.925824
-89 11 22.803509
-89 12 24.083189
-89 13 20.615528
-89 14 29.832868
-89 15 23.021729
-89 16 28.425341
-89 17 30.000000
-89 18 27.294688
-89 19 56.648036
-89 20 51.264022
-89 21 46.615448
-89 22 55.362442
-89 23 45.880279
-89 24 54.817880
-89 25 45.221676
-89 26 54.129474
-89 27 76.321688
-89 28 74.632433
-89 29 73.539105
-89 30 69.892775
-89 31 69.856997
-89 32 68.007353
-89 33 68.942005
-89 34 69.354164
-89 35 65.192024
-89 36 50.774009
-89 37 49.091751
-89 38 47.507894
-89 39 43.908997
-89 40 42.190046
-89 41 45.000000
-89 42 38.013156
-89 43 38.013156
-89 44 41.109610
-89 45 39.204592
-89 46 24.331050
-89 47 22.803509
-89 48 25.553865
-89 49 55.973208
-89 50 49.396356
-89 51 53.225934
-89 52 49.040799
-89 53 28.017851
-89 54 8.944272
-89 55 31.064449
-89 56 6.324555
-89 57 34.713110
-89 58 33.541020
-89 59 48.836462
-89 60 40.496913
-89 61 9.219544
-89 62 22.135944
-89 63 47.010637
-89 64 55.901699
-89 65 35.000000
-89 66 21.095023
-89 67 27.018512
-89 68 43.081318
-89 69 16.124515
-89 70 9.219544
-89 71 15.556349
-89 72 41.109610
-89 73 39.623226
-89 74 22.090722
-89 75 38.209946
-89 76 56.302753
-89 77 58.412327
-89 78 55.009090
-89 79 16.124515
-89 80 20.591260
-89 81 25.495098
-89 82 25.000000
-89 83 15.297059
-89 84 29.966648
-89 85 43.931765
-89 86 52.402290
-89 87 34.132096
-89 88 36.055513
-89 90 68.249542
-89 91 17.029386
-89 92 29.681644
-89 93 32.649655
-89 94 37.483330
-89 95 34.481879
-89 96 38.275318
-89 97 31.256999
-89 98 44.721360
-89 99 6.324555
-89 100 23.086793
-89 101 11.401754
-90 1 52.478567
-90 2 90.354856
-90 3 83.216585
-90 4 91.787799
-90 5 88.509886
-90 6 92.784697
-90 7 85.445889
-90 8 87.200917
-90 9 91.263355
-90 10 64.412732
-90 11 66.887966
-90 12 68.600292
-90 13 71.281134
-90 14 68.876701
-90 15 73.783467
-90 16 73.824115
-90 17 75.591005
-90 18 78.032045
-90 19 23.000000
-90 20 25.495098
-90 21 26.925824
-90 22 27.000000
-90 23 28.792360
-90 24 29.000000
-90 25 30.675723
-90 26 32.000000
-90 27 37.536649
-90 28 41.036569
-90 29 35.355339
-90 30 37.802116
-90 31 32.649655
-90 32 36.619667
-90 33 32.015621
-90 34 26.907248
-90 35 34.985711
-90 36 80.000000
-90 37 80.024996
-90 38 77.025970
-90 39 75.166482
-90 40 75.325958
-90 41 80.305666
-90 42 70.576200
-90 43 75.953933
-90 44 80.894994
-90 45 77.929455
-90 46 90.210864
-90 47 89.587946
-90 48 76.321688
-90 49 25.000000
-90 50 25.961510
-90 51 30.413813
-90 52 19.209373
-90 53 48.877398
-90 54 65.069194
-90 55 56.293872
-90 56 66.287254
-90 57 34.481879
-90 58 42.059482
-90 59 52.239832
-90 60 58.940648
-90 61 75.690158
-90 62 63.906181
-90 63 30.066593
-90 64 15.132746
-90 65 33.301652
-90 66 47.423623
-90 67 41.231056
-90 68 37.121422
-90 69 61.269895
-90 70 59.203040
-90 71 71.554175
-90 72 50.039984
-90 73 60.133186
-90 74 85.146932
-90 75 49.335586
-90 76 62.000000
-90 77 9.899495
-90 78 44.045431
-90 79 77.987178
-90 80 87.692645
-90 81 46.518813
-90 82 55.973208
-90 83 55.172457
-90 84 39.698866
-90 85 26.000000
-90 86 18.439089
-90 87 49.769469
-90 88 58.189346
-90 89 68.249542
-90 91 51.613952
-90 92 41.146081
-90 93 40.496913
-90 94 47.381431
-90 95 44.147480
-90 96 33.837849
-90 97 50.447993
-90 98 64.327288
-90 99 62.369865
-90 100 50.803543
-90 101 71.693793
-91 1 4.242641
-91 2 39.849718
-91 3 31.764760
-91 4 40.853396
-91 5 37.121422
-91 6 41.629317
-91 7 33.837849
-91 8 35.608988
-91 9 39.661064
-91 10 29.546573
-91 11 27.892651
-91 12 29.832868
-91 13 29.068884
-91 14 34.176015
-91 15 32.062439
-91 16 35.693137
-91 17 37.656341
-91 18 37.054015
-91 19 42.579338
-91 20 37.336309
-91 21 32.388269
-91 22 42.107007
-91 23 32.140317
-91 24 42.011903
-91 25 32.015621
-91 26 42.047592
-91 27 60.440053
-91 28 59.228372
-91 29 57.567352
-91 30 54.341513
-91 31 53.758720
-91 32 52.392748
-91 33 52.810984
-91 34 52.801515
-91 35 49.477268
-91 36 48.414874
-91 37 47.201695
-91 38 44.821870
-91 39 41.400483
-91 40 40.224371
-91 41 44.418465
-91 42 35.000000
-91 43 37.589892
-91 44 42.047592
-91 45 39.357337
-91 46 38.910153
-91 47 38.078866
-91 48 35.057096
-91 49 42.296572
-91 50 35.355339
-91 51 37.000000
-91 52 32.449961
-91 53 20.808652
-91 54 17.262677
-91 55 22.203603
-91 56 14.764823
-91 57 17.691806
-91 58 23.086793
-91 59 43.046487
-91 60 38.183766
-91 61 25.553865
-91 62 19.697716
-91 63 30.463092
-91 64 38.897301
-91 65 18.788294
-91 66 7.280110
-91 67 10.770330
-91 68 27.459060
-91 69 13.341664
-91 70 7.810250
-91 71 22.090722
-91 72 29.120440
-91 73 31.622777
-91 74 37.336309
-91 75 31.906112
-91 76 52.801515
-91 77 41.880783
-91 78 46.173586
-91 79 30.364453
-91 80 37.443290
-91 81 10.000000
-91 82 16.278821
-91 83 10.770330
-91 84 16.000000
-91 85 26.907248
-91 86 35.383612
-91 87 28.017851
-91 88 33.970576
-91 89 17.029386
-91 90 51.613952
-91 92 13.000000
-91 93 16.492423
-91 94 24.515301
-91 95 20.024984
-91 96 21.470911
-91 97 19.313208
-91 98 43.931765
-91 99 12.083046
-91 100 16.278821
-91 101 20.880613
-92 1 12.041595
-92 2 49.244289
-92 3 42.638011
-92 4 50.774009
-92 5 47.801674
-92 6 51.865210
-92 7 45.276926
-92 8 47.381431
-92 9 50.990195
-92 10 39.623226
-92 11 39.051248
-92 12 41.048752
-92 13 41.109610
-92 14 44.553339
-92 15 44.102154
-92 16 47.042534
-92 17 49.040799
-92 18 49.091751
-92 19 37.336309
-92 20 32.756679
-92 21 27.892651
-92 22 38.078866
-92 23 28.460499
-92 24 38.600518
-92 25 29.154759
-92 26 39.560081
-92 27 47.539457
-92 28 46.529560
-92 29 44.643029
-92 30 41.593269
-92 31 40.804412
-92 32 39.623226
-92 33 39.849718
-92 34 39.812058
-92 35 36.674242
-92 36 46.615448
-92 37 45.880279
-92 38 43.081318
-92 39 40.162171
-92 40 39.560081
-92 41 44.384682
-92 42 34.205263
-92 43 38.470768
-92 44 43.416587
-92 45 40.447497
-92 46 49.406477
-92 47 49.040799
-92 48 47.095647
-92 49 37.656341
-92 50 30.805844
-92 51 24.041631
-92 52 22.803509
-92 53 26.832816
-92 54 30.083218
-92 55 18.973666
-92 56 26.172505
-92 57 7.071068
-92 58 25.495098
-92 59 46.690470
-92 60 44.777226
-92 61 38.470768
-92 62 23.345235
-92 63 17.464249
-92 64 27.202941
-92 65 12.649111
-92 66 14.142136
-92 67 9.433981
-92 68 15.000000
-92 69 20.124612
-92 70 20.591260
-92 71 30.413813
-92 72 20.615528
-92 73 26.925824
-92 74 50.328918
-92 75 36.400549
-92 76 57.489129
-92 77 31.953091
-92 78 46.872167
-92 79 43.324358
-92 80 50.249378
-92 81 5.385165
-92 82 16.000000
-92 83 22.022716
-92 84 16.278821
-92 85 15.264338
-92 86 23.600847
-92 87 33.286634
-92 88 41.146081
-92 89 29.681644
-92 90 41.146081
-92 91 13.000000
-92 93 4.123106
-92 94 15.620499
-92 95 10.000000
-92 96 8.602325
-92 97 13.416408
-92 98 51.000000
-92 99 25.079872
-92 100 24.041631
-92 101 30.805844
-93 1 14.764823
-93 2 50.477718
-93 3 44.553339
-93 4 52.201533
-93 5 49.578221
-93 6 53.413481
-93 7 47.423623
-93 8 49.678969
-93 9 53.037722
-93 10 43.737855
-93 11 43.104524
-93 12 45.099889
-93 13 45.044423
-93 14 48.662100
-93 15 48.041649
-93 16 51.088159
-93 17 53.084838
-93 18 53.037722
-93 19 39.051248
-93 20 34.785054
-93 21 30.083218
-93 22 40.162171
-93 23 30.870698
-93 24 40.853396
-93 25 31.764760
-93 26 42.047592
-93 27 43.965896
-93 28 42.755117
-93 29 41.109610
-93 30 37.854986
-93 31 37.336309
-93 32 35.902646
-93 33 36.400549
-93 34 36.715120
-93 35 32.984845
-93 36 44.271887
-93 37 43.680659
-93 38 40.804412
-93 39 38.078866
-93 40 37.656341
-93 41 42.579338
-93 42 32.388269
-93 43 37.054015
-93 44 42.047592
-93 45 39.051248
-93 46 51.088159
-93 47 50.931326
-93 48 51.039201
-93 49 39.560081
-93 50 32.893768
-93 51 20.615528
-93 52 23.086793
-93 53 30.870698
-93 54 33.734256
-93 55 17.117243
-93 56 28.600699
-93 57 8.544004
-93 58 29.206164
-93 59 50.328918
-93 60 48.764741
-93 61 41.629317
-93 62 23.409400
-93 63 14.422205
-93 64 25.942244
-93 65 15.264338
-93 66 18.248288
-93 67 13.416408
-93 68 11.045361
-93 69 21.400935
-93 70 23.769729
-93 71 31.622777
-93 72 16.970563
-93 73 24.166092
-93 74 53.758720
-93 75 40.224371
-93 76 61.220911
-93 77 31.780497
-93 78 50.000000
-93 79 46.840154
-93 80 53.235327
-93 81 7.211103
-93 82 15.524175
-93 83 26.000000
-93 84 20.000000
-93 85 14.560220
-93 86 22.360680
-93 87 37.215588
-93 88 45.188494
-93 89 32.649655
-93 90 40.496913
-93 91 16.492423
-93 92 4.123106
-93 94 12.041595
-93 95 6.403124
-93 96 6.708204
-93 97 11.180340
-93 98 55.009090
-93 99 28.460499
-93 100 28.160256
-93 101 32.557641
-94 1 21.095023
-94 2 48.836462
-94 3 45.276926
-94 4 51.088159
-94 5 49.648766
-94 6 52.630789
-94 7 48.764741
-94 8 51.429563
-94 9 53.851648
-94 10 53.758720
-94 11 52.392748
-94 12 54.341513
-94 13 53.460266
-94 14 58.523500
-94 15 56.435804
-94 16 60.207973
-94 17 62.169124
-94 18 61.400326
-94 19 49.979996
-94 20 46.097722
-94 21 41.593269
-94 22 51.478151
-94 23 42.544095
-94 24 52.325902
-94 25 43.566042
-94 26 53.712196
-94 27 40.496913
-94 28 38.013156
-94 29 38.013156
-94 30 33.615473
-94 31 34.828150
-94 32 31.906112
-94 33 34.058773
-94 34 36.124784
-94 35 29.410882
-94 36 33.541020
-94 37 33.241540
-94 38 30.265492
-94 39 28.017851
-94 40 28.017851
-94 41 33.015148
-94 42 23.194827
-94 43 28.635642
-94 44 33.541020
-94 45 30.594117
-94 46 50.803543
-94 47 51.312766
-94 48 59.413803
-94 49 50.695167
-94 50 44.283180
-94 51 20.248457
-94 52 32.557641
-94 53 42.190046
-94 54 41.048752
-94 55 10.000000
-94 56 32.015621
-94 57 20.248457
-94 58 41.109610
-94 59 62.289646
-94 60 60.207973
-94 61 46.690470
-94 62 20.615528
-94 63 17.464249
-94 64 32.249031
-94 65 27.202941
-94 66 28.635642
-94 67 25.000000
-94 68 10.440307
-94 69 22.472205
-94 70 30.000000
-94 71 31.064449
-94 72 5.000000
-94 73 13.152946
-94 74 59.539903
-94 75 52.009614
-94 76 73.109507
-94 77 40.012498
-94 78 62.008064
-94 79 53.150729
-94 80 57.280014
-94 81 14.866069
-94 82 13.416408
-94 83 35.171011
-94 84 31.890437
-94 85 23.345235
-94 86 29.068884
-94 87 48.826222
-94 88 56.435804
-94 89 37.483330
-94 90 47.381431
-94 91 24.515301
-94 92 15.620499
-94 93 12.041595
-94 95 5.656854
-94 96 15.811388
-94 97 6.324555
-94 98 66.370174
-94 99 35.000000
-94 100 38.910153
-94 101 33.541020
-95 1 17.117243
-95 2 48.918299
-95 3 44.204072
-95 4 50.931326
-95 5 48.918299
-95 6 52.325902
-95 7 47.434165
-95 8 49.929951
-95 9 52.801515
-95 10 48.764741
-95 11 47.675990
-95 12 49.648766
-95 13 49.091751
-95 14 53.600373
-95 15 52.086467
-95 16 55.578773
-95 17 57.558666
-95 18 57.078893
-95 19 44.922155
-95 20 40.853396
-95 21 36.249138
-95 22 46.238512
-95 23 37.121422
-95 24 47.010637
-95 25 38.078866
-95 26 48.301139
-95 27 42.047592
-95 28 40.162171
-95 29 39.357337
-95 30 35.468296
-95 31 35.846897
-95 32 33.615473
-95 33 34.985711
-95 34 36.235342
-95 35 30.870698
-95 36 38.327536
-95 37 37.854986
-95 38 34.928498
-95 39 32.388269
-95 40 32.140317
-95 41 37.121422
-95 42 27.018512
-95 43 32.062439
-95 44 37.054015
-95 45 34.058773
-95 46 50.249378
-95 47 50.447993
-95 48 55.081757
-95 49 45.541190
-95 50 39.000000
-95 51 19.849433
-95 52 28.071338
-95 53 36.715120
-95 54 37.054015
-95 55 12.165525
-95 56 29.546573
-95 57 14.764823
-95 58 35.468296
-95 59 56.639209
-95 60 54.708317
-95 61 43.680659
-95 62 20.808652
-95 63 15.264338
-95 64 29.120440
-95 65 21.633308
-95 66 23.409400
-95 67 19.416488
-95 68 9.219544
-95 69 20.808652
-95 70 26.305893
-95 71 30.413813
-95 72 10.630146
-95 73 18.027756
-95 74 56.293872
-95 75 46.400431
-95 76 67.475922
-95 77 36.124784
-95 78 56.400355
-95 79 49.648766
-95 80 54.781384
-95 81 10.049876
-95 82 12.806248
-95 83 30.413813
-95 84 26.248809
-95 85 19.000000
-95 86 25.709920
-95 87 43.266615
-95 88 51.000000
-95 89 34.481879
-95 90 44.147480
-95 91 20.024984
-95 92 10.000000
-95 93 6.403124
-95 94 5.656854
-95 96 11.045361
-95 97 6.324555
-95 98 60.901560
-95 99 31.256999
-95 100 33.615473
-95 101 32.202484
-96 1 20.615528
-96 2 57.140179
-96 3 50.990195
-96 4 58.821765
-96 5 56.080300
-96 6 60.000000
-96 7 53.740115
-96 8 55.901699
-96 9 59.413803
-96 10 46.043458
-96 11 46.097722
-96 12 48.093659
-96 13 48.662100
-96 14 51.039201
-96 15 51.623638
-96 16 54.083269
-96 17 56.080300
-96 18 56.568542
-96 19 34.176015
-96 20 30.413813
-96 21 26.076810
-96 22 35.777088
-96 23 27.202941
-96 24 36.715120
-96 25 28.425341
-96 26 38.275318
-96 27 39.623226
-96 28 39.051248
-96 29 36.674242
-96 30 34.058773
-96 31 32.756679
-96 32 32.062439
-96 33 31.780497
-96 34 31.384710
-96 35 29.068884
-96 36 49.244289
-96 37 48.836462
-96 38 45.891176
-96 39 43.416587
-96 40 43.185646
-96 41 48.166378
-96 42 38.052595
-96 43 43.011626
-96 44 48.010416
-96 45 45.011110
-96 46 57.628118
-96 47 57.384667
-96 48 54.589376
-96 49 34.928498
-96 50 28.653098
-96 51 16.124515
-96 52 17.029386
-96 53 31.780497
-96 54 38.275318
-96 55 23.021729
-96 56 34.713110
-96 57 6.324555
-96 58 28.635642
-96 59 49.091751
-96 60 49.040799
-96 61 47.010637
-96 62 30.083218
-96 63 9.219544
-96 64 19.235384
-96 65 13.038405
-96 66 21.213203
-96 67 15.000000
-96 68 9.433981
-96 69 28.017851
-96 70 29.154759
-96 71 38.275318
-96 72 20.124612
-96 73 28.861739
-96 74 58.694122
-96 75 39.812058
-96 76 60.207973
-96 77 25.317978
-96 78 47.381431
-96 79 51.623638
-96 80 58.830264
-96 81 13.453624
-96 82 22.135944
-96 83 29.614186
-96 84 19.924859
-96 85 8.062258
-96 86 15.652476
-96 87 37.336309
-96 88 45.880279
-96 89 38.275318
-96 90 33.837849
-96 91 21.470911
-96 92 8.602325
-96 93 6.708204
-96 94 15.811388
-96 95 11.045361
-96 97 17.029386
-96 98 55.362442
-96 99 33.541020
-96 100 30.066593
-96 101 39.051248
-97 1 15.524175
-97 2 43.139309
-97 3 39.115214
-97 4 45.276926
-97 5 43.600459
-97 6 46.754679
-97 7 42.544095
-97 8 45.177428
-97 9 47.707442
-97 10 48.846699
-97 11 47.127487
-97 12 49.040799
-97 13 47.853944
-97 14 53.488316
-97 15 50.803543
-97 16 54.817880
-97 17 56.753854
-97 18 55.731499
-97 19 50.219518
-97 20 45.880279
-97 21 41.109610
-97 22 51.244512
-97 23 41.785165
-97 24 51.865210
-97 25 42.544095
-97 26 52.924474
-97 27 46.647615
-97 28 44.283180
-97 29 44.102154
-97 30 39.824616
-97 31 40.804412
-97 32 38.078866
-97 33 40.000000
-97 34 41.725292
-97 35 35.510562
-97 36 33.241540
-97 37 32.572995
-97 38 29.732137
-97 39 26.925824
-97 40 26.476405
-97 41 31.400637
-97 42 21.213203
-97 43 26.000000
-97 44 31.000000
-97 45 28.000000
-97 46 44.821870
-97 47 45.221676
-97 48 53.758720
-97 49 50.695167
-97 50 43.965896
-97 51 25.495098
-97 52 34.000000
-97 53 38.418745
-97 54 35.227830
-97 55 6.000000
-97 56 25.709920
-97 57 19.646883
-97 58 38.288379
-97 59 59.464275
-97 60 56.400355
-97 61 40.447497
-97 62 14.866069
-97 63 21.470911
-97 64 35.440090
-97 65 26.000000
-97 66 24.413111
-97 67 22.022716
-97 68 15.000000
-97 69 16.155494
-97 70 24.083189
-97 71 25.000000
-97 72 10.049876
-97 73 13.601471
-97 74 53.338541
-97 75 48.795492
-97 76 70.007142
-97 77 42.296572
-97 78 60.207973
-97 79 47.042534
-97 80 50.960769
-97 81 10.630146
-97 82 7.211103
-97 83 30.083218
-97 84 29.206164
-97 85 25.079872
-97 86 32.015621
-97 87 45.343136
-97 88 52.430907
-97 89 31.256999
-97 90 50.447993
-97 91 19.313208
-97 92 13.416408
-97 93 11.180340
-97 94 6.324555
-97 95 6.324555
-97 96 17.029386
-97 98 62.425956
-97 99 29.068884
-97 100 34.669872
-97 101 27.294688
-98 1 48.166378
-98 2 70.213959
-98 3 59.774577
-98 4 69.375788
-98 5 64.031242
-98 6 68.883960
-98 7 58.694122
-98 8 58.051701
-98 9 62.968246
-98 10 18.027756
-98 11 22.803509
-98 12 22.360680
-98 13 27.294688
-98 14 17.029386
-98 15 27.018512
-98 16 22.090722
-98 17 22.360680
-98 18 27.294688
-98 19 42.059482
-98 20 38.832976
-98 21 38.118237
-98 22 38.275318
-98 23 36.124784
-98 24 36.400549
-98 25 34.132096
-98 26 33.615473
-98 27 91.787799
-98 28 92.574294
-98 29 88.814413
-98 30 87.664132
-98 31 84.852814
-98 32 85.702975
-98 33 83.862983
-98 34 81.301906
-98 35 82.764727
-98 36 91.967386
-98 37 90.609050
-98 38 88.413800
-98 39 84.899941
-98 40 83.546394
-98 41 87.321246
-98 42 78.517514
-98 43 80.280757
-98 44 84.202138
-98 45 81.835200
-98 46 65.969690
-98 47 63.560994
-98 48 27.073973
-98 49 40.162171
-98 50 38.470768
-98 51 70.092796
-98 52 51.039201
-98 53 24.186773
-98 54 35.777088
-98 55 66.068147
-98 56 49.396356
-98 57 49.040799
-98 58 26.925824
-98 59 13.601471
-98 60 6.324555
-98 61 43.416587
-98 62 62.369865
-98 63 63.324561
-98 64 61.032778
-98 65 42.720019
-98 66 38.013156
-98 67 41.593269
-98 68 64.621978
-98 69 55.317267
-98 70 43.416587
-98 71 59.682493
-98 72 71.344236
-98 73 75.432089
-98 74 42.047592
-98 75 16.124515
-98 76 13.038405
-98 77 56.320511
-98 78 24.207437
-98 79 38.209946
-98 80 50.039984
-98 81 51.865210
-98 82 60.207973
-98 83 33.970576
-98 84 35.468296
-98 85 54.129474
-98 86 59.211485
-98 87 18.027756
-98 88 10.000000
-98 89 44.721360
-98 90 64.327288
-98 91 43.931765
-98 92 51.000000
-98 93 55.009090
-98 94 66.370174
-98 95 60.901560
-98 96 55.362442
-98 97 62.425956
-98 99 40.496913
-98 100 27.802878
-98 101 55.946403
-99 1 14.142136
-99 2 33.015148
-99 3 23.345235
-99 4 33.241540
-99 5 28.635642
-99 6 33.541020
-99 7 24.351591
-99 8 25.495098
-99 9 30.083218
-99 10 23.345235
-99 11 20.000000
-99 12 21.633308
-99 13 19.313208
-99 14 27.018512
-99 15 22.135944
-99 16 26.832816
-99 17 28.635642
-99 18 26.925824
-99 19 50.328918
-99 20 44.944410
-99 21 40.311289
-99 22 49.040799
-99 23 39.560081
-99 24 48.507731
-99 25 38.897301
-99 26 47.853944
-99 27 72.422372
-99 28 71.063352
-99 29 69.570109
-99 30 66.219333
-99 31 65.787537
-99 32 64.288413
-99 33 64.845971
-99 34 64.884513
-99 35 61.400326
-99 36 52.630789
-99 37 51.088159
-99 38 49.203658
-99 39 45.607017
-99 40 44.045431
-99 41 47.381431
-99 42 39.408121
-99 43 40.311289
-99 44 43.931765
-99 45 41.725292
-99 46 30.594117
-99 47 29.120440
-99 48 25.000000
-99 49 49.648766
-99 50 43.081318
-99 51 49.040799
-99 52 43.185646
-99 53 22.022716
-99 54 6.324555
-99 55 30.083218
-99 56 8.944272
-99 57 29.410882
-99 58 27.294688
-99 59 43.416587
-99 60 35.777088
-99 61 13.601471
-99 62 23.021729
-99 63 42.544095
-99 64 50.447993
-99 65 29.068884
-99 66 15.000000
-99 67 21.213203
-99 68 39.293765
-99 69 16.124515
-99 70 5.000000
-99 71 19.235384
-99 72 39.115214
-99 73 39.217343
-99 74 25.298221
-99 75 32.557641
-99 76 51.478151
-99 77 52.497619
-99 78 49.091751
-99 79 18.439089
-99 80 25.612497
-99 81 21.587033
-99 82 23.769729
-99 83 9.055385
-99 84 23.706539
-99 85 38.600518
-99 86 47.010637
-99 87 28.442925
-99 88 31.304952
-99 89 6.324555
-99 90 62.369865
-99 91 12.083046
-99 92 25.079872
-99 93 28.460499
-99 94 35.000000
-99 95 31.256999
-99 96 33.541020
-99 97 29.068884
-99 98 40.496913
-99 100 17.000000
-99 101 15.811388
-100 1 20.518285
-100 2 50.009999
-100 3 40.199502
-100 4 50.159745
-100 5 45.398238
-100 6 50.358713
-100 7 40.792156
-100 8 41.484937
-100 9 46.324939
-100 10 16.000000
-100 11 16.763055
-100 12 18.681542
-100 13 20.591260
-100 14 21.000000
-100 15 23.259407
-100 16 24.515301
-100 17 26.476405
-100 18 27.856777
-100 19 34.985711
-100 20 29.681644
-100 21 25.612497
-100 22 33.105891
-100 23 24.413111
-100 24 32.310989
-100 25 23.323808
-100 26 31.320920
-100 27 69.180922
-100 28 69.000000
-100 29 66.189123
-100 30 64.000000
-100 31 62.201286
-100 32 62.000000
-100 33 61.204575
-100 34 59.841457
-100 35 59.000000
-100 36 64.660653
-100 37 63.411355
-100 38 61.073726
-100 39 57.628118
-100 40 56.400355
-100 41 60.464866
-100 42 51.224994
-100 43 53.535035
-100 44 57.801384
-100 45 55.226805
-100 46 47.381431
-100 47 45.705580
-100 48 26.000000
-100 49 34.000000
-100 50 28.017851
-100 51 46.000000
-100 52 32.649655
-100 53 5.099020
-100 54 16.155494
-100 55 38.288379
-100 56 25.317978
-100 57 24.000000
-100 58 10.770330
-100 59 27.313001
-100 60 21.931712
-100 61 27.313001
-100 62 35.510562
-100 63 39.000000
-100 64 41.785165
-100 65 19.646883
-100 66 10.295630
-100 67 15.132746
-100 68 38.639358
-100 69 28.653098
-100 70 17.720045
-100 71 35.171011
-100 72 43.829214
-100 73 47.634021
-100 74 34.655447
-100 75 16.155494
-100 76 36.619667
-100 77 41.048752
-100 78 32.140317
-100 79 27.658633
-100 80 38.587563
-100 81 24.186773
-100 82 32.526912
-100 83 8.062258
-100 84 11.704700
-100 85 31.575307
-100 86 38.897301
-100 87 12.083046
-100 88 17.804494
-100 89 23.086793
-100 90 50.803543
-100 91 16.278821
-100 92 24.041631
-100 93 28.160256
-100 94 38.910153
-100 95 33.615473
-100 96 30.066593
-100 97 34.669872
-100 98 27.802878
-100 99 17.000000
-100 101 32.388269
-101 1 19.235384
-101 2 18.973666
-101 3 12.041595
-101 4 20.124612
-101 5 17.029386
-101 6 21.095023
-101 7 15.264338
-101 8 17.888544
-101 9 20.615528
-101 10 38.275318
-101 11 34.205263
-101 12 35.468296
-101 13 31.827661
-101 14 41.231056
-101 15 34.058773
-101 16 39.623226
-101 17 41.109610
-101 18 38.013156
-101 19 63.348244
-101 20 58.051701
-101 21 53.150729
-101 22 62.649820
-101 23 52.773099
-101 24 62.393910
-101 25 52.469038
-101 26 62.128898
-101 27 73.925638
-101 28 71.554175
-101 29 71.344236
-101 30 67.119297
-101 31 67.955868
-101 32 65.368188
-101 33 67.119297
-101 34 68.410526
-101 35 62.769419
-101 36 40.249224
-101 37 38.470768
-101 38 37.161808
-101 39 33.615473
-101 40 31.780497
-101 41 34.132096
-101 42 28.160256
-101 43 27.294688
-101 44 30.000000
-101 45 28.301943
-101 46 18.601075
-101 47 18.384776
-101 48 36.400549
-101 49 62.968246
-101 50 56.089215
-101 51 52.009614
-101 52 52.773099
-101 53 37.483330
-101 54 20.248457
-101 55 25.000000
-101 56 7.071068
-101 57 37.215588
-101 58 42.011903
-101 59 59.203040
-101 60 51.478151
-101 61 17.464249
-101 62 14.142136
-101 63 46.690470
-101 64 58.008620
-101 65 39.560081
-101 66 27.294688
-101 67 31.622777
-101 68 41.400483
-101 69 11.401754
-101 70 15.000000
-101 71 4.472136
-101 72 36.055513
-101 73 32.062439
-101 74 29.832868
-101 75 48.270074
-101 76 67.230945
-101 77 62.177166
-101 78 64.498062
-101 79 25.495098
-101 80 25.019992
-101 81 25.612497
-101 82 20.124612
-101 83 24.331050
-101 84 36.496575
-101 85 46.043458
-101 86 54.405882
-101 87 44.147480
-101 88 47.010637
-101 89 11.401754
-101 90 71.693793
-101 91 20.880613
-101 92 30.805844
-101 93 32.557641
-101 94 33.541020
-101 95 32.202484
-101 96 39.051248
-101 97 27.294688
-101 98 55.946403
-101 99 15.811388
-101 100 32.388269
+1 2 38.078866
+1 3 30.805844
+1 4 39.357337
+1 5 36.055513
+1 6 40.311289
+1 7 33.301652
+1 8 35.355339
+1 9 39.051248
+1 10 33.541020
+1 11 31.622777
+1 12 33.526109
+1 13 32.388269
+1 14 38.078866
+1 15 35.355339
+1 16 39.293765
+1 17 41.231056
+1 18 40.311289
+1 19 45.177428
+1 20 40.049969
+1 21 35.057096
+1 22 45.000000
+1 23 35.000000
+1 24 45.044423
+1 25 35.057096
+1 26 45.276926
+1 27 58.523500
+1 28 57.008771
+1 29 55.713553
+1 30 52.201533
+1 31 52.000000
+1 32 50.289164
+1 33 51.078371
+1 34 51.478151
+1 35 47.434165
+1 36 44.204072
+1 37 43.011626
+1 38 40.607881
+1 39 37.202150
+1 40 36.055513
+1 41 40.311289
+1 42 30.805844
+1 43 33.541020
+1 44 38.078866
+1 45 35.341194
+1 46 37.735925
+1 47 37.202150
+1 48 38.327536
+1 49 45.044423
+1 50 38.052595
+1 51 35.341194
+1 52 33.541020
+1 53 25.000000
+1 54 20.000000
+1 55 18.027756
+1 56 14.142136
+1 57 18.027756
+1 58 26.925824
+1 59 47.169906
+1 60 42.426407
+1 61 26.925824
+1 62 15.811388
+1 63 29.154759
+1 64 39.051248
+1 65 20.615528
+1 66 11.180340
+1 67 13.038405
+1 68 25.298221
+1 69 10.000000
+1 70 9.219544
+1 71 19.646883
+1 72 25.495098
+1 73 27.459060
+1 74 39.293765
+1 75 36.055513
+1 76 57.008771
+1 77 42.941821
+1 78 49.979996
+1 79 32.557641
+1 80 38.470768
+1 81 7.615773
+1 82 12.041595
+1 83 14.764823
+1 84 19.235384
+1 85 27.018512
+1 86 35.468296
+1 87 32.202484
+1 88 38.209946
+1 89 17.888544
+1 90 52.478567
+1 91 4.242641
+1 92 12.041595
+1 93 14.764823
+1 94 21.095023
+1 95 17.117243
+1 96 20.615528
+1 97 15.524175
+1 98 48.166378
+1 99 14.142136
+1 100 20.518285
+1 101 19.235384
+2 1 38.078866
+2 3 10.440307
+2 4 3.000000
+2 5 7.071068
+2 6 5.000000
+2 7 12.206556
+2 8 14.142136
+2 9 11.180340
+2 10 52.201533
+2 11 47.434165
+2 12 48.104054
+2 13 43.462628
+2 14 53.851648
+2 15 44.721360
+2 16 50.537115
+2 17 51.478151
+2 18 47.169906
+2 19 82.225300
+2 20 76.902536
+2 21 72.034714
+2 22 81.394103
+2 23 71.589105
+2 24 81.049368
+2 25 71.196910
+2 26 80.622577
+2 27 89.022469
+2 28 86.023253
+2 29 86.683332
+2 30 82.006097
+2 31 83.630138
+2 32 80.430094
+2 33 82.879430
+2 34 84.852814
+2 35 78.102497
+2 36 42.000000
+2 37 40.000000
+2 38 40.112342
+2 39 37.336309
+2 40 35.355339
+2 41 35.000000
+2 42 34.481879
+2 43 30.413813
+2 44 30.000000
+2 45 30.149627
+2 46 5.830952
+2 47 8.602325
+2 48 46.141088
+2 49 81.786307
+2 50 74.953319
+2 51 68.622154
+2 52 71.589105
+2 53 55.000000
+2 54 35.355339
+2 55 39.051248
+2 56 25.495098
+2 57 55.901699
+2 58 60.207973
+2 59 75.663730
+2 60 66.708320
+2 61 26.925824
+2 62 28.284271
+2 63 64.031242
+2 64 76.321688
+2 65 58.523500
+2 66 46.097722
+2 67 50.596443
+2 68 58.051701
+2 69 29.154759
+2 70 33.541020
+2 71 18.867962
+2 72 50.000000
+2 73 42.941821
+2 74 33.970576
+2 75 65.192024
+2 76 82.462113
+2 77 80.956779
+2 78 82.024387
+2 79 33.615473
+2 80 25.495098
+2 81 43.908997
+2 82 36.124784
+2 83 42.047592
+2 84 55.317267
+2 85 64.498062
+2 86 72.718636
+2 87 61.131007
+2 88 62.369865
+2 89 27.018512
+2 90 90.354856
+2 91 39.849718
+2 92 49.244289
+2 93 50.477718
+2 94 48.836462
+2 95 48.918299
+2 96 57.140179
+2 97 43.139309
+2 98 70.213959
+2 99 33.015148
+2 100 50.009999
+2 101 18.973666
+3 1 30.805844
+3 2 10.440307
+3 4 10.000000
+3 5 5.385165
+3 6 10.198039
+3 7 4.000000
+3 8 7.000000
+3 9 8.602325
+3 10 41.761226
+3 11 37.000000
+3 12 37.696154
+3 13 33.105891
+3 14 43.462628
+3 15 34.481879
+3 16 40.311289
+3 17 41.340053
+3 18 37.202150
+3 19 73.375745
+3 20 68.007353
+3 21 63.245553
+3 22 72.277244
+3 23 62.641839
+3 24 71.805292
+3 25 62.096699
+3 26 71.196910
+3 27 85.755466
+3 28 83.240615
+3 29 83.216585
+3 30 78.892332
+3 31 79.881162
+3 32 77.175126
+3 33 79.056942
+3 34 80.430094
+3 35 74.625733
+3 36 46.097722
+3 37 44.147480
+3 38 43.566042
+3 39 40.311289
+3 40 38.327536
+3 41 39.293765
+3 42 36.000000
+3 43 33.376639
+3 44 34.481879
+3 45 33.734256
+3 46 7.280110
+3 47 6.403124
+3 48 36.055513
+3 49 72.801099
+3 50 66.098411
+3 51 64.031242
+3 52 64.140471
+3 53 45.099889
+3 54 25.079872
+3 55 36.249138
+3 56 17.000000
+3 57 48.826222
+3 58 50.635956
+3 59 65.375837
+3 60 56.293872
+3 61 16.552945
+3 62 25.079872
+3 63 58.728187
+3 64 69.814039
+3 65 50.537115
+3 66 37.336309
+3 67 42.485292
+3 68 53.413481
+3 69 23.430749
+3 70 24.698178
+3 71 14.317821
+3 72 47.423623
+3 73 42.201896
+3 74 25.000000
+3 75 55.036352
+3 76 72.034714
+3 77 73.573093
+3 78 72.006944
+3 79 23.600847
+3 80 17.464249
+3 81 37.536649
+3 82 31.906112
+3 83 32.388269
+3 84 46.486557
+3 85 57.801384
+3 86 66.219333
+3 87 51.009803
+3 88 51.971146
+3 89 17.117243
+3 90 83.216585
+3 91 31.764760
+3 92 42.638011
+3 93 44.553339
+3 94 45.276926
+3 95 44.204072
+3 96 50.990195
+3 97 39.115214
+3 98 59.774577
+3 99 23.345235
+3 100 40.199502
+3 101 12.041595
+4 1 39.357337
+4 2 3.000000
+4 3 10.000000
+4 5 5.385165
+4 6 2.000000
+4 7 10.770330
+4 8 12.206556
+4 9 8.602325
+4 10 51.419841
+4 11 46.572524
+4 12 47.127487
+4 13 42.379240
+4 14 52.810984
+4 15 43.462628
+4 16 49.244289
+4 17 50.089919
+4 18 45.650849
+4 19 82.969874
+4 20 77.620873
+4 21 72.801099
+4 22 82.000000
+4 23 72.277244
+4 24 81.584312
+4 25 71.805292
+4 26 81.049368
+4 27 91.400219
+4 28 88.481637
+4 29 89.022469
+4 30 84.403791
+4 31 85.912746
+4 32 82.800966
+4 33 85.146932
+4 34 87.000000
+4 35 80.430094
+4 36 45.000000
+4 37 43.000000
+4 38 43.104524
+4 39 40.311289
+4 40 38.327536
+4 41 38.000000
+4 42 37.363083
+4 43 33.376639
+4 44 33.000000
+4 45 33.136083
+4 46 3.605551
+4 47 6.403124
+4 48 44.721360
+4 49 82.462113
+4 50 75.690158
+4 51 70.710678
+4 52 72.897188
+4 53 55.081757
+4 54 35.057096
+4 55 41.400483
+4 56 26.248809
+4 57 57.306195
+4 58 60.530984
+4 59 75.325958
+4 60 66.098411
+4 61 25.961510
+4 62 30.479501
+4 63 65.946948
+4 64 77.935871
+4 65 59.615434
+4 66 46.840154
+4 67 51.623638
+4 68 60.108236
+4 69 30.805844
+4 70 34.205263
+4 71 20.615528
+4 72 52.430907
+4 73 45.617979
+4 74 32.015621
+4 75 65.030762
+4 76 81.786307
+4 77 82.298238
+4 78 82.006097
+4 79 32.202484
+4 80 23.345235
+4 81 45.486262
+4 82 38.183766
+4 83 42.296572
+4 84 56.044625
+4 85 66.037868
+4 86 74.330344
+4 87 61.008196
+4 88 61.814238
+4 89 27.073973
+4 90 91.787799
+4 91 40.853396
+4 92 50.774009
+4 93 52.201533
+4 94 51.088159
+4 95 50.931326
+4 96 58.821765
+4 97 45.276926
+4 98 69.375788
+4 99 33.241540
+4 100 50.159745
+4 101 20.124612
+5 1 36.055513
+5 2 7.071068
+5 3 5.385165
+5 4 5.385165
+5 6 5.000000
+5 7 5.385165
+5 8 7.071068
+5 9 5.000000
+5 10 46.097722
+5 11 41.231056
+5 12 41.761226
+5 13 37.000000
+5 14 47.434165
+5 15 38.078866
+5 16 43.863424
+5 17 44.721360
+5 18 40.311289
+5 19 78.746428
+5 20 73.375745
+5 21 68.622154
+5 22 77.620873
+5 23 68.007353
+5 24 77.129761
+5 25 67.446275
+5 26 76.485293
+5 27 90.138782
+5 28 87.464278
+5 29 87.658428
+5 30 83.216585
+5 31 84.403791
+5 32 81.541401
+5 33 83.600239
+5 34 85.146932
+5 35 79.056942
+5 36 47.265209
+5 37 45.276926
+5 38 45.044423
+5 39 42.000000
+5 40 40.000000
+5 41 40.311289
+5 42 38.327536
+5 43 35.000000
+5 44 35.355339
+5 45 35.057096
+5 46 2.000000
+5 47 2.000000
+5 48 39.357337
+5 49 78.160092
+5 50 71.470274
+5 51 68.767725
+5 52 69.462220
+5 53 50.249378
+5 54 30.000000
+5 55 40.311289
+5 56 22.360680
+5 57 54.083269
+5 58 55.901699
+5 59 70.178344
+5 60 60.827625
+5 61 20.615528
+5 62 29.154759
+5 63 63.639610
+5 64 75.000000
+5 65 55.901699
+5 66 42.720019
+5 67 47.853944
+5 68 58.137767
+5 69 28.284271
+5 70 30.083218
+5 71 18.601075
+5 72 51.478151
+5 73 45.541190
+5 74 26.907248
+5 75 60.000000
+5 76 76.485293
+5 77 78.892332
+5 78 77.058419
+5 79 26.832816
+5 80 18.439089
+5 81 42.638011
+5 82 36.400549
+5 83 37.656341
+5 84 51.865210
+5 85 63.007936
+5 86 71.400280
+5 87 56.008928
+5 88 56.568542
+5 89 22.360680
+5 90 88.509886
+5 91 37.121422
+5 92 47.801674
+5 93 49.578221
+5 94 49.648766
+5 95 48.918299
+5 96 56.080300
+5 97 43.600459
+5 98 64.031242
+5 99 28.635642
+5 100 45.398238
+5 101 17.029386
+6 1 40.311289
+6 2 5.000000
+6 3 10.198039
+6 4 2.000000
+6 5 5.000000
+6 7 10.198039
+6 8 11.180340
+6 9 7.071068
+6 10 50.990195
+6 11 46.097722
+6 12 46.572524
+6 13 41.761226
+6 14 52.201533
+6 15 42.720019
+6 16 48.466483
+6 17 49.244289
+6 18 44.721360
+6 19 83.522452
+6 20 78.160092
+6 21 73.375745
+6 22 82.462113
+6 23 72.801099
+6 24 82.000000
+6 25 72.277244
+6 26 81.394103
+6 27 93.005376
+6 28 90.138782
+6 29 90.603532
+6 30 86.023253
+6 31 87.458562
+6 32 84.403791
+6 33 86.683332
+6 34 88.459030
+6 35 82.006097
+6 36 47.000000
+6 37 45.000000
+6 38 45.099889
+6 39 42.296572
+6 40 40.311289
+6 41 40.000000
+6 42 39.293765
+6 43 35.355339
+6 44 35.000000
+6 45 35.128336
+6 46 3.000000
+6 47 5.385165
+6 48 43.863424
+6 49 82.969874
+6 50 76.243032
+6 51 72.138755
+6 52 73.824115
+6 53 55.226805
+6 54 35.000000
+6 55 43.011626
+6 56 26.925824
+6 57 58.309519
+6 58 60.827625
+6 59 75.166482
+6 60 65.764732
+6 61 25.495098
+6 62 32.015621
+6 63 67.268120
+6 64 79.056942
+6 65 60.415230
+6 66 47.434165
+6 67 52.392748
+6 68 61.522354
+6 69 32.015621
+6 70 34.785054
+6 71 21.931712
+6 72 54.083269
+6 73 47.423623
+6 74 30.805844
+6 75 65.000000
+6 76 81.394103
+6 77 83.240615
+6 78 82.054860
+6 79 31.384710
+6 80 22.022716
+6 81 46.615448
+6 82 39.623226
+6 83 42.579338
+6 84 56.612719
+6 85 67.119297
+6 86 75.451971
+6 87 61.008196
+6 88 61.522354
+6 89 27.294688
+6 90 92.784697
+6 91 41.629317
+6 92 51.865210
+6 93 53.413481
+6 94 52.630789
+6 95 52.325902
+6 96 60.000000
+6 97 46.754679
+6 98 68.883960
+6 99 33.541020
+6 100 50.358713
+6 101 21.095023
+7 1 33.301652
+7 2 12.206556
+7 3 4.000000
+7 4 10.770330
+7 5 5.385165
+7 6 10.198039
+7 8 3.000000
+7 9 5.830952
+7 10 40.792156
+7 11 35.902646
+7 12 36.400549
+7 13 31.622777
+7 14 42.059482
+7 15 32.695565
+7 16 38.483763
+7 17 39.357337
+7 18 34.985711
+7 19 74.672619
+7 20 69.289249
+7 21 64.621978
+7 22 73.375745
+7 23 63.906181
+7 24 72.801099
+7 25 63.245553
+7 26 72.034714
+7 27 89.185201
+7 28 86.769810
+7 29 86.608314
+7 30 82.365041
+7 31 83.216585
+7 32 80.622577
+7 33 82.377181
+7 34 83.600239
+7 35 78.032045
+7 36 50.009999
+7 37 48.052055
+7 38 47.518417
+7 39 44.283180
+7 40 42.296572
+7 41 43.174066
+7 42 40.000000
+7 43 37.336309
+7 44 38.327536
+7 45 37.656341
+7 46 7.280110
+7 47 5.000000
+7 48 34.000000
+7 49 74.000000
+7 50 67.416615
+7 51 67.201190
+7 52 66.287254
+7 53 45.541190
+7 54 25.079872
+7 55 39.924930
+7 56 19.209373
+7 57 51.224994
+7 58 51.419841
+7 59 65.069194
+7 60 55.578773
+7 61 15.297059
+7 62 28.792360
+7 63 61.717096
+7 64 72.346389
+7 65 52.478567
+7 66 38.910153
+7 67 44.418465
+7 68 56.612719
+7 69 26.627054
+7 70 26.419690
+7 71 18.027756
+7 72 51.078371
+7 73 46.097722
+7 74 21.931712
+7 75 55.036352
+7 76 71.196910
+7 77 75.716577
+7 78 72.173402
+7 79 21.470911
+7 80 13.892444
+7 81 40.311289
+7 82 35.355339
+7 83 33.241540
+7 84 47.927028
+7 85 60.307545
+7 86 68.767725
+7 87 51.088159
+7 88 51.351728
+7 89 18.027756
+7 90 85.445889
+7 91 33.837849
+7 92 45.276926
+7 93 47.423623
+7 94 48.764741
+7 95 47.434165
+7 96 53.740115
+7 97 42.544095
+7 98 58.694122
+7 99 24.351591
+7 100 40.792156
+7 101 15.264338
+8 1 35.355339
+8 2 14.142136
+8 3 7.000000
+8 4 12.206556
+8 5 7.071068
+8 6 11.180340
+8 7 3.000000
+8 9 5.000000
+8 10 40.311289
+8 11 35.355339
+8 12 35.693137
+8 13 30.805844
+8 14 41.231056
+8 15 31.622777
+8 16 37.336309
+8 17 38.078866
+8 18 33.541020
+8 19 75.769387
+8 20 70.384657
+8 21 65.795137
+8 22 74.330344
+8 23 65.000000
+8 24 73.681748
+8 25 64.257295
+8 26 72.801099
+8 27 91.787799
+8 28 89.442719
+8 29 89.185201
+8 30 85.000000
+8 31 85.755466
+8 32 83.240615
+8 33 84.905830
+8 34 86.023253
+8 35 80.622577
+8 36 52.952809
+8 37 50.990195
+8 38 50.487622
+8 39 47.265209
+8 40 45.276926
+8 41 46.097722
+8 42 43.000000
+8 43 40.311289
+8 44 41.231056
+8 45 40.607881
+8 46 8.602325
+8 47 5.830952
+8 48 32.695565
+8 49 75.026662
+8 50 68.541958
+8 51 69.634761
+8 52 68.007353
+8 53 46.097722
+8 54 25.495098
+8 55 42.720019
+8 56 21.213203
+8 57 53.150729
+8 58 52.201533
+8 59 65.000000
+8 60 55.226805
+8 61 15.000000
+8 62 31.622777
+8 63 64.031242
+8 64 74.330344
+8 65 54.083269
+8 66 40.311289
+8 67 46.043458
+8 68 59.076222
+8 69 29.154759
+8 70 28.017851
+8 71 20.880613
+8 72 53.851648
+8 73 49.030603
+8 74 19.849433
+8 75 55.226805
+8 76 70.710678
+8 77 77.420927
+8 78 72.443081
+8 79 20.248457
+8 80 11.401754
+8 81 42.520583
+8 82 38.013156
+8 83 34.176015
+8 84 49.193496
+8 85 62.289646
+8 86 70.767224
+8 87 51.351728
+8 88 51.088159
+8 89 19.235384
+8 90 87.200917
+8 91 35.608988
+8 92 47.381431
+8 93 49.678969
+8 94 51.429563
+8 95 49.929951
+8 96 55.901699
+8 97 45.177428
+8 98 58.051701
+8 99 25.495098
+8 100 41.484937
+8 101 17.888544
+9 1 39.051248
+9 2 11.180340
+9 3 8.602325
+9 4 8.602325
+9 5 5.000000
+9 6 7.071068
+9 7 5.830952
+9 8 5.000000
+9 10 45.276926
+9 11 40.311289
+9 12 40.607881
+9 13 35.693137
+9 14 46.097722
+9 15 36.400549
+9 16 42.059482
+9 17 42.720019
+9 18 38.078866
+9 19 80.411442
+9 20 75.026662
+9 21 70.384657
+9 22 79.056942
+9 23 69.641941
+9 24 78.447435
+9 25 68.949257
+9 26 77.620873
+9 27 94.339811
+9 28 91.787799
+9 29 91.809586
+9 30 87.464278
+9 31 88.481637
+9 32 85.755466
+9 33 87.658428
+9 34 89.022469
+9 35 83.216585
+9 36 52.239832
+9 37 50.249378
+9 38 50.039984
+9 39 47.000000
+9 40 45.000000
+9 41 45.276926
+9 42 43.289722
+9 43 40.000000
+9 44 40.311289
+9 45 40.049969
+9 46 5.385165
+9 47 3.000000
+9 48 37.336309
+9 49 79.711982
+9 50 73.164199
+9 51 72.622311
+9 52 72.111026
+9 53 50.990195
+9 54 30.413813
+9 55 44.721360
+9 56 25.000000
+9 57 57.008771
+9 58 57.008771
+9 59 70.000000
+9 60 60.207973
+9 61 20.000000
+9 62 33.541020
+9 63 67.268120
+9 64 78.102497
+9 65 58.309519
+9 66 44.721360
+9 67 50.249378
+9 68 62.008064
+9 69 32.015621
+9 70 32.249031
+9 71 22.825424
+9 72 55.901699
+9 73 50.289164
+9 74 23.853721
+9 75 60.207973
+9 76 75.663730
+9 77 81.541401
+9 78 77.414469
+9 79 25.000000
+9 80 15.000000
+9 81 45.967380
+9 82 40.496913
+9 83 38.897301
+9 84 53.712196
+9 85 66.068147
+9 86 74.518454
+9 87 56.320511
+9 88 56.080300
+9 89 23.769729
+9 90 91.263355
+9 91 39.661064
+9 92 50.990195
+9 93 53.037722
+9 94 53.851648
+9 95 52.801515
+9 96 59.413803
+9 97 47.707442
+9 98 62.968246
+9 99 30.083218
+9 100 46.324939
+9 101 20.615528
+10 1 33.541020
+10 2 52.201533
+10 3 41.761226
+10 4 51.419841
+10 5 46.097722
+10 6 50.990195
+10 7 40.792156
+10 8 40.311289
+10 9 45.276926
+10 11 5.000000
+10 12 5.385165
+10 13 10.198039
+10 14 5.000000
+10 15 11.180340
+10 16 9.433981
+10 17 11.180340
+10 18 14.142136
+10 19 45.343136
+10 20 40.607881
+10 21 37.735925
+10 22 42.426407
+10 23 36.055513
+10 24 41.036569
+10 25 34.409301
+10 26 39.051248
+10 27 85.146932
+10 28 85.000000
+10 29 82.152298
+10 30 80.000000
+10 31 78.160092
+10 32 78.000000
+10 33 77.162167
+10 34 75.663730
+10 35 75.000000
+10 36 75.822160
+10 37 74.330344
+10 38 72.346389
+10 39 68.767725
+10 40 67.268120
+10 41 70.710678
+10 42 62.481997
+10 43 63.639610
+10 44 67.268120
+10 45 65.069194
+10 46 48.052055
+10 47 45.705580
+10 48 12.806248
+10 49 43.863424
+10 50 39.408121
+10 51 62.000000
+10 52 47.434165
+10 53 15.811388
+10 54 18.027756
+10 55 51.478151
+10 56 32.015621
+10 57 40.000000
+10 58 22.360680
+10 59 25.495098
+10 60 15.000000
+10 61 25.495098
+10 62 46.097722
+10 63 55.000000
+10 64 57.008771
+10 65 35.355339
+10 66 25.495098
+10 67 31.064449
+10 68 54.451814
+10 69 39.051248
+10 70 27.018512
+10 71 42.201896
+10 72 58.523500
+10 73 60.901560
+10 74 26.248809
+10 75 18.027756
+10 76 30.413813
+10 77 55.036352
+10 78 34.539832
+10 79 21.095023
+10 80 33.241540
+10 81 38.897301
+10 82 45.276926
+10 83 18.788294
+10 84 27.294688
+10 85 47.381431
+10 86 54.341513
+10 87 15.556349
+10 88 11.180340
+10 89 26.925824
+10 90 64.412732
+10 91 29.546573
+10 92 39.623226
+10 93 43.737855
+10 94 53.758720
+10 95 48.764741
+10 96 46.043458
+10 97 48.846699
+10 98 18.027756
+10 99 23.345235
+10 100 16.000000
+10 101 38.275318
+11 1 31.622777
+11 2 47.434165
+11 3 37.000000
+11 4 46.572524
+11 5 41.231056
+11 6 46.097722
+11 7 35.902646
+11 8 35.355339
+11 9 40.311289
+11 10 5.000000
+11 12 2.000000
+11 13 5.385165
+11 14 7.071068
+11 15 7.071068
+11 16 8.000000
+11 17 10.000000
+11 18 11.180340
+11 19 48.795492
+11 20 43.863424
+11 21 40.607881
+11 22 46.097722
+11 23 39.051248
+11 24 44.821870
+11 25 37.536649
+11 26 43.011626
+11 27 85.586214
+11 28 85.146932
+11 29 82.607506
+11 30 80.156098
+11 31 78.638413
+11 32 78.160092
+11 33 77.646635
+11 34 76.485293
+11 35 75.166482
+11 36 72.622311
+11 37 71.063352
+11 38 69.202601
+11 39 65.604878
+11 40 64.031242
+11 41 67.268120
+11 42 59.405387
+11 43 60.207973
+11 44 63.639610
+11 45 61.554854
+11 46 43.174066
+11 47 40.792156
+11 48 9.433981
+11 49 47.423623
+11 50 42.520583
+11 51 62.201286
+11 52 49.244289
+11 53 18.027756
+11 54 14.142136
+11 55 49.244289
+11 56 28.284271
+11 57 40.311289
+11 58 25.000000
+11 59 30.413813
+11 60 20.000000
+11 61 20.615528
+11 62 43.011626
+11 63 55.226805
+11 64 58.523500
+11 65 36.400549
+11 66 25.000000
+11 67 31.144823
+11 68 54.037024
+11 69 36.055513
+11 70 24.186773
+11 71 38.288379
+11 72 57.008771
+11 73 58.600341
+11 74 21.540659
+11 75 22.360680
+11 76 35.355339
+11 77 57.306195
+11 78 39.217343
+11 79 16.124515
+11 80 28.284271
+11 81 37.656341
+11 82 42.953463
+11 83 17.262677
+11 84 28.460499
+11 85 48.270074
+11 86 55.659680
+11 87 19.416488
+11 88 16.124515
+11 89 22.803509
+11 90 66.887966
+11 91 27.892651
+11 92 39.051248
+11 93 43.104524
+11 94 52.392748
+11 95 47.675990
+11 96 46.097722
+11 97 47.127487
+11 98 22.803509
+11 99 20.000000
+11 100 16.763055
+11 101 34.205263
+12 1 33.526109
+12 2 48.104054
+12 3 37.696154
+12 4 47.127487
+12 5 41.761226
+12 6 46.572524
+12 7 36.400549
+12 8 35.693137
+12 9 40.607881
+12 10 5.385165
+12 11 2.000000
+12 13 5.000000
+12 14 5.830952
+12 15 5.830952
+12 16 6.000000
+12 17 8.000000
+12 18 9.433981
+12 19 50.209561
+12 20 45.343136
+12 21 42.201896
+12 22 47.423623
+12 23 40.607881
+12 24 46.097722
+12 25 39.051248
+12 26 44.204072
+12 27 87.572827
+12 28 87.143560
+12 29 84.593144
+12 30 82.152298
+12 31 80.622577
+12 32 80.156098
+12 33 79.630396
+12 34 78.447435
+12 35 77.162167
+12 36 74.202426
+12 37 72.622311
+12 38 70.802542
+12 39 67.201190
+12 40 65.604878
+12 41 68.767725
+12 42 61.032778
+12 43 61.717096
+12 44 65.069194
+12 45 63.031738
+12 46 43.680659
+12 47 41.231056
+12 48 7.810250
+12 49 48.795492
+12 50 44.045431
+12 51 64.195015
+12 52 51.078371
+12 53 19.723083
+12 54 15.620499
+12 55 51.078371
+12 56 29.732137
+12 57 42.296572
+12 58 26.627054
+12 59 30.805844
+12 60 20.099751
+12 61 21.189620
+12 62 44.654227
+12 63 57.218878
+12 64 60.406953
+12 65 38.327536
+12 66 27.000000
+12 67 33.136083
+12 68 56.035703
+12 69 37.735925
+12 70 25.942244
+12 71 39.623226
+12 72 58.940648
+12 73 60.415230
+12 74 20.880613
+12 75 23.323808
+12 76 35.128336
+12 77 59.059292
+12 78 39.924930
+12 79 16.000000
+12 80 28.071338
+12 81 39.623226
+12 82 44.777226
+12 83 19.235384
+12 84 30.364453
+12 85 50.219518
+12 86 57.567352
+12 87 20.615528
+12 88 16.492423
+12 89 24.083189
+12 90 68.600292
+12 91 29.832868
+12 92 41.048752
+12 93 45.099889
+12 94 54.341513
+12 95 49.648766
+12 96 48.093659
+12 97 49.040799
+12 98 22.360680
+12 99 21.633308
+12 100 18.681542
+12 101 35.468296
+13 1 32.388269
+13 2 43.462628
+13 3 33.105891
+13 4 42.379240
+13 5 37.000000
+13 6 41.761226
+13 7 31.622777
+13 8 30.805844
+13 9 35.693137
+13 10 10.198039
+13 11 5.385165
+13 12 5.000000
+13 14 10.440307
+13 15 3.000000
+13 16 7.810250
+13 17 9.433981
+13 18 8.000000
+13 19 53.814496
+13 20 48.795492
+13 21 45.343136
+13 22 51.224994
+13 23 43.863424
+13 24 50.000000
+13 25 42.426407
+13 26 48.259714
+13 27 88.283634
+13 28 87.572827
+13 29 85.328776
+13 30 82.607506
+13 31 81.394103
+13 32 80.622577
+13 33 80.411442
+13 34 79.555012
+13 35 77.646635
+13 36 71.281134
+13 37 69.634761
+13 38 67.955868
+13 39 64.350602
+13 40 62.681736
+13 41 65.604878
+13 42 58.309519
+13 43 58.600341
+13 44 61.717096
+13 45 59.816386
+13 46 38.897301
+13 47 36.400549
+13 48 6.000000
+13 49 52.497619
+13 50 47.381431
+13 51 64.776539
+13 52 53.235327
+13 53 22.671568
+13 54 13.000000
+13 55 49.335586
+13 56 26.627054
+13 57 43.174066
+13 58 29.732137
+13 59 35.693137
+13 60 25.079872
+13 61 16.552945
+13 62 42.059482
+13 63 57.870545
+13 64 62.241465
+13 65 39.924930
+13 66 27.459060
+13 67 33.955854
+13 68 56.080300
+13 69 35.341194
+13 70 24.041631
+13 71 36.124784
+13 72 57.870545
+13 73 58.523500
+13 74 16.155494
+13 75 27.730849
+13 76 40.112342
+13 77 61.587336
+13 78 44.598206
+13 79 11.000000
+13 80 23.086793
+13 81 39.051248
+13 82 43.011626
+13 83 19.104973
+13 84 32.202484
+13 85 51.546096
+13 86 59.236813
+13 87 24.698178
+13 88 21.377558
+13 89 20.615528
+13 90 71.281134
+13 91 29.068884
+13 92 41.109610
+13 93 45.044423
+13 94 53.460266
+13 95 49.091751
+13 96 48.662100
+13 97 47.853944
+13 98 27.294688
+13 99 19.313208
+13 100 20.591260
+13 101 31.827661
+14 1 38.078866
+14 2 53.851648
+14 3 43.462628
+14 4 52.810984
+14 5 47.434165
+14 6 52.201533
+14 7 42.059482
+14 8 41.231056
+14 9 46.097722
+14 10 5.000000
+14 11 7.071068
+14 12 5.830952
+14 13 10.440307
+14 15 10.000000
+14 16 5.830952
+14 17 7.071068
+14 18 11.180340
+14 19 49.203658
+14 20 44.654227
+14 21 42.059482
+14 22 46.097722
+14 23 40.311289
+14 24 44.598206
+14 25 38.587563
+14 26 42.426407
+14 27 90.138782
+14 28 90.000000
+14 29 87.143560
+14 30 85.000000
+14 31 83.150466
+14 32 83.000000
+14 33 82.152298
+14 34 80.622577
+14 35 80.000000
+14 36 79.649231
+14 37 78.102497
+14 38 76.216796
+14 39 72.622311
+14 40 71.063352
+14 41 74.330344
+14 42 66.400301
+14 43 67.268120
+14 44 70.710678
+14 45 68.622154
+14 46 49.335586
+14 47 46.840154
+14 48 10.440307
+14 49 47.634021
+14 50 43.566042
+14 51 67.000000
+14 52 52.201533
+14 53 20.615528
+14 54 21.213203
+14 55 55.901699
+14 56 35.355339
+14 57 45.000000
+14 58 26.925824
+14 59 26.925824
+14 60 15.811388
+14 61 26.925824
+14 62 50.000000
+14 63 60.000000
+14 64 61.846584
+14 65 40.311289
+14 66 30.413813
+14 67 36.055513
+14 68 59.413803
+14 69 43.011626
+14 70 31.064449
+14 71 45.343136
+14 72 63.245553
+14 73 65.299311
+14 74 25.179357
+14 75 21.213203
+14 76 30.000000
+14 77 59.615434
+14 78 36.715120
+14 79 21.213203
+14 80 33.015148
+14 81 43.680659
+14 82 49.648766
+14 83 23.409400
+14 84 32.249031
+14 85 52.345009
+14 86 59.228372
+14 87 19.416488
+14 88 13.038405
+14 89 29.832868
+14 90 68.876701
+14 91 34.176015
+14 92 44.553339
+14 93 48.662100
+14 94 58.523500
+14 95 53.600373
+14 96 51.039201
+14 97 53.488316
+14 98 17.029386
+14 99 27.018512
+14 100 21.000000
+14 101 41.231056
+15 1 35.355339
+15 2 44.721360
+15 3 34.481879
+15 4 43.462628
+15 5 38.078866
+15 6 42.720019
+15 7 32.695565
+15 8 31.622777
+15 9 36.400549
+15 10 11.180340
+15 11 7.071068
+15 12 5.830952
+15 13 3.000000
+15 14 10.000000
+15 16 5.830952
+15 17 7.071068
+15 18 5.000000
+15 19 55.865911
+15 20 50.931326
+15 21 47.634021
+15 22 53.150729
+15 23 46.097722
+15 24 51.855569
+15 25 44.598206
+15 26 50.000000
+15 27 91.241438
+15 28 90.553851
+15 29 88.283634
+15 30 85.586214
+15 31 84.344532
+15 32 83.600239
+15 33 83.360662
+15 34 82.462113
+15 35 80.622577
+15 36 73.783467
+15 37 72.111026
+15 38 70.491134
+15 39 66.887966
+15 40 65.192024
+15 41 68.007353
+15 42 60.901560
+15 43 61.032778
+15 44 64.031242
+15 45 62.201286
+15 46 39.924930
+15 47 37.336309
+15 48 3.000000
+15 49 54.488531
+15 50 49.578221
+15 51 67.742158
+15 52 55.901699
+15 53 25.000000
+15 54 15.811388
+15 55 52.201533
+15 56 29.154759
+15 57 46.097722
+15 58 32.015621
+15 59 36.400549
+15 60 25.495098
+15 61 18.027756
+15 62 44.721360
+15 63 60.827625
+15 64 65.000000
+15 65 42.720019
+15 66 30.413813
+15 67 36.878178
+15 68 59.076222
+15 69 38.078866
+15 70 26.925824
+15 71 38.418745
+15 72 60.827625
+15 73 61.351447
+15 74 15.297059
+15 75 29.154759
+15 76 40.000000
+15 77 64.140471
+15 78 45.694639
+15 79 11.401754
+15 80 23.021729
+15 81 42.047592
+15 82 45.880279
+15 83 22.090722
+15 84 34.928498
+15 85 54.405882
+15 86 62.032250
+15 87 26.400758
+15 88 22.135944
+15 89 23.021729
+15 90 73.783467
+15 91 32.062439
+15 92 44.102154
+15 93 48.041649
+15 94 56.435804
+15 95 52.086467
+15 96 51.623638
+15 97 50.803543
+15 98 27.018512
+15 99 22.135944
+15 100 23.259407
+15 101 34.058773
+16 1 39.293765
+16 2 50.537115
+16 3 40.311289
+16 4 49.244289
+16 5 43.863424
+16 6 48.466483
+16 7 38.483763
+16 8 37.336309
+16 9 42.059482
+16 10 9.433981
+16 11 8.000000
+16 12 6.000000
+16 13 7.810250
+16 14 5.830952
+16 15 5.830952
+16 17 2.000000
+16 18 5.385165
+16 19 54.671748
+16 20 50.000000
+16 21 47.169906
+16 22 51.662365
+16 23 45.486262
+16 24 50.209561
+16 25 43.829214
+16 26 48.104054
+16 27 93.536089
+16 28 93.134312
+16 29 90.553851
+16 30 88.141931
+16 31 86.579443
+16 32 86.145226
+16 33 85.586214
+16 34 84.344532
+16 35 83.150466
+16 36 79.056942
+16 37 77.420927
+16 38 75.716577
+16 39 72.111026
+16 40 70.455660
+16 41 73.409809
+16 42 66.037868
+16 43 66.400301
+16 44 69.526973
+16 45 67.623960
+16 46 45.694639
+16 47 43.081318
+16 48 5.000000
+16 49 53.150729
+16 50 48.826222
+16 51 70.178344
+16 52 56.648036
+16 53 25.079872
+16 54 20.591260
+16 55 56.648036
+16 56 34.409301
+16 57 48.259714
+16 58 31.764760
+16 59 32.695565
+16 60 21.540659
+16 61 23.853721
+16 62 49.739320
+16 63 63.198101
+16 64 66.098411
+16 65 44.147480
+16 66 33.000000
+16 67 39.115214
+16 68 62.032250
+16 69 42.941821
+16 70 31.384710
+16 71 43.931765
+16 72 64.761099
+16 73 65.924199
+16 74 20.000000
+16 75 26.907248
+16 76 35.128336
+16 77 64.404969
+16 78 42.544095
+16 79 17.088007
+16 80 28.284271
+16 81 45.541190
+16 82 50.328918
+16 83 25.179357
+16 84 36.138622
+16 85 56.089215
+16 86 63.324561
+16 87 24.839485
+16 88 18.867962
+16 89 28.425341
+16 90 73.824115
+16 91 35.693137
+16 92 47.042534
+16 93 51.088159
+16 94 60.207973
+16 95 55.578773
+16 96 54.083269
+16 97 54.817880
+16 98 22.090722
+16 99 26.832816
+16 100 24.515301
+16 101 39.623226
+17 1 41.231056
+17 2 51.478151
+17 3 41.340053
+17 4 50.089919
+17 5 44.721360
+17 6 49.244289
+17 7 39.357337
+17 8 38.078866
+17 9 42.720019
+17 10 11.180340
+17 11 10.000000
+17 12 8.000000
+17 13 9.433981
+17 14 7.071068
+17 15 7.071068
+17 16 2.000000
+17 18 5.000000
+17 19 56.222771
+17 20 51.613952
+17 21 48.877398
+17 22 53.150729
+17 23 47.169906
+17 24 51.662365
+17 25 45.486262
+17 26 49.497475
+17 27 95.524866
+17 28 95.131488
+17 29 92.541882
+17 30 90.138782
+17 31 88.566359
+17 32 88.141931
+17 33 87.572827
+17 34 86.313383
+17 35 85.146932
+17 36 80.709355
+17 37 79.056942
+17 38 77.388630
+17 39 73.783467
+17 40 72.111026
+17 41 75.000000
+17 42 67.742158
+17 43 68.007353
+17 44 71.063352
+17 45 69.202601
+17 46 46.518813
+17 47 43.863424
+17 48 5.385165
+17 49 54.671748
+17 50 50.477718
+17 51 72.173402
+17 52 58.523500
+17 53 26.925824
+17 54 22.360680
+17 55 58.523500
+17 56 36.055513
+17 57 50.249378
+17 58 33.541020
+17 59 33.541020
+17 60 22.360680
+17 61 25.000000
+17 62 51.478151
+17 63 65.192024
+17 64 68.007353
+17 65 46.097722
+17 66 35.000000
+17 67 41.109610
+17 68 64.031242
+17 69 44.721360
+17 70 33.241540
+17 71 45.453273
+17 72 66.708320
+17 73 67.779053
+17 74 20.099751
+17 75 28.284271
+17 76 35.355339
+17 77 66.211781
+17 78 43.566042
+17 79 17.888544
+17 80 28.635642
+17 81 47.518417
+17 82 52.201533
+17 83 27.166155
+17 84 38.078866
+17 85 58.051701
+17 86 65.253352
+17 87 26.400758
+17 88 20.000000
+17 89 30.000000
+17 90 75.591005
+17 91 37.656341
+17 92 49.040799
+17 93 53.084838
+17 94 62.169124
+17 95 57.558666
+17 96 56.080300
+17 97 56.753854
+17 98 22.360680
+17 99 28.635642
+17 100 26.476405
+17 101 41.109610
+18 1 40.311289
+18 2 47.169906
+18 3 37.202150
+18 4 45.650849
+18 5 40.311289
+18 6 44.721360
+18 7 34.985711
+18 8 33.541020
+18 9 38.078866
+18 10 14.142136
+18 11 11.180340
+18 12 9.433981
+18 13 8.000000
+18 14 11.180340
+18 15 5.000000
+18 16 5.385165
+18 17 5.000000
+18 19 59.464275
+18 20 54.671748
+18 21 51.613952
+18 22 56.568542
+18 23 50.000000
+18 24 55.172457
+18 25 48.414874
+18 26 53.150729
+18 27 96.176920
+18 28 95.524866
+18 29 93.214806
+18 30 90.553851
+18 31 89.269256
+18 32 88.566359
+18 33 88.283634
+18 34 87.321246
+18 35 85.586214
+18 36 78.032045
+18 37 76.321688
+18 38 74.793048
+18 39 71.196910
+18 40 69.462220
+18 41 72.111026
+18 42 65.299311
+18 43 65.192024
+18 44 68.007353
+18 45 66.287254
+18 46 42.059482
+18 47 39.357337
+18 48 2.000000
+18 49 58.000000
+18 50 53.413481
+18 51 72.691127
+18 52 60.415230
+18 53 29.154759
+18 54 20.615528
+18 55 57.008771
+18 56 33.541020
+18 57 50.990195
+18 58 36.055513
+18 59 38.078866
+18 60 26.925824
+18 61 21.213203
+18 62 49.244289
+18 63 65.764732
+18 64 69.641941
+18 65 47.434165
+18 66 35.355339
+18 67 41.773197
+18 68 64.070274
+18 69 42.720019
+18 70 31.780497
+18 71 42.438190
+18 72 65.764732
+18 73 66.098411
+18 74 15.132746
+18 75 32.015621
+18 76 40.311289
+18 77 68.476273
+18 78 47.885280
+18 79 13.601471
+18 80 23.769729
+18 81 47.042534
+18 82 50.695167
+18 83 27.073973
+18 84 39.560081
+18 85 59.203040
+18 86 66.730802
+18 87 29.698485
+18 88 24.186773
+18 89 27.294688
+18 90 78.032045
+18 91 37.054015
+18 92 49.091751
+18 93 53.037722
+18 94 61.400326
+18 95 57.078893
+18 96 56.568542
+18 97 55.731499
+18 98 27.294688
+18 99 26.925824
+18 100 27.856777
+18 101 38.013156
+19 1 45.177428
+19 2 82.225300
+19 3 73.375745
+19 4 82.969874
+19 5 78.746428
+19 6 83.522452
+19 7 74.672619
+19 8 75.769387
+19 9 80.411442
+19 10 45.343136
+19 11 48.795492
+19 12 50.209561
+19 13 53.814496
+19 14 49.203658
+19 15 55.865911
+19 16 54.671748
+19 17 56.222771
+19 18 59.464275
+19 20 5.385165
+19 21 10.198039
+19 22 4.000000
+19 23 10.770330
+19 24 6.000000
+19 25 11.661904
+19 26 9.000000
+19 27 56.797887
+19 28 59.169249
+19 29 54.120237
+19 30 54.918121
+19 31 50.606324
+19 32 53.254108
+19 33 49.739320
+19 34 45.617979
+19 35 50.803543
+19 36 83.240615
+19 37 82.710338
+19 38 79.812280
+19 39 77.129761
+19 40 76.687678
+19 41 81.584312
+19 42 71.386273
+19 43 75.802375
+19 44 80.752709
+19 45 77.781746
+19 46 80.653580
+19 47 79.378838
+19 48 58.000000
+19 49 2.000000
+19 50 7.280110
+19 51 41.036569
+19 52 18.601075
+19 53 31.400637
+19 54 51.000000
+19 55 56.089215
+19 56 56.753854
+19 57 30.594117
+19 58 24.413111
+19 59 29.427878
+19 60 37.161808
+19 61 62.177166
+19 62 60.008333
+19 63 36.619667
+19 64 25.806976
+19 65 25.019992
+19 66 36.138622
+19 67 32.140317
+19 68 42.059482
+19 69 55.145263
+19 70 48.764741
+19 71 64.629715
+19 72 54.230987
+19 73 62.936476
+19 74 69.202601
+19 75 28.301943
+19 76 39.000000
+19 77 17.464249
+19 78 21.095023
+19 79 62.425956
+19 80 73.573093
+19 81 42.107007
+19 82 53.235327
+19 83 41.629317
+19 84 26.925824
+19 85 27.294688
+19 86 26.172505
+19 87 29.832868
+19 88 37.215588
+19 89 56.648036
+19 90 23.000000
+19 91 42.579338
+19 92 37.336309
+19 93 39.051248
+19 94 49.979996
+19 95 44.922155
+19 96 34.176015
+19 97 50.219518
+19 98 42.059482
+19 99 50.328918
+19 100 34.985711
+19 101 63.348244
+20 1 40.049969
+20 2 76.902536
+20 3 68.007353
+20 4 77.620873
+20 5 73.375745
+20 6 78.160092
+20 7 69.289249
+20 8 70.384657
+20 9 75.026662
+20 10 40.607881
+20 11 43.863424
+20 12 45.343136
+20 13 48.795492
+20 14 44.654227
+20 15 50.931326
+20 16 50.000000
+20 17 51.613952
+20 18 54.671748
+20 19 5.385165
+20 21 5.000000
+20 22 5.385165
+20 23 5.385165
+20 24 6.403124
+20 25 6.403124
+20 26 8.602325
+20 27 56.648036
+20 28 58.600341
+20 29 53.851648
+20 30 54.120237
+20 31 50.159745
+20 32 52.354560
+20 33 49.244289
+20 34 45.541190
+20 35 49.739320
+20 36 79.056942
+20 37 78.447435
+20 38 75.584390
+20 39 72.801099
+20 40 72.277244
+20 41 77.129761
+20 42 66.940272
+20 43 71.196910
+20 44 76.118329
+20 45 73.164199
+20 46 75.286121
+20 47 74.000000
+20 48 53.150729
+20 49 5.000000
+20 50 2.000000
+20 51 39.051248
+20 52 16.401219
+20 53 26.248809
+20 54 45.650849
+20 55 51.662365
+20 56 51.419841
+20 57 26.248809
+20 58 19.209373
+20 59 27.000000
+20 60 33.526109
+20 61 56.824291
+20 62 55.081757
+20 63 33.970576
+20 64 25.079872
+20 65 20.223748
+20 66 30.805844
+20 67 27.018512
+20 68 38.832976
+20 69 50.039984
+20 70 43.416587
+20 71 59.413803
+20 72 50.537115
+20 73 58.872744
+20 74 64.031242
+20 75 24.166092
+20 76 37.336309
+20 77 18.110770
+20 78 20.248457
+20 79 57.201399
+20 80 68.264193
+20 81 37.336309
+20 82 48.507731
+20 83 36.249138
+20 84 21.587033
+20 85 24.207437
+20 86 24.698178
+20 87 25.238859
+20 88 33.105891
+20 89 51.264022
+20 90 25.495098
+20 91 37.336309
+20 92 32.756679
+20 93 34.785054
+20 94 46.097722
+20 95 40.853396
+20 96 30.413813
+20 97 45.880279
+20 98 38.832976
+20 99 44.944410
+20 100 29.681644
+20 101 58.051701
+21 1 35.057096
+21 2 72.034714
+21 3 63.245553
+21 4 72.801099
+21 5 68.622154
+21 6 73.375745
+21 7 64.621978
+21 8 65.795137
+21 9 70.384657
+21 10 37.735925
+21 11 40.607881
+21 12 42.201896
+21 13 45.343136
+21 14 42.059482
+21 15 47.634021
+21 16 47.169906
+21 17 48.877398
+21 18 51.613952
+21 19 10.198039
+21 20 5.000000
+21 22 10.198039
+21 23 2.000000
+21 24 10.770330
+21 25 4.000000
+21 26 12.206556
+21 27 55.081757
+21 28 56.648036
+21 29 52.201533
+21 30 52.000000
+21 31 48.383882
+21 32 50.159745
+21 33 47.434165
+21 34 44.147480
+21 35 47.423623
+21 36 74.330344
+21 37 73.681748
+21 38 70.837843
+21 39 68.007353
+21 40 67.446275
+21 41 72.277244
+21 42 62.096699
+21 43 66.287254
+21 44 71.196910
+21 45 68.249542
+21 46 70.519501
+21 47 69.289249
+21 48 50.000000
+21 49 10.000000
+21 50 3.000000
+21 51 36.055513
+21 52 13.928388
+21 53 22.671568
+21 54 41.340053
+21 55 46.840154
+21 56 46.572524
+21 57 21.540659
+21 58 15.620499
+21 59 27.459060
+21 60 32.388269
+21 61 52.478567
+21 62 50.089919
+21 63 30.479501
+21 64 23.537205
+21 65 15.297059
+21 66 25.961510
+21 67 22.022716
+21 68 34.828150
+21 69 45.044423
+21 70 38.600518
+21 71 54.451814
+21 72 46.141088
+21 73 54.230987
+21 74 60.207973
+21 75 22.561028
+21 76 38.327536
+21 77 18.248288
+21 78 22.472205
+21 79 53.263496
+21 80 64.070274
+21 81 32.388269
+21 82 43.566042
+21 83 31.764760
+21 84 16.763055
+21 85 20.518285
+21 86 22.472205
+21 87 22.847319
+21 88 31.320920
+21 89 46.615448
+21 90 26.925824
+21 91 32.388269
+21 92 27.892651
+21 93 30.083218
+21 94 41.593269
+21 95 36.249138
+21 96 26.076810
+21 97 41.109610
+21 98 38.118237
+21 99 40.311289
+21 100 25.612497
+21 101 53.150729
+22 1 45.000000
+22 2 81.394103
+22 3 72.277244
+22 4 82.000000
+22 5 77.620873
+22 6 82.462113
+22 7 73.375745
+22 8 74.330344
+22 9 79.056942
+22 10 42.426407
+22 11 46.097722
+22 12 47.423623
+22 13 51.224994
+22 14 46.097722
+22 15 53.150729
+22 16 51.662365
+22 17 53.150729
+22 18 56.568542
+22 19 4.000000
+22 20 5.385165
+22 21 10.198039
+22 23 10.000000
+22 24 2.000000
+22 25 10.198039
+22 26 5.000000
+22 27 60.415230
+22 28 62.649820
+22 29 57.697487
+22 30 58.309519
+22 31 54.120237
+22 32 56.603887
+22 33 53.235327
+22 34 49.244289
+22 35 54.083269
+22 36 84.433406
+22 37 83.815273
+22 38 80.956779
+22 39 78.160092
+22 40 77.620873
+22 41 82.462113
+22 42 72.277244
+22 43 76.485293
+22 44 81.394103
+22 45 78.447435
+22 46 79.555012
+22 47 78.160092
+22 48 55.172457
+22 49 2.000000
+22 50 7.280110
+22 51 43.863424
+22 52 21.213203
+22 53 29.154759
+22 54 49.244289
+22 55 57.008771
+22 56 55.901699
+22 57 31.622777
+22 58 22.360680
+22 59 25.495098
+22 60 33.541020
+22 61 60.415230
+22 62 60.207973
+22 63 39.051248
+22 64 29.154759
+22 65 25.495098
+22 66 35.355339
+22 67 32.015621
+22 68 44.102154
+22 69 55.000000
+22 70 47.853944
+22 71 64.195015
+22 72 55.901699
+22 73 64.257295
+22 74 66.850580
+22 75 25.000000
+22 76 35.000000
+22 77 21.189620
+22 78 17.117243
+22 79 60.207973
+22 80 71.589105
+22 81 42.579338
+22 82 53.758720
+22 83 40.162171
+22 84 26.172505
+22 85 29.410882
+22 86 29.206164
+22 87 26.870058
+22 88 33.837849
+22 89 55.362442
+22 90 27.000000
+22 91 42.107007
+22 92 38.078866
+22 93 40.162171
+22 94 51.478151
+22 95 46.238512
+22 96 35.777088
+22 97 51.244512
+22 98 38.275318
+22 99 49.040799
+22 100 33.105891
+22 101 62.649820
+23 1 35.000000
+23 2 71.589105
+23 3 62.641839
+23 4 72.277244
+23 5 68.007353
+23 6 72.801099
+23 7 63.906181
+23 8 65.000000
+23 9 69.641941
+23 10 36.055513
+23 11 39.051248
+23 12 40.607881
+23 13 43.863424
+23 14 40.311289
+23 15 46.097722
+23 16 45.486262
+23 17 47.169906
+23 18 50.000000
+23 19 10.770330
+23 20 5.385165
+23 21 2.000000
+23 22 10.000000
+23 24 10.198039
+23 25 2.000000
+23 26 11.180340
+23 27 57.008771
+23 28 58.523500
+23 29 54.120237
+23 30 53.851648
+23 31 50.289164
+23 32 52.000000
+23 33 49.335586
+23 34 46.097722
+23 35 49.244289
+23 36 75.026662
+23 37 74.330344
+23 38 71.512237
+23 39 68.622154
+23 40 68.007353
+23 41 72.801099
+23 42 62.641839
+23 43 66.708320
+23 44 71.589105
+23 45 68.658576
+23 46 69.921384
+23 47 68.622154
+23 48 48.414874
+23 49 10.198039
+23 50 3.605551
+23 51 37.735925
+23 52 15.811388
+23 53 21.213203
+23 54 40.311289
+23 55 47.434165
+23 56 46.097722
+23 57 22.360680
+23 58 14.142136
+23 59 25.495098
+23 60 30.413813
+23 61 51.478151
+23 62 50.249378
+23 63 32.015621
+23 64 25.495098
+23 65 15.811388
+23 66 25.495098
+23 67 22.022716
+23 68 36.124784
+23 69 45.000000
+23 70 38.078866
+23 71 54.230987
+23 72 47.169906
+23 73 55.036352
+23 74 58.898217
+23 75 20.615528
+23 76 36.400549
+23 77 20.223748
+23 78 20.808652
+23 79 52.009614
+23 80 62.968246
+23 81 32.756679
+23 82 43.931765
+23 83 30.870698
+23 84 16.278821
+23 85 22.022716
+23 86 24.351591
+23 87 21.023796
+23 88 29.410882
+23 89 45.880279
+23 90 28.792360
+23 91 32.140317
+23 92 28.460499
+23 93 30.870698
+23 94 42.544095
+23 95 37.121422
+23 96 27.202941
+23 97 41.785165
+23 98 36.124784
+23 99 39.560081
+23 100 24.413111
+23 101 52.773099
+24 1 45.044423
+24 2 81.049368
+24 3 71.805292
+24 4 81.584312
+24 5 77.129761
+24 6 82.000000
+24 7 72.801099
+24 8 73.681748
+24 9 78.447435
+24 10 41.036569
+24 11 44.821870
+24 12 46.097722
+24 13 50.000000
+24 14 44.598206
+24 15 51.855569
+24 16 50.209561
+24 17 51.662365
+24 18 55.172457
+24 19 6.000000
+24 20 6.403124
+24 21 10.770330
+24 22 2.000000
+24 23 10.198039
+24 25 10.000000
+24 26 3.000000
+24 27 62.241465
+24 28 64.412732
+24 29 59.506302
+24 30 60.033324
+24 31 55.901699
+24 32 58.309519
+24 33 55.009090
+24 34 51.078371
+24 35 55.758407
+24 36 85.094066
+24 37 84.433406
+24 38 81.596569
+24 39 78.746428
+24 40 78.160092
+24 41 82.969874
+24 42 72.801099
+24 43 76.902536
+24 44 81.786307
+24 45 78.854296
+24 46 79.075913
+24 47 77.620873
+24 48 53.814496
+24 49 4.000000
+24 50 8.062258
+24 51 45.343136
+24 52 22.671568
+24 53 28.178006
+24 54 48.466483
+24 55 57.567352
+24 56 55.578773
+24 57 32.310989
+24 58 21.540659
+24 59 23.537205
+24 60 31.764760
+24 61 59.615434
+24 62 60.406953
+24 63 40.360872
+24 64 30.886890
+24 65 25.961510
+24 66 35.128336
+24 67 32.140317
+24 68 45.221676
+24 69 55.036352
+24 70 47.518417
+24 71 64.070274
+24 72 56.824291
+24 73 65.000000
+24 74 65.734314
+24 75 23.430749
+24 76 33.000000
+24 77 23.086793
+24 78 15.132746
+24 79 59.169249
+24 80 70.661163
+24 81 42.953463
+24 82 54.129474
+24 83 39.560081
+24 84 26.019224
+24 85 30.610456
+24 86 30.805844
+24 87 25.495098
+24 88 32.202484
+24 89 54.817880
+24 90 29.000000
+24 91 42.011903
+24 92 38.600518
+24 93 40.853396
+24 94 52.325902
+24 95 47.010637
+24 96 36.715120
+24 97 51.865210
+24 98 36.400549
+24 99 48.507731
+24 100 32.310989
+24 101 62.393910
+25 1 35.057096
+25 2 71.196910
+25 3 62.096699
+25 4 71.805292
+25 5 67.446275
+25 6 72.277244
+25 7 63.245553
+25 8 64.257295
+25 9 68.949257
+25 10 34.409301
+25 11 37.536649
+25 12 39.051248
+25 13 42.426407
+25 14 38.587563
+25 15 44.598206
+25 16 43.829214
+25 17 45.486262
+25 18 48.414874
+25 19 11.661904
+25 20 6.403124
+25 21 4.000000
+25 22 10.198039
+25 23 2.000000
+25 24 10.000000
+25 26 10.440307
+25 27 58.940648
+25 28 60.406953
+25 29 56.044625
+25 30 55.713553
+25 31 52.201533
+25 32 53.851648
+25 33 51.244512
+25 34 48.052055
+25 35 51.078371
+25 36 75.769387
+25 37 75.026662
+25 38 72.235725
+25 39 69.289249
+25 40 68.622154
+25 41 73.375745
+25 42 63.245553
+25 43 67.186308
+25 44 72.034714
+25 45 69.123079
+25 46 69.375788
+25 47 68.007353
+25 48 46.861498
+25 49 10.770330
+25 50 5.000000
+25 51 39.446166
+25 52 17.720045
+25 53 19.849433
+25 54 39.357337
+25 55 48.104054
+25 56 45.705580
+25 57 23.323808
+25 58 12.806248
+25 59 23.537205
+25 60 28.442925
+25 61 50.537115
+25 62 50.487622
+25 63 33.600595
+25 64 27.459060
+25 65 16.552945
+25 66 25.179357
+25 67 22.203603
+25 68 37.483330
+25 69 45.044423
+25 70 37.656341
+25 71 54.083269
+25 72 48.259714
+25 73 55.901699
+25 74 57.628118
+25 75 18.681542
+25 76 34.481879
+25 77 22.203603
+25 78 19.209373
+25 79 50.803543
+25 80 61.911227
+25 81 33.241540
+25 82 44.384682
+25 83 30.083218
+25 84 16.031220
+25 85 23.600847
+25 86 26.248809
+25 87 19.235384
+25 88 27.513633
+25 89 45.221676
+25 90 30.675723
+25 91 32.015621
+25 92 29.154759
+25 93 31.764760
+25 94 43.566042
+25 95 38.078866
+25 96 28.425341
+25 97 42.544095
+25 98 34.132096
+25 99 38.897301
+25 100 23.323808
+25 101 52.469038
+26 1 45.276926
+26 2 80.622577
+26 3 71.196910
+26 4 81.049368
+26 5 76.485293
+26 6 81.394103
+26 7 72.034714
+26 8 72.801099
+26 9 77.620873
+26 10 39.051248
+26 11 43.011626
+26 12 44.204072
+26 13 48.259714
+26 14 42.426407
+26 15 50.000000
+26 16 48.104054
+26 17 49.497475
+26 18 53.150729
+26 19 9.000000
+26 20 8.602325
+26 21 12.206556
+26 22 5.000000
+26 23 11.180340
+26 24 3.000000
+26 25 10.440307
+26 27 65.000000
+26 28 67.082039
+26 29 62.241465
+26 30 62.649820
+26 31 58.600341
+26 32 60.901560
+26 33 57.697487
+26 34 53.851648
+26 35 58.309519
+26 36 86.162637
+26 37 85.440037
+26 38 82.637764
+26 39 79.711982
+26 40 79.056942
+26 41 83.815273
+26 42 73.681748
+26 43 77.620873
+26 44 82.462113
+26 45 79.555012
+26 46 78.447435
+26 47 76.902536
+26 48 51.855569
+26 49 7.000000
+26 50 9.899495
+26 51 47.634021
+26 52 25.000000
+26 53 26.925824
+26 54 47.434165
+26 55 58.523500
+26 56 55.226805
+26 57 33.541020
+26 58 20.615528
+26 59 20.615528
+26 60 29.154759
+26 61 58.523500
+26 62 60.827625
+26 63 42.426407
+26 64 33.541020
+26 65 26.925824
+26 66 35.000000
+26 67 32.557641
+26 68 47.010637
+26 69 55.226805
+26 70 47.169906
+26 71 64.000000
+26 72 58.309519
+26 73 66.211781
+26 74 64.140471
+26 75 21.213203
+26 76 30.000000
+26 77 25.961510
+26 78 12.165525
+26 79 57.706152
+26 80 69.354164
+26 81 43.680659
+26 82 54.817880
+26 83 38.832976
+26 84 26.076810
+26 85 32.557641
+26 86 33.286634
+26 87 23.600847
+26 88 29.832868
+26 89 54.129474
+26 90 32.000000
+26 91 42.047592
+26 92 39.560081
+26 93 42.047592
+26 94 53.712196
+26 95 48.301139
+26 96 38.275318
+26 97 52.924474
+26 98 33.615473
+26 99 47.853944
+26 100 31.320920
+26 101 62.128898
+27 1 58.523500
+27 2 89.022469
+27 3 85.755466
+27 4 91.400219
+27 5 90.138782
+27 6 93.005376
+27 7 89.185201
+27 8 91.787799
+27 9 94.339811
+27 10 85.146932
+27 11 85.586214
+27 12 87.572827
+27 13 88.283634
+27 14 90.138782
+27 15 91.241438
+27 16 93.536089
+27 17 95.524866
+27 18 96.176920
+27 19 56.797887
+27 20 56.648036
+27 21 55.081757
+27 22 60.415230
+27 23 57.008771
+27 24 62.241465
+27 25 58.940648
+27 26 65.000000
+27 28 5.000000
+27 29 3.000000
+27 30 7.071068
+27 31 7.000000
+27 32 8.602325
+27 33 8.000000
+27 34 11.180340
+27 35 11.180340
+27 36 61.717096
+27 37 62.649820
+27 38 60.033324
+27 39 59.908263
+27 40 61.032778
+27 41 65.192024
+27 42 58.258047
+27 43 64.031242
+27 44 68.007353
+27 45 65.604878
+27 46 91.263355
+27 47 91.809586
+27 48 94.201911
+27 49 58.600341
+27 50 55.973208
+27 51 23.537205
+27 52 41.231056
+27 53 70.000000
+27 54 77.620873
+27 55 50.000000
+27 56 71.589105
+27 57 45.276926
+27 58 65.192024
+27 59 82.462113
+27 60 85.586214
+27 61 85.440037
+27 62 61.032778
+27 63 30.413813
+27 64 31.622777
+27 65 50.000000
+27 66 60.827625
+27 67 54.451814
+27 68 33.241540
+27 69 62.649820
+27 70 67.675697
+27 71 71.561163
+27 72 39.051248
+27 73 47.423623
+27 74 97.718985
+27 75 75.663730
+27 76 93.407708
+27 77 39.357337
+27 78 76.896034
+27 79 90.801982
+27 80 96.772930
+27 81 50.921508
+27 82 53.851648
+27 83 69.231496
+27 84 58.008620
+27 85 38.013156
+27 86 32.756679
+27 87 74.242845
+27 88 83.216585
+27 89 76.321688
+27 90 37.536649
+27 91 60.440053
+27 92 47.539457
+27 93 43.965896
+27 94 40.496913
+27 95 42.047592
+27 96 39.623226
+27 97 46.647615
+27 98 91.787799
+27 99 72.422372
+27 100 69.180922
+27 101 73.925638
+28 1 57.008771
+28 2 86.023253
+28 3 83.240615
+28 4 88.481637
+28 5 87.464278
+28 6 90.138782
+28 7 86.769810
+28 8 89.442719
+28 9 91.787799
+28 10 85.000000
+28 11 85.146932
+28 12 87.143560
+28 13 87.572827
+28 14 90.000000
+28 15 90.553851
+28 16 93.134312
+28 17 95.131488
+28 18 95.524866
+28 19 59.169249
+28 20 58.600341
+28 21 56.648036
+28 22 62.649820
+28 23 58.523500
+28 24 64.412732
+28 25 60.406953
+28 26 67.082039
+28 27 5.000000
+28 29 5.830952
+28 30 5.000000
+28 31 8.602325
+28 32 7.000000
+28 33 9.433981
+28 34 14.142136
+28 35 10.000000
+28 36 57.306195
+28 37 58.309519
+28 38 55.758407
+28 39 55.803226
+28 40 57.008771
+28 41 61.032778
+28 42 54.488531
+28 43 60.207973
+28 44 64.031242
+28 45 61.717096
+28 46 88.509886
+28 47 89.185201
+28 48 93.536089
+28 49 60.901560
+28 50 57.775427
+28 51 23.000000
+28 52 42.720019
+28 53 70.178344
+28 54 76.485293
+28 55 47.169906
+28 56 69.641941
+28 57 45.000000
+28 58 65.764732
+28 59 83.815273
+28 60 86.313383
+28 61 83.815273
+28 62 58.309519
+28 63 30.000000
+28 64 33.541020
+28 65 50.249378
+28 66 60.207973
+28 67 54.037024
+28 68 31.780497
+28 69 60.415230
+28 70 66.219333
+28 71 68.963759
+28 72 36.055513
+28 73 43.863424
+28 74 96.301610
+28 75 76.485293
+28 76 94.868330
+28 77 41.880783
+28 78 78.790862
+28 79 89.498603
+28 80 94.921020
+28 81 49.477268
+28 82 51.429563
+28 83 68.468971
+28 84 58.137767
+28 85 38.470768
+28 86 34.176015
+28 87 74.813100
+28 88 83.725743
+28 89 74.632433
+28 90 41.036569
+28 91 59.228372
+28 92 46.529560
+28 93 42.755117
+28 94 38.013156
+28 95 40.162171
+28 96 39.051248
+28 97 44.283180
+28 98 92.574294
+28 99 71.063352
+28 100 69.000000
+28 101 71.554175
+29 1 55.713553
+29 2 86.683332
+29 3 83.216585
+29 4 89.022469
+29 5 87.658428
+29 6 90.603532
+29 7 86.608314
+29 8 89.185201
+29 9 91.809586
+29 10 82.152298
+29 11 82.607506
+29 12 84.593144
+29 13 85.328776
+29 14 87.143560
+29 15 88.283634
+29 16 90.553851
+29 17 92.541882
+29 18 93.214806
+29 19 54.120237
+29 20 53.851648
+29 21 52.201533
+29 22 57.697487
+29 23 54.120237
+29 24 59.506302
+29 25 56.044625
+29 26 62.241465
+29 27 3.000000
+29 28 5.830952
+29 30 5.385165
+29 31 4.000000
+29 32 6.403124
+29 33 5.000000
+29 34 8.602325
+29 35 8.602325
+29 36 60.415230
+29 37 61.269895
+29 38 58.591808
+29 39 58.309519
+29 40 59.363288
+29 41 63.631753
+29 42 56.400355
+29 43 62.201286
+29 44 66.287254
+29 45 63.820060
+29 46 88.814413
+29 47 89.308454
+29 48 91.241438
+29 49 55.901699
+29 50 53.141321
+29 51 20.615528
+29 52 38.327536
+29 53 67.000000
+29 54 74.726167
+29 55 47.634021
+29 56 68.876701
+29 57 42.296572
+29 58 62.201286
+29 59 79.555012
+29 60 82.607506
+29 61 82.637764
+29 62 58.600341
+29 63 27.459060
+29 64 28.792360
+29 65 47.000000
+29 66 57.870545
+29 67 51.478151
+29 68 30.463092
+29 69 60.033324
+29 70 64.845971
+29 71 69.065187
+29 72 36.796739
+29 73 45.453273
+29 74 94.868330
+29 75 72.691127
+29 76 90.520716
+29 77 36.715120
+29 78 74.094534
+29 79 87.931792
+29 80 94.021274
+29 81 48.104054
+29 82 51.312766
+29 83 66.287254
+29 84 55.009090
+29 85 35.014283
+29 86 29.832868
+29 87 71.253070
+29 88 80.224684
+29 89 73.539105
+29 90 35.355339
+29 91 57.567352
+29 92 44.643029
+29 93 41.109610
+29 94 38.013156
+29 95 39.357337
+29 96 36.674242
+29 97 44.102154
+29 98 88.814413
+29 99 69.570109
+29 100 66.189123
+29 101 71.344236
+30 1 52.201533
+30 2 82.006097
+30 3 78.892332
+30 4 84.403791
+30 5 83.216585
+30 6 86.023253
+30 7 82.365041
+30 8 85.000000
+30 9 87.464278
+30 10 80.000000
+30 11 80.156098
+30 12 82.152298
+30 13 82.607506
+30 14 85.000000
+30 15 85.586214
+30 16 88.141931
+30 17 90.138782
+30 18 90.553851
+30 19 54.918121
+30 20 54.120237
+30 21 52.000000
+30 22 58.309519
+30 23 53.851648
+30 24 60.033324
+30 25 55.713553
+30 26 62.649820
+30 27 7.071068
+30 28 5.000000
+30 29 5.385165
+30 31 5.385165
+30 32 2.000000
+30 33 5.830952
+30 34 11.180340
+30 35 5.000000
+30 36 55.036352
+30 37 55.901699
+30 38 53.235327
+30 39 53.000000
+30 40 54.083269
+30 41 58.309519
+30 42 51.224994
+30 43 57.008771
+30 44 61.032778
+30 45 58.600341
+30 46 84.314886
+30 47 84.905830
+30 48 88.566359
+30 49 56.603887
+30 50 53.225934
+30 51 18.000000
+30 52 38.078866
+30 53 65.192024
+30 54 71.589105
+30 55 43.011626
+30 56 65.000000
+30 57 40.000000
+30 58 60.827625
+30 59 79.056942
+30 60 81.394103
+30 61 79.056942
+30 62 54.083269
+30 63 25.000000
+30 64 29.154759
+30 65 45.276926
+30 66 55.226805
+30 67 49.040799
+30 68 26.925824
+30 69 55.901699
+30 70 61.400326
+30 71 64.660653
+30 72 32.015621
+30 73 40.360872
+30 74 91.482239
+30 75 71.589105
+30 76 90.138782
+30 77 37.802116
+30 78 74.249579
+30 79 84.646323
+30 80 90.249654
+30 81 44.643029
+30 82 47.010637
+30 83 63.505905
+30 84 53.150729
+30 85 33.541020
+30 86 29.546573
+30 87 69.871310
+30 88 78.771822
+30 89 69.892775
+30 90 37.802116
+30 91 54.341513
+30 92 41.593269
+30 93 37.854986
+30 94 33.615473
+30 95 35.468296
+30 96 34.058773
+30 97 39.824616
+30 98 87.664132
+30 99 66.219333
+30 100 64.000000
+30 101 67.119297
+31 1 52.000000
+31 2 83.630138
+31 3 79.881162
+31 4 85.912746
+31 5 84.403791
+31 6 87.458562
+31 7 83.216585
+31 8 85.755466
+31 9 88.481637
+31 10 78.160092
+31 11 78.638413
+31 12 80.622577
+31 13 81.394103
+31 14 83.150466
+31 15 84.344532
+31 16 86.579443
+31 17 88.566359
+31 18 89.269256
+31 19 50.606324
+31 20 50.159745
+31 21 48.383882
+31 22 54.120237
+31 23 50.289164
+31 24 55.901699
+31 25 52.201533
+31 26 58.600341
+31 27 7.000000
+31 28 8.602325
+31 29 4.000000
+31 30 5.385165
+31 32 5.000000
+31 33 1.000000
+31 34 5.830952
+31 35 5.830952
+31 36 58.872744
+31 37 59.615434
+31 38 56.859476
+31 39 56.356011
+31 40 57.306195
+31 41 61.717096
+31 42 54.083269
+31 43 59.908263
+31 44 64.140471
+31 45 61.587336
+31 46 85.603738
+31 47 86.023253
+31 48 87.298339
+31 49 52.354560
+31 50 49.396356
+31 51 16.763055
+31 52 34.481879
+31 53 63.000000
+31 54 70.880181
+31 55 44.598206
+31 56 65.299311
+31 57 38.327536
+31 58 58.215118
+31 59 75.690158
+31 60 78.638413
+31 61 78.924014
+31 62 55.443665
+31 63 23.537205
+31 64 25.079872
+31 65 43.000000
+31 66 53.935146
+31 67 47.518417
+31 68 26.832816
+31 69 56.603887
+31 70 61.098281
+31 71 65.802736
+31 72 33.970576
+31 73 43.011626
+31 74 91.082380
+31 75 68.731361
+31 76 86.683332
+31 77 33.286634
+31 78 70.384657
+31 79 84.118963
+31 80 90.376988
+31 81 44.384682
+31 82 48.010416
+31 83 62.369865
+31 84 51.009803
+31 85 31.016125
+31 86 25.961510
+31 87 67.268120
+31 88 76.236474
+31 89 69.856997
+31 90 32.649655
+31 91 53.758720
+31 92 40.804412
+31 93 37.336309
+31 94 34.828150
+31 95 35.846897
+31 96 32.756679
+31 97 40.804412
+31 98 84.852814
+31 99 65.787537
+31 100 62.201286
+31 101 67.955868
+32 1 50.289164
+32 2 80.430094
+32 3 77.175126
+32 4 82.800966
+32 5 81.541401
+32 6 84.403791
+32 7 80.622577
+32 8 83.240615
+32 9 85.755466
+32 10 78.000000
+32 11 78.160092
+32 12 80.156098
+32 13 80.622577
+32 14 83.000000
+32 15 83.600239
+32 16 86.145226
+32 17 88.141931
+32 18 88.566359
+32 19 53.254108
+32 20 52.354560
+32 21 50.159745
+32 22 56.603887
+32 23 52.000000
+32 24 58.309519
+32 25 53.851648
+32 26 60.901560
+32 27 8.602325
+32 28 7.000000
+32 29 6.403124
+32 30 2.000000
+32 31 5.000000
+32 33 5.099020
+32 34 10.440307
+32 35 3.000000
+32 36 54.230987
+32 37 55.036352
+32 38 52.325902
+32 39 51.971146
+32 40 53.000000
+32 41 57.306195
+32 42 50.000000
+32 43 55.803226
+32 44 59.908263
+32 45 57.428216
+32 46 82.661962
+32 47 83.216585
+32 48 86.579443
+32 49 54.918121
+32 50 51.429563
+32 51 16.000000
+32 52 36.249138
+32 53 63.198101
+32 54 69.634761
+32 55 41.400483
+32 56 63.158531
+32 57 38.000000
+32 58 58.855756
+32 59 77.162167
+32 60 79.429214
+32 61 77.162167
+32 62 52.430907
+32 63 23.000000
+32 64 27.459060
+32 65 43.289722
+32 66 53.235327
+32 67 47.042534
+32 68 25.000000
+32 69 54.120237
+32 70 59.481089
+32 71 62.968246
+32 72 30.479501
+32 73 39.051248
+32 74 89.560036
+32 75 69.634761
+32 76 88.255311
+32 77 36.235342
+32 78 72.449983
+32 79 82.710338
+32 80 88.391176
+32 81 42.720019
+32 82 45.276926
+32 83 61.522354
+32 84 51.156622
+32 85 31.575307
+32 86 27.730849
+32 87 67.896981
+32 88 76.791927
+32 89 68.007353
+32 90 36.619667
+32 91 52.392748
+32 92 39.623226
+32 93 35.902646
+32 94 31.906112
+32 95 33.615473
+32 96 32.062439
+32 97 38.078866
+32 98 85.702975
+32 99 64.288413
+32 100 62.000000
+32 101 65.368188
+33 1 51.078371
+33 2 82.879430
+33 3 79.056942
+33 4 85.146932
+33 5 83.600239
+33 6 86.683332
+33 7 82.377181
+33 8 84.905830
+33 9 87.658428
+33 10 77.162167
+33 11 77.646635
+33 12 79.630396
+33 13 80.411442
+33 14 82.152298
+33 15 83.360662
+33 16 85.586214
+33 17 87.572827
+33 18 88.283634
+33 19 49.739320
+33 20 49.244289
+33 21 47.434165
+33 22 53.235327
+33 23 49.335586
+33 24 55.009090
+33 25 51.244512
+33 26 57.697487
+33 27 8.000000
+33 28 9.433981
+33 29 5.000000
+33 30 5.830952
+33 31 1.000000
+33 32 5.099020
+33 34 5.385165
+33 35 5.385165
+33 36 58.523500
+33 37 59.236813
+33 38 56.462377
+33 39 55.901699
+33 40 56.824291
+33 41 61.269895
+33 42 53.535035
+33 43 59.363288
+33 44 63.631753
+33 45 61.057350
+33 46 84.811556
+33 47 85.211502
+33 48 86.313383
+33 49 51.478151
+33 50 48.466483
+33 51 15.811388
+33 52 33.526109
+33 53 62.000000
+33 54 69.921384
+33 55 43.863424
+33 56 64.412732
+33 57 37.336309
+33 58 57.218878
+33 59 74.726167
+33 60 77.646635
+33 61 78.000000
+33 62 54.671748
+33 63 22.561028
+33 64 24.166092
+33 65 42.000000
+33 66 52.952809
+33 67 46.529560
+33 68 25.942244
+33 69 55.758407
+33 70 60.166436
+33 71 65.000000
+33 72 33.301652
+33 73 42.438190
+33 74 90.138782
+33 75 67.742158
+33 76 85.726309
+33 77 32.449961
+33 78 69.462220
+33 79 83.168504
+33 80 89.470666
+33 81 43.462628
+33 82 47.201695
+33 83 61.392182
+33 84 50.009999
+33 85 30.016662
+33 86 25.000000
+33 87 66.272166
+33 88 75.239617
+33 89 68.942005
+33 90 32.015621
+33 91 52.810984
+33 92 39.849718
+33 93 36.400549
+33 94 34.058773
+33 95 34.985711
+33 96 31.780497
+33 97 40.000000
+33 98 83.862983
+33 99 64.845971
+33 100 61.204575
+33 101 67.119297
+34 1 51.478151
+34 2 84.852814
+34 3 80.430094
+34 4 87.000000
+34 5 85.146932
+34 6 88.459030
+34 7 83.600239
+34 8 86.023253
+34 9 89.022469
+34 10 75.663730
+34 11 76.485293
+34 12 78.447435
+34 13 79.555012
+34 14 80.622577
+34 15 82.462113
+34 16 84.344532
+34 17 86.313383
+34 18 87.321246
+34 19 45.617979
+34 20 45.541190
+34 21 44.147480
+34 22 49.244289
+34 23 46.097722
+34 24 51.078371
+34 25 48.052055
+34 26 53.851648
+34 27 11.180340
+34 28 14.142136
+34 29 8.602325
+34 30 11.180340
+34 31 5.830952
+34 32 10.440307
+34 33 5.385165
+34 35 10.000000
+34 36 62.641839
+34 37 63.245553
+34 38 60.406953
+34 39 59.615434
+34 40 60.415230
+34 41 65.000000
+34 42 56.824291
+34 43 62.649820
+34 44 67.082039
+34 45 64.412732
+34 46 86.452299
+34 47 86.683332
+34 48 85.375641
+34 49 47.423623
+34 50 44.922155
+34 51 16.401219
+34 52 30.413813
+34 53 60.207973
+34 54 69.641941
+34 55 46.097722
+34 56 65.192024
+34 57 36.400549
+34 58 55.000000
+34 59 71.589105
+34 60 75.166482
+34 61 78.262379
+34 62 56.568542
+34 63 22.360680
+34 64 20.615528
+34 65 40.311289
+34 66 52.201533
+34 67 45.607017
+34 68 27.018512
+34 69 57.008771
+34 70 60.373835
+34 71 66.603303
+34 72 36.055513
+34 73 45.650849
+34 74 90.077744
+34 75 65.192024
+34 76 82.462113
+34 77 28.178006
+34 78 65.787537
+34 79 83.006024
+34 80 89.944427
+34 81 43.908997
+34 82 48.836462
+34 83 60.728906
+34 84 48.373546
+34 85 28.284271
+34 86 22.090722
+34 87 64.007812
+34 88 73.006849
+34 89 69.354164
+34 90 26.907248
+34 91 52.801515
+34 92 39.812058
+34 93 36.715120
+34 94 36.124784
+34 95 36.235342
+34 96 31.384710
+34 97 41.725292
+34 98 81.301906
+34 99 64.884513
+34 100 59.841457
+34 101 68.410526
+35 1 47.434165
+35 2 78.102497
+35 3 74.625733
+35 4 80.430094
+35 5 79.056942
+35 6 82.006097
+35 7 78.032045
+35 8 80.622577
+35 9 83.216585
+35 10 75.000000
+35 11 75.166482
+35 12 77.162167
+35 13 77.646635
+35 14 80.000000
+35 15 80.622577
+35 16 83.150466
+35 17 85.146932
+35 18 85.586214
+35 19 50.803543
+35 20 49.739320
+35 21 47.423623
+35 22 54.083269
+35 23 49.244289
+35 24 55.758407
+35 25 51.078371
+35 26 58.309519
+35 27 11.180340
+35 28 10.000000
+35 29 8.602325
+35 30 5.000000
+35 31 5.830952
+35 32 3.000000
+35 33 5.385165
+35 34 10.000000
+35 36 53.141321
+35 37 53.851648
+35 38 51.078371
+35 39 50.537115
+35 40 51.478151
+35 41 55.901699
+35 42 48.259714
+35 43 54.083269
+35 44 58.309519
+35 45 55.758407
+35 46 80.212219
+35 47 80.709355
+35 48 83.600239
+35 49 52.430907
+35 50 48.764741
+35 51 13.000000
+35 52 33.541020
+35 53 60.207973
+35 54 66.708320
+35 55 39.051248
+35 56 60.415230
+35 57 35.000000
+35 58 55.901699
+35 59 74.330344
+35 60 76.485293
+35 61 74.330344
+35 62 50.000000
+35 63 20.000000
+35 64 25.000000
+35 65 40.311289
+35 66 50.249378
+35 67 44.045431
+35 68 22.135944
+35 69 51.478151
+35 70 56.612719
+35 71 60.464866
+35 72 28.284271
+35 73 37.202150
+35 74 86.683332
+35 75 66.708320
+35 76 85.440037
+35 77 33.970576
+35 78 69.771054
+35 79 79.812280
+35 80 85.615419
+35 81 39.849718
+35 82 42.720019
+35 83 58.549125
+35 84 48.166378
+35 85 28.635642
+35 86 25.059928
+35 87 64.938432
+35 88 73.824115
+35 89 65.192024
+35 90 34.985711
+35 91 49.477268
+35 92 36.674242
+35 93 32.984845
+35 94 29.410882
+35 95 30.870698
+35 96 29.068884
+35 97 35.510562
+35 98 82.764727
+35 99 61.400326
+35 100 59.000000
+35 101 62.769419
+36 1 44.204072
+36 2 42.000000
+36 3 46.097722
+36 4 45.000000
+36 5 47.265209
+36 6 47.000000
+36 7 50.009999
+36 8 52.952809
+36 9 52.239832
+36 10 75.822160
+36 11 72.622311
+36 12 74.202426
+36 13 71.281134
+36 14 79.649231
+36 15 73.783467
+36 16 79.056942
+36 17 80.709355
+36 18 78.032045
+36 19 83.240615
+36 20 79.056942
+36 21 74.330344
+36 22 84.433406
+36 23 75.026662
+36 24 85.094066
+36 25 75.769387
+36 26 86.162637
+36 27 61.717096
+36 28 57.306195
+36 29 60.415230
+36 30 55.036352
+36 31 58.872744
+36 32 54.230987
+36 33 58.523500
+36 34 62.641839
+36 35 53.141321
+36 37 2.000000
+36 38 3.605551
+36 39 7.071068
+36 40 8.602325
+36 41 7.000000
+36 42 13.453624
+36 43 13.000000
+36 44 12.000000
+36 45 12.369317
+36 46 47.095647
+36 47 49.254441
+36 48 76.321688
+36 49 83.815273
+36 50 77.162167
+36 51 50.249378
+36 52 66.098411
+36 53 69.202601
+36 54 58.600341
+36 55 27.730849
+36 56 44.654227
+36 57 52.810984
+36 58 70.491134
+36 59 91.263355
+36 60 86.452299
+36 61 57.697487
+36 62 29.732137
+36 63 50.039984
+36 64 65.030762
+36 65 59.236813
+36 66 55.217751
+36 67 54.589376
+36 68 43.104524
+36 69 36.796739
+36 70 48.836462
+36 71 35.777088
+36 72 30.066593
+36 73 20.396078
+36 74 69.641941
+36 75 80.212219
+36 76 101.212647
+36 77 73.334848
+36 78 93.059121
+36 79 65.741920
+36 80 63.324561
+36 81 42.941821
+36 82 32.449961
+36 83 58.000000
+36 84 61.773781
+36 85 56.885851
+36 86 62.128898
+36 87 76.400262
+36 88 82.134037
+36 89 50.774009
+36 90 80.000000
+36 91 48.414874
+36 92 46.615448
+36 93 44.271887
+36 94 33.541020
+36 95 38.327536
+36 96 49.244289
+36 97 33.241540
+36 98 91.967386
+36 99 52.630789
+36 100 64.660653
+36 101 40.249224
+37 1 43.011626
+37 2 40.000000
+37 3 44.147480
+37 4 43.000000
+37 5 45.276926
+37 6 45.000000
+37 7 48.052055
+37 8 50.990195
+37 9 50.249378
+37 10 74.330344
+37 11 71.063352
+37 12 72.622311
+37 13 69.634761
+37 14 78.102497
+37 15 72.111026
+37 16 77.420927
+37 17 79.056942
+37 18 76.321688
+37 19 82.710338
+37 20 78.447435
+37 21 73.681748
+37 22 83.815273
+37 23 74.330344
+37 24 84.433406
+37 25 75.026662
+37 26 85.440037
+37 27 62.649820
+37 28 58.309519
+37 29 61.269895
+37 30 55.901699
+37 31 59.615434
+37 32 55.036352
+37 33 59.236813
+37 34 63.245553
+37 35 53.851648
+37 36 2.000000
+37 38 3.000000
+37 39 5.830952
+37 40 7.071068
+37 41 5.000000
+37 42 12.206556
+37 43 11.180340
+37 44 10.000000
+37 45 10.440307
+37 46 45.099889
+37 47 47.265209
+37 48 74.625733
+37 49 83.240615
+37 50 76.537572
+37 51 50.487622
+37 52 65.764732
+37 53 68.007353
+37 54 57.008771
+37 55 26.925824
+37 56 43.011626
+37 57 52.201533
+37 58 69.462220
+37 59 90.138782
+37 60 85.146932
+37 61 55.901699
+37 62 28.284271
+37 63 50.000000
+37 64 65.000000
+37 65 58.523500
+37 66 54.083269
+37 67 53.665631
+37 68 43.011626
+37 69 35.355339
+37 70 47.381431
+37 71 34.000000
+37 72 30.000000
+37 73 20.099751
+37 74 67.779053
+37 75 79.056942
+37 76 100.000000
+37 77 73.171033
+37 78 92.130342
+37 79 63.953108
+37 80 61.400326
+37 81 42.047592
+37 82 31.384710
+37 83 56.639209
+37 84 60.827625
+37 85 56.568542
+37 86 62.032250
+37 87 75.213031
+37 88 80.808415
+37 89 49.091751
+37 90 80.024996
+37 91 47.201695
+37 92 45.880279
+37 93 43.680659
+37 94 33.241540
+37 95 37.854986
+37 96 48.836462
+37 97 32.572995
+37 98 90.609050
+37 99 51.088159
+37 100 63.411355
+37 101 38.470768
+38 1 40.607881
+38 2 40.112342
+38 3 43.566042
+38 4 43.104524
+38 5 45.044423
+38 6 45.099889
+38 7 47.518417
+38 8 50.487622
+38 9 50.039984
+38 10 72.346389
+38 11 69.202601
+38 12 70.802542
+38 13 67.955868
+38 14 76.216796
+38 15 70.491134
+38 16 75.716577
+38 17 77.388630
+38 18 74.793048
+38 19 79.812280
+38 20 75.584390
+38 21 70.837843
+38 22 80.956779
+38 23 71.512237
+38 24 81.596569
+38 25 72.235725
+38 26 82.637764
+38 27 60.033324
+38 28 55.758407
+38 29 58.591808
+38 30 53.235327
+38 31 56.859476
+38 32 52.325902
+38 33 56.462377
+38 34 60.406953
+38 35 51.078371
+38 36 3.605551
+38 37 3.000000
+38 39 3.605551
+38 40 5.385165
+38 41 5.830952
+38 42 9.899495
+38 43 10.198039
+38 44 10.440307
+38 45 10.000000
+38 46 45.000000
+38 47 47.042534
+38 48 73.061618
+38 49 80.361682
+38 50 73.681748
+38 51 47.518417
+38 52 62.801274
+38 53 65.604878
+38 54 55.217751
+38 55 24.166092
+38 56 41.340053
+38 57 49.335586
+38 58 66.887966
+38 59 87.658428
+38 60 82.879430
+38 61 54.626001
+38 62 26.248809
+38 63 47.000000
+38 64 62.000000
+38 65 55.713553
+38 66 51.613952
+38 67 51.000000
+38 68 40.012498
+38 69 33.301652
+38 70 45.343136
+38 71 32.695565
+38 72 27.000000
+38 73 17.117243
+38 74 66.730802
+38 75 76.609399
+38 76 97.616597
+38 77 70.178344
+38 78 89.470666
+38 79 62.649820
+38 80 60.638272
+38 81 39.357337
+38 82 28.844410
+38 83 54.451814
+38 84 58.180753
+38 85 53.600373
+38 86 59.033889
+38 87 72.801099
+38 88 78.568442
+38 89 47.507894
+38 90 77.025970
+38 91 44.821870
+38 92 43.081318
+38 93 40.804412
+38 94 30.265492
+38 95 34.928498
+38 96 45.891176
+38 97 29.732137
+38 98 88.413800
+38 99 49.203658
+38 100 61.073726
+38 101 37.161808
+39 1 37.202150
+39 2 37.336309
+39 3 40.311289
+39 4 40.311289
+39 5 42.000000
+39 6 42.296572
+39 7 44.283180
+39 8 47.265209
+39 9 47.000000
+39 10 68.767725
+39 11 65.604878
+39 12 67.201190
+39 13 64.350602
+39 14 72.622311
+39 15 66.887966
+39 16 72.111026
+39 17 73.783467
+39 18 71.196910
+39 19 77.129761
+39 20 72.801099
+39 21 68.007353
+39 22 78.160092
+39 23 68.622154
+39 24 78.746428
+39 25 69.289249
+39 26 79.711982
+39 27 59.908263
+39 28 55.803226
+39 29 58.309519
+39 30 53.000000
+39 31 56.356011
+39 32 51.971146
+39 33 55.901699
+39 34 59.615434
+39 35 50.537115
+39 36 7.071068
+39 37 5.830952
+39 38 3.605551
+39 40 2.000000
+39 41 5.385165
+39 42 6.403124
+39 43 7.000000
+39 44 8.602325
+39 45 7.280110
+39 46 42.047592
+39 47 44.000000
+39 48 69.462220
+39 49 77.620873
+39 50 70.880181
+39 51 46.097722
+39 52 60.406953
+39 53 62.201286
+39 54 51.613952
+39 55 21.189620
+39 56 37.735925
+39 57 46.572524
+39 58 63.631753
+39 59 84.314886
+39 60 79.397733
+39 61 51.078371
+39 62 22.671568
+39 63 45.099889
+39 64 60.074953
+39 65 52.810984
+39 66 48.259714
+39 67 47.853944
+39 68 38.052595
+39 69 29.732137
+39 70 41.773197
+39 71 29.154759
+39 72 25.179357
+39 73 15.033296
+39 74 63.245553
+39 75 73.239334
+39 76 94.201911
+39 77 68.029405
+39 78 86.313383
+39 79 59.093147
+39 80 57.271284
+39 81 36.249138
+39 82 25.553865
+39 83 50.931326
+39 84 55.009090
+39 85 51.244512
+39 86 57.008771
+39 87 69.404611
+39 88 75.073298
+39 89 43.908997
+39 90 75.166482
+39 91 41.400483
+39 92 40.162171
+39 93 38.078866
+39 94 28.017851
+39 95 32.388269
+39 96 43.416587
+39 97 26.925824
+39 98 84.899941
+39 99 45.607017
+39 100 57.628118
+39 101 33.615473
+40 1 36.055513
+40 2 35.355339
+40 3 38.327536
+40 4 38.327536
+40 5 40.000000
+40 6 40.311289
+40 7 42.296572
+40 8 45.276926
+40 9 45.000000
+40 10 67.268120
+40 11 64.031242
+40 12 65.604878
+40 13 62.681736
+40 14 71.063352
+40 15 65.192024
+40 16 70.455660
+40 17 72.111026
+40 18 69.462220
+40 19 76.687678
+40 20 72.277244
+40 21 67.446275
+40 22 77.620873
+40 23 68.007353
+40 24 78.160092
+40 25 68.622154
+40 26 79.056942
+40 27 61.032778
+40 28 57.008771
+40 29 59.363288
+40 30 54.083269
+40 31 57.306195
+40 32 53.000000
+40 33 56.824291
+40 34 60.415230
+40 35 51.478151
+40 36 8.602325
+40 37 7.071068
+40 38 5.385165
+40 39 2.000000
+40 41 5.000000
+40 42 5.385165
+40 43 5.000000
+40 44 7.071068
+40 45 5.385165
+40 46 40.049969
+40 47 42.000000
+40 48 67.742158
+40 49 77.129761
+40 50 70.342022
+40 51 46.572524
+40 52 60.207973
+40 53 61.032778
+40 54 50.000000
+40 55 20.615528
+40 56 36.055513
+40 57 46.097722
+40 58 62.649820
+40 59 83.216585
+40 60 78.102497
+40 61 49.244289
+40 62 21.213203
+40 63 45.276926
+40 64 60.207973
+40 65 52.201533
+40 66 47.169906
+40 67 47.010637
+40 68 38.209946
+40 69 28.284271
+40 70 40.311289
+40 71 27.313001
+40 72 25.495098
+40 73 15.297059
+40 74 61.351447
+40 75 72.111026
+40 76 93.005376
+40 77 68.000000
+40 78 85.428333
+40 79 57.271284
+40 80 55.317267
+40 81 35.468296
+40 82 24.596748
+40 83 49.578221
+40 84 54.129474
+40 85 51.088159
+40 86 57.078893
+40 87 68.242216
+40 88 73.756356
+40 89 42.190046
+40 90 75.325958
+40 91 40.224371
+40 92 39.560081
+40 93 37.656341
+40 94 28.017851
+40 95 32.140317
+40 96 43.185646
+40 97 26.476405
+40 98 83.546394
+40 99 44.045431
+40 100 56.400355
+40 101 31.780497
+41 1 40.311289
+41 2 35.000000
+41 3 39.293765
+41 4 38.000000
+41 5 40.311289
+41 6 40.000000
+41 7 43.174066
+41 8 46.097722
+41 9 45.276926
+41 10 70.710678
+41 11 67.268120
+41 12 68.767725
+41 13 65.604878
+41 14 74.330344
+41 15 68.007353
+41 16 73.409809
+41 17 75.000000
+41 18 72.111026
+41 19 81.584312
+41 20 77.129761
+41 21 72.277244
+41 22 82.462113
+41 23 72.801099
+41 24 82.969874
+41 25 73.375745
+41 26 83.815273
+41 27 65.192024
+41 28 61.032778
+41 29 63.631753
+41 30 58.309519
+41 31 61.717096
+41 32 57.306195
+41 33 61.269895
+41 34 65.000000
+41 35 55.901699
+41 36 7.000000
+41 37 5.000000
+41 38 5.830952
+41 39 5.385165
+41 40 5.000000
+41 42 10.198039
+41 43 7.071068
+41 44 5.000000
+41 45 5.830952
+41 46 40.112342
+41 47 42.296572
+41 48 70.455660
+41 49 82.000000
+41 50 75.186435
+41 51 51.419841
+41 52 65.192024
+41 53 65.192024
+41 54 53.150729
+41 55 25.495098
+41 56 39.051248
+41 57 50.990195
+41 58 67.082039
+41 59 87.464278
+41 60 82.006097
+41 61 51.478151
+41 62 25.000000
+41 63 50.249378
+41 64 65.192024
+41 65 57.008771
+41 66 51.478151
+41 67 51.623638
+41 68 43.185646
+41 69 32.015621
+41 70 43.931765
+41 71 29.681644
+41 72 30.413813
+41 73 20.223748
+41 74 63.158531
+41 75 76.321688
+41 76 97.082439
+41 77 73.000000
+41 78 89.961103
+41 79 59.539903
+41 80 56.612719
+41 81 40.162171
+41 82 29.154759
+41 83 53.413481
+41 84 58.694122
+41 85 56.080300
+41 86 62.072538
+41 87 72.401657
+41 88 77.620873
+41 89 45.000000
+41 90 80.305666
+41 91 44.418465
+41 92 44.384682
+41 93 42.579338
+41 94 33.015148
+41 95 37.121422
+41 96 48.166378
+41 97 31.400637
+41 98 87.321246
+41 99 47.381431
+41 100 60.464866
+41 101 34.132096
+42 1 30.805844
+42 2 34.481879
+42 3 36.000000
+42 4 37.363083
+42 5 38.327536
+42 6 39.293765
+42 7 40.000000
+42 8 43.000000
+42 9 43.289722
+42 10 62.481997
+42 11 59.405387
+42 12 61.032778
+42 13 58.309519
+42 14 66.400301
+42 15 60.901560
+42 16 66.037868
+42 17 67.742158
+42 18 65.299311
+42 19 71.386273
+42 20 66.940272
+42 21 62.096699
+42 22 72.277244
+42 23 62.641839
+42 24 72.801099
+42 25 63.245553
+42 26 73.681748
+42 27 58.258047
+42 28 54.488531
+42 29 56.400355
+42 30 51.224994
+42 31 54.083269
+42 32 50.000000
+42 33 53.535035
+42 34 56.824291
+42 35 48.259714
+42 36 13.453624
+42 37 12.206556
+42 38 9.899495
+42 39 6.403124
+42 40 5.385165
+42 41 10.198039
+42 43 5.830952
+42 44 10.440307
+42 45 7.615773
+42 46 38.639358
+42 47 40.311289
+42 48 63.529521
+42 49 71.805292
+42 50 65.000000
+42 51 42.379240
+42 52 55.081757
+42 53 55.803226
+42 54 45.486262
+42 55 15.297059
+42 56 31.764760
+42 57 40.792156
+42 58 57.306195
+42 59 77.935871
+42 60 73.000000
+42 61 45.541190
+42 62 16.401219
+42 63 40.607881
+42 64 55.443665
+42 65 46.840154
+42 66 41.880783
+42 67 41.629317
+42 68 33.541020
+42 69 23.430749
+42 70 35.468296
+42 71 23.769729
+42 72 21.189620
+42 73 11.180340
+42 74 57.974132
+42 75 66.850580
+42 76 87.800911
+42 77 63.031738
+42 78 80.056230
+42 79 53.488316
+42 80 52.469038
+42 81 30.083218
+42 82 19.235384
+42 83 44.553339
+42 84 48.754487
+42 85 46.010868
+42 86 52.239832
+42 87 63.007936
+42 88 68.680419
+42 89 38.013156
+42 90 70.576200
+42 91 35.000000
+42 92 34.205263
+42 93 32.388269
+42 94 23.194827
+42 95 27.018512
+42 96 38.052595
+42 97 21.213203
+42 98 78.517514
+42 99 39.408121
+42 100 51.224994
+42 101 28.160256
+43 1 33.541020
+43 2 30.413813
+43 3 33.376639
+43 4 33.376639
+43 5 35.000000
+43 6 35.355339
+43 7 37.336309
+43 8 40.311289
+43 9 40.000000
+43 10 63.639610
+43 11 60.207973
+43 12 61.717096
+43 13 58.600341
+43 14 67.268120
+43 15 61.032778
+43 16 66.400301
+43 17 68.007353
+43 18 65.192024
+43 19 75.802375
+43 20 71.196910
+43 21 66.287254
+43 22 76.485293
+43 23 66.708320
+43 24 76.902536
+43 25 67.186308
+43 26 77.620873
+43 27 64.031242
+43 28 60.207973
+43 29 62.201286
+43 30 57.008771
+43 31 59.908263
+43 32 55.803226
+43 33 59.363288
+43 34 62.649820
+43 35 54.083269
+43 36 13.000000
+43 37 11.180340
+43 38 10.198039
+43 39 7.000000
+43 40 5.000000
+43 41 7.071068
+43 42 5.830952
+43 44 5.000000
+43 45 2.000000
+43 46 35.057096
+43 47 37.000000
+43 48 63.513778
+43 49 76.118329
+43 50 69.231496
+43 51 48.104054
+43 52 60.000000
+43 53 58.309519
+43 54 46.097722
+43 55 20.000000
+43 56 32.015621
+43 57 45.276926
+43 58 60.415230
+43 59 80.622577
+43 60 75.000000
+43 61 44.721360
+43 62 18.027756
+43 63 46.097722
+43 64 60.827625
+43 65 50.990195
+43 66 44.721360
+43 67 45.221676
+43 68 39.051248
+43 69 25.000000
+43 70 36.878178
+43 71 22.825424
+43 72 26.925824
+43 73 17.000000
+43 74 56.648036
+43 75 69.462220
+43 76 90.138782
+43 77 68.183576
+43 78 83.384651
+43 79 52.773099
+43 80 50.447993
+43 81 33.955854
+43 82 22.803509
+43 83 46.400431
+43 84 52.201533
+43 85 51.039201
+43 86 57.558666
+43 87 65.513357
+43 88 70.604532
+43 89 38.013156
+43 90 75.953933
+43 91 37.589892
+43 92 38.470768
+43 93 37.054015
+43 94 28.635642
+43 95 32.062439
+43 96 43.011626
+43 97 26.000000
+43 98 80.280757
+43 99 40.311289
+43 100 53.535035
+43 101 27.294688
+44 1 38.078866
+44 2 30.000000
+44 3 34.481879
+44 4 33.000000
+44 5 35.355339
+44 6 35.000000
+44 7 38.327536
+44 8 41.231056
+44 9 40.311289
+44 10 67.268120
+44 11 63.639610
+44 12 65.069194
+44 13 61.717096
+44 14 70.710678
+44 15 64.031242
+44 16 69.526973
+44 17 71.063352
+44 18 68.007353
+44 19 80.752709
+44 20 76.118329
+44 21 71.196910
+44 22 81.394103
+44 23 71.589105
+44 24 81.786307
+44 25 72.034714
+44 26 82.462113
+44 27 68.007353
+44 28 64.031242
+44 29 66.287254
+44 30 61.032778
+44 31 64.140471
+44 32 59.908263
+44 33 63.631753
+44 34 67.082039
+44 35 58.309519
+44 36 12.000000
+44 37 10.000000
+44 38 10.440307
+44 39 8.602325
+44 40 7.071068
+44 41 5.000000
+44 42 10.440307
+44 43 5.000000
+44 45 3.000000
+44 46 35.128336
+44 47 37.336309
+44 48 66.400301
+44 49 81.049368
+44 50 74.148500
+44 51 52.810984
+44 52 65.000000
+44 53 62.649820
+44 54 49.497475
+44 55 25.000000
+44 56 35.355339
+44 57 50.249378
+44 58 65.000000
+44 59 85.000000
+44 60 79.056942
+44 61 47.169906
+44 62 22.360680
+44 63 50.990195
+44 64 65.764732
+44 65 55.901699
+44 66 49.244289
+44 67 50.000000
+44 68 43.931765
+44 69 29.154759
+44 70 40.804412
+44 71 25.612497
+44 72 31.622777
+44 73 21.540659
+44 74 58.600341
+44 75 73.824115
+44 76 94.339811
+44 77 73.171033
+44 78 88.022724
+44 79 55.226805
+44 80 51.865210
+44 81 38.832976
+44 82 27.658633
+44 83 50.477718
+44 84 56.920998
+44 85 56.035703
+44 86 62.513998
+44 87 69.835521
+44 88 74.632433
+44 89 41.109610
+44 90 80.894994
+44 91 42.047592
+44 92 43.416587
+44 93 42.047592
+44 94 33.541020
+44 95 37.054015
+44 96 48.010416
+44 97 31.000000
+44 98 84.202138
+44 99 43.931765
+44 100 57.801384
+44 101 30.000000
+45 1 35.341194
+45 2 30.149627
+45 3 33.734256
+45 4 33.136083
+45 5 35.057096
+45 6 35.128336
+45 7 37.656341
+45 8 40.607881
+45 9 40.049969
+45 10 65.069194
+45 11 61.554854
+45 12 63.031738
+45 13 59.816386
+45 14 68.622154
+45 15 62.201286
+45 16 67.623960
+45 17 69.202601
+45 18 66.287254
+45 19 77.781746
+45 20 73.164199
+45 21 68.249542
+45 22 78.447435
+45 23 68.658576
+45 24 78.854296
+45 25 69.123079
+45 26 79.555012
+45 27 65.604878
+45 28 61.717096
+45 29 63.820060
+45 30 58.600341
+45 31 61.587336
+45 32 57.428216
+45 33 61.057350
+45 34 64.412732
+45 35 55.758407
+45 36 12.369317
+45 37 10.440307
+45 38 10.000000
+45 39 7.280110
+45 40 5.385165
+45 41 5.830952
+45 42 7.615773
+45 43 2.000000
+45 44 3.000000
+45 46 35.000000
+45 47 37.054015
+45 48 64.637450
+45 49 78.089692
+45 50 71.196910
+45 51 49.979996
+45 52 62.000000
+45 53 60.033324
+45 54 47.423623
+45 55 22.000000
+45 56 33.301652
+45 57 47.265209
+45 58 62.241465
+45 59 82.365041
+45 60 76.609399
+45 61 45.650849
+45 62 19.723083
+45 63 48.052055
+45 64 62.801274
+45 65 52.952809
+45 66 46.518813
+45 67 47.127487
+45 68 41.000000
+45 69 26.627054
+45 70 38.418745
+45 71 23.853721
+45 72 28.792360
+45 73 18.788294
+45 74 57.384667
+45 75 71.196910
+45 76 91.809586
+45 77 70.178344
+45 78 85.234969
+45 79 53.712196
+45 80 50.960769
+45 81 35.902646
+45 82 24.738634
+45 83 48.010416
+45 84 54.083269
+45 85 53.037722
+45 86 59.539903
+45 87 67.230945
+45 88 72.201108
+45 89 39.204592
+45 90 77.929455
+45 91 39.357337
+45 92 40.447497
+45 93 39.051248
+45 94 30.594117
+45 95 34.058773
+45 96 45.011110
+45 97 28.000000
+45 98 81.835200
+45 99 41.725292
+45 100 55.226805
+45 101 28.301943
+46 1 37.735925
+46 2 5.830952
+46 3 7.280110
+46 4 3.605551
+46 5 2.000000
+46 6 3.000000
+46 7 7.280110
+46 8 8.602325
+46 9 5.385165
+46 10 48.052055
+46 11 43.174066
+46 12 43.680659
+46 13 38.897301
+46 14 49.335586
+46 15 39.924930
+46 16 45.694639
+46 17 46.518813
+46 18 42.059482
+46 19 80.653580
+46 20 75.286121
+46 21 70.519501
+46 22 79.555012
+46 23 69.921384
+46 24 79.075913
+46 25 69.375788
+46 26 78.447435
+46 27 91.263355
+46 28 88.509886
+46 29 88.814413
+46 30 84.314886
+46 31 85.603738
+46 32 82.661962
+46 33 84.811556
+46 34 86.452299
+46 35 80.212219
+46 36 47.095647
+46 37 45.099889
+46 38 45.000000
+46 39 42.047592
+46 40 40.049969
+46 41 40.112342
+46 42 38.639358
+46 43 35.057096
+46 44 35.128336
+46 45 35.000000
+46 47 2.828427
+46 48 41.146081
+46 49 80.081209
+46 50 73.375745
+46 51 70.092796
+46 52 71.196910
+46 53 52.239832
+46 54 32.000000
+46 55 41.340053
+46 56 24.166092
+46 57 55.758407
+46 58 57.870545
+46 59 72.173402
+46 60 62.801274
+46 61 22.561028
+46 62 30.232433
+46 63 65.069194
+46 64 76.609399
+46 65 57.697487
+46 66 44.598206
+46 67 49.658836
+46 68 59.464275
+46 69 29.732137
+46 70 31.953091
+46 71 19.849433
+46 72 52.478567
+46 73 46.238512
+46 74 28.425341
+46 75 62.000000
+46 76 78.447435
+46 77 80.622577
+46 78 79.056942
+46 79 28.635642
+46 80 19.798990
+46 81 44.204072
+46 82 37.643060
+46 83 39.623226
+46 84 53.758720
+46 85 64.637450
+46 86 73.006849
+46 87 58.008620
+46 88 58.549125
+46 89 24.331050
+46 90 90.210864
+46 91 38.910153
+46 92 49.406477
+46 93 51.088159
+46 94 50.803543
+46 95 50.249378
+46 96 57.628118
+46 97 44.821870
+46 98 65.969690
+46 99 30.594117
+46 100 47.381431
+46 101 18.601075
+47 1 37.202150
+47 2 8.602325
+47 3 6.403124
+47 4 6.403124
+47 5 2.000000
+47 6 5.385165
+47 7 5.000000
+47 8 5.830952
+47 9 3.000000
+47 10 45.705580
+47 11 40.792156
+47 12 41.231056
+47 13 36.400549
+47 14 46.840154
+47 15 37.336309
+47 16 43.081318
+47 17 43.863424
+47 18 39.357337
+47 19 79.378838
+47 20 74.000000
+47 21 69.289249
+47 22 78.160092
+47 23 68.622154
+47 24 77.620873
+47 25 68.007353
+47 26 76.902536
+47 27 91.809586
+47 28 89.185201
+47 29 89.308454
+47 30 84.905830
+47 31 86.023253
+47 32 83.216585
+47 33 85.211502
+47 34 86.683332
+47 35 80.709355
+47 36 49.254441
+47 37 47.265209
+47 38 47.042534
+47 39 44.000000
+47 40 42.000000
+47 41 42.296572
+47 42 40.311289
+47 43 37.000000
+47 44 37.336309
+47 45 37.054015
+47 46 2.828427
+47 48 38.483763
+47 49 78.746428
+47 50 72.111026
+47 51 70.292247
+47 52 70.491134
+47 53 50.487622
+47 54 30.066593
+47 55 42.059482
+47 56 23.323808
+47 57 55.217751
+47 58 56.293872
+47 59 70.064256
+47 60 60.530984
+47 61 20.223748
+47 62 30.886890
+47 63 65.069194
+47 64 76.216796
+47 65 56.824291
+47 66 43.462628
+47 67 48.764741
+47 68 59.665736
+47 69 29.732137
+47 70 30.870698
+47 71 20.248457
+47 72 53.235327
+47 73 47.434165
+47 74 25.612497
+47 75 60.033324
+47 76 76.118329
+47 77 79.924965
+47 78 77.162167
+47 79 26.000000
+47 80 16.970563
+47 81 43.931765
+47 82 38.013156
+47 83 38.078866
+47 84 52.554733
+47 85 64.202804
+47 86 72.622311
+47 87 56.080300
+47 88 56.320511
+47 89 22.803509
+47 90 89.587946
+47 91 38.078866
+47 92 49.040799
+47 93 50.931326
+47 94 51.312766
+47 95 50.447993
+47 96 57.384667
+47 97 45.221676
+47 98 63.560994
+47 99 29.120440
+47 100 45.705580
+47 101 18.384776
+48 1 38.327536
+48 2 46.141088
+48 3 36.055513
+48 4 44.721360
+48 5 39.357337
+48 6 43.863424
+48 7 34.000000
+48 8 32.695565
+48 9 37.336309
+48 10 12.806248
+48 11 9.433981
+48 12 7.810250
+48 13 6.000000
+48 14 10.440307
+48 15 3.000000
+48 16 5.000000
+48 17 5.385165
+48 18 2.000000
+48 19 58.000000
+48 20 53.150729
+48 21 50.000000
+48 22 55.172457
+48 23 48.414874
+48 24 53.814496
+48 25 46.861498
+48 26 51.855569
+48 27 94.201911
+48 28 93.536089
+48 29 91.241438
+48 30 88.566359
+48 31 87.298339
+48 32 86.579443
+48 33 86.313383
+48 34 85.375641
+48 35 83.600239
+48 36 76.321688
+48 37 74.625733
+48 38 73.061618
+48 39 69.462220
+48 40 67.742158
+48 41 70.455660
+48 42 63.529521
+48 43 63.513778
+48 44 66.400301
+48 45 64.637450
+48 46 41.146081
+48 47 38.483763
+48 49 56.568542
+48 50 51.855569
+48 51 70.710678
+48 52 58.600341
+48 53 27.459060
+48 54 18.681542
+48 55 55.081757
+48 56 31.764760
+48 57 49.030603
+48 58 34.409301
+48 59 37.336309
+48 60 26.248809
+48 61 19.849433
+48 62 47.423623
+48 63 63.788714
+48 64 67.779053
+48 65 45.541190
+48 66 33.376639
+48 67 39.812058
+48 68 62.072538
+48 69 40.853396
+48 70 29.832868
+48 71 40.804412
+48 72 63.788714
+48 73 64.195015
+48 74 15.000000
+48 75 30.805844
+48 76 40.112342
+48 77 66.730802
+48 78 46.957428
+48 79 12.529964
+48 80 23.345235
+48 81 45.044423
+48 82 48.764741
+48 83 25.079872
+48 84 37.696154
+48 85 57.280014
+48 86 64.845971
+48 87 28.319605
+48 88 23.259407
+48 89 25.553865
+48 90 76.321688
+48 91 35.057096
+48 92 47.095647
+48 93 51.039201
+48 94 59.413803
+48 95 55.081757
+48 96 54.589376
+48 97 53.758720
+48 98 27.073973
+48 99 25.000000
+48 100 26.000000
+48 101 36.400549
+49 1 45.044423
+49 2 81.786307
+49 3 72.801099
+49 4 82.462113
+49 5 78.160092
+49 6 82.969874
+49 7 74.000000
+49 8 75.026662
+49 9 79.711982
+49 10 43.863424
+49 11 47.423623
+49 12 48.795492
+49 13 52.497619
+49 14 47.634021
+49 15 54.488531
+49 16 53.150729
+49 17 54.671748
+49 18 58.000000
+49 19 2.000000
+49 20 5.000000
+49 21 10.000000
+49 22 2.000000
+49 23 10.198039
+49 24 4.000000
+49 25 10.770330
+49 26 7.000000
+49 27 58.600341
+49 28 60.901560
+49 29 55.901699
+49 30 56.603887
+49 31 52.354560
+49 32 54.918121
+49 33 51.478151
+49 34 47.423623
+49 35 52.430907
+49 36 83.815273
+49 37 83.240615
+49 38 80.361682
+49 39 77.620873
+49 40 77.129761
+49 41 82.000000
+49 42 71.805292
+49 43 76.118329
+49 44 81.049368
+49 45 78.089692
+49 46 80.081209
+49 47 78.746428
+49 48 56.568542
+49 50 7.000000
+49 51 42.426407
+49 52 19.849433
+49 53 30.232433
+49 54 50.089919
+49 55 56.515485
+49 56 56.293872
+49 57 31.048349
+49 58 23.323808
+49 59 27.459060
+49 60 35.341194
+49 61 61.269895
+49 62 60.074953
+49 63 37.802116
+49 64 27.459060
+49 65 25.179357
+49 66 35.693137
+49 67 32.015621
+49 68 43.046487
+49 69 55.036352
+49 70 48.270074
+49 71 64.381674
+49 72 55.036352
+49 73 63.568860
+49 74 68.007353
+49 75 26.627054
+49 76 37.000000
+49 77 19.313208
+49 78 19.104973
+49 79 61.294372
+49 80 72.560320
+49 81 42.296572
+49 82 53.460266
+49 83 40.853396
+49 84 26.476405
+49 85 28.301943
+49 86 27.658633
+49 87 28.319605
+49 88 35.510562
+49 89 55.973208
+49 90 25.000000
+49 91 42.296572
+49 92 37.656341
+49 93 39.560081
+49 94 50.695167
+49 95 45.541190
+49 96 34.928498
+49 97 50.695167
+49 98 40.162171
+49 99 49.648766
+49 100 34.000000
+49 101 62.968246
+50 1 38.052595
+50 2 74.953319
+50 3 66.098411
+50 4 75.690158
+50 5 71.470274
+50 6 76.243032
+50 7 67.416615
+50 8 68.541958
+50 9 73.164199
+50 10 39.408121
+50 11 42.520583
+50 12 44.045431
+50 13 47.381431
+50 14 43.566042
+50 15 49.578221
+50 16 48.826222
+50 17 50.477718
+50 18 53.413481
+50 19 7.280110
+50 20 2.000000
+50 21 3.000000
+50 22 7.280110
+50 23 3.605551
+50 24 8.062258
+50 25 5.000000
+50 26 9.899495
+50 27 55.973208
+50 28 57.775427
+50 29 53.141321
+50 30 53.225934
+50 31 49.396356
+50 32 51.429563
+50 33 48.466483
+50 34 44.922155
+50 35 48.764741
+50 36 77.162167
+50 37 76.537572
+50 38 73.681748
+50 39 70.880181
+50 40 70.342022
+50 41 75.186435
+50 42 65.000000
+50 43 69.231496
+50 44 74.148500
+50 45 71.196910
+50 46 73.375745
+50 47 72.111026
+50 48 51.855569
+50 49 7.000000
+50 51 37.802116
+50 52 15.264338
+50 53 24.758837
+50 54 43.908997
+50 55 49.729267
+50 56 49.477268
+50 57 24.351591
+50 58 17.691806
+50 59 27.073973
+50 60 32.984845
+50 61 55.072679
+50 62 53.084838
+50 63 32.526912
+50 64 24.351591
+50 65 18.248288
+50 66 28.861739
+50 67 25.019992
+50 68 37.202150
+50 69 48.041649
+50 70 41.484937
+50 71 57.428216
+50 72 48.764741
+50 73 57.008771
+50 74 62.481997
+50 75 23.409400
+50 76 37.656341
+50 77 18.000000
+50 78 21.023796
+50 79 55.605755
+50 80 66.573268
+50 81 35.355339
+50 82 46.529560
+50 83 34.438351
+50 84 19.646883
+50 85 22.671568
+50 86 23.706539
+50 87 24.186773
+50 88 32.310989
+50 89 49.396356
+50 90 25.961510
+50 91 35.355339
+50 92 30.805844
+50 93 32.893768
+50 94 44.283180
+50 95 39.000000
+50 96 28.653098
+50 97 43.965896
+50 98 38.470768
+50 99 43.081318
+50 100 28.017851
+50 101 56.089215
+51 1 35.341194
+51 2 68.622154
+51 3 64.031242
+51 4 70.710678
+51 5 68.767725
+51 6 72.138755
+51 7 67.201190
+51 8 69.634761
+51 9 72.622311
+51 10 62.000000
+51 11 62.201286
+51 12 64.195015
+51 13 64.776539
+51 14 67.000000
+51 15 67.742158
+51 16 70.178344
+51 17 72.173402
+51 18 72.691127
+51 19 41.036569
+51 20 39.051248
+51 21 36.055513
+51 22 43.863424
+51 23 37.735925
+51 24 45.343136
+51 25 39.446166
+51 26 47.634021
+51 27 23.537205
+51 28 23.000000
+51 29 20.615528
+51 30 18.000000
+51 31 16.763055
+51 32 16.000000
+51 33 15.811388
+51 34 16.401219
+51 35 13.000000
+51 36 50.249378
+51 37 50.487622
+51 38 47.518417
+51 39 46.097722
+51 40 46.572524
+51 41 51.419841
+51 42 42.379240
+51 43 48.104054
+51 44 52.810984
+51 45 49.979996
+51 46 70.092796
+51 47 70.292247
+51 48 70.710678
+51 49 42.426407
+51 50 37.802116
+51 52 22.671568
+51 53 47.265209
+51 54 54.120237
+51 55 30.232433
+51 56 48.877398
+51 57 22.000000
+51 58 43.174066
+51 59 62.241465
+51 60 63.788714
+51 61 62.241465
+51 62 40.360872
+51 63 7.000000
+51 64 16.552945
+51 65 27.459060
+51 66 37.336309
+51 67 31.064449
+51 68 10.630146
+51 69 40.607881
+51 70 44.384682
+51 71 50.249378
+51 72 21.189620
+51 73 31.320920
+51 74 74.330344
+51 75 54.120237
+51 76 73.409809
+51 77 25.942244
+51 78 58.523500
+51 79 67.357256
+51 80 73.790243
+51 81 27.730849
+51 82 32.526912
+51 83 45.705580
+51 84 35.227830
+51 85 16.155494
+51 86 15.000000
+51 87 52.172790
+51 88 61.000000
+51 89 53.225934
+51 90 30.413813
+51 91 37.000000
+51 92 24.041631
+51 93 20.615528
+51 94 20.248457
+51 95 19.849433
+51 96 16.124515
+51 97 25.495098
+51 98 70.092796
+51 99 49.040799
+51 100 46.000000
+51 101 52.009614
+52 1 33.541020
+52 2 71.589105
+52 3 64.140471
+52 4 72.897188
+52 5 69.462220
+52 6 73.824115
+52 7 66.287254
+52 8 68.007353
+52 9 72.111026
+52 10 47.434165
+52 11 49.244289
+52 12 51.078371
+52 13 53.235327
+52 14 52.201533
+52 15 55.901699
+52 16 56.648036
+52 17 58.523500
+52 18 60.415230
+52 19 18.601075
+52 20 16.401219
+52 21 13.928388
+52 22 21.213203
+52 23 15.811388
+52 24 22.671568
+52 25 17.720045
+52 26 25.000000
+52 27 41.231056
+52 28 42.720019
+52 29 38.327536
+52 30 38.078866
+52 31 34.481879
+52 32 36.249138
+52 33 33.526109
+52 34 30.413813
+52 35 33.541020
+52 36 66.098411
+52 37 65.764732
+52 38 62.801274
+52 39 60.406953
+52 40 60.207973
+52 41 65.192024
+52 42 55.081757
+52 43 60.000000
+52 44 65.000000
+52 45 62.000000
+52 46 71.196910
+52 47 70.491134
+52 48 58.600341
+52 49 19.849433
+52 50 15.264338
+52 51 22.671568
+52 53 31.622777
+52 54 46.097722
+52 55 40.000000
+52 56 47.169906
+52 57 15.811388
+52 58 25.495098
+52 59 41.231056
+52 60 45.000000
+52 61 56.568542
+52 62 46.097722
+52 63 18.027756
+52 64 10.000000
+52 65 14.142136
+52 66 28.284271
+52 67 22.022716
+52 68 23.769729
+52 69 42.720019
+52 70 40.000000
+52 71 52.924474
+52 72 36.400549
+52 73 45.705580
+52 74 66.400301
+52 75 35.000000
+52 76 52.201533
+52 77 9.433981
+52 78 36.235342
+52 79 59.203040
+52 80 68.593003
+52 81 28.160256
+52 82 38.470768
+52 83 36.235342
+52 84 21.095023
+52 85 9.219544
+52 86 8.544004
+52 87 34.234486
+52 88 43.185646
+52 89 49.040799
+52 90 19.209373
+52 91 32.449961
+52 92 22.803509
+52 93 23.086793
+52 94 32.557641
+52 95 28.071338
+52 96 17.029386
+52 97 34.000000
+52 98 51.039201
+52 99 43.185646
+52 100 32.649655
+52 101 52.773099
+53 1 25.000000
+53 2 55.000000
+53 3 45.099889
+53 4 55.081757
+53 5 50.249378
+53 6 55.226805
+53 7 45.541190
+53 8 46.097722
+53 9 50.990195
+53 10 15.811388
+53 11 18.027756
+53 12 19.723083
+53 13 22.671568
+53 14 20.615528
+53 15 25.000000
+53 16 25.079872
+53 17 26.925824
+53 18 29.154759
+53 19 31.400637
+53 20 26.248809
+53 21 22.671568
+53 22 29.154759
+53 23 21.213203
+53 24 28.178006
+53 25 19.849433
+53 26 26.925824
+53 27 70.000000
+53 28 70.178344
+53 29 67.000000
+53 30 65.192024
+53 31 63.000000
+53 32 63.198101
+53 33 62.000000
+53 34 60.207973
+53 35 60.207973
+53 36 69.202601
+53 37 68.007353
+53 38 65.604878
+53 39 62.201286
+53 40 61.032778
+53 41 65.192024
+53 42 55.803226
+53 43 58.309519
+53 44 62.649820
+53 45 60.033324
+53 46 52.239832
+53 47 50.487622
+53 48 27.459060
+53 49 30.232433
+53 50 24.758837
+53 51 47.265209
+53 52 31.622777
+53 54 20.615528
+53 55 42.426407
+53 56 30.413813
+53 57 25.495098
+53 58 7.071068
+53 59 22.360680
+53 60 18.027756
+53 61 31.622777
+53 62 40.311289
+53 63 40.311289
+53 64 41.231056
+53 65 20.000000
+53 66 14.142136
+53 67 17.464249
+53 68 40.804412
+53 69 33.541020
+53 70 22.803509
+53 71 40.261644
+53 72 47.169906
+53 73 51.662365
+53 74 37.802116
+53 75 11.180340
+53 76 32.015621
+53 77 39.357337
+53 78 27.073973
+53 79 31.064449
+53 80 42.485292
+53 81 27.802878
+53 82 36.878178
+53 83 13.152946
+53 84 12.041595
+53 85 32.015621
+53 86 38.639358
+53 87 7.211103
+53 88 14.317821
+53 89 28.017851
+53 90 48.877398
+53 91 20.808652
+53 92 26.832816
+53 93 30.870698
+53 94 42.190046
+53 95 36.715120
+53 96 31.780497
+53 97 38.418745
+53 98 24.186773
+53 99 22.022716
+53 100 5.099020
+53 101 37.483330
+54 1 20.000000
+54 2 35.355339
+54 3 25.079872
+54 4 35.057096
+54 5 30.000000
+54 6 35.000000
+54 7 25.079872
+54 8 25.495098
+54 9 30.413813
+54 10 18.027756
+54 11 14.142136
+54 12 15.620499
+54 13 13.000000
+54 14 21.213203
+54 15 15.811388
+54 16 20.591260
+54 17 22.360680
+54 18 20.615528
+54 19 51.000000
+54 20 45.650849
+54 21 41.340053
+54 22 49.244289
+54 23 40.311289
+54 24 48.466483
+54 25 39.357337
+54 26 47.434165
+54 27 77.620873
+54 28 76.485293
+54 29 74.726167
+54 30 71.589105
+54 31 70.880181
+54 32 69.634761
+54 33 69.921384
+54 34 69.641941
+54 35 66.708320
+54 36 58.600341
+54 37 57.008771
+54 38 55.217751
+54 39 51.613952
+54 40 50.000000
+54 41 53.150729
+54 42 45.486262
+54 43 46.097722
+54 44 49.497475
+54 45 47.423623
+54 46 32.000000
+54 47 30.066593
+54 48 18.681542
+54 49 50.089919
+54 50 43.908997
+54 51 54.120237
+54 52 46.097722
+54 53 20.615528
+54 55 36.400549
+54 56 14.142136
+54 57 33.541020
+54 58 26.925824
+54 59 40.311289
+54 60 31.622777
+54 61 11.180340
+54 62 29.154759
+54 63 47.434165
+54 64 54.083269
+54 65 32.015621
+54 66 18.027756
+54 67 24.698178
+54 68 44.721360
+54 69 22.360680
+54 70 11.180340
+54 71 24.207437
+54 72 45.276926
+54 73 45.541190
+54 74 20.591260
+54 75 30.000000
+54 76 47.434165
+54 77 55.172457
+54 78 47.095647
+54 79 13.416408
+54 80 22.803509
+54 81 27.166155
+54 82 30.083218
+54 83 9.899495
+54 84 25.495098
+54 85 42.544095
+54 86 50.774009
+54 87 26.019224
+54 88 27.202941
+54 89 8.944272
+54 90 65.069194
+54 91 17.262677
+54 92 30.083218
+54 93 33.734256
+54 94 41.048752
+54 95 37.054015
+54 96 38.275318
+54 97 35.227830
+54 98 35.777088
+54 99 6.324555
+54 100 16.155494
+54 101 20.248457
+55 1 18.027756
+55 2 39.051248
+55 3 36.249138
+55 4 41.400483
+55 5 40.311289
+55 6 43.011626
+55 7 39.924930
+55 8 42.720019
+55 9 44.721360
+55 10 51.478151
+55 11 49.244289
+55 12 51.078371
+55 13 49.335586
+55 14 55.901699
+55 15 52.201533
+55 16 56.648036
+55 17 58.523500
+55 18 57.008771
+55 19 56.089215
+55 20 51.662365
+55 21 46.840154
+55 22 57.008771
+55 23 47.434165
+55 24 57.567352
+55 25 48.104054
+55 26 58.523500
+55 27 50.000000
+55 28 47.169906
+55 29 47.634021
+55 30 43.011626
+55 31 44.598206
+55 32 41.400483
+55 33 43.863424
+55 34 46.097722
+55 35 39.051248
+55 36 27.730849
+55 37 26.925824
+55 38 24.166092
+55 39 21.189620
+55 40 20.615528
+55 41 25.495098
+55 42 15.297059
+55 43 20.000000
+55 44 25.000000
+55 45 22.000000
+55 46 41.340053
+55 47 42.059482
+55 48 55.081757
+55 49 56.515485
+55 50 49.729267
+55 51 30.232433
+55 52 40.000000
+55 53 42.426407
+55 54 36.400549
+55 56 25.000000
+55 57 25.495098
+55 58 43.011626
+55 59 64.031242
+55 60 60.207973
+55 61 40.000000
+55 62 11.180340
+55 63 26.925824
+55 64 41.231056
+55 65 31.622777
+55 66 28.284271
+55 67 26.925824
+55 68 20.124612
+55 69 15.000000
+55 70 25.298221
+55 71 21.931712
+55 72 11.180340
+55 73 9.433981
+55 74 53.000000
+55 75 53.150729
+55 76 74.330344
+55 77 48.259714
+55 78 65.368188
+55 79 47.169906
+55 80 49.648766
+55 81 15.264338
+55 82 6.324555
+55 83 32.756679
+55 84 34.132096
+55 85 31.064449
+55 86 37.854986
+55 87 49.517674
+55 88 56.080300
+55 89 31.064449
+55 90 56.293872
+55 91 22.203603
+55 92 18.973666
+55 93 17.117243
+55 94 10.000000
+55 95 12.165525
+55 96 23.021729
+55 97 6.000000
+55 98 66.068147
+55 99 30.083218
+55 100 38.288379
+55 101 25.000000
+56 1 14.142136
+56 2 25.495098
+56 3 17.000000
+56 4 26.248809
+56 5 22.360680
+56 6 26.925824
+56 7 19.209373
+56 8 21.213203
+56 9 25.000000
+56 10 32.015621
+56 11 28.284271
+56 12 29.732137
+56 13 26.627054
+56 14 35.355339
+56 15 29.154759
+56 16 34.409301
+56 17 36.055513
+56 18 33.541020
+56 19 56.753854
+56 20 51.419841
+56 21 46.572524
+56 22 55.901699
+56 23 46.097722
+56 24 55.578773
+56 25 45.705580
+56 26 55.226805
+56 27 71.589105
+56 28 69.641941
+56 29 68.876701
+56 30 65.000000
+56 31 65.299311
+56 32 63.158531
+56 33 64.412732
+56 34 65.192024
+56 35 60.415230
+56 36 44.654227
+56 37 43.011626
+56 38 41.340053
+56 39 37.735925
+56 40 36.055513
+56 41 39.051248
+56 42 31.764760
+56 43 32.015621
+56 44 35.355339
+56 45 33.301652
+56 46 24.166092
+56 47 23.323808
+56 48 31.764760
+56 49 56.293872
+56 50 49.477268
+56 51 48.877398
+56 52 47.169906
+56 53 30.413813
+56 54 14.142136
+56 55 25.000000
+56 57 32.015621
+56 58 35.000000
+56 59 52.201533
+56 60 44.721360
+56 61 15.000000
+56 62 15.811388
+56 63 43.011626
+56 64 53.150729
+56 65 33.541020
+56 66 20.615528
+56 67 25.495098
+56 68 38.470768
+56 69 10.000000
+56 70 8.062258
+56 71 10.295630
+56 72 35.355339
+56 73 33.376639
+56 74 28.000000
+56 75 41.231056
+56 76 60.415230
+56 77 56.603887
+56 78 57.428216
+56 79 22.360680
+56 80 25.298221
+56 81 21.400935
+56 82 19.104973
+56 83 17.262677
+56 84 29.832868
+56 85 41.109610
+56 86 49.578221
+56 87 37.107951
+56 88 40.249224
+56 89 6.324555
+56 90 66.287254
+56 91 14.764823
+56 92 26.172505
+56 93 28.600699
+56 94 32.015621
+56 95 29.546573
+56 96 34.713110
+56 97 25.709920
+56 98 49.396356
+56 99 8.944272
+56 100 25.317978
+56 101 7.071068
+57 1 18.027756
+57 2 55.901699
+57 3 48.826222
+57 4 57.306195
+57 5 54.083269
+57 6 58.309519
+57 7 51.224994
+57 8 53.150729
+57 9 57.008771
+57 10 40.000000
+57 11 40.311289
+57 12 42.296572
+57 13 43.174066
+57 14 45.000000
+57 15 46.097722
+57 16 48.259714
+57 17 50.249378
+57 18 50.990195
+57 19 30.594117
+57 20 26.248809
+57 21 21.540659
+57 22 31.622777
+57 23 22.360680
+57 24 32.310989
+57 25 23.323808
+57 26 33.541020
+57 27 45.276926
+57 28 45.000000
+57 29 42.296572
+57 30 40.000000
+57 31 38.327536
+57 32 38.000000
+57 33 37.336309
+57 34 36.400549
+57 35 35.000000
+57 36 52.810984
+57 37 52.201533
+57 38 49.335586
+57 39 46.572524
+57 40 46.097722
+57 41 50.990195
+57 42 40.792156
+57 43 45.276926
+57 44 50.249378
+57 45 47.265209
+57 46 55.758407
+57 47 55.217751
+57 48 49.030603
+57 49 31.048349
+57 50 24.351591
+57 51 22.000000
+57 52 15.811388
+57 53 25.495098
+57 54 33.541020
+57 55 25.495098
+57 56 32.015621
+57 58 22.360680
+57 59 43.011626
+57 60 42.720019
+57 61 43.011626
+57 62 30.413813
+57 63 15.000000
+57 64 21.213203
+57 65 7.071068
+57 66 15.811388
+57 67 9.219544
+57 68 15.652476
+57 69 26.925824
+57 70 25.495098
+57 71 37.161808
+57 72 25.000000
+57 73 32.695565
+57 74 54.120237
+57 75 33.541020
+57 76 54.083269
+57 77 25.079872
+57 78 41.868843
+57 79 46.957428
+57 80 55.000000
+57 81 12.369317
+57 82 23.021729
+57 83 24.351591
+57 84 13.601471
+57 85 9.219544
+57 86 17.691806
+57 87 31.016125
+57 88 39.560081
+57 89 34.713110
+57 90 34.481879
+57 91 17.691806
+57 92 7.071068
+57 93 8.544004
+57 94 20.248457
+57 95 14.764823
+57 96 6.324555
+57 97 19.646883
+57 98 49.040799
+57 99 29.410882
+57 100 24.000000
+57 101 37.215588
+58 1 26.925824
+58 2 60.207973
+58 3 50.635956
+58 4 60.530984
+58 5 55.901699
+58 6 60.827625
+58 7 51.419841
+58 8 52.201533
+58 9 57.008771
+58 10 22.360680
+58 11 25.000000
+58 12 26.627054
+58 13 29.732137
+58 14 26.925824
+58 15 32.015621
+58 16 31.764760
+58 17 33.541020
+58 18 36.055513
+58 19 24.413111
+58 20 19.209373
+58 21 15.620499
+58 22 22.360680
+58 23 14.142136
+58 24 21.540659
+58 25 12.806248
+58 26 20.615528
+58 27 65.192024
+58 28 65.764732
+58 29 62.201286
+58 30 60.827625
+58 31 58.215118
+58 32 58.855756
+58 33 57.218878
+58 34 55.000000
+58 35 55.901699
+58 36 70.491134
+58 37 69.462220
+58 38 66.887966
+58 39 63.631753
+58 40 62.649820
+58 41 67.082039
+58 42 57.306195
+58 43 60.415230
+58 44 65.000000
+58 45 62.241465
+58 46 57.870545
+58 47 56.293872
+58 48 34.409301
+58 49 23.323808
+58 50 17.691806
+58 51 43.174066
+58 52 25.495098
+58 53 7.071068
+58 54 26.925824
+58 55 43.011626
+58 56 35.000000
+58 57 22.360680
+58 59 21.213203
+58 60 20.615528
+58 61 38.078866
+58 62 42.720019
+58 63 36.400549
+58 64 35.355339
+58 65 15.811388
+58 66 15.811388
+58 67 16.278821
+58 68 38.013156
+58 69 36.400549
+58 70 27.018512
+58 71 44.283180
+58 72 46.097722
+58 73 51.855569
+58 74 44.821870
+58 75 11.180340
+58 76 32.015621
+58 77 32.695565
+58 78 23.086793
+58 79 38.013156
+58 80 49.244289
+58 81 27.802878
+58 82 38.078866
+58 83 18.248288
+58 84 9.219544
+58 85 27.294688
+58 86 33.060551
+58 87 9.055385
+58 88 18.027756
+58 89 33.541020
+58 90 42.059482
+58 91 23.086793
+58 92 25.495098
+58 93 29.206164
+58 94 41.109610
+58 95 35.468296
+58 96 28.635642
+58 97 38.288379
+58 98 26.925824
+58 99 27.294688
+58 100 10.770330
+58 101 42.011903
+59 1 47.169906
+59 2 75.663730
+59 3 65.375837
+59 4 75.325958
+59 5 70.178344
+59 6 75.166482
+59 7 65.069194
+59 8 65.000000
+59 9 70.000000
+59 10 25.495098
+59 11 30.413813
+59 12 30.805844
+59 13 35.693137
+59 14 26.925824
+59 15 36.400549
+59 16 32.695565
+59 17 33.541020
+59 18 38.078866
+59 19 29.427878
+59 20 27.000000
+59 21 27.459060
+59 22 25.495098
+59 23 25.495098
+59 24 23.537205
+59 25 23.537205
+59 26 20.615528
+59 27 82.462113
+59 28 83.815273
+59 29 79.555012
+59 30 79.056942
+59 31 75.690158
+59 32 77.162167
+59 33 74.726167
+59 34 71.589105
+59 35 74.330344
+59 36 91.263355
+59 37 90.138782
+59 38 87.658428
+59 39 84.314886
+59 40 83.216585
+59 41 87.464278
+59 42 77.935871
+59 43 80.622577
+59 44 85.000000
+59 45 82.365041
+59 46 72.173402
+59 47 70.064256
+59 48 37.336309
+59 49 27.459060
+59 50 27.073973
+59 51 62.241465
+59 52 41.231056
+59 53 22.360680
+59 54 40.311289
+59 55 64.031242
+59 56 52.201533
+59 57 43.011626
+59 58 21.213203
+59 60 11.180340
+59 61 50.000000
+59 62 62.649820
+59 63 55.901699
+59 64 50.990195
+59 65 36.055513
+59 66 36.055513
+59 67 37.483330
+59 68 58.523500
+59 69 55.901699
+59 70 44.944410
+59 71 62.297673
+59 72 67.268120
+59 73 73.000000
+59 74 51.662365
+59 75 11.180340
+59 76 11.180340
+59 77 45.044423
+59 78 10.630146
+59 79 46.529560
+59 80 58.694122
+59 81 48.918299
+59 82 58.821765
+59 83 35.114100
+59 84 30.413813
+59 85 46.097722
+59 86 49.729267
+59 87 15.231546
+59 88 14.317821
+59 89 48.836462
+59 90 52.239832
+59 91 43.046487
+59 92 46.690470
+59 93 50.328918
+59 94 62.289646
+59 95 56.639209
+59 96 49.091751
+59 97 59.464275
+59 98 13.601471
+59 99 43.416587
+59 100 27.313001
+59 101 59.203040
+60 1 42.426407
+60 2 66.708320
+60 3 56.293872
+60 4 66.098411
+60 5 60.827625
+60 6 65.764732
+60 7 55.578773
+60 8 55.226805
+60 9 60.207973
+60 10 15.000000
+60 11 20.000000
+60 12 20.099751
+60 13 25.079872
+60 14 15.811388
+60 15 25.495098
+60 16 21.540659
+60 17 22.360680
+60 18 26.925824
+60 19 37.161808
+60 20 33.526109
+60 21 32.388269
+60 22 33.541020
+60 23 30.413813
+60 24 31.764760
+60 25 28.442925
+60 26 29.154759
+60 27 85.586214
+60 28 86.313383
+60 29 82.607506
+60 30 81.394103
+60 31 78.638413
+60 32 79.429214
+60 33 77.646635
+60 34 75.166482
+60 35 76.485293
+60 36 86.452299
+60 37 85.146932
+60 38 82.879430
+60 39 79.397733
+60 40 78.102497
+60 41 82.006097
+60 42 73.000000
+60 43 75.000000
+60 44 79.056942
+60 45 76.609399
+60 46 62.801274
+60 47 60.530984
+60 48 26.248809
+60 49 35.341194
+60 50 32.984845
+60 51 63.788714
+60 52 45.000000
+60 53 18.027756
+60 54 31.622777
+60 55 60.207973
+60 56 44.721360
+60 57 42.720019
+60 58 20.615528
+60 59 11.180340
+60 61 40.311289
+60 62 57.008771
+60 63 57.008771
+60 64 55.000000
+60 65 36.400549
+60 66 32.015621
+60 67 35.355339
+60 68 58.309519
+60 69 50.000000
+60 70 38.275318
+60 71 55.009090
+60 72 65.192024
+60 73 69.526973
+60 74 40.792156
+60 75 10.000000
+60 76 15.811388
+60 77 50.635956
+60 78 21.400935
+60 79 36.055513
+60 80 48.166378
+60 81 45.803930
+60 82 54.451814
+60 83 28.600699
+60 84 29.154759
+60 85 47.853944
+60 86 53.084838
+60 87 11.704700
+60 88 4.472136
+60 89 40.496913
+60 90 58.940648
+60 91 38.183766
+60 92 44.777226
+60 93 48.764741
+60 94 60.207973
+60 95 54.708317
+60 96 49.040799
+60 97 56.400355
+60 98 6.324555
+60 99 35.777088
+60 100 21.931712
+60 101 51.478151
+61 1 26.925824
+61 2 26.925824
+61 3 16.552945
+61 4 25.961510
+61 5 20.615528
+61 6 25.495098
+61 7 15.297059
+61 8 15.000000
+61 9 20.000000
+61 10 25.495098
+61 11 20.615528
+61 12 21.189620
+61 13 16.552945
+61 14 26.925824
+61 15 18.027756
+61 16 23.853721
+61 17 25.000000
+61 18 21.213203
+61 19 62.177166
+61 20 56.824291
+61 21 52.478567
+61 22 60.415230
+61 23 51.478151
+61 24 59.615434
+61 25 50.537115
+61 26 58.523500
+61 27 85.440037
+61 28 83.815273
+61 29 82.637764
+61 30 79.056942
+61 31 78.924014
+61 32 77.162167
+61 33 78.000000
+61 34 78.262379
+61 35 74.330344
+61 36 57.697487
+61 37 55.901699
+61 38 54.626001
+61 39 51.078371
+61 40 49.244289
+61 41 51.478151
+61 42 45.541190
+61 43 44.721360
+61 44 47.169906
+61 45 45.650849
+61 46 22.561028
+61 47 20.223748
+61 48 19.849433
+61 49 61.269895
+61 50 55.072679
+61 51 62.241465
+61 52 56.568542
+61 53 31.622777
+61 54 11.180340
+61 55 40.000000
+61 56 15.000000
+61 57 43.011626
+61 58 38.078866
+61 59 50.000000
+61 60 40.311289
+61 62 30.413813
+61 63 55.901699
+61 64 64.031242
+61 65 42.426407
+61 66 28.284271
+61 67 34.713110
+61 68 52.201533
+61 69 25.000000
+61 70 17.888544
+61 71 21.931712
+61 72 50.249378
+61 73 48.259714
+61 74 13.000000
+61 75 40.311289
+61 76 55.901699
+61 77 65.795137
+61 78 57.558666
+61 79 8.062258
+61 80 12.041595
+61 81 34.539832
+61 82 34.058773
+61 83 20.808652
+61 84 36.400549
+61 85 52.201533
+61 86 60.605280
+61 87 36.496575
+61 88 36.124784
+61 89 9.219544
+61 90 75.690158
+61 91 25.553865
+61 92 38.470768
+61 93 41.629317
+61 94 46.690470
+61 95 43.680659
+61 96 47.010637
+61 97 40.447497
+61 98 43.416587
+61 99 13.601471
+61 100 27.313001
+61 101 17.464249
+62 1 15.811388
+62 2 28.284271
+62 3 25.079872
+62 4 30.479501
+62 5 29.154759
+62 6 32.015621
+62 7 28.792360
+62 8 31.622777
+62 9 33.541020
+62 10 46.097722
+62 11 43.011626
+62 12 44.654227
+62 13 42.059482
+62 14 50.000000
+62 15 44.721360
+62 16 49.739320
+62 17 51.478151
+62 18 49.244289
+62 19 60.008333
+62 20 55.081757
+62 21 50.089919
+62 22 60.207973
+62 23 50.249378
+62 24 60.406953
+62 25 50.487622
+62 26 60.827625
+62 27 61.032778
+62 28 58.309519
+62 29 58.600341
+62 30 54.083269
+62 31 55.443665
+62 32 52.430907
+62 33 54.671748
+62 34 56.568542
+62 35 50.000000
+62 36 29.732137
+62 37 28.284271
+62 38 26.248809
+62 39 22.671568
+62 40 21.213203
+62 41 25.000000
+62 42 16.401219
+62 43 18.027756
+62 44 22.360680
+62 45 19.723083
+62 46 30.232433
+62 47 30.886890
+62 48 47.423623
+62 49 60.074953
+62 50 53.084838
+62 51 40.360872
+62 52 46.097722
+62 53 40.311289
+62 54 29.154759
+62 55 11.180340
+62 56 15.811388
+62 57 30.413813
+62 58 42.720019
+62 59 62.649820
+62 60 57.008771
+62 61 30.413813
+62 63 36.055513
+62 64 49.244289
+62 65 35.000000
+62 66 26.925824
+62 67 28.284271
+62 68 29.832868
+62 69 7.071068
+62 70 19.104973
+62 71 10.770330
+62 72 22.360680
+62 73 18.000000
+62 74 43.289722
+62 75 51.478151
+62 76 72.111026
+62 77 55.081757
+62 78 65.787537
+62 79 38.078866
+62 80 39.115214
+62 81 18.110770
+62 82 8.062258
+62 83 28.425341
+62 84 34.928498
+62 85 37.947332
+62 86 45.694639
+62 87 47.507894
+62 88 52.630789
+62 89 22.135944
+62 90 63.906181
+62 91 19.697716
+62 92 23.345235
+62 93 23.409400
+62 94 20.615528
+62 95 20.808652
+62 96 30.083218
+62 97 14.866069
+62 98 62.369865
+62 99 23.021729
+62 100 35.510562
+62 101 14.142136
+63 1 29.154759
+63 2 64.031242
+63 3 58.728187
+63 4 65.946948
+63 5 63.639610
+63 6 67.268120
+63 7 61.717096
+63 8 64.031242
+63 9 67.268120
+63 10 55.000000
+63 11 55.226805
+63 12 57.218878
+63 13 57.870545
+63 14 60.000000
+63 15 60.827625
+63 16 63.198101
+63 17 65.192024
+63 18 65.764732
+63 19 36.619667
+63 20 33.970576
+63 21 30.479501
+63 22 39.051248
+63 23 32.015621
+63 24 40.360872
+63 25 33.600595
+63 26 42.426407
+63 27 30.413813
+63 28 30.000000
+63 29 27.459060
+63 30 25.000000
+63 31 23.537205
+63 32 23.000000
+63 33 22.561028
+63 34 22.360680
+63 35 20.000000
+63 36 50.039984
+63 37 50.000000
+63 38 47.000000
+63 39 45.099889
+63 40 45.276926
+63 41 50.249378
+63 42 40.607881
+63 43 46.097722
+63 44 50.990195
+63 45 48.052055
+63 46 65.069194
+63 47 65.069194
+63 48 63.788714
+63 49 37.802116
+63 50 32.526912
+63 51 7.000000
+63 52 18.027756
+63 53 40.311289
+63 54 47.434165
+63 55 26.925824
+63 56 43.011626
+63 57 15.000000
+63 58 36.400549
+63 59 55.901699
+63 60 57.008771
+63 61 55.901699
+63 62 36.055513
+63 64 15.000000
+63 65 20.615528
+63 66 30.413813
+63 67 24.083189
+63 68 7.071068
+63 69 35.355339
+63 70 38.013156
+63 71 45.343136
+63 72 20.000000
+63 73 30.066593
+63 74 67.779053
+63 75 47.434165
+63 76 67.082039
+63 77 23.537205
+63 78 52.801515
+63 79 60.745370
+63 80 67.601775
+63 81 21.633308
+63 82 28.017851
+63 83 38.832976
+63 84 28.284271
+63 85 10.000000
+63 86 12.165525
+63 87 45.354162
+63 88 54.129474
+63 89 47.010637
+63 90 30.066593
+63 91 30.463092
+63 92 17.464249
+63 93 14.422205
+63 94 17.464249
+63 95 15.264338
+63 96 9.219544
+63 97 21.470911
+63 98 63.324561
+63 99 42.544095
+63 100 39.000000
+63 101 46.690470
+64 1 39.051248
+64 2 76.321688
+64 3 69.814039
+64 4 77.935871
+64 5 75.000000
+64 6 79.056942
+64 7 72.346389
+64 8 74.330344
+64 9 78.102497
+64 10 57.008771
+64 11 58.523500
+64 12 60.406953
+64 13 62.241465
+64 14 61.846584
+64 15 65.000000
+64 16 66.098411
+64 17 68.007353
+64 18 69.641941
+64 19 25.806976
+64 20 25.079872
+64 21 23.537205
+64 22 29.154759
+64 23 25.495098
+64 24 30.886890
+64 25 27.459060
+64 26 33.541020
+64 27 31.622777
+64 28 33.541020
+64 29 28.792360
+64 30 29.154759
+64 31 25.079872
+64 32 27.459060
+64 33 24.166092
+64 34 20.615528
+64 35 25.000000
+64 36 65.030762
+64 37 65.000000
+64 38 62.000000
+64 39 60.074953
+64 40 60.207973
+64 41 65.192024
+64 42 55.443665
+64 43 60.827625
+64 44 65.764732
+64 45 62.801274
+64 46 76.609399
+64 47 76.216796
+64 48 67.779053
+64 49 27.459060
+64 50 24.351591
+64 51 16.552945
+64 52 10.000000
+64 53 41.231056
+64 54 54.083269
+64 55 41.231056
+64 56 53.150729
+64 57 21.213203
+64 58 35.355339
+64 59 50.990195
+64 60 55.000000
+64 61 64.031242
+64 62 49.244289
+64 63 15.000000
+64 65 22.360680
+64 66 36.055513
+64 67 29.410882
+64 68 22.022716
+64 69 47.169906
+64 70 46.690470
+64 71 57.454330
+64 72 35.000000
+64 73 45.044423
+64 74 74.625733
+64 75 45.000000
+64 76 61.846584
+64 77 9.433981
+64 78 45.310043
+64 79 67.416615
+64 80 76.059187
+64 81 32.449961
+64 82 41.231056
+64 83 44.418465
+64 84 30.083218
+64 85 12.041595
+64 86 3.605551
+64 87 44.181444
+64 88 53.150729
+64 89 55.901699
+64 90 15.132746
+64 91 38.897301
+64 92 27.202941
+64 93 25.942244
+64 94 32.249031
+64 95 29.120440
+64 96 19.235384
+64 97 35.440090
+64 98 61.032778
+64 99 50.447993
+64 100 41.785165
+64 101 58.008620
+65 1 20.615528
+65 2 58.523500
+65 3 50.537115
+65 4 59.615434
+65 5 55.901699
+65 6 60.415230
+65 7 52.478567
+65 8 54.083269
+65 9 58.309519
+65 10 35.355339
+65 11 36.400549
+65 12 38.327536
+65 13 39.924930
+65 14 40.311289
+65 15 42.720019
+65 16 44.147480
+65 17 46.097722
+65 18 47.434165
+65 19 25.019992
+65 20 20.223748
+65 21 15.297059
+65 22 25.495098
+65 23 15.811388
+65 24 25.961510
+65 25 16.552945
+65 26 26.925824
+65 27 50.000000
+65 28 50.249378
+65 29 47.000000
+65 30 45.276926
+65 31 43.000000
+65 32 43.289722
+65 33 42.000000
+65 34 40.311289
+65 35 40.311289
+65 36 59.236813
+65 37 58.523500
+65 38 55.713553
+65 39 52.810984
+65 40 52.201533
+65 41 57.008771
+65 42 46.840154
+65 43 50.990195
+65 44 55.901699
+65 45 52.952809
+65 46 57.697487
+65 47 56.824291
+65 48 45.541190
+65 49 25.179357
+65 50 18.248288
+65 51 27.459060
+65 52 14.142136
+65 53 20.000000
+65 54 32.015621
+65 55 31.622777
+65 56 33.541020
+65 57 7.071068
+65 58 15.811388
+65 59 36.055513
+65 60 36.400549
+65 61 42.426407
+65 62 35.000000
+65 63 20.615528
+65 64 22.360680
+65 66 14.142136
+65 67 8.062258
+65 68 22.472205
+65 69 30.413813
+65 70 26.076810
+65 71 40.261644
+65 72 32.015621
+65 73 39.357337
+65 74 52.430907
+65 75 26.925824
+65 76 47.169906
+65 77 23.430749
+65 78 34.828150
+65 79 45.221676
+65 80 54.451814
+65 81 17.117243
+65 82 28.284271
+65 83 22.203603
+65 84 8.062258
+65 85 12.041595
+65 86 19.313208
+65 87 24.738634
+65 88 33.541020
+65 89 35.000000
+65 90 33.301652
+65 91 18.788294
+65 92 12.649111
+65 93 15.264338
+65 94 27.202941
+65 95 21.633308
+65 96 13.038405
+65 97 26.000000
+65 98 42.720019
+65 99 29.068884
+65 100 19.646883
+65 101 39.560081
+66 1 11.180340
+66 2 46.097722
+66 3 37.336309
+66 4 46.840154
+66 5 42.720019
+66 6 47.434165
+66 7 38.910153
+66 8 40.311289
+66 9 44.721360
+66 10 25.495098
+66 11 25.000000
+66 12 27.000000
+66 13 27.459060
+66 14 30.413813
+66 15 30.413813
+66 16 33.000000
+66 17 35.000000
+66 18 35.355339
+66 19 36.138622
+66 20 30.805844
+66 21 25.961510
+66 22 35.355339
+66 23 25.495098
+66 24 35.128336
+66 25 25.179357
+66 26 35.000000
+66 27 60.827625
+66 28 60.207973
+66 29 57.870545
+66 30 55.226805
+66 31 53.935146
+66 32 53.235327
+66 33 52.952809
+66 34 52.201533
+66 35 50.249378
+66 36 55.217751
+66 37 54.083269
+66 38 51.613952
+66 39 48.259714
+66 40 47.169906
+66 41 51.478151
+66 42 41.880783
+66 43 44.721360
+66 44 49.244289
+66 45 46.518813
+66 46 44.598206
+66 47 43.462628
+66 48 33.376639
+66 49 35.693137
+66 50 28.861739
+66 51 37.336309
+66 52 28.284271
+66 53 14.142136
+66 54 18.027756
+66 55 28.284271
+66 56 20.615528
+66 57 15.811388
+66 58 15.811388
+66 59 36.055513
+66 60 32.015621
+66 61 28.284271
+66 62 26.925824
+66 63 30.413813
+66 64 36.055513
+66 65 14.142136
+66 67 6.708204
+66 68 29.068884
+66 69 20.615528
+66 70 12.649111
+66 71 29.000000
+66 72 33.541020
+66 73 37.536649
+66 74 38.587563
+66 75 25.000000
+66 76 46.097722
+66 77 37.536649
+66 78 38.897301
+66 79 31.384710
+66 80 40.311289
+66 81 13.892444
+66 82 22.803509
+66 83 8.544004
+66 84 9.219544
+66 85 24.596748
+66 86 32.756679
+66 87 21.260292
+66 88 28.017851
+66 89 21.095023
+66 90 47.423623
+66 91 7.280110
+66 92 14.142136
+66 93 18.248288
+66 94 28.635642
+66 95 23.409400
+66 96 21.213203
+66 97 24.413111
+66 98 38.013156
+66 99 15.000000
+66 100 10.295630
+66 101 27.294688
+67 1 13.038405
+67 2 50.596443
+67 3 42.485292
+67 4 51.623638
+67 5 47.853944
+67 6 52.392748
+67 7 44.418465
+67 8 46.043458
+67 9 50.249378
+67 10 31.064449
+67 11 31.144823
+67 12 33.136083
+67 13 33.955854
+67 14 36.055513
+67 15 36.878178
+67 16 39.115214
+67 17 41.109610
+67 18 41.773197
+67 19 32.140317
+67 20 27.018512
+67 21 22.022716
+67 22 32.015621
+67 23 22.022716
+67 24 32.140317
+67 25 22.203603
+67 26 32.557641
+67 27 54.451814
+67 28 54.037024
+67 29 51.478151
+67 30 49.040799
+67 31 47.518417
+67 32 47.042534
+67 33 46.529560
+67 34 45.607017
+67 35 44.045431
+67 36 54.589376
+67 37 53.665631
+67 38 51.000000
+67 39 47.853944
+67 40 47.010637
+67 41 51.623638
+67 42 41.629317
+67 43 45.221676
+67 44 50.000000
+67 45 47.127487
+67 46 49.658836
+67 47 48.764741
+67 48 39.812058
+67 49 32.015621
+67 50 25.019992
+67 51 31.064449
+67 52 22.022716
+67 53 17.464249
+67 54 24.698178
+67 55 26.925824
+67 56 25.495098
+67 57 9.219544
+67 58 16.278821
+67 59 37.483330
+67 60 35.355339
+67 61 34.713110
+67 62 28.284271
+67 63 24.083189
+67 64 29.410882
+67 65 8.062258
+67 66 6.708204
+67 68 23.537205
+67 69 23.021729
+67 70 18.027756
+67 71 32.557641
+67 72 30.000000
+67 73 35.608988
+67 74 45.276926
+67 75 27.018512
+67 76 48.166378
+67 77 31.400637
+67 78 38.470768
+67 79 38.078866
+67 80 46.754679
+67 81 11.661904
+67 82 22.472205
+67 83 15.231546
+67 84 7.211103
+67 85 17.888544
+67 86 26.076810
+67 87 23.853721
+67 88 31.780497
+67 89 27.018512
+67 90 41.231056
+67 91 10.770330
+67 92 9.433981
+67 93 13.416408
+67 94 25.000000
+67 95 19.416488
+67 96 15.000000
+67 97 22.022716
+67 98 41.593269
+67 99 21.213203
+67 100 15.132746
+67 101 31.622777
+68 1 25.298221
+68 2 58.051701
+68 3 53.413481
+68 4 60.108236
+68 5 58.137767
+68 6 61.522354
+68 7 56.612719
+68 8 59.076222
+68 9 62.008064
+68 10 54.451814
+68 11 54.037024
+68 12 56.035703
+68 13 56.080300
+68 14 59.413803
+68 15 59.076222
+68 16 62.032250
+68 17 64.031242
+68 18 64.070274
+68 19 42.059482
+68 20 38.832976
+68 21 34.828150
+68 22 44.102154
+68 23 36.124784
+68 24 45.221676
+68 25 37.483330
+68 26 47.010637
+68 27 33.241540
+68 28 31.780497
+68 29 30.463092
+68 30 26.925824
+68 31 26.832816
+68 32 25.000000
+68 33 25.942244
+68 34 27.018512
+68 35 22.135944
+68 36 43.104524
+68 37 43.011626
+68 38 40.012498
+68 39 38.052595
+68 40 38.209946
+68 41 43.185646
+68 42 33.541020
+68 43 39.051248
+68 44 43.931765
+68 45 41.000000
+68 46 59.464275
+68 47 59.665736
+68 48 62.072538
+68 49 43.046487
+68 50 37.202150
+68 51 10.630146
+68 52 23.769729
+68 53 40.804412
+68 54 44.721360
+68 55 20.124612
+68 56 38.470768
+68 57 15.652476
+68 58 38.013156
+68 59 58.523500
+68 60 58.309519
+68 61 52.201533
+68 62 29.832868
+68 63 7.071068
+68 64 22.022716
+68 65 22.472205
+68 66 29.068884
+68 67 23.537205
+68 69 30.000000
+68 70 34.481879
+68 71 39.623226
+68 72 13.038405
+68 73 23.021729
+68 74 64.560050
+68 75 49.193496
+68 76 69.641941
+68 77 30.265492
+68 78 56.586217
+68 79 57.723479
+68 80 63.560994
+68 81 17.720045
+68 82 21.931712
+68 83 37.013511
+68 84 29.154759
+68 85 14.764823
+68 86 19.026298
+68 87 46.615448
+68 88 55.027266
+68 89 43.081318
+68 90 37.121422
+68 91 27.459060
+68 92 15.000000
+68 93 11.045361
+68 94 10.440307
+68 95 9.219544
+68 96 9.433981
+68 97 15.000000
+68 98 64.621978
+68 99 39.293765
+68 100 38.639358
+68 101 41.400483
+69 1 10.000000
+69 2 29.154759
+69 3 23.430749
+69 4 30.805844
+69 5 28.284271
+69 6 32.015621
+69 7 26.627054
+69 8 29.154759
+69 9 32.015621
+69 10 39.051248
+69 11 36.055513
+69 12 37.735925
+69 13 35.341194
+69 14 43.011626
+69 15 38.078866
+69 16 42.941821
+69 17 44.721360
+69 18 42.720019
+69 19 55.145263
+69 20 50.039984
+69 21 45.044423
+69 22 55.000000
+69 23 45.000000
+69 24 55.036352
+69 25 45.044423
+69 26 55.226805
+69 27 62.649820
+69 28 60.415230
+69 29 60.033324
+69 30 55.901699
+69 31 56.603887
+69 32 54.120237
+69 33 55.758407
+69 34 57.008771
+69 35 51.478151
+69 36 36.796739
+69 37 35.355339
+69 38 33.301652
+69 39 29.732137
+69 40 28.284271
+69 41 32.015621
+69 42 23.430749
+69 43 25.000000
+69 44 29.154759
+69 45 26.627054
+69 46 29.732137
+69 47 29.732137
+69 48 40.853396
+69 49 55.036352
+69 50 48.041649
+69 51 40.607881
+69 52 42.720019
+69 53 33.541020
+69 54 22.360680
+69 55 15.000000
+69 56 10.000000
+69 57 26.925824
+69 58 36.400549
+69 59 55.901699
+69 60 50.000000
+69 61 25.000000
+69 62 7.071068
+69 63 35.355339
+69 64 47.169906
+69 65 30.413813
+69 66 20.615528
+69 67 23.021729
+69 68 30.000000
+69 70 12.041595
+69 71 10.295630
+69 72 25.495098
+69 73 23.537205
+69 74 38.000000
+69 75 44.721360
+69 76 65.192024
+69 77 52.000000
+69 78 59.481089
+69 79 32.249031
+69 80 34.928498
+69 81 14.764823
+69 82 9.219544
+69 83 21.400935
+69 84 29.154759
+69 85 35.355339
+69 86 43.566042
+69 87 40.706265
+69 88 45.607017
+69 89 16.124515
+69 90 61.269895
+69 91 13.341664
+69 92 20.124612
+69 93 21.400935
+69 94 22.472205
+69 95 20.808652
+69 96 28.017851
+69 97 16.155494
+69 98 55.317267
+69 99 16.124515
+69 100 28.653098
+69 101 11.401754
+70 1 9.219544
+70 2 33.541020
+70 3 24.698178
+70 4 34.205263
+70 5 30.083218
+70 6 34.785054
+70 7 26.419690
+70 8 28.017851
+70 9 32.249031
+70 10 27.018512
+70 11 24.186773
+70 12 25.942244
+70 13 24.041631
+70 14 31.064449
+70 15 26.925824
+70 16 31.384710
+70 17 33.241540
+70 18 31.780497
+70 19 48.764741
+70 20 43.416587
+70 21 38.600518
+70 22 47.853944
+70 23 38.078866
+70 24 47.518417
+70 25 37.656341
+70 26 47.169906
+70 27 67.675697
+70 28 66.219333
+70 29 64.845971
+70 30 61.400326
+70 31 61.098281
+70 32 59.481089
+70 33 60.166436
+70 34 60.373835
+70 35 56.612719
+70 36 48.836462
+70 37 47.381431
+70 38 45.343136
+70 39 41.773197
+70 40 40.311289
+70 41 43.931765
+70 42 35.468296
+70 43 36.878178
+70 44 40.804412
+70 45 38.418745
+70 46 31.953091
+70 47 30.870698
+70 48 29.832868
+70 49 48.270074
+70 50 41.484937
+70 51 44.384682
+70 52 40.000000
+70 53 22.803509
+70 54 11.180340
+70 55 25.298221
+70 56 8.062258
+70 57 25.495098
+70 58 27.018512
+70 59 44.944410
+70 60 38.275318
+70 61 17.888544
+70 62 19.104973
+70 63 38.013156
+70 64 46.690470
+70 65 26.076810
+70 66 12.649111
+70 67 18.027756
+70 68 34.481879
+70 69 12.041595
+70 71 17.464249
+70 72 34.132096
+70 73 34.539832
+70 74 30.083218
+70 75 33.837849
+70 76 53.712196
+70 77 49.406477
+70 78 49.648766
+70 79 23.345235
+70 80 29.681644
+70 81 16.763055
+70 82 18.973666
+70 83 9.848858
+70 84 21.840330
+70 85 34.713110
+70 86 43.185646
+70 87 29.732137
+70 88 33.837849
+70 89 9.219544
+70 90 59.203040
+70 91 7.810250
+70 92 20.591260
+70 93 23.769729
+70 94 30.000000
+70 95 26.305893
+70 96 29.154759
+70 97 24.083189
+70 98 43.416587
+70 99 5.000000
+70 100 17.720045
+70 101 15.000000
+71 1 19.646883
+71 2 18.867962
+71 3 14.317821
+71 4 20.615528
+71 5 18.601075
+71 6 21.931712
+71 7 18.027756
+71 8 20.880613
+71 9 22.825424
+71 10 42.201896
+71 11 38.288379
+71 12 39.623226
+71 13 36.124784
+71 14 45.343136
+71 15 38.418745
+71 16 43.931765
+71 17 45.453273
+71 18 42.438190
+71 19 64.629715
+71 20 59.413803
+71 21 54.451814
+71 22 64.195015
+71 23 54.230987
+71 24 64.070274
+71 25 54.083269
+71 26 64.000000
+71 27 71.561163
+71 28 68.963759
+71 29 69.065187
+71 30 64.660653
+71 31 65.802736
+71 32 62.968246
+71 33 65.000000
+71 34 66.603303
+71 35 60.464866
+71 36 35.777088
+71 37 34.000000
+71 38 32.695565
+71 39 29.154759
+71 40 27.313001
+71 41 29.681644
+71 42 23.769729
+71 43 22.825424
+71 44 25.612497
+71 45 23.853721
+71 46 19.849433
+71 47 20.248457
+71 48 40.804412
+71 49 64.381674
+71 50 57.428216
+71 51 50.249378
+71 52 52.924474
+71 53 40.261644
+71 54 24.207437
+71 55 21.931712
+71 56 10.295630
+71 57 37.161808
+71 58 44.283180
+71 59 62.297673
+71 60 55.009090
+71 61 21.931712
+71 62 10.770330
+71 63 45.343136
+71 64 57.454330
+71 65 40.261644
+71 66 29.000000
+71 67 32.557641
+71 68 39.623226
+71 69 10.295630
+71 70 17.464249
+71 72 33.105891
+71 73 28.284271
+71 74 34.205263
+71 75 51.244512
+71 76 70.682388
+71 77 62.241465
+71 78 67.082039
+71 79 29.966648
+71 80 29.017236
+71 81 25.059928
+71 82 17.804494
+71 83 27.202941
+71 84 38.052595
+71 85 45.650849
+71 86 53.851648
+71 87 47.127487
+71 88 50.537115
+71 89 15.556349
+71 90 71.554175
+71 91 22.090722
+71 92 30.413813
+71 93 31.622777
+71 94 31.064449
+71 95 30.413813
+71 96 38.275318
+71 97 25.000000
+71 98 59.682493
+71 99 19.235384
+71 100 35.171011
+71 101 4.472136
+72 1 25.495098
+72 2 50.000000
+72 3 47.423623
+72 4 52.430907
+72 5 51.478151
+72 6 54.083269
+72 7 51.078371
+72 8 53.851648
+72 9 55.901699
+72 10 58.523500
+72 11 57.008771
+72 12 58.940648
+72 13 57.870545
+72 14 63.245553
+72 15 60.827625
+72 16 64.761099
+72 17 66.708320
+72 18 65.764732
+72 19 54.230987
+72 20 50.537115
+72 21 46.141088
+72 22 55.901699
+72 23 47.169906
+72 24 56.824291
+72 25 48.259714
+72 26 58.309519
+72 27 39.051248
+72 28 36.055513
+72 29 36.796739
+72 30 32.015621
+72 31 33.970576
+72 32 30.479501
+72 33 33.301652
+72 34 36.055513
+72 35 28.284271
+72 36 30.066593
+72 37 30.000000
+72 38 27.000000
+72 39 25.179357
+72 40 25.495098
+72 41 30.413813
+72 42 21.189620
+72 43 26.925824
+72 44 31.622777
+72 45 28.792360
+72 46 52.478567
+72 47 53.235327
+72 48 63.788714
+72 49 55.036352
+72 50 48.764741
+72 51 21.189620
+72 52 36.400549
+72 53 47.169906
+72 54 45.276926
+72 55 11.180340
+72 56 35.355339
+72 57 25.000000
+72 58 46.097722
+72 59 67.268120
+72 60 65.192024
+72 61 50.249378
+72 62 22.360680
+72 63 20.000000
+72 64 35.000000
+72 65 32.015621
+72 66 33.541020
+72 67 30.000000
+72 68 13.038405
+72 69 25.495098
+72 70 34.132096
+72 71 33.105891
+72 73 10.198039
+72 74 63.198101
+72 75 57.008771
+72 76 78.102497
+72 77 43.289722
+72 78 66.843100
+72 79 57.008771
+72 80 60.415230
+72 81 19.697716
+72 82 16.278821
+72 83 39.849718
+72 84 36.878178
+72 85 27.202941
+72 86 32.062439
+72 87 53.823787
+72 88 61.400326
+72 89 41.109610
+72 90 50.039984
+72 91 29.120440
+72 92 20.615528
+72 93 16.970563
+72 94 5.000000
+72 95 10.630146
+72 96 20.124612
+72 97 10.049876
+72 98 71.344236
+72 99 39.115214
+72 100 43.829214
+72 101 36.055513
+73 1 27.459060
+73 2 42.941821
+73 3 42.201896
+73 4 45.617979
+73 5 45.541190
+73 6 47.423623
+73 7 46.097722
+73 8 49.030603
+73 9 50.289164
+73 10 60.901560
+73 11 58.600341
+73 12 60.415230
+73 13 58.523500
+73 14 65.299311
+73 15 61.351447
+73 16 65.924199
+73 17 67.779053
+73 18 66.098411
+73 19 62.936476
+73 20 58.872744
+73 21 54.230987
+73 22 64.257295
+73 23 55.036352
+73 24 65.000000
+73 25 55.901699
+73 26 66.211781
+73 27 47.423623
+73 28 43.863424
+73 29 45.453273
+73 30 40.360872
+73 31 43.011626
+73 32 39.051248
+73 33 42.438190
+73 34 45.650849
+73 35 37.202150
+73 36 20.396078
+73 37 20.099751
+73 38 17.117243
+73 39 15.033296
+73 40 15.297059
+73 41 20.223748
+73 42 11.180340
+73 43 17.000000
+73 44 21.540659
+73 45 18.788294
+73 46 46.238512
+73 47 47.434165
+73 48 64.195015
+73 49 63.568860
+73 50 57.008771
+73 51 31.320920
+73 52 45.705580
+73 53 51.662365
+73 54 45.541190
+73 55 9.433981
+73 56 33.376639
+73 57 32.695565
+73 58 51.855569
+73 59 73.000000
+73 60 69.526973
+73 61 48.259714
+73 62 18.000000
+73 63 30.066593
+73 64 45.044423
+73 65 39.357337
+73 66 37.536649
+73 67 35.608988
+73 68 23.021729
+73 69 23.537205
+73 70 34.539832
+73 71 28.284271
+73 72 10.198039
+73 74 61.204575
+73 75 62.241465
+73 76 83.450584
+73 77 53.084838
+73 78 73.783467
+73 79 55.731499
+73 80 57.078893
+73 81 24.083189
+73 82 15.652476
+73 83 42.190046
+73 84 42.801869
+73 85 36.496575
+73 86 42.000000
+73 87 58.694122
+73 88 65.436993
+73 89 39.623226
+73 90 60.133186
+73 91 31.622777
+73 92 26.925824
+73 93 24.166092
+73 94 13.152946
+73 95 18.027756
+73 96 28.861739
+73 97 13.601471
+73 98 75.432089
+73 99 39.217343
+73 100 47.634021
+73 101 32.062439
+74 1 39.293765
+74 2 33.970576
+74 3 25.000000
+74 4 32.015621
+74 5 26.907248
+74 6 30.805844
+74 7 21.931712
+74 8 19.849433
+74 9 23.853721
+74 10 26.248809
+74 11 21.540659
+74 12 20.880613
+74 13 16.155494
+74 14 25.179357
+74 15 15.297059
+74 16 20.000000
+74 17 20.099751
+74 18 15.132746
+74 19 69.202601
+74 20 64.031242
+74 21 60.207973
+74 22 66.850580
+74 23 58.898217
+74 24 65.734314
+74 25 57.628118
+74 26 64.140471
+74 27 97.718985
+74 28 96.301610
+74 29 94.868330
+74 30 91.482239
+74 31 91.082380
+74 32 89.560036
+74 33 90.138782
+74 34 90.077744
+74 35 86.683332
+74 36 69.641941
+74 37 67.779053
+74 38 66.730802
+74 39 63.245553
+74 40 61.351447
+74 41 63.158531
+74 42 57.974132
+74 43 56.648036
+74 44 58.600341
+74 45 57.384667
+74 46 28.425341
+74 47 25.612497
+74 48 15.000000
+74 49 68.007353
+74 50 62.481997
+74 51 74.330344
+74 52 66.400301
+74 53 37.802116
+74 54 20.591260
+74 55 53.000000
+74 56 28.000000
+74 57 54.120237
+74 58 44.821870
+74 59 51.662365
+74 60 40.792156
+74 61 13.000000
+74 62 43.289722
+74 63 67.779053
+74 64 74.625733
+74 65 52.430907
+74 66 38.587563
+74 67 45.276926
+74 68 64.560050
+74 69 38.000000
+74 70 30.083218
+74 71 34.205263
+74 72 63.198101
+74 73 61.204575
+74 75 43.863424
+74 76 55.081757
+74 77 75.286121
+74 78 60.745370
+74 79 7.211103
+74 80 8.944272
+74 81 46.840154
+74 82 47.042534
+74 83 30.232433
+74 84 45.453273
+74 85 63.134776
+74 86 71.344236
+74 87 40.706265
+74 88 37.363083
+74 89 22.090722
+74 90 85.146932
+74 91 37.336309
+74 92 50.328918
+74 93 53.758720
+74 94 59.539903
+74 95 56.293872
+74 96 58.694122
+74 97 53.338541
+74 98 42.047592
+74 99 25.298221
+74 100 34.655447
+74 101 29.832868
+75 1 36.055513
+75 2 65.192024
+75 3 55.036352
+75 4 65.030762
+75 5 60.000000
+75 6 65.000000
+75 7 55.036352
+75 8 55.226805
+75 9 60.207973
+75 10 18.027756
+75 11 22.360680
+75 12 23.323808
+75 13 27.730849
+75 14 21.213203
+75 15 29.154759
+75 16 26.907248
+75 17 28.284271
+75 18 32.015621
+75 19 28.301943
+75 20 24.166092
+75 21 22.561028
+75 22 25.000000
+75 23 20.615528
+75 24 23.430749
+75 25 18.681542
+75 26 21.213203
+75 27 75.663730
+75 28 76.485293
+75 29 72.691127
+75 30 71.589105
+75 31 68.731361
+75 32 69.634761
+75 33 67.742158
+75 34 65.192024
+75 35 66.708320
+75 36 80.212219
+75 37 79.056942
+75 38 76.609399
+75 39 73.239334
+75 40 72.111026
+75 41 76.321688
+75 42 66.850580
+75 43 69.462220
+75 44 73.824115
+75 45 71.196910
+75 46 62.000000
+75 47 60.033324
+75 48 30.805844
+75 49 26.627054
+75 50 23.409400
+75 51 54.120237
+75 52 35.000000
+75 53 11.180340
+75 54 30.000000
+75 55 53.150729
+75 56 41.231056
+75 57 33.541020
+75 58 11.180340
+75 59 11.180340
+75 60 10.000000
+75 61 40.311289
+75 62 51.478151
+75 63 47.434165
+75 64 45.000000
+75 65 26.925824
+75 66 25.000000
+75 67 27.018512
+75 68 49.193496
+75 69 44.721360
+75 70 33.837849
+75 71 51.244512
+75 72 57.008771
+75 73 62.241465
+75 74 43.863424
+75 76 21.213203
+75 77 40.792156
+75 78 17.262677
+75 79 37.947332
+75 80 50.000000
+75 81 38.183766
+75 82 47.801674
+75 83 24.041631
+75 84 20.248457
+75 85 38.078866
+75 86 43.104524
+75 87 4.123106
+75 88 8.944272
+75 89 38.209946
+75 90 49.335586
+75 91 31.906112
+75 92 36.400549
+75 93 40.224371
+75 94 52.009614
+75 95 46.400431
+75 96 39.812058
+75 97 48.795492
+75 98 16.124515
+75 99 32.557641
+75 100 16.155494
+75 101 48.270074
+76 1 57.008771
+76 2 82.462113
+76 3 72.034714
+76 4 81.786307
+76 5 76.485293
+76 6 81.394103
+76 7 71.196910
+76 8 70.710678
+76 9 75.663730
+76 10 30.413813
+76 11 35.355339
+76 12 35.128336
+76 13 40.112342
+76 14 30.000000
+76 15 40.000000
+76 16 35.128336
+76 17 35.355339
+76 18 40.311289
+76 19 39.000000
+76 20 37.336309
+76 21 38.327536
+76 22 35.000000
+76 23 36.400549
+76 24 33.000000
+76 25 34.481879
+76 26 30.000000
+76 27 93.407708
+76 28 94.868330
+76 29 90.520716
+76 30 90.138782
+76 31 86.683332
+76 32 88.255311
+76 33 85.726309
+76 34 82.462113
+76 35 85.440037
+76 36 101.212647
+76 37 100.000000
+76 38 97.616597
+76 39 94.201911
+76 40 93.005376
+76 41 97.082439
+76 42 87.800911
+76 43 90.138782
+76 44 94.339811
+76 45 91.809586
+76 46 78.447435
+76 47 76.118329
+76 48 40.112342
+76 49 37.000000
+76 50 37.656341
+76 51 73.409809
+76 52 52.201533
+76 53 32.015621
+76 54 47.434165
+76 55 74.330344
+76 56 60.415230
+76 57 54.083269
+76 58 32.015621
+76 59 11.180340
+76 60 15.811388
+76 61 55.901699
+76 62 72.111026
+76 63 67.082039
+76 64 61.846584
+76 65 47.169906
+76 66 46.097722
+76 67 48.166378
+76 68 69.641941
+76 69 65.192024
+76 70 53.712196
+76 71 70.682388
+76 72 78.102497
+76 73 83.450584
+76 74 55.081757
+76 75 21.213203
+76 77 55.443665
+76 78 18.110770
+76 79 51.088159
+76 80 63.007936
+76 81 59.396970
+76 82 68.883960
+76 83 43.908997
+76 84 41.231056
+76 85 57.271284
+76 86 60.728906
+76 87 24.839485
+76 88 20.248457
+76 89 56.302753
+76 90 62.000000
+76 91 52.801515
+76 92 57.489129
+76 93 61.220911
+76 94 73.109507
+76 95 67.475922
+76 96 60.207973
+76 97 70.007142
+76 98 13.038405
+76 99 51.478151
+76 100 36.619667
+76 101 67.230945
+77 1 42.941821
+77 2 80.956779
+77 3 73.573093
+77 4 82.298238
+77 5 78.892332
+77 6 83.240615
+77 7 75.716577
+77 8 77.420927
+77 9 81.541401
+77 10 55.036352
+77 11 57.306195
+77 12 59.059292
+77 13 61.587336
+77 14 59.615434
+77 15 64.140471
+77 16 64.404969
+77 17 66.211781
+77 18 68.476273
+77 19 17.464249
+77 20 18.110770
+77 21 18.248288
+77 22 21.189620
+77 23 20.223748
+77 24 23.086793
+77 25 22.203603
+77 26 25.961510
+77 27 39.357337
+77 28 41.880783
+77 29 36.715120
+77 30 37.802116
+77 31 33.286634
+77 32 36.235342
+77 33 32.449961
+77 34 28.178006
+77 35 33.970576
+77 36 73.334848
+77 37 73.171033
+77 38 70.178344
+77 39 68.029405
+77 40 68.000000
+77 41 73.000000
+77 42 63.031738
+77 43 68.183576
+77 44 73.171033
+77 45 70.178344
+77 46 80.622577
+77 47 79.924965
+77 48 66.730802
+77 49 19.313208
+77 50 18.000000
+77 51 25.942244
+77 52 9.433981
+77 53 39.357337
+77 54 55.172457
+77 55 48.259714
+77 56 56.603887
+77 57 25.079872
+77 58 32.695565
+77 59 45.044423
+77 60 50.635956
+77 61 65.795137
+77 62 55.081757
+77 63 23.537205
+77 64 9.433981
+77 65 23.430749
+77 66 37.536649
+77 67 31.400637
+77 68 30.265492
+77 69 52.000000
+77 70 49.406477
+77 71 62.241465
+77 72 43.289722
+77 73 53.084838
+77 74 75.286121
+77 75 40.792156
+77 76 55.443665
+77 78 38.078866
+77 79 68.117545
+77 80 77.794601
+77 81 37.336309
+77 82 47.296934
+77 83 45.276926
+77 84 29.832868
+77 85 17.262677
+77 86 11.401754
+77 87 40.804412
+77 88 49.477268
+77 89 58.412327
+77 90 9.899495
+77 91 41.880783
+77 92 31.953091
+77 93 31.780497
+77 94 40.012498
+77 95 36.124784
+77 96 25.317978
+77 97 42.296572
+77 98 56.320511
+77 99 52.497619
+77 100 41.048752
+77 101 62.177166
+78 1 49.979996
+78 2 82.024387
+78 3 72.006944
+78 4 82.006097
+78 5 77.058419
+78 6 82.054860
+78 7 72.173402
+78 8 72.443081
+78 9 77.414469
+78 10 34.539832
+78 11 39.217343
+78 12 39.924930
+78 13 44.598206
+78 14 36.715120
+78 15 45.694639
+78 16 42.544095
+78 17 43.566042
+78 18 47.885280
+78 19 21.095023
+78 20 20.248457
+78 21 22.472205
+78 22 17.117243
+78 23 20.808652
+78 24 15.132746
+78 25 19.209373
+78 26 12.165525
+78 27 76.896034
+78 28 78.790862
+78 29 74.094534
+78 30 74.249579
+78 31 70.384657
+78 32 72.449983
+78 33 69.462220
+78 34 65.787537
+78 35 69.771054
+78 36 93.059121
+78 37 92.130342
+78 38 89.470666
+78 39 86.313383
+78 40 85.428333
+78 41 89.961103
+78 42 80.056230
+78 43 83.384651
+78 44 88.022724
+78 45 85.234969
+78 46 79.056942
+78 47 77.162167
+78 48 46.957428
+78 49 19.104973
+78 50 21.023796
+78 51 58.523500
+78 52 36.235342
+78 53 27.073973
+78 54 47.095647
+78 55 65.368188
+78 56 57.428216
+78 57 41.868843
+78 58 23.086793
+78 59 10.630146
+78 60 21.400935
+78 61 57.558666
+78 62 65.787537
+78 63 52.801515
+78 64 45.310043
+78 65 34.828150
+78 66 38.897301
+78 67 38.470768
+78 68 56.586217
+78 69 59.481089
+78 70 49.648766
+78 71 67.082039
+78 72 66.843100
+78 73 73.783467
+78 74 60.745370
+78 75 17.262677
+78 76 18.110770
+78 77 38.078866
+78 79 55.081757
+78 80 67.186308
+78 81 50.119856
+78 82 60.835845
+78 83 40.199502
+78 84 31.304952
+78 85 42.801869
+78 86 44.721360
+78 87 21.095023
+78 88 23.706539
+78 89 55.009090
+78 90 44.045431
+78 91 46.173586
+78 92 46.872167
+78 93 50.000000
+78 94 62.008064
+78 95 56.400355
+78 96 47.381431
+78 97 60.207973
+78 98 24.207437
+78 99 49.091751
+78 100 32.140317
+78 101 64.498062
+79 1 32.557641
+79 2 33.615473
+79 3 23.600847
+79 4 32.202484
+79 5 26.832816
+79 6 31.384710
+79 7 21.470911
+79 8 20.248457
+79 9 25.000000
+79 10 21.095023
+79 11 16.124515
+79 12 16.000000
+79 13 11.000000
+79 14 21.213203
+79 15 11.401754
+79 16 17.088007
+79 17 17.888544
+79 18 13.601471
+79 19 62.425956
+79 20 57.201399
+79 21 53.263496
+79 22 60.207973
+79 23 52.009614
+79 24 59.169249
+79 25 50.803543
+79 26 57.706152
+79 27 90.801982
+79 28 89.498603
+79 29 87.931792
+79 30 84.646323
+79 31 84.118963
+79 32 82.710338
+79 33 83.168504
+79 34 83.006024
+79 35 79.812280
+79 36 65.741920
+79 37 63.953108
+79 38 62.649820
+79 39 59.093147
+79 40 57.271284
+79 41 59.539903
+79 42 53.488316
+79 43 52.773099
+79 44 55.226805
+79 45 53.712196
+79 46 28.635642
+79 47 26.000000
+79 48 12.529964
+79 49 61.294372
+79 50 55.605755
+79 51 67.357256
+79 52 59.203040
+79 53 31.064449
+79 54 13.416408
+79 55 47.169906
+79 56 22.360680
+79 57 46.957428
+79 58 38.013156
+79 59 46.529560
+79 60 36.055513
+79 61 8.062258
+79 62 38.078866
+79 63 60.745370
+79 64 67.416615
+79 65 45.221676
+79 66 31.384710
+79 67 38.078866
+79 68 57.723479
+79 69 32.249031
+79 70 23.345235
+79 71 29.966648
+79 72 57.008771
+79 73 55.731499
+79 74 7.211103
+79 75 37.947332
+79 76 51.088159
+79 77 68.117545
+79 78 55.081757
+79 80 12.165525
+79 81 40.024992
+79 82 41.048752
+79 83 23.021729
+79 84 38.288379
+79 85 55.946403
+79 86 64.140471
+79 87 34.539832
+79 88 32.249031
+79 89 16.124515
+79 90 77.987178
+79 91 30.364453
+79 92 43.324358
+79 93 46.840154
+79 94 53.150729
+79 95 49.648766
+79 96 51.623638
+79 97 47.042534
+79 98 38.209946
+79 99 18.439089
+79 100 27.658633
+79 101 25.495098
+80 1 38.470768
+80 2 25.495098
+80 3 17.464249
+80 4 23.345235
+80 5 18.439089
+80 6 22.022716
+80 7 13.892444
+80 8 11.401754
+80 9 15.000000
+80 10 33.241540
+80 11 28.284271
+80 12 28.071338
+80 13 23.086793
+80 14 33.015148
+80 15 23.021729
+80 16 28.284271
+80 17 28.635642
+80 18 23.769729
+80 19 73.573093
+80 20 68.264193
+80 21 64.070274
+80 22 71.589105
+80 23 62.968246
+80 24 70.661163
+80 25 61.911227
+80 26 69.354164
+80 27 96.772930
+80 28 94.921020
+80 29 94.021274
+80 30 90.249654
+80 31 90.376988
+80 32 88.391176
+80 33 89.470666
+80 34 89.944427
+80 35 85.615419
+80 36 63.324561
+80 37 61.400326
+80 38 60.638272
+80 39 57.271284
+80 40 55.317267
+80 41 56.612719
+80 42 52.469038
+80 43 50.447993
+80 44 51.865210
+80 45 50.960769
+80 46 19.798990
+80 47 16.970563
+80 48 23.345235
+80 49 72.560320
+80 50 66.573268
+80 51 73.790243
+80 52 68.593003
+80 53 42.485292
+80 54 22.803509
+80 55 49.648766
+80 56 25.298221
+80 57 55.000000
+80 58 49.244289
+80 59 58.694122
+80 60 48.166378
+80 61 12.041595
+80 62 39.115214
+80 63 67.601775
+80 64 76.059187
+80 65 54.451814
+80 66 40.311289
+80 67 46.754679
+80 68 63.560994
+80 69 34.928498
+80 70 29.681644
+80 71 29.017236
+80 72 60.415230
+80 73 57.078893
+80 74 8.944272
+80 75 50.000000
+80 76 63.007936
+80 77 77.794601
+80 78 67.186308
+80 79 12.165525
+80 81 46.065171
+80 82 44.147480
+80 83 32.649655
+80 84 48.270074
+80 85 64.202804
+80 86 72.622311
+80 87 46.486557
+80 88 44.407207
+80 89 20.591260
+80 90 87.692645
+80 91 37.443290
+80 92 50.249378
+80 93 53.235327
+80 94 57.280014
+80 95 54.781384
+80 96 58.830264
+80 97 50.960769
+80 98 50.039984
+80 99 25.612497
+80 100 38.587563
+80 101 25.019992
+81 1 7.615773
+81 2 43.908997
+81 3 37.536649
+81 4 45.486262
+81 5 42.638011
+81 6 46.615448
+81 7 40.311289
+81 8 42.520583
+81 9 45.967380
+81 10 38.897301
+81 11 37.656341
+81 12 39.623226
+81 13 39.051248
+81 14 43.680659
+81 15 42.047592
+81 16 45.541190
+81 17 47.518417
+81 18 47.042534
+81 19 42.107007
+81 20 37.336309
+81 21 32.388269
+81 22 42.579338
+81 23 32.756679
+81 24 42.953463
+81 25 33.241540
+81 26 43.680659
+81 27 50.921508
+81 28 49.477268
+81 29 48.104054
+81 30 44.643029
+81 31 44.384682
+81 32 42.720019
+81 33 43.462628
+81 34 43.908997
+81 35 39.849718
+81 36 42.941821
+81 37 42.047592
+81 38 39.357337
+81 39 36.249138
+81 40 35.468296
+81 41 40.162171
+81 42 30.083218
+81 43 33.955854
+81 44 38.832976
+81 45 35.902646
+81 46 44.204072
+81 47 43.931765
+81 48 45.044423
+81 49 42.296572
+81 50 35.355339
+81 51 27.730849
+81 52 28.160256
+81 53 27.802878
+81 54 27.166155
+81 55 15.264338
+81 56 21.400935
+81 57 12.369317
+81 58 27.802878
+81 59 48.918299
+81 60 45.803930
+81 61 34.539832
+81 62 18.110770
+81 63 21.633308
+81 64 32.449961
+81 65 17.117243
+81 66 13.892444
+81 67 11.661904
+81 68 17.720045
+81 69 14.764823
+81 70 16.763055
+81 71 25.059928
+81 72 19.697716
+81 73 24.083189
+81 74 46.840154
+81 75 38.183766
+81 76 59.396970
+81 77 37.336309
+81 78 50.119856
+81 79 40.024992
+81 80 46.065171
+81 82 11.180340
+81 83 20.396078
+81 84 18.867962
+81 85 20.591260
+81 86 28.844410
+81 87 34.713110
+81 88 41.880783
+81 89 25.495098
+81 90 46.518813
+81 91 10.000000
+81 92 5.385165
+81 93 7.211103
+81 94 14.866069
+81 95 10.049876
+81 96 13.453624
+81 97 10.630146
+81 98 51.865210
+81 99 21.587033
+81 100 24.186773
+81 101 25.612497
+82 1 12.041595
+82 2 36.124784
+82 3 31.906112
+82 4 38.183766
+82 5 36.400549
+82 6 39.623226
+82 7 35.355339
+82 8 38.013156
+82 9 40.496913
+82 10 45.276926
+82 11 42.953463
+82 12 44.777226
+82 13 43.011626
+82 14 49.648766
+82 15 45.880279
+82 16 50.328918
+82 17 52.201533
+82 18 50.695167
+82 19 53.235327
+82 20 48.507731
+82 21 43.566042
+82 22 53.758720
+82 23 43.931765
+82 24 54.129474
+82 25 44.384682
+82 26 54.817880
+82 27 53.851648
+82 28 51.429563
+82 29 51.312766
+82 30 47.010637
+82 31 48.010416
+82 32 45.276926
+82 33 47.201695
+82 34 48.836462
+82 35 42.720019
+82 36 32.449961
+82 37 31.384710
+82 38 28.844410
+82 39 25.553865
+82 40 24.596748
+82 41 29.154759
+82 42 19.235384
+82 43 22.803509
+82 44 27.658633
+82 45 24.738634
+82 46 37.643060
+82 47 38.013156
+82 48 48.764741
+82 49 53.460266
+82 50 46.529560
+82 51 32.526912
+82 52 38.470768
+82 53 36.878178
+82 54 30.083218
+82 55 6.324555
+82 56 19.104973
+82 57 23.021729
+82 58 38.078866
+82 59 58.821765
+82 60 54.451814
+82 61 34.058773
+82 62 8.062258
+82 63 28.017851
+82 64 41.231056
+82 65 28.284271
+82 66 22.803509
+82 67 22.472205
+82 68 21.931712
+82 69 9.219544
+82 70 18.973666
+82 71 17.804494
+82 72 16.278821
+82 73 15.652476
+82 74 47.042534
+82 75 47.801674
+82 76 68.883960
+82 77 47.296934
+82 78 60.835845
+82 79 41.048752
+82 80 44.147480
+82 81 11.180340
+82 83 26.627054
+82 84 29.546573
+82 85 30.083218
+82 86 37.696154
+82 87 44.045431
+82 88 50.249378
+82 89 25.000000
+82 90 55.973208
+82 91 16.278821
+82 92 16.000000
+82 93 15.524175
+82 94 13.416408
+82 95 12.806248
+82 96 22.135944
+82 97 7.211103
+82 98 60.207973
+82 99 23.769729
+82 100 32.526912
+82 101 20.124612
+83 1 14.764823
+83 2 42.047592
+83 3 32.388269
+83 4 42.296572
+83 5 37.656341
+83 6 42.579338
+83 7 33.241540
+83 8 34.176015
+83 9 38.897301
+83 10 18.788294
+83 11 17.262677
+83 12 19.235384
+83 13 19.104973
+83 14 23.409400
+83 15 22.090722
+83 16 25.179357
+83 17 27.166155
+83 18 27.073973
+83 19 41.629317
+83 20 36.249138
+83 21 31.764760
+83 22 40.162171
+83 23 30.870698
+83 24 39.560081
+83 25 30.083218
+83 26 38.832976
+83 27 69.231496
+83 28 68.468971
+83 29 66.287254
+83 30 63.505905
+83 31 62.369865
+83 32 61.522354
+83 33 61.392182
+83 34 60.728906
+83 35 58.549125
+83 36 58.000000
+83 37 56.639209
+83 38 54.451814
+83 39 50.931326
+83 40 49.578221
+83 41 53.413481
+83 42 44.553339
+83 43 46.400431
+83 44 50.477718
+83 45 48.010416
+83 46 39.623226
+83 47 38.078866
+83 48 25.079872
+83 49 40.853396
+83 50 34.438351
+83 51 45.705580
+83 52 36.235342
+83 53 13.152946
+83 54 9.899495
+83 55 32.756679
+83 56 17.262677
+83 57 24.351591
+83 58 18.248288
+83 59 35.114100
+83 60 28.600699
+83 61 20.808652
+83 62 28.425341
+83 63 38.832976
+83 64 44.418465
+83 65 22.203603
+83 66 8.544004
+83 67 15.231546
+83 68 37.013511
+83 69 21.400935
+83 70 9.848858
+83 71 27.202941
+83 72 39.849718
+83 73 42.190046
+83 74 30.232433
+83 75 24.041631
+83 76 43.908997
+83 77 45.276926
+83 78 40.199502
+83 79 23.021729
+83 80 32.649655
+83 81 20.396078
+83 82 26.627054
+83 84 15.620499
+83 85 33.105891
+83 86 41.182521
+83 87 19.924859
+83 88 24.207437
+83 89 15.297059
+83 90 55.172457
+83 91 10.770330
+83 92 22.022716
+83 93 26.000000
+83 94 35.171011
+83 95 30.413813
+83 96 29.614186
+83 97 30.083218
+83 98 33.970576
+83 99 9.055385
+83 100 8.062258
+83 101 24.331050
+84 1 19.235384
+84 2 55.317267
+84 3 46.486557
+84 4 56.044625
+84 5 51.865210
+84 6 56.612719
+84 7 47.927028
+84 8 49.193496
+84 9 53.712196
+84 10 27.294688
+84 11 28.460499
+84 12 30.364453
+84 13 32.202484
+84 14 32.249031
+84 15 34.928498
+84 16 36.138622
+84 17 38.078866
+84 18 39.560081
+84 19 26.925824
+84 20 21.587033
+84 21 16.763055
+84 22 26.172505
+84 23 16.278821
+84 24 26.019224
+84 25 16.031220
+84 26 26.076810
+84 27 58.008620
+84 28 58.137767
+84 29 55.009090
+84 30 53.150729
+84 31 51.009803
+84 32 51.156622
+84 33 50.009999
+84 34 48.373546
+84 35 48.166378
+84 36 61.773781
+84 37 60.827625
+84 38 58.180753
+84 39 55.009090
+84 40 54.129474
+84 41 58.694122
+84 42 48.754487
+84 43 52.201533
+84 44 56.920998
+84 45 54.083269
+84 46 53.758720
+84 47 52.554733
+84 48 37.696154
+84 49 26.476405
+84 50 19.646883
+84 51 35.227830
+84 52 21.095023
+84 53 12.041595
+84 54 25.495098
+84 55 34.132096
+84 56 29.832868
+84 57 13.601471
+84 58 9.219544
+84 59 30.413813
+84 60 29.154759
+84 61 36.400549
+84 62 34.928498
+84 63 28.284271
+84 64 30.083218
+84 65 8.062258
+84 66 9.219544
+84 67 7.211103
+84 68 29.154759
+84 69 29.154759
+84 70 21.840330
+84 71 38.052595
+84 72 36.878178
+84 73 42.801869
+84 74 45.453273
+84 75 20.248457
+84 76 41.231056
+84 77 29.832868
+84 78 31.304952
+84 79 38.288379
+84 80 48.270074
+84 81 18.867962
+84 82 29.546573
+84 83 15.620499
+84 85 20.099751
+84 86 27.202941
+84 87 17.464249
+84 88 25.961510
+84 89 29.966648
+84 90 39.698866
+84 91 16.000000
+84 92 16.278821
+84 93 20.000000
+84 94 31.890437
+84 95 26.248809
+84 96 19.924859
+84 97 29.206164
+84 98 35.468296
+84 99 23.706539
+84 100 11.704700
+84 101 36.496575
+85 1 27.018512
+85 2 64.498062
+85 3 57.801384
+85 4 66.037868
+85 5 63.007936
+85 6 67.119297
+85 7 60.307545
+85 8 62.289646
+85 9 66.068147
+85 10 47.381431
+85 11 48.270074
+85 12 50.219518
+85 13 51.546096
+85 14 52.345009
+85 15 54.405882
+85 16 56.089215
+85 17 58.051701
+85 18 59.203040
+85 19 27.294688
+85 20 24.207437
+85 21 20.518285
+85 22 29.410882
+85 23 22.022716
+85 24 30.610456
+85 25 23.600847
+85 26 32.557641
+85 27 38.013156
+85 28 38.470768
+85 29 35.014283
+85 30 33.541020
+85 31 31.016125
+85 32 31.575307
+85 33 30.016662
+85 34 28.284271
+85 35 28.635642
+85 36 56.885851
+85 37 56.568542
+85 38 53.600373
+85 39 51.244512
+85 40 51.088159
+85 41 56.080300
+85 42 46.010868
+85 43 51.039201
+85 44 56.035703
+85 45 53.037722
+85 46 64.637450
+85 47 64.202804
+85 48 57.280014
+85 49 28.301943
+85 50 22.671568
+85 51 16.155494
+85 52 9.219544
+85 53 32.015621
+85 54 42.544095
+85 55 31.064449
+85 56 41.109610
+85 57 9.219544
+85 58 27.294688
+85 59 46.097722
+85 60 47.853944
+85 61 52.201533
+85 62 37.947332
+85 63 10.000000
+85 64 12.041595
+85 65 12.041595
+85 66 24.596748
+85 67 17.888544
+85 68 14.764823
+85 69 35.355339
+85 70 34.713110
+85 71 45.650849
+85 72 27.202941
+85 73 36.496575
+85 74 63.134776
+85 75 38.078866
+85 76 57.271284
+85 77 17.262677
+85 78 42.801869
+85 79 55.946403
+85 80 64.202804
+85 81 20.591260
+85 82 30.083218
+85 83 33.105891
+85 84 20.099751
+85 86 8.485281
+85 87 36.345564
+85 88 45.276926
+85 89 43.931765
+85 90 26.000000
+85 91 26.907248
+85 92 15.264338
+85 93 14.560220
+85 94 23.345235
+85 95 19.000000
+85 96 8.062258
+85 97 25.079872
+85 98 54.129474
+85 99 38.600518
+85 100 31.575307
+85 101 46.043458
+86 1 35.468296
+86 2 72.718636
+86 3 66.219333
+86 4 74.330344
+86 5 71.400280
+86 6 75.451971
+86 7 68.767725
+86 8 70.767224
+86 9 74.518454
+86 10 54.341513
+86 11 55.659680
+86 12 57.567352
+86 13 59.236813
+86 14 59.228372
+86 15 62.032250
+86 16 63.324561
+86 17 65.253352
+86 18 66.730802
+86 19 26.172505
+86 20 24.698178
+86 21 22.472205
+86 22 29.206164
+86 23 24.351591
+86 24 30.805844
+86 25 26.248809
+86 26 33.286634
+86 27 32.756679
+86 28 34.176015
+86 29 29.832868
+86 30 29.546573
+86 31 25.961510
+86 32 27.730849
+86 33 25.000000
+86 34 22.090722
+86 35 25.059928
+86 36 62.128898
+86 37 62.032250
+86 38 59.033889
+86 39 57.008771
+86 40 57.078893
+86 41 62.072538
+86 42 52.239832
+86 43 57.558666
+86 44 62.513998
+86 45 59.539903
+86 46 73.006849
+86 47 72.622311
+86 48 64.845971
+86 49 27.658633
+86 50 23.706539
+86 51 15.000000
+86 52 8.544004
+86 53 38.639358
+86 54 50.774009
+86 55 37.854986
+86 56 49.578221
+86 57 17.691806
+86 58 33.060551
+86 59 49.729267
+86 60 53.084838
+86 61 60.605280
+86 62 45.694639
+86 63 12.165525
+86 64 3.605551
+86 65 19.313208
+86 66 32.756679
+86 67 26.076810
+86 68 19.026298
+86 69 43.566042
+86 70 43.185646
+86 71 53.851648
+86 72 32.062439
+86 73 42.000000
+86 74 71.344236
+86 75 43.104524
+86 76 60.728906
+86 77 11.401754
+86 78 44.721360
+86 79 64.140471
+86 80 72.622311
+86 81 28.844410
+86 82 37.696154
+86 83 41.182521
+86 84 27.202941
+86 85 8.485281
+86 87 42.011903
+86 88 51.009803
+86 89 52.402290
+86 90 18.439089
+86 91 35.383612
+86 92 23.600847
+86 93 22.360680
+86 94 29.068884
+86 95 25.709920
+86 96 15.652476
+86 97 32.015621
+86 98 59.211485
+86 99 47.010637
+86 100 38.897301
+86 101 54.405882
+87 1 32.202484
+87 2 61.131007
+87 3 51.009803
+87 4 61.008196
+87 5 56.008928
+87 6 61.008196
+87 7 51.088159
+87 8 51.351728
+87 9 56.320511
+87 10 15.556349
+87 11 19.416488
+87 12 20.615528
+87 13 24.698178
+87 14 19.416488
+87 15 26.400758
+87 16 24.839485
+87 17 26.400758
+87 18 29.698485
+87 19 29.832868
+87 20 25.238859
+87 21 22.847319
+87 22 26.870058
+87 23 21.023796
+87 24 25.495098
+87 25 19.235384
+87 26 23.600847
+87 27 74.242845
+87 28 74.813100
+87 29 71.253070
+87 30 69.871310
+87 31 67.268120
+87 32 67.896981
+87 33 66.272166
+87 34 64.007812
+87 35 64.938432
+87 36 76.400262
+87 37 75.213031
+87 38 72.801099
+87 39 69.404611
+87 40 68.242216
+87 41 72.401657
+87 42 63.007936
+87 43 65.513357
+87 44 69.835521
+87 45 67.230945
+87 46 58.008620
+87 47 56.080300
+87 48 28.319605
+87 49 28.319605
+87 50 24.186773
+87 51 52.172790
+87 52 34.234486
+87 53 7.211103
+87 54 26.019224
+87 55 49.517674
+87 56 37.107951
+87 57 31.016125
+87 58 9.055385
+87 59 15.231546
+87 60 11.704700
+87 61 36.496575
+87 62 47.507894
+87 63 45.354162
+87 64 44.181444
+87 65 24.738634
+87 66 21.260292
+87 67 23.853721
+87 68 46.615448
+87 69 40.706265
+87 70 29.732137
+87 71 47.127487
+87 72 53.823787
+87 73 58.694122
+87 74 40.706265
+87 75 4.123106
+87 76 24.839485
+87 77 40.804412
+87 78 21.095023
+87 79 34.539832
+87 80 46.486557
+87 81 34.713110
+87 82 44.045431
+87 83 19.924859
+87 84 17.464249
+87 85 36.345564
+87 86 42.011903
+87 88 9.000000
+87 89 34.132096
+87 90 49.769469
+87 91 28.017851
+87 92 33.286634
+87 93 37.215588
+87 94 48.826222
+87 95 43.266615
+87 96 37.336309
+87 97 45.343136
+87 98 18.027756
+87 99 28.442925
+87 100 12.083046
+87 101 44.147480
+88 1 38.209946
+88 2 62.369865
+88 3 51.971146
+88 4 61.814238
+88 5 56.568542
+88 6 61.522354
+88 7 51.351728
+88 8 51.088159
+88 9 56.080300
+88 10 11.180340
+88 11 16.124515
+88 12 16.492423
+88 13 21.377558
+88 14 13.038405
+88 15 22.135944
+88 16 18.867962
+88 17 20.000000
+88 18 24.186773
+88 19 37.215588
+88 20 33.105891
+88 21 31.320920
+88 22 33.837849
+88 23 29.410882
+88 24 32.202484
+88 25 27.513633
+88 26 29.832868
+88 27 83.216585
+88 28 83.725743
+88 29 80.224684
+88 30 78.771822
+88 31 76.236474
+88 32 76.791927
+88 33 75.239617
+88 34 73.006849
+88 35 73.824115
+88 36 82.134037
+88 37 80.808415
+88 38 78.568442
+88 39 75.073298
+88 40 73.756356
+88 41 77.620873
+88 42 68.680419
+88 43 70.604532
+88 44 74.632433
+88 45 72.201108
+88 46 58.549125
+88 47 56.320511
+88 48 23.259407
+88 49 35.510562
+88 50 32.310989
+88 51 61.000000
+88 52 43.185646
+88 53 14.317821
+88 54 27.202941
+88 55 56.080300
+88 56 40.249224
+88 57 39.560081
+88 58 18.027756
+88 59 14.317821
+88 60 4.472136
+88 61 36.124784
+88 62 52.630789
+88 63 54.129474
+88 64 53.150729
+88 65 33.541020
+88 66 28.017851
+88 67 31.780497
+88 68 55.027266
+88 69 45.607017
+88 70 33.837849
+88 71 50.537115
+88 72 61.400326
+88 73 65.436993
+88 74 37.363083
+88 75 8.944272
+88 76 20.248457
+88 77 49.477268
+88 78 23.706539
+88 79 32.249031
+88 80 44.407207
+88 81 41.880783
+88 82 50.249378
+88 83 24.207437
+88 84 25.961510
+88 85 45.276926
+88 86 51.009803
+88 87 9.000000
+88 89 36.055513
+88 90 58.189346
+88 91 33.970576
+88 92 41.146081
+88 93 45.188494
+88 94 56.435804
+88 95 51.000000
+88 96 45.880279
+88 97 52.430907
+88 98 10.000000
+88 99 31.304952
+88 100 17.804494
+88 101 47.010637
+89 1 17.888544
+89 2 27.018512
+89 3 17.117243
+89 4 27.073973
+89 5 22.360680
+89 6 27.294688
+89 7 18.027756
+89 8 19.235384
+89 9 23.769729
+89 10 26.925824
+89 11 22.803509
+89 12 24.083189
+89 13 20.615528
+89 14 29.832868
+89 15 23.021729
+89 16 28.425341
+89 17 30.000000
+89 18 27.294688
+89 19 56.648036
+89 20 51.264022
+89 21 46.615448
+89 22 55.362442
+89 23 45.880279
+89 24 54.817880
+89 25 45.221676
+89 26 54.129474
+89 27 76.321688
+89 28 74.632433
+89 29 73.539105
+89 30 69.892775
+89 31 69.856997
+89 32 68.007353
+89 33 68.942005
+89 34 69.354164
+89 35 65.192024
+89 36 50.774009
+89 37 49.091751
+89 38 47.507894
+89 39 43.908997
+89 40 42.190046
+89 41 45.000000
+89 42 38.013156
+89 43 38.013156
+89 44 41.109610
+89 45 39.204592
+89 46 24.331050
+89 47 22.803509
+89 48 25.553865
+89 49 55.973208
+89 50 49.396356
+89 51 53.225934
+89 52 49.040799
+89 53 28.017851
+89 54 8.944272
+89 55 31.064449
+89 56 6.324555
+89 57 34.713110
+89 58 33.541020
+89 59 48.836462
+89 60 40.496913
+89 61 9.219544
+89 62 22.135944
+89 63 47.010637
+89 64 55.901699
+89 65 35.000000
+89 66 21.095023
+89 67 27.018512
+89 68 43.081318
+89 69 16.124515
+89 70 9.219544
+89 71 15.556349
+89 72 41.109610
+89 73 39.623226
+89 74 22.090722
+89 75 38.209946
+89 76 56.302753
+89 77 58.412327
+89 78 55.009090
+89 79 16.124515
+89 80 20.591260
+89 81 25.495098
+89 82 25.000000
+89 83 15.297059
+89 84 29.966648
+89 85 43.931765
+89 86 52.402290
+89 87 34.132096
+89 88 36.055513
+89 90 68.249542
+89 91 17.029386
+89 92 29.681644
+89 93 32.649655
+89 94 37.483330
+89 95 34.481879
+89 96 38.275318
+89 97 31.256999
+89 98 44.721360
+89 99 6.324555
+89 100 23.086793
+89 101 11.401754
+90 1 52.478567
+90 2 90.354856
+90 3 83.216585
+90 4 91.787799
+90 5 88.509886
+90 6 92.784697
+90 7 85.445889
+90 8 87.200917
+90 9 91.263355
+90 10 64.412732
+90 11 66.887966
+90 12 68.600292
+90 13 71.281134
+90 14 68.876701
+90 15 73.783467
+90 16 73.824115
+90 17 75.591005
+90 18 78.032045
+90 19 23.000000
+90 20 25.495098
+90 21 26.925824
+90 22 27.000000
+90 23 28.792360
+90 24 29.000000
+90 25 30.675723
+90 26 32.000000
+90 27 37.536649
+90 28 41.036569
+90 29 35.355339
+90 30 37.802116
+90 31 32.649655
+90 32 36.619667
+90 33 32.015621
+90 34 26.907248
+90 35 34.985711
+90 36 80.000000
+90 37 80.024996
+90 38 77.025970
+90 39 75.166482
+90 40 75.325958
+90 41 80.305666
+90 42 70.576200
+90 43 75.953933
+90 44 80.894994
+90 45 77.929455
+90 46 90.210864
+90 47 89.587946
+90 48 76.321688
+90 49 25.000000
+90 50 25.961510
+90 51 30.413813
+90 52 19.209373
+90 53 48.877398
+90 54 65.069194
+90 55 56.293872
+90 56 66.287254
+90 57 34.481879
+90 58 42.059482
+90 59 52.239832
+90 60 58.940648
+90 61 75.690158
+90 62 63.906181
+90 63 30.066593
+90 64 15.132746
+90 65 33.301652
+90 66 47.423623
+90 67 41.231056
+90 68 37.121422
+90 69 61.269895
+90 70 59.203040
+90 71 71.554175
+90 72 50.039984
+90 73 60.133186
+90 74 85.146932
+90 75 49.335586
+90 76 62.000000
+90 77 9.899495
+90 78 44.045431
+90 79 77.987178
+90 80 87.692645
+90 81 46.518813
+90 82 55.973208
+90 83 55.172457
+90 84 39.698866
+90 85 26.000000
+90 86 18.439089
+90 87 49.769469
+90 88 58.189346
+90 89 68.249542
+90 91 51.613952
+90 92 41.146081
+90 93 40.496913
+90 94 47.381431
+90 95 44.147480
+90 96 33.837849
+90 97 50.447993
+90 98 64.327288
+90 99 62.369865
+90 100 50.803543
+90 101 71.693793
+91 1 4.242641
+91 2 39.849718
+91 3 31.764760
+91 4 40.853396
+91 5 37.121422
+91 6 41.629317
+91 7 33.837849
+91 8 35.608988
+91 9 39.661064
+91 10 29.546573
+91 11 27.892651
+91 12 29.832868
+91 13 29.068884
+91 14 34.176015
+91 15 32.062439
+91 16 35.693137
+91 17 37.656341
+91 18 37.054015
+91 19 42.579338
+91 20 37.336309
+91 21 32.388269
+91 22 42.107007
+91 23 32.140317
+91 24 42.011903
+91 25 32.015621
+91 26 42.047592
+91 27 60.440053
+91 28 59.228372
+91 29 57.567352
+91 30 54.341513
+91 31 53.758720
+91 32 52.392748
+91 33 52.810984
+91 34 52.801515
+91 35 49.477268
+91 36 48.414874
+91 37 47.201695
+91 38 44.821870
+91 39 41.400483
+91 40 40.224371
+91 41 44.418465
+91 42 35.000000
+91 43 37.589892
+91 44 42.047592
+91 45 39.357337
+91 46 38.910153
+91 47 38.078866
+91 48 35.057096
+91 49 42.296572
+91 50 35.355339
+91 51 37.000000
+91 52 32.449961
+91 53 20.808652
+91 54 17.262677
+91 55 22.203603
+91 56 14.764823
+91 57 17.691806
+91 58 23.086793
+91 59 43.046487
+91 60 38.183766
+91 61 25.553865
+91 62 19.697716
+91 63 30.463092
+91 64 38.897301
+91 65 18.788294
+91 66 7.280110
+91 67 10.770330
+91 68 27.459060
+91 69 13.341664
+91 70 7.810250
+91 71 22.090722
+91 72 29.120440
+91 73 31.622777
+91 74 37.336309
+91 75 31.906112
+91 76 52.801515
+91 77 41.880783
+91 78 46.173586
+91 79 30.364453
+91 80 37.443290
+91 81 10.000000
+91 82 16.278821
+91 83 10.770330
+91 84 16.000000
+91 85 26.907248
+91 86 35.383612
+91 87 28.017851
+91 88 33.970576
+91 89 17.029386
+91 90 51.613952
+91 92 13.000000
+91 93 16.492423
+91 94 24.515301
+91 95 20.024984
+91 96 21.470911
+91 97 19.313208
+91 98 43.931765
+91 99 12.083046
+91 100 16.278821
+91 101 20.880613
+92 1 12.041595
+92 2 49.244289
+92 3 42.638011
+92 4 50.774009
+92 5 47.801674
+92 6 51.865210
+92 7 45.276926
+92 8 47.381431
+92 9 50.990195
+92 10 39.623226
+92 11 39.051248
+92 12 41.048752
+92 13 41.109610
+92 14 44.553339
+92 15 44.102154
+92 16 47.042534
+92 17 49.040799
+92 18 49.091751
+92 19 37.336309
+92 20 32.756679
+92 21 27.892651
+92 22 38.078866
+92 23 28.460499
+92 24 38.600518
+92 25 29.154759
+92 26 39.560081
+92 27 47.539457
+92 28 46.529560
+92 29 44.643029
+92 30 41.593269
+92 31 40.804412
+92 32 39.623226
+92 33 39.849718
+92 34 39.812058
+92 35 36.674242
+92 36 46.615448
+92 37 45.880279
+92 38 43.081318
+92 39 40.162171
+92 40 39.560081
+92 41 44.384682
+92 42 34.205263
+92 43 38.470768
+92 44 43.416587
+92 45 40.447497
+92 46 49.406477
+92 47 49.040799
+92 48 47.095647
+92 49 37.656341
+92 50 30.805844
+92 51 24.041631
+92 52 22.803509
+92 53 26.832816
+92 54 30.083218
+92 55 18.973666
+92 56 26.172505
+92 57 7.071068
+92 58 25.495098
+92 59 46.690470
+92 60 44.777226
+92 61 38.470768
+92 62 23.345235
+92 63 17.464249
+92 64 27.202941
+92 65 12.649111
+92 66 14.142136
+92 67 9.433981
+92 68 15.000000
+92 69 20.124612
+92 70 20.591260
+92 71 30.413813
+92 72 20.615528
+92 73 26.925824
+92 74 50.328918
+92 75 36.400549
+92 76 57.489129
+92 77 31.953091
+92 78 46.872167
+92 79 43.324358
+92 80 50.249378
+92 81 5.385165
+92 82 16.000000
+92 83 22.022716
+92 84 16.278821
+92 85 15.264338
+92 86 23.600847
+92 87 33.286634
+92 88 41.146081
+92 89 29.681644
+92 90 41.146081
+92 91 13.000000
+92 93 4.123106
+92 94 15.620499
+92 95 10.000000
+92 96 8.602325
+92 97 13.416408
+92 98 51.000000
+92 99 25.079872
+92 100 24.041631
+92 101 30.805844
+93 1 14.764823
+93 2 50.477718
+93 3 44.553339
+93 4 52.201533
+93 5 49.578221
+93 6 53.413481
+93 7 47.423623
+93 8 49.678969
+93 9 53.037722
+93 10 43.737855
+93 11 43.104524
+93 12 45.099889
+93 13 45.044423
+93 14 48.662100
+93 15 48.041649
+93 16 51.088159
+93 17 53.084838
+93 18 53.037722
+93 19 39.051248
+93 20 34.785054
+93 21 30.083218
+93 22 40.162171
+93 23 30.870698
+93 24 40.853396
+93 25 31.764760
+93 26 42.047592
+93 27 43.965896
+93 28 42.755117
+93 29 41.109610
+93 30 37.854986
+93 31 37.336309
+93 32 35.902646
+93 33 36.400549
+93 34 36.715120
+93 35 32.984845
+93 36 44.271887
+93 37 43.680659
+93 38 40.804412
+93 39 38.078866
+93 40 37.656341
+93 41 42.579338
+93 42 32.388269
+93 43 37.054015
+93 44 42.047592
+93 45 39.051248
+93 46 51.088159
+93 47 50.931326
+93 48 51.039201
+93 49 39.560081
+93 50 32.893768
+93 51 20.615528
+93 52 23.086793
+93 53 30.870698
+93 54 33.734256
+93 55 17.117243
+93 56 28.600699
+93 57 8.544004
+93 58 29.206164
+93 59 50.328918
+93 60 48.764741
+93 61 41.629317
+93 62 23.409400
+93 63 14.422205
+93 64 25.942244
+93 65 15.264338
+93 66 18.248288
+93 67 13.416408
+93 68 11.045361
+93 69 21.400935
+93 70 23.769729
+93 71 31.622777
+93 72 16.970563
+93 73 24.166092
+93 74 53.758720
+93 75 40.224371
+93 76 61.220911
+93 77 31.780497
+93 78 50.000000
+93 79 46.840154
+93 80 53.235327
+93 81 7.211103
+93 82 15.524175
+93 83 26.000000
+93 84 20.000000
+93 85 14.560220
+93 86 22.360680
+93 87 37.215588
+93 88 45.188494
+93 89 32.649655
+93 90 40.496913
+93 91 16.492423
+93 92 4.123106
+93 94 12.041595
+93 95 6.403124
+93 96 6.708204
+93 97 11.180340
+93 98 55.009090
+93 99 28.460499
+93 100 28.160256
+93 101 32.557641
+94 1 21.095023
+94 2 48.836462
+94 3 45.276926
+94 4 51.088159
+94 5 49.648766
+94 6 52.630789
+94 7 48.764741
+94 8 51.429563
+94 9 53.851648
+94 10 53.758720
+94 11 52.392748
+94 12 54.341513
+94 13 53.460266
+94 14 58.523500
+94 15 56.435804
+94 16 60.207973
+94 17 62.169124
+94 18 61.400326
+94 19 49.979996
+94 20 46.097722
+94 21 41.593269
+94 22 51.478151
+94 23 42.544095
+94 24 52.325902
+94 25 43.566042
+94 26 53.712196
+94 27 40.496913
+94 28 38.013156
+94 29 38.013156
+94 30 33.615473
+94 31 34.828150
+94 32 31.906112
+94 33 34.058773
+94 34 36.124784
+94 35 29.410882
+94 36 33.541020
+94 37 33.241540
+94 38 30.265492
+94 39 28.017851
+94 40 28.017851
+94 41 33.015148
+94 42 23.194827
+94 43 28.635642
+94 44 33.541020
+94 45 30.594117
+94 46 50.803543
+94 47 51.312766
+94 48 59.413803
+94 49 50.695167
+94 50 44.283180
+94 51 20.248457
+94 52 32.557641
+94 53 42.190046
+94 54 41.048752
+94 55 10.000000
+94 56 32.015621
+94 57 20.248457
+94 58 41.109610
+94 59 62.289646
+94 60 60.207973
+94 61 46.690470
+94 62 20.615528
+94 63 17.464249
+94 64 32.249031
+94 65 27.202941
+94 66 28.635642
+94 67 25.000000
+94 68 10.440307
+94 69 22.472205
+94 70 30.000000
+94 71 31.064449
+94 72 5.000000
+94 73 13.152946
+94 74 59.539903
+94 75 52.009614
+94 76 73.109507
+94 77 40.012498
+94 78 62.008064
+94 79 53.150729
+94 80 57.280014
+94 81 14.866069
+94 82 13.416408
+94 83 35.171011
+94 84 31.890437
+94 85 23.345235
+94 86 29.068884
+94 87 48.826222
+94 88 56.435804
+94 89 37.483330
+94 90 47.381431
+94 91 24.515301
+94 92 15.620499
+94 93 12.041595
+94 95 5.656854
+94 96 15.811388
+94 97 6.324555
+94 98 66.370174
+94 99 35.000000
+94 100 38.910153
+94 101 33.541020
+95 1 17.117243
+95 2 48.918299
+95 3 44.204072
+95 4 50.931326
+95 5 48.918299
+95 6 52.325902
+95 7 47.434165
+95 8 49.929951
+95 9 52.801515
+95 10 48.764741
+95 11 47.675990
+95 12 49.648766
+95 13 49.091751
+95 14 53.600373
+95 15 52.086467
+95 16 55.578773
+95 17 57.558666
+95 18 57.078893
+95 19 44.922155
+95 20 40.853396
+95 21 36.249138
+95 22 46.238512
+95 23 37.121422
+95 24 47.010637
+95 25 38.078866
+95 26 48.301139
+95 27 42.047592
+95 28 40.162171
+95 29 39.357337
+95 30 35.468296
+95 31 35.846897
+95 32 33.615473
+95 33 34.985711
+95 34 36.235342
+95 35 30.870698
+95 36 38.327536
+95 37 37.854986
+95 38 34.928498
+95 39 32.388269
+95 40 32.140317
+95 41 37.121422
+95 42 27.018512
+95 43 32.062439
+95 44 37.054015
+95 45 34.058773
+95 46 50.249378
+95 47 50.447993
+95 48 55.081757
+95 49 45.541190
+95 50 39.000000
+95 51 19.849433
+95 52 28.071338
+95 53 36.715120
+95 54 37.054015
+95 55 12.165525
+95 56 29.546573
+95 57 14.764823
+95 58 35.468296
+95 59 56.639209
+95 60 54.708317
+95 61 43.680659
+95 62 20.808652
+95 63 15.264338
+95 64 29.120440
+95 65 21.633308
+95 66 23.409400
+95 67 19.416488
+95 68 9.219544
+95 69 20.808652
+95 70 26.305893
+95 71 30.413813
+95 72 10.630146
+95 73 18.027756
+95 74 56.293872
+95 75 46.400431
+95 76 67.475922
+95 77 36.124784
+95 78 56.400355
+95 79 49.648766
+95 80 54.781384
+95 81 10.049876
+95 82 12.806248
+95 83 30.413813
+95 84 26.248809
+95 85 19.000000
+95 86 25.709920
+95 87 43.266615
+95 88 51.000000
+95 89 34.481879
+95 90 44.147480
+95 91 20.024984
+95 92 10.000000
+95 93 6.403124
+95 94 5.656854
+95 96 11.045361
+95 97 6.324555
+95 98 60.901560
+95 99 31.256999
+95 100 33.615473
+95 101 32.202484
+96 1 20.615528
+96 2 57.140179
+96 3 50.990195
+96 4 58.821765
+96 5 56.080300
+96 6 60.000000
+96 7 53.740115
+96 8 55.901699
+96 9 59.413803
+96 10 46.043458
+96 11 46.097722
+96 12 48.093659
+96 13 48.662100
+96 14 51.039201
+96 15 51.623638
+96 16 54.083269
+96 17 56.080300
+96 18 56.568542
+96 19 34.176015
+96 20 30.413813
+96 21 26.076810
+96 22 35.777088
+96 23 27.202941
+96 24 36.715120
+96 25 28.425341
+96 26 38.275318
+96 27 39.623226
+96 28 39.051248
+96 29 36.674242
+96 30 34.058773
+96 31 32.756679
+96 32 32.062439
+96 33 31.780497
+96 34 31.384710
+96 35 29.068884
+96 36 49.244289
+96 37 48.836462
+96 38 45.891176
+96 39 43.416587
+96 40 43.185646
+96 41 48.166378
+96 42 38.052595
+96 43 43.011626
+96 44 48.010416
+96 45 45.011110
+96 46 57.628118
+96 47 57.384667
+96 48 54.589376
+96 49 34.928498
+96 50 28.653098
+96 51 16.124515
+96 52 17.029386
+96 53 31.780497
+96 54 38.275318
+96 55 23.021729
+96 56 34.713110
+96 57 6.324555
+96 58 28.635642
+96 59 49.091751
+96 60 49.040799
+96 61 47.010637
+96 62 30.083218
+96 63 9.219544
+96 64 19.235384
+96 65 13.038405
+96 66 21.213203
+96 67 15.000000
+96 68 9.433981
+96 69 28.017851
+96 70 29.154759
+96 71 38.275318
+96 72 20.124612
+96 73 28.861739
+96 74 58.694122
+96 75 39.812058
+96 76 60.207973
+96 77 25.317978
+96 78 47.381431
+96 79 51.623638
+96 80 58.830264
+96 81 13.453624
+96 82 22.135944
+96 83 29.614186
+96 84 19.924859
+96 85 8.062258
+96 86 15.652476
+96 87 37.336309
+96 88 45.880279
+96 89 38.275318
+96 90 33.837849
+96 91 21.470911
+96 92 8.602325
+96 93 6.708204
+96 94 15.811388
+96 95 11.045361
+96 97 17.029386
+96 98 55.362442
+96 99 33.541020
+96 100 30.066593
+96 101 39.051248
+97 1 15.524175
+97 2 43.139309
+97 3 39.115214
+97 4 45.276926
+97 5 43.600459
+97 6 46.754679
+97 7 42.544095
+97 8 45.177428
+97 9 47.707442
+97 10 48.846699
+97 11 47.127487
+97 12 49.040799
+97 13 47.853944
+97 14 53.488316
+97 15 50.803543
+97 16 54.817880
+97 17 56.753854
+97 18 55.731499
+97 19 50.219518
+97 20 45.880279
+97 21 41.109610
+97 22 51.244512
+97 23 41.785165
+97 24 51.865210
+97 25 42.544095
+97 26 52.924474
+97 27 46.647615
+97 28 44.283180
+97 29 44.102154
+97 30 39.824616
+97 31 40.804412
+97 32 38.078866
+97 33 40.000000
+97 34 41.725292
+97 35 35.510562
+97 36 33.241540
+97 37 32.572995
+97 38 29.732137
+97 39 26.925824
+97 40 26.476405
+97 41 31.400637
+97 42 21.213203
+97 43 26.000000
+97 44 31.000000
+97 45 28.000000
+97 46 44.821870
+97 47 45.221676
+97 48 53.758720
+97 49 50.695167
+97 50 43.965896
+97 51 25.495098
+97 52 34.000000
+97 53 38.418745
+97 54 35.227830
+97 55 6.000000
+97 56 25.709920
+97 57 19.646883
+97 58 38.288379
+97 59 59.464275
+97 60 56.400355
+97 61 40.447497
+97 62 14.866069
+97 63 21.470911
+97 64 35.440090
+97 65 26.000000
+97 66 24.413111
+97 67 22.022716
+97 68 15.000000
+97 69 16.155494
+97 70 24.083189
+97 71 25.000000
+97 72 10.049876
+97 73 13.601471
+97 74 53.338541
+97 75 48.795492
+97 76 70.007142
+97 77 42.296572
+97 78 60.207973
+97 79 47.042534
+97 80 50.960769
+97 81 10.630146
+97 82 7.211103
+97 83 30.083218
+97 84 29.206164
+97 85 25.079872
+97 86 32.015621
+97 87 45.343136
+97 88 52.430907
+97 89 31.256999
+97 90 50.447993
+97 91 19.313208
+97 92 13.416408
+97 93 11.180340
+97 94 6.324555
+97 95 6.324555
+97 96 17.029386
+97 98 62.425956
+97 99 29.068884
+97 100 34.669872
+97 101 27.294688
+98 1 48.166378
+98 2 70.213959
+98 3 59.774577
+98 4 69.375788
+98 5 64.031242
+98 6 68.883960
+98 7 58.694122
+98 8 58.051701
+98 9 62.968246
+98 10 18.027756
+98 11 22.803509
+98 12 22.360680
+98 13 27.294688
+98 14 17.029386
+98 15 27.018512
+98 16 22.090722
+98 17 22.360680
+98 18 27.294688
+98 19 42.059482
+98 20 38.832976
+98 21 38.118237
+98 22 38.275318
+98 23 36.124784
+98 24 36.400549
+98 25 34.132096
+98 26 33.615473
+98 27 91.787799
+98 28 92.574294
+98 29 88.814413
+98 30 87.664132
+98 31 84.852814
+98 32 85.702975
+98 33 83.862983
+98 34 81.301906
+98 35 82.764727
+98 36 91.967386
+98 37 90.609050
+98 38 88.413800
+98 39 84.899941
+98 40 83.546394
+98 41 87.321246
+98 42 78.517514
+98 43 80.280757
+98 44 84.202138
+98 45 81.835200
+98 46 65.969690
+98 47 63.560994
+98 48 27.073973
+98 49 40.162171
+98 50 38.470768
+98 51 70.092796
+98 52 51.039201
+98 53 24.186773
+98 54 35.777088
+98 55 66.068147
+98 56 49.396356
+98 57 49.040799
+98 58 26.925824
+98 59 13.601471
+98 60 6.324555
+98 61 43.416587
+98 62 62.369865
+98 63 63.324561
+98 64 61.032778
+98 65 42.720019
+98 66 38.013156
+98 67 41.593269
+98 68 64.621978
+98 69 55.317267
+98 70 43.416587
+98 71 59.682493
+98 72 71.344236
+98 73 75.432089
+98 74 42.047592
+98 75 16.124515
+98 76 13.038405
+98 77 56.320511
+98 78 24.207437
+98 79 38.209946
+98 80 50.039984
+98 81 51.865210
+98 82 60.207973
+98 83 33.970576
+98 84 35.468296
+98 85 54.129474
+98 86 59.211485
+98 87 18.027756
+98 88 10.000000
+98 89 44.721360
+98 90 64.327288
+98 91 43.931765
+98 92 51.000000
+98 93 55.009090
+98 94 66.370174
+98 95 60.901560
+98 96 55.362442
+98 97 62.425956
+98 99 40.496913
+98 100 27.802878
+98 101 55.946403
+99 1 14.142136
+99 2 33.015148
+99 3 23.345235
+99 4 33.241540
+99 5 28.635642
+99 6 33.541020
+99 7 24.351591
+99 8 25.495098
+99 9 30.083218
+99 10 23.345235
+99 11 20.000000
+99 12 21.633308
+99 13 19.313208
+99 14 27.018512
+99 15 22.135944
+99 16 26.832816
+99 17 28.635642
+99 18 26.925824
+99 19 50.328918
+99 20 44.944410
+99 21 40.311289
+99 22 49.040799
+99 23 39.560081
+99 24 48.507731
+99 25 38.897301
+99 26 47.853944
+99 27 72.422372
+99 28 71.063352
+99 29 69.570109
+99 30 66.219333
+99 31 65.787537
+99 32 64.288413
+99 33 64.845971
+99 34 64.884513
+99 35 61.400326
+99 36 52.630789
+99 37 51.088159
+99 38 49.203658
+99 39 45.607017
+99 40 44.045431
+99 41 47.381431
+99 42 39.408121
+99 43 40.311289
+99 44 43.931765
+99 45 41.725292
+99 46 30.594117
+99 47 29.120440
+99 48 25.000000
+99 49 49.648766
+99 50 43.081318
+99 51 49.040799
+99 52 43.185646
+99 53 22.022716
+99 54 6.324555
+99 55 30.083218
+99 56 8.944272
+99 57 29.410882
+99 58 27.294688
+99 59 43.416587
+99 60 35.777088
+99 61 13.601471
+99 62 23.021729
+99 63 42.544095
+99 64 50.447993
+99 65 29.068884
+99 66 15.000000
+99 67 21.213203
+99 68 39.293765
+99 69 16.124515
+99 70 5.000000
+99 71 19.235384
+99 72 39.115214
+99 73 39.217343
+99 74 25.298221
+99 75 32.557641
+99 76 51.478151
+99 77 52.497619
+99 78 49.091751
+99 79 18.439089
+99 80 25.612497
+99 81 21.587033
+99 82 23.769729
+99 83 9.055385
+99 84 23.706539
+99 85 38.600518
+99 86 47.010637
+99 87 28.442925
+99 88 31.304952
+99 89 6.324555
+99 90 62.369865
+99 91 12.083046
+99 92 25.079872
+99 93 28.460499
+99 94 35.000000
+99 95 31.256999
+99 96 33.541020
+99 97 29.068884
+99 98 40.496913
+99 100 17.000000
+99 101 15.811388
+100 1 20.518285
+100 2 50.009999
+100 3 40.199502
+100 4 50.159745
+100 5 45.398238
+100 6 50.358713
+100 7 40.792156
+100 8 41.484937
+100 9 46.324939
+100 10 16.000000
+100 11 16.763055
+100 12 18.681542
+100 13 20.591260
+100 14 21.000000
+100 15 23.259407
+100 16 24.515301
+100 17 26.476405
+100 18 27.856777
+100 19 34.985711
+100 20 29.681644
+100 21 25.612497
+100 22 33.105891
+100 23 24.413111
+100 24 32.310989
+100 25 23.323808
+100 26 31.320920
+100 27 69.180922
+100 28 69.000000
+100 29 66.189123
+100 30 64.000000
+100 31 62.201286
+100 32 62.000000
+100 33 61.204575
+100 34 59.841457
+100 35 59.000000
+100 36 64.660653
+100 37 63.411355
+100 38 61.073726
+100 39 57.628118
+100 40 56.400355
+100 41 60.464866
+100 42 51.224994
+100 43 53.535035
+100 44 57.801384
+100 45 55.226805
+100 46 47.381431
+100 47 45.705580
+100 48 26.000000
+100 49 34.000000
+100 50 28.017851
+100 51 46.000000
+100 52 32.649655
+100 53 5.099020
+100 54 16.155494
+100 55 38.288379
+100 56 25.317978
+100 57 24.000000
+100 58 10.770330
+100 59 27.313001
+100 60 21.931712
+100 61 27.313001
+100 62 35.510562
+100 63 39.000000
+100 64 41.785165
+100 65 19.646883
+100 66 10.295630
+100 67 15.132746
+100 68 38.639358
+100 69 28.653098
+100 70 17.720045
+100 71 35.171011
+100 72 43.829214
+100 73 47.634021
+100 74 34.655447
+100 75 16.155494
+100 76 36.619667
+100 77 41.048752
+100 78 32.140317
+100 79 27.658633
+100 80 38.587563
+100 81 24.186773
+100 82 32.526912
+100 83 8.062258
+100 84 11.704700
+100 85 31.575307
+100 86 38.897301
+100 87 12.083046
+100 88 17.804494
+100 89 23.086793
+100 90 50.803543
+100 91 16.278821
+100 92 24.041631
+100 93 28.160256
+100 94 38.910153
+100 95 33.615473
+100 96 30.066593
+100 97 34.669872
+100 98 27.802878
+100 99 17.000000
+100 101 32.388269
+101 1 19.235384
+101 2 18.973666
+101 3 12.041595
+101 4 20.124612
+101 5 17.029386
+101 6 21.095023
+101 7 15.264338
+101 8 17.888544
+101 9 20.615528
+101 10 38.275318
+101 11 34.205263
+101 12 35.468296
+101 13 31.827661
+101 14 41.231056
+101 15 34.058773
+101 16 39.623226
+101 17 41.109610
+101 18 38.013156
+101 19 63.348244
+101 20 58.051701
+101 21 53.150729
+101 22 62.649820
+101 23 52.773099
+101 24 62.393910
+101 25 52.469038
+101 26 62.128898
+101 27 73.925638
+101 28 71.554175
+101 29 71.344236
+101 30 67.119297
+101 31 67.955868
+101 32 65.368188
+101 33 67.119297
+101 34 68.410526
+101 35 62.769419
+101 36 40.249224
+101 37 38.470768
+101 38 37.161808
+101 39 33.615473
+101 40 31.780497
+101 41 34.132096
+101 42 28.160256
+101 43 27.294688
+101 44 30.000000
+101 45 28.301943
+101 46 18.601075
+101 47 18.384776
+101 48 36.400549
+101 49 62.968246
+101 50 56.089215
+101 51 52.009614
+101 52 52.773099
+101 53 37.483330
+101 54 20.248457
+101 55 25.000000
+101 56 7.071068
+101 57 37.215588
+101 58 42.011903
+101 59 59.203040
+101 60 51.478151
+101 61 17.464249
+101 62 14.142136
+101 63 46.690470
+101 64 58.008620
+101 65 39.560081
+101 66 27.294688
+101 67 31.622777
+101 68 41.400483
+101 69 11.401754
+101 70 15.000000
+101 71 4.472136
+101 72 36.055513
+101 73 32.062439
+101 74 29.832868
+101 75 48.270074
+101 76 67.230945
+101 77 62.177166
+101 78 64.498062
+101 79 25.495098
+101 80 25.019992
+101 81 25.612497
+101 82 20.124612
+101 83 24.331050
+101 84 36.496575
+101 85 46.043458
+101 86 54.405882
+101 87 44.147480
+101 88 47.010637
+101 89 11.401754
+101 90 71.693793
+101 91 20.880613
+101 92 30.805844
+101 93 32.557641
+101 94 33.541020
+101 95 32.202484
+101 96 39.051248
+101 97 27.294688
+101 98 55.946403
+101 99 15.811388
+101 100 32.388269
diff --git a/src/vrp_basic/test/Orders.txt b/src/vrp_basic/test/Orders.txt
index f4b621a..61a445e 100644
--- a/src/vrp_basic/test/Orders.txt
+++ b/src/vrp_basic/test/Orders.txt
@@ -1,102 +1,102 @@
- CUST_NO. XCOORD. YCOORD. DEMAND READY_TIME DUE_Time SERVICE_TIME
- 1 40.00 50.00 0.00 0.00 240.00 0.00
- 2 25.00 85.00 20.00 145.00 175.00 10.00
- 3 22.00 75.00 30.00 50.00 80.00 10.00
- 4 22.00 85.00 10.00 109.00 139.00 10.00
- 5 20.00 80.00 40.00 141.00 171.00 10.00
- 6 20.00 85.00 20.00 41.00 71.00 10.00
- 7 18.00 75.00 20.00 95.00 125.00 10.00
- 8 15.00 75.00 20.00 79.00 109.00 10.00
- 9 15.00 80.00 10.00 91.00 121.00 10.00
- 10 10.00 35.00 20.00 91.00 121.00 10.00
- 11 10.00 40.00 30.00 119.00 149.00 10.00
- 12 8.00 40.00 40.00 59.00 89.00 10.00
- 13 8.00 45.00 20.00 64.00 94.00 10.00
- 14 5.00 35.00 10.00 142.00 172.00 10.00
- 15 5.00 45.00 10.00 35.00 65.00 10.00
- 16 2.00 40.00 20.00 58.00 88.00 10.00
- 17 0.00 40.00 20.00 72.00 102.00 10.00
- 18 0.00 45.00 20.00 149.00 179.00 10.00
- 19 44.00 5.00 20.00 87.00 117.00 10.00
- 20 42.00 10.00 40.00 72.00 102.00 10.00
- 21 42.00 15.00 10.00 122.00 152.00 10.00
- 22 40.00 5.00 10.00 67.00 97.00 10.00
- 23 40.00 15.00 40.00 92.00 122.00 10.00
- 24 38.00 5.00 30.00 65.00 95.00 10.00
- 25 38.00 15.00 10.00 148.00 178.00 10.00
- 26 35.00 5.00 20.00 154.00 184.00 10.00
- 27 95.00 30.00 30.00 115.00 145.00 10.00
- 28 95.00 35.00 20.00 62.00 92.00 10.00
- 29 92.00 30.00 10.00 62.00 92.00 10.00
- 30 90.00 35.00 10.00 67.00 97.00 10.00
- 31 88.00 30.00 10.00 74.00 104.00 10.00
- 32 88.00 35.00 20.00 61.00 91.00 10.00
- 33 87.00 30.00 10.00 131.00 161.00 10.00
- 34 85.00 25.00 10.00 51.00 81.00 10.00
- 35 85.00 35.00 30.00 111.00 141.00 10.00
- 36 67.00 85.00 20.00 139.00 169.00 10.00
- 37 65.00 85.00 40.00 43.00 73.00 10.00
- 38 65.00 82.00 10.00 124.00 154.00 10.00
- 39 62.00 80.00 30.00 75.00 105.00 10.00
- 40 60.00 80.00 10.00 37.00 67.00 10.00
- 41 60.00 85.00 30.00 85.00 115.00 10.00
- 42 58.00 75.00 20.00 92.00 122.00 10.00
- 43 55.00 80.00 10.00 33.00 63.00 10.00
- 44 55.00 85.00 20.00 128.00 158.00 10.00
- 45 55.00 82.00 10.00 64.00 94.00 10.00
- 46 20.00 82.00 10.00 37.00 67.00 10.00
- 47 18.00 80.00 10.00 113.00 143.00 10.00
- 48 2.00 45.00 10.00 45.00 75.00 10.00
- 49 42.00 5.00 10.00 151.00 181.00 10.00
- 50 42.00 12.00 10.00 104.00 134.00 10.00
- 51 72.00 35.00 30.00 116.00 146.00 10.00
- 52 55.00 20.00 19.00 83.00 113.00 10.00
- 53 25.00 30.00 3.00 52.00 82.00 10.00
- 54 20.00 50.00 5.00 91.00 121.00 10.00
- 55 55.00 60.00 16.00 139.00 169.00 10.00
- 56 30.00 60.00 16.00 140.00 170.00 10.00
- 57 50.00 35.00 19.00 130.00 160.00 10.00
- 58 30.00 25.00 23.00 96.00 126.00 10.00
- 59 15.00 10.00 20.00 152.00 182.00 10.00
- 60 10.00 20.00 19.00 42.00 72.00 10.00
- 61 15.00 60.00 17.00 155.00 185.00 10.00
- 62 45.00 65.00 9.00 66.00 96.00 10.00
- 63 65.00 35.00 3.00 52.00 82.00 10.00
- 64 65.00 20.00 6.00 39.00 69.00 10.00
- 65 45.00 30.00 17.00 53.00 83.00 10.00
- 66 35.00 40.00 16.00 11.00 41.00 10.00
- 67 41.00 37.00 16.00 133.00 163.00 10.00
- 68 64.00 42.00 9.00 70.00 100.00 10.00
- 69 40.00 60.00 21.00 144.00 174.00 10.00
- 70 31.00 52.00 27.00 41.00 71.00 10.00
- 71 35.00 69.00 23.00 180.00 210.00 10.00
- 72 65.00 55.00 14.00 65.00 95.00 10.00
- 73 63.00 65.00 8.00 30.00 60.00 10.00
- 74 2.00 60.00 5.00 77.00 107.00 10.00
- 75 20.00 20.00 8.00 141.00 171.00 10.00
- 76 5.00 5.00 16.00 74.00 104.00 10.00
- 77 60.00 12.00 31.00 75.00 105.00 10.00
- 78 23.00 3.00 7.00 150.00 180.00 10.00
- 79 8.00 56.00 27.00 90.00 120.00 10.00
- 80 6.00 68.00 30.00 89.00 119.00 10.00
- 81 47.00 47.00 13.00 192.00 222.00 10.00
- 82 49.00 58.00 10.00 86.00 116.00 10.00
- 83 27.00 43.00 9.00 42.00 72.00 10.00
- 84 37.00 31.00 14.00 35.00 65.00 10.00
- 85 57.00 29.00 18.00 96.00 126.00 10.00
- 86 63.00 23.00 2.00 87.00 117.00 10.00
- 87 21.00 24.00 28.00 87.00 117.00 10.00
- 88 12.00 24.00 13.00 90.00 120.00 10.00
- 89 24.00 58.00 19.00 67.00 97.00 10.00
- 90 67.00 5.00 25.00 144.00 174.00 10.00
- 91 37.00 47.00 6.00 86.00 116.00 10.00
- 92 49.00 42.00 13.00 167.00 197.00 10.00
- 93 53.00 43.00 14.00 14.00 44.00 10.00
- 94 61.00 52.00 3.00 178.00 208.00 10.00
- 95 57.00 48.00 23.00 95.00 125.00 10.00
- 96 56.00 37.00 6.00 34.00 64.00 10.00
- 97 55.00 54.00 26.00 132.00 162.00 10.00
- 98 4.00 18.00 35.00 120.00 150.00 10.00
- 99 26.00 52.00 9.00 46.00 76.00 10.00
- 100 26.00 35.00 15.00 77.00 107.00 10.00
+ CUST_NO. XCOORD. YCOORD. DEMAND READY_TIME DUE_Time SERVICE_TIME
+ 1 40.00 50.00 0.00 0.00 240.00 0.00
+ 2 25.00 85.00 20.00 145.00 175.00 10.00
+ 3 22.00 75.00 30.00 50.00 80.00 10.00
+ 4 22.00 85.00 10.00 109.00 139.00 10.00
+ 5 20.00 80.00 40.00 141.00 171.00 10.00
+ 6 20.00 85.00 20.00 41.00 71.00 10.00
+ 7 18.00 75.00 20.00 95.00 125.00 10.00
+ 8 15.00 75.00 20.00 79.00 109.00 10.00
+ 9 15.00 80.00 10.00 91.00 121.00 10.00
+ 10 10.00 35.00 20.00 91.00 121.00 10.00
+ 11 10.00 40.00 30.00 119.00 149.00 10.00
+ 12 8.00 40.00 40.00 59.00 89.00 10.00
+ 13 8.00 45.00 20.00 64.00 94.00 10.00
+ 14 5.00 35.00 10.00 142.00 172.00 10.00
+ 15 5.00 45.00 10.00 35.00 65.00 10.00
+ 16 2.00 40.00 20.00 58.00 88.00 10.00
+ 17 0.00 40.00 20.00 72.00 102.00 10.00
+ 18 0.00 45.00 20.00 149.00 179.00 10.00
+ 19 44.00 5.00 20.00 87.00 117.00 10.00
+ 20 42.00 10.00 40.00 72.00 102.00 10.00
+ 21 42.00 15.00 10.00 122.00 152.00 10.00
+ 22 40.00 5.00 10.00 67.00 97.00 10.00
+ 23 40.00 15.00 40.00 92.00 122.00 10.00
+ 24 38.00 5.00 30.00 65.00 95.00 10.00
+ 25 38.00 15.00 10.00 148.00 178.00 10.00
+ 26 35.00 5.00 20.00 154.00 184.00 10.00
+ 27 95.00 30.00 30.00 115.00 145.00 10.00
+ 28 95.00 35.00 20.00 62.00 92.00 10.00
+ 29 92.00 30.00 10.00 62.00 92.00 10.00
+ 30 90.00 35.00 10.00 67.00 97.00 10.00
+ 31 88.00 30.00 10.00 74.00 104.00 10.00
+ 32 88.00 35.00 20.00 61.00 91.00 10.00
+ 33 87.00 30.00 10.00 131.00 161.00 10.00
+ 34 85.00 25.00 10.00 51.00 81.00 10.00
+ 35 85.00 35.00 30.00 111.00 141.00 10.00
+ 36 67.00 85.00 20.00 139.00 169.00 10.00
+ 37 65.00 85.00 40.00 43.00 73.00 10.00
+ 38 65.00 82.00 10.00 124.00 154.00 10.00
+ 39 62.00 80.00 30.00 75.00 105.00 10.00
+ 40 60.00 80.00 10.00 37.00 67.00 10.00
+ 41 60.00 85.00 30.00 85.00 115.00 10.00
+ 42 58.00 75.00 20.00 92.00 122.00 10.00
+ 43 55.00 80.00 10.00 33.00 63.00 10.00
+ 44 55.00 85.00 20.00 128.00 158.00 10.00
+ 45 55.00 82.00 10.00 64.00 94.00 10.00
+ 46 20.00 82.00 10.00 37.00 67.00 10.00
+ 47 18.00 80.00 10.00 113.00 143.00 10.00
+ 48 2.00 45.00 10.00 45.00 75.00 10.00
+ 49 42.00 5.00 10.00 151.00 181.00 10.00
+ 50 42.00 12.00 10.00 104.00 134.00 10.00
+ 51 72.00 35.00 30.00 116.00 146.00 10.00
+ 52 55.00 20.00 19.00 83.00 113.00 10.00
+ 53 25.00 30.00 3.00 52.00 82.00 10.00
+ 54 20.00 50.00 5.00 91.00 121.00 10.00
+ 55 55.00 60.00 16.00 139.00 169.00 10.00
+ 56 30.00 60.00 16.00 140.00 170.00 10.00
+ 57 50.00 35.00 19.00 130.00 160.00 10.00
+ 58 30.00 25.00 23.00 96.00 126.00 10.00
+ 59 15.00 10.00 20.00 152.00 182.00 10.00
+ 60 10.00 20.00 19.00 42.00 72.00 10.00
+ 61 15.00 60.00 17.00 155.00 185.00 10.00
+ 62 45.00 65.00 9.00 66.00 96.00 10.00
+ 63 65.00 35.00 3.00 52.00 82.00 10.00
+ 64 65.00 20.00 6.00 39.00 69.00 10.00
+ 65 45.00 30.00 17.00 53.00 83.00 10.00
+ 66 35.00 40.00 16.00 11.00 41.00 10.00
+ 67 41.00 37.00 16.00 133.00 163.00 10.00
+ 68 64.00 42.00 9.00 70.00 100.00 10.00
+ 69 40.00 60.00 21.00 144.00 174.00 10.00
+ 70 31.00 52.00 27.00 41.00 71.00 10.00
+ 71 35.00 69.00 23.00 180.00 210.00 10.00
+ 72 65.00 55.00 14.00 65.00 95.00 10.00
+ 73 63.00 65.00 8.00 30.00 60.00 10.00
+ 74 2.00 60.00 5.00 77.00 107.00 10.00
+ 75 20.00 20.00 8.00 141.00 171.00 10.00
+ 76 5.00 5.00 16.00 74.00 104.00 10.00
+ 77 60.00 12.00 31.00 75.00 105.00 10.00
+ 78 23.00 3.00 7.00 150.00 180.00 10.00
+ 79 8.00 56.00 27.00 90.00 120.00 10.00
+ 80 6.00 68.00 30.00 89.00 119.00 10.00
+ 81 47.00 47.00 13.00 192.00 222.00 10.00
+ 82 49.00 58.00 10.00 86.00 116.00 10.00
+ 83 27.00 43.00 9.00 42.00 72.00 10.00
+ 84 37.00 31.00 14.00 35.00 65.00 10.00
+ 85 57.00 29.00 18.00 96.00 126.00 10.00
+ 86 63.00 23.00 2.00 87.00 117.00 10.00
+ 87 21.00 24.00 28.00 87.00 117.00 10.00
+ 88 12.00 24.00 13.00 90.00 120.00 10.00
+ 89 24.00 58.00 19.00 67.00 97.00 10.00
+ 90 67.00 5.00 25.00 144.00 174.00 10.00
+ 91 37.00 47.00 6.00 86.00 116.00 10.00
+ 92 49.00 42.00 13.00 167.00 197.00 10.00
+ 93 53.00 43.00 14.00 14.00 44.00 10.00
+ 94 61.00 52.00 3.00 178.00 208.00 10.00
+ 95 57.00 48.00 23.00 95.00 125.00 10.00
+ 96 56.00 37.00 6.00 34.00 64.00 10.00
+ 97 55.00 54.00 26.00 132.00 162.00 10.00
+ 98 4.00 18.00 35.00 120.00 150.00 10.00
+ 99 26.00 52.00 9.00 46.00 76.00 10.00
+ 100 26.00 35.00 15.00 77.00 107.00 10.00
101 31.00 67.00 3.00 180.00 210.00 10.00
\ No newline at end of file
diff --git a/src/vrp_basic/test/Vehicles.txt b/src/vrp_basic/test/Vehicles.txt
index 04aa1c2..d9c77cb 100644
--- a/src/vrp_basic/test/Vehicles.txt
+++ b/src/vrp_basic/test/Vehicles.txt
@@ -1,21 +1,21 @@
-V_d Capacity
-1 200
-2 200
-3 200
-4 200
-5 200
-6 200
-7 200
-8 200
-9 200
-10 200
-11 200
-12 200
-13 200
-14 200
-15 200
-16 200
-17 200
-18 200
-19 200
-20 200
+V_d Capacity
+1 200
+2 200
+3 200
+4 200
+5 200
+6 200
+7 200
+8 200
+9 200
+10 200
+11 200
+12 200
+13 200
+14 200
+15 200
+16 200
+17 200
+18 200
+19 200
+20 200
diff --git a/src/vrppdtw/doc/doc-gsoc_vrppdtw.queries b/src/vrppdtw/doc/doc-gsoc_vrppdtw.queries
index bde31e9..9a0126c 100644
--- a/src/vrppdtw/doc/doc-gsoc_vrppdtw.queries
+++ b/src/vrppdtw/doc/doc-gsoc_vrppdtw.queries
@@ -1,3 +1,7 @@
+BEGIN;
+BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT DISTINCT(id1) FROM pgr_gsoc_vrppdtw(
'SELECT * FROM customer ORDER BY id', 25, 200)
@@ -75,3 +79,5 @@ SELECT * FROM pgr_gsoc_vrppdtw(
(42 rows)
--q4
+ROLLBACK;
+ROLLBACK
diff --git a/src/vrppdtw/doc/pgr_gsoc_vrppdtw.rst b/src/vrppdtw/doc/pgr_gsoc_vrppdtw.rst
index 0ec72e2..a8969d8 100644
--- a/src/vrppdtw/doc/pgr_gsoc_vrppdtw.rst
+++ b/src/vrppdtw/doc/pgr_gsoc_vrppdtw.rst
@@ -1,9 +1,9 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
- This documentation is licensed under a Creative Commons Attribution-Share
+ This documentation is licensed under a Creative Commons Attribution-Share
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
@@ -18,15 +18,15 @@ Name
``pgr_gsoc_vrppdtw`` — Returns a solution for `Pick and Delivery` with `time windows` Vehicle Routing Problem
-.. include:: ../../proposed.rst
- :start-after: begin-warning
- :end-before: end-warning
+.. include:: proposed.rst
+ :start-after: begin-warn-expr
+ :end-before: end-warn-expr
Signature Summary
-----------------
-
+
.. code-block:: none
pgr_gsoc_vrppdtw(sql, vehicle_num, capacity)
@@ -35,7 +35,7 @@ Signature Summary
Signatures
-----------
-.. index::
+.. index::
single: gsoc_vrppdtw(Complete Signature) - proposed
diff --git a/src/vrppdtw/test/jet_customers.result b/src/vrppdtw/test/jet_customers.result
new file mode 100644
index 0000000..cd684ff
--- /dev/null
+++ b/src/vrppdtw/test/jet_customers.result
@@ -0,0 +1,96 @@
+1|1|0|TEB|0|0.00
+2|1|5|BOS|4|1.26
+3|1|62|BOS|-1|2.01
+4|1|53|MVY|1|2.95
+5|1|61|ABE|1|4.38
+6|1|54|MIA|-1|8.01
+7|1|6|MIA|-4|8.76
+8|1|0|TEB|0|11.75
+9|2|0|TEB|0|0.00
+10|2|71|ABE|1|0.95
+11|2|35|MIA|2|4.58
+12|2|33|MIA|2|5.33
+13|2|72|ABE|-1|8.96
+14|2|36|ABE|-2|9.71
+15|2|34|MVY|-2|11.14
+16|2|0|TEB|0|11.63
+17|3|0|TEB|0|0.00
+18|3|45|TEB|5|0.76
+19|3|8|TEB|-4|1.51
+20|3|1|BOS|4|2.77
+21|3|2|BOS|-4|3.52
+22|3|7|BOS|4|4.27
+23|3|46|MVY|-5|5.21
+24|3|0|TEB|0|5.69
+25|4|0|TEB|0|0.00
+26|4|17|BGR|4|1.78
+27|4|64|BGR|-1|2.53
+28|4|63|ABE|1|4.47
+29|4|18|MIA|-4|8.10
+30|4|0|TEB|0|11.09
+31|5|0|TEB|0|0.00
+32|5|27|MIA|2|3.73
+33|5|25|MIA|2|4.48
+34|5|26|BOS|-2|8.66
+35|5|28|BGR|-2|9.96
+36|5|0|TEB|0|10.99
+37|6|0|TEB|0|0.00
+38|6|65|ABE|1|0.95
+39|6|31|MIA|2|4.58
+40|6|29|MIA|2|5.33
+41|6|66|MIA|-1|6.08
+42|6|30|MIA|-2|6.83
+43|6|32|TEB|-2|10.56
+44|6|0|TEB|0|10.56
+45|7|0|TEB|0|0.00
+46|7|49|MVY|1|1.24
+47|7|51|MVY|1|1.99
+48|7|59|MVY|1|2.74
+49|7|55|MVY|1|3.49
+50|7|10|MVY|-4|4.24
+51|7|9|BOS|4|5.18
+52|7|50|BOS|-1|5.93
+53|7|52|BGR|-1|7.22
+54|7|60|ABE|-1|9.16
+55|7|56|TEB|-1|10.11
+56|7|0|TEB|0|10.11
+57|8|0|TEB|0|0.00
+58|8|47|TEB|5|0.76
+59|8|68|TEB|-1|1.51
+60|8|67|ABE|1|2.45
+61|8|48|ABE|-5|3.20
+62|8|69|ABE|1|3.95
+63|8|57|MVY|1|5.39
+64|8|70|MVY|-1|6.14
+65|8|58|MVY|-1|6.89
+66|8|0|TEB|0|7.37
+67|9|0|TEB|0|0.00
+68|9|37|TEB|5|0.76
+69|9|12|ABE|-4|1.70
+70|9|11|BOS|4|3.15
+71|9|38|BOS|-5|3.90
+72|9|23|BGR|4|5.19
+73|9|24|ABE|-4|7.13
+74|9|0|TEB|0|7.33
+75|10|0|TEB|0|0.00
+76|10|39|TEB|5|0.76
+77|10|22|MVY|-4|1.99
+78|10|21|BGR|4|3.43
+79|10|40|BGR|-5|4.18
+80|10|19|BGR|4|4.93
+81|10|20|TEB|-4|6.71
+82|10|0|TEB|0|6.71
+83|11|0|TEB|0|0.00
+84|11|3|BOS|4|1.26
+85|11|14|BOS|-4|2.01
+86|11|15|BGR|4|3.31
+87|11|16|BGR|-4|4.06
+88|11|13|BGR|4|4.81
+89|11|4|BGR|-4|5.56
+90|11|0|TEB|0|6.59
+91|12|0|TEB|0|0.00
+92|12|43|TEB|5|0.76
+93|12|44|TEB|-5|1.51
+94|12|41|TEB|5|2.26
+95|12|42|MIA|-5|5.99
+96|12|0|TEB|0|8.97
diff --git a/src/vrppdtw/test/jet_customers.test.sql b/src/vrppdtw/test/jet_customers.test.sql
new file mode 100644
index 0000000..7729204
--- /dev/null
+++ b/src/vrppdtw/test/jet_customers.test.sql
@@ -0,0 +1,128 @@
+--
+-- PostgreSQL database dump
+--
+
+-- Dumped from database version 9.6.2
+-- Dumped by pg_dump version 9.6.1
+
+-- Started on 2017-03-12 13:34:07
+
+
+
+--
+-- TOC entry 318 (class 1259 OID 15659206)
+-- Name: jet_customers; Type: TABLE; Schema: public; Owner: postgres
+--
+
+CREATE TABLE jet_customers (
+ airport character varying,
+ id integer,
+ x double precision,
+ y double precision,
+ pindex integer,
+ dindex integer,
+ demand integer,
+ opentime double precision,
+ closetime double precision,
+ servicetime double precision
+);
+
+--
+-- TOC entry 4308 (class 0 OID 15659206)
+-- Dependencies: 318
+-- Data for Name: jet_customers; Type: TABLE DATA; Schema: public; Owner: postgres
+--
+
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 1, 2320738.4688434978, 126348.38967116659, 0, 2, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 3, 2320738.4688434978, 126348.38967116659, 0, 4, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 5, 2320738.4688434978, 126348.38967116659, 0, 6, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 7, 2320738.4688434978, 126348.38967116659, 0, 8, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 9, 2320738.4688434978, 126348.38967116659, 0, 10, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 11, 2320738.4688434978, 126348.38967116659, 0, 12, 4, 3448, 2853448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 13, 2383186.1525343237, 448251.25888828852, 0, 14, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 15, 2383186.1525343237, 448251.25888828852, 0, 16, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 17, 2383186.1525343237, 448251.25888828852, 0, 18, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 19, 2383186.1525343237, 448251.25888828852, 0, 20, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 21, 2383186.1525343237, 448251.25888828852, 0, 22, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 23, 2383186.1525343237, 448251.25888828852, 0, 24, 4, 3463, 2853463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 25, 1981144.5525029898, -1903041.2384292425, 0, 26, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 27, 1981144.5525029898, -1903041.2384292425, 0, 28, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 29, 1981144.5525029898, -1903041.2384292425, 0, 30, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 31, 1981144.5525029898, -1903041.2384292425, 0, 32, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 33, 1981144.5525029898, -1903041.2384292425, 0, 34, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 35, 1981144.5525029898, -1903041.2384292425, 0, 36, 2, 3576, 2853576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 37, 2138409.5568088419, -119451.50568778868, 0, 38, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 39, 2138409.5568088419, -119451.50568778868, 0, 40, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 41, 2138409.5568088419, -119451.50568778868, 0, 42, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 43, 2138409.5568088419, -119451.50568778868, 0, 44, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 45, 2138409.5568088419, -119451.50568778868, 0, 46, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 47, 2138409.5568088419, -119451.50568778868, 0, 48, 5, 3624, 2853624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 49, 2387491.1007072991, 34459.351848672632, 0, 50, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 51, 2387491.1007072991, 34459.351848672632, 0, 52, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 53, 2387491.1007072991, 34459.351848672632, 0, 54, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 55, 2387491.1007072991, 34459.351848672632, 0, 56, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 57, 2387491.1007072991, 34459.351848672632, 0, 58, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 59, 2387491.1007072991, 34459.351848672632, 0, 60, 1, 4265, 2854265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 61, 2035310.7411768832, -176076.78362264115, 0, 62, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 63, 2035310.7411768832, -176076.78362264115, 0, 64, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 65, 2035310.7411768832, -176076.78362264115, 0, 66, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 67, 2035310.7411768832, -176076.78362264115, 0, 68, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 69, 2035310.7411768832, -176076.78362264115, 0, 70, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 71, 2035310.7411768832, -176076.78362264115, 0, 72, 1, 4355, 2854355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 2, 2320738.4688434978, 126348.38967116659, 1, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 4, 2383186.1525343237, 448251.25888828852, 3, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 6, 1981144.5525029898, -1903041.2384292425, 5, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 8, 2138409.5568088419, -119451.50568778868, 7, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 10, 2387491.1007072991, 34459.351848672632, 9, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 12, 2035310.7411768832, -176076.78362264115, 11, 0, -4, 3448, 6903448, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 14, 2320738.4688434978, 126348.38967116659, 13, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 16, 2383186.1525343237, 448251.25888828852, 15, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 18, 1981144.5525029898, -1903041.2384292425, 17, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 20, 2138409.5568088419, -119451.50568778868, 19, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 22, 2387491.1007072991, 34459.351848672632, 21, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 24, 2035310.7411768832, -176076.78362264115, 23, 0, -4, 3463, 6903463, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 26, 2320738.4688434978, 126348.38967116659, 25, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 28, 2383186.1525343237, 448251.25888828852, 27, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 30, 1981144.5525029898, -1903041.2384292425, 29, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 32, 2138409.5568088419, -119451.50568778868, 31, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 34, 2387491.1007072991, 34459.351848672632, 33, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 36, 2035310.7411768832, -176076.78362264115, 35, 0, -2, 3576, 6903576, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 38, 2320738.4688434978, 126348.38967116659, 37, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 40, 2383186.1525343237, 448251.25888828852, 39, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 42, 1981144.5525029898, -1903041.2384292425, 41, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 44, 2138409.5568088419, -119451.50568778868, 43, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 46, 2387491.1007072991, 34459.351848672632, 45, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 48, 2035310.7411768832, -176076.78362264115, 47, 0, -5, 3624, 6903624, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 50, 2320738.4688434978, 126348.38967116659, 49, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 52, 2383186.1525343237, 448251.25888828852, 51, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 54, 1981144.5525029898, -1903041.2384292425, 53, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 56, 2138409.5568088419, -119451.50568778868, 55, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 58, 2387491.1007072991, 34459.351848672632, 57, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 60, 2035310.7411768832, -176076.78362264115, 59, 0, -1, 4265, 6904265, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BOS', 62, 2320738.4688434978, 126348.38967116659, 61, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('BGR', 64, 2383186.1525343237, 448251.25888828852, 63, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MIA', 66, 1981144.5525029898, -1903041.2384292425, 65, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 68, 2138409.5568088419, -119451.50568778868, 67, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('MVY', 70, 2387491.1007072991, 34459.351848672632, 69, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('ABE', 72, 2035310.7411768832, -176076.78362264115, 71, 0, -1, 4355, 6904355, 450000);
+INSERT INTO jet_customers (airport, id, x, y, pindex, dindex, demand, opentime, closetime, servicetime) VALUES ('TEB', 0, 2138409.5568088419, -119451.50568778868, 0, 0, 0, 0, 7200000, 0);
+
+SELECT
+n.seq, n.id1 AS jet, n.id2 AS cust, pd.airport, pd.demand AS pas,
+(n.cost/1000/600)::numeric(10,2) AS c_hrs
+FROM
+pgr_gsoc_vrppdtw(
+ $$
+ SELECT
+ id, x, y, demand,
+ opentime, closetime, servicetime,
+ pindex, dindex
+ FROM jet_customers
+ ORDER BY id
+ $$,
+ 2,
+ 5
+) AS n LEFT JOIN
+jet_customers AS pd ON n.id2 = pd.id
+ORDER BY n.seq;
+
diff --git a/src/vrppdtw/test/test.conf b/src/vrppdtw/test/test.conf
index 936e410..0df0702 100644
--- a/src/vrppdtw/test/test.conf
+++ b/src/vrppdtw/test/test.conf
@@ -5,6 +5,7 @@
'comment' => 'Function test for any versions.',
'data' => ['../../pickDeliver/test/pickDeliver.data'],
'tests' => [qw(
+ jet_customers
doc-gsoc_vrppdtw
pdp-any-02
)],
diff --git a/src/withPoints/doc/doc-pgr_withPoints.queries b/src/withPoints/doc/doc-pgr_withPoints.queries
index cfc6332..9ae373b 100644
--- a/src/withPoints/doc/doc-pgr_withPoints.queries
+++ b/src/withPoints/doc/doc-pgr_withPoints.queries
@@ -1,10 +1,12 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--e1
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -3);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -3);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | -1 | 1 | 0.6 | 0
@@ -16,10 +18,10 @@ SELECT * FROM pgr_withPoints(
--e2
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3,
- details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3,
+ details := true);
seq | path_seq | node | edge | cost | agg_cost
-----+----------+------+------+------+----------
1 | 1 | -1 | 1 | 0.6 | 0
@@ -34,9 +36,9 @@ SELECT * FROM pgr_withPoints(
--e3
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, ARRAY[-3,5]);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, ARRAY[-3,5]);
seq | path_seq | end_pid | node | edge | cost | agg_cost
-----+----------+---------+------+------+------+----------
1 | 1 | -3 | -1 | 1 | 0.6 | 0
@@ -51,9 +53,9 @@ SELECT * FROM pgr_withPoints(
--e4
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], -3);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], -3);
seq | path_seq | start_pid | node | edge | cost | agg_cost
-----+----------+-----------+------+------+------+----------
1 | 1 | -1 | -1 | 1 | 0.6 | 0
@@ -69,9 +71,9 @@ SELECT * FROM pgr_withPoints(
--e5
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7]);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7]);
seq | path_seq | start_pid | end_pid | node | edge | cost | agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 | 1 | -1 | -3 | -1 | 1 | 0.6 | 0
@@ -96,20 +98,20 @@ SELECT * FROM pgr_withPoints(
--q2
SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
- CASE WHEN edge = -1 THEN ' visits'
- ELSE ' passes in front of'
- END as status,
- CASE WHEN node < 0 THEN 'Point'
- ELSE 'Vertex'
- END as is_a,
- abs(node) as id
- FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
- driving_side := 'r',
- details := true)
- WHERE node IN (-6,6);
+ CASE WHEN edge = -1 THEN ' visits'
+ ELSE ' passes in front of'
+ END as status,
+ CASE WHEN node < 0 THEN 'Point'
+ ELSE 'Vertex'
+ END as is_a,
+ abs(node) as id
+ FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
+ driving_side := 'r',
+ details := true)
+ WHERE node IN (-6,6);
path_at | status | is_a | id
-------------------------+---------------------+--------+----
(-1 => -6) at 4th step: | visits | Point | 6
@@ -132,20 +134,20 @@ SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:
--q3
SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
- CASE WHEN edge = -1 THEN ' visits'
- ELSE ' passes in front of'
- END as status,
- CASE WHEN node < 0 THEN 'Point'
- ELSE 'Vertex'
- END as is_a,
- abs(node) as id
- FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
- driving_side := 'l',
- details := true)
- WHERE node IN (-6,6);
+ CASE WHEN edge = -1 THEN ' visits'
+ ELSE ' passes in front of'
+ END as status,
+ CASE WHEN node < 0 THEN 'Point'
+ ELSE 'Vertex'
+ END as is_a,
+ abs(node) as id
+ FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
+ driving_side := 'l',
+ details := true)
+ WHERE node IN (-6,6);
path_at | status | is_a | id
-------------------------+---------------------+--------+----
(-1 => -6) at 3th step: | visits | Point | 6
@@ -168,11 +170,11 @@ SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:
--q4
SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- directed := false,
- details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ directed := false,
+ details := true);
seq | path_seq | start_pid | end_pid | node | edge | cost | agg_cost
-----+----------+-----------+---------+------+------+------+----------
1 | 1 | -1 | -3 | -1 | 1 | 0.6 | 0
diff --git a/src/withPoints/doc/doc-pgr_withPointsCost.queries b/src/withPoints/doc/doc-pgr_withPointsCost.queries
index e911c9b..7930644 100644
--- a/src/withPoints/doc/doc-pgr_withPointsCost.queries
+++ b/src/withPoints/doc/doc-pgr_withPointsCost.queries
@@ -1,10 +1,12 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--e1
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -3);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -3);
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
@@ -12,10 +14,10 @@ SELECT * FROM pgr_withPointsCost(
--e2
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3,
- directed := false);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3,
+ directed := false);
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | 3 | 1.6
@@ -23,9 +25,9 @@ SELECT * FROM pgr_withPointsCost(
--e3
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, ARRAY[-3,5]);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, ARRAY[-3,5]);
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
@@ -34,9 +36,9 @@ SELECT * FROM pgr_withPointsCost(
--e4
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], -3);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], -3);
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
@@ -45,9 +47,9 @@ SELECT * FROM pgr_withPointsCost(
--e5
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7]);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7]);
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
@@ -58,10 +60,10 @@ SELECT * FROM pgr_withPointsCost(
--q2
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'l');
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'l');
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
@@ -72,10 +74,10 @@ SELECT * FROM pgr_withPointsCost(
--q3
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'r');
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'r');
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 4
@@ -86,10 +88,10 @@ SELECT * FROM pgr_withPointsCost(
--q4
SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'b');
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'b');
start_pid | end_pid | agg_cost
-----------+---------+----------
-1 | -3 | 3.2
diff --git a/src/withPoints/doc/doc-pgr_withPointsDD.queries b/src/withPoints/doc/doc-pgr_withPointsDD.queries
index c9b4fa5..6435a0f 100644
--- a/src/withPoints/doc/doc-pgr_withPointsDD.queries
+++ b/src/withPoints/doc/doc-pgr_withPointsDD.queries
@@ -1,10 +1,12 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8);
seq | node | edge | cost | agg_cost
-----+------+------+------+----------
1 | -1 | -1 | 0 | 0
@@ -22,11 +24,11 @@ SELECT * FROM pgr_withPointsDD(
--q2
SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'r',
- details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'r',
+ details := true);
seq | node | edge | cost | agg_cost
-----+------+------+------+----------
1 | -1 | -1 | 0 | 0
@@ -41,11 +43,11 @@ SELECT * FROM pgr_withPointsDD(
--q3
SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'l',
- details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'l',
+ details := true);
seq | node | edge | cost | agg_cost
-----+------+------+------+----------
1 | -1 | -1 | 0 | 0
@@ -66,11 +68,11 @@ SELECT * FROM pgr_withPointsDD(
--q4
SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'b',
- details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'b',
+ details := true);
seq | node | edge | cost | agg_cost
-----+------+------+------+----------
1 | -1 | -1 | 0 | 0
diff --git a/src/withPoints/doc/doc-pgr_withPointsKSP.queries b/src/withPoints/doc/doc-pgr_withPointsKSP.queries
index 2e1a849..965c8dc 100644
--- a/src/withPoints/doc/doc-pgr_withPointsKSP.queries
+++ b/src/withPoints/doc/doc-pgr_withPointsKSP.queries
@@ -1,10 +1,12 @@
BEGIN;
BEGIN
+SET client_min_messages TO NOTICE;
+SET
--q1
SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2);
seq | path_id | path_seq | node | edge | cost | agg_cost
-----+---------+----------+------+------+------+----------
1 | 1 | 1 | -1 | 1 | 0.6 | 0
@@ -24,9 +26,9 @@ SELECT * FROM pgr_withPointsKSP(
--q2
SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 6, 2, details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 6, 2, details := true);
seq | path_id | path_seq | node | edge | cost | agg_cost
-----+---------+----------+------+------+------+----------
1 | 1 | 1 | -1 | 1 | 0.6 | 0
@@ -49,36 +51,36 @@ SELECT * FROM pgr_withPointsKSP(
--q3
SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2,
- driving_side := 'l', details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ driving_side := 'l', details := true);
seq | path_id | path_seq | node | edge | cost | agg_cost
-----+---------+----------+------+------+------+----------
1 | 1 | 1 | -1 | 1 | 0.6 | 0
2 | 1 | 2 | 2 | 4 | 0.7 | 0.6
3 | 1 | 3 | -6 | 4 | 0.3 | 1.3
4 | 1 | 4 | 5 | 8 | 1 | 1.6
- 5 | 1 | 5 | 6 | 11 | 1 | 2.6
- 6 | 1 | 6 | 11 | 13 | 1 | 3.6
+ 5 | 1 | 5 | 6 | 9 | 1 | 2.6
+ 6 | 1 | 6 | 9 | 15 | 1 | 3.6
7 | 1 | 7 | 12 | 15 | 0.6 | 4.6
8 | 1 | 8 | -2 | -1 | 0 | 5.2
9 | 2 | 1 | -1 | 1 | 0.6 | 0
10 | 2 | 2 | 2 | 4 | 0.7 | 0.6
11 | 2 | 3 | -6 | 4 | 0.3 | 1.3
12 | 2 | 4 | 5 | 8 | 1 | 1.6
- 13 | 2 | 5 | 6 | 9 | 1 | 2.6
- 14 | 2 | 6 | 9 | 15 | 1 | 3.6
+ 13 | 2 | 5 | 6 | 11 | 1 | 2.6
+ 14 | 2 | 6 | 11 | 13 | 1 | 3.6
15 | 2 | 7 | 12 | 15 | 0.6 | 4.6
16 | 2 | 8 | -2 | -1 | 0 | 5.2
(16 rows)
--q4
SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2,
- heap_paths := true, driving_side := 'r', details := true);
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ heap_paths := true, driving_side := 'r', details := true);
seq | path_id | path_seq | node | edge | cost | agg_cost
-----+---------+----------+------+------+------+----------
1 | 1 | 1 | -1 | 1 | 0.4 | 0
diff --git a/src/withPoints/doc/pgr_withPoints.rst b/src/withPoints/doc/pgr_withPoints.rst
index 28311d9..86291e5 100644
--- a/src/withPoints/doc/pgr_withPoints.rst
+++ b/src/withPoints/doc/pgr_withPoints.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,20 +19,22 @@ Name
``pgr_withPoints`` - Returns the shortest path in a graph with additional temporary vertices.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Synopsis
-------------------------------------------------------------------------------
-Modify the graph to include points defined by points_sql.
+Modify the graph to include points defined by points_sql.
Using Dijkstra algorithm, find the shortest path(s)
Characteristics:
@@ -195,11 +197,11 @@ Description of the Signatures
..
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
diff --git a/src/withPoints/doc/pgr_withPointsCost.rst b/src/withPoints/doc/pgr_withPointsCost.rst
index 4f1a37b..9c15cd4 100644
--- a/src/withPoints/doc/pgr_withPointsCost.rst
+++ b/src/withPoints/doc/pgr_withPointsCost.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,16 +19,18 @@ Name
``pgr_withPointsCost`` - Calculates the shortest path and returns only the aggregate cost of the shortest path(s) found, for the combination of points given.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Synopsis
-------------------------------------------------------------------------------
@@ -87,7 +89,7 @@ Signature Summary
pgr_withPointsCost(edges_sql, points_sql, start_vids, end_vids, directed, driving_side)
RETURNS SET OF (start_vid, end_vid, agg_cost)
-.. note:: There is no **details** flag, unlike the other members of the withPoints family of functions.
+.. note:: There is no **details** flag, unlike the other members of the withPoints family of functions.
Signatures
@@ -204,11 +206,11 @@ Description of the Signatures
..
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
diff --git a/src/withPoints/doc/pgr_withPointsDD.rst b/src/withPoints/doc/pgr_withPointsDD.rst
index 49f5916..62bac3d 100644
--- a/src/withPoints/doc/pgr_withPointsDD.rst
+++ b/src/withPoints/doc/pgr_withPointsDD.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,20 +19,22 @@ Name
``pgr_withPointsDD`` - Returns the driving distance from a starting point.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Synopsis
-------------------------------------------------------------------------------
-Modify the graph to include points and
+Modify the graph to include points and
using Dijkstra algorithm, extracts all the nodes and points that have costs less
than or equal to the value ``distance`` from the starting point.
The edges extracted will conform the corresponding spanning tree.
@@ -119,11 +121,11 @@ Description of the Signatures
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
@@ -147,7 +149,7 @@ Parameter Type Description
**details** ``BOOLEAN`` (optional). When ``true`` the results will include the driving distance to the points with in the ``distance``.
Default is ``false`` which ignores other points of the points_sql.
-**equicost** ``BOOLEAN`` (optional). When ``true`` the nodes will only appear in the closest start_v list. Default is ``false`` which resembles several calls using the single starting point signatures. Tie brakes are arbitrary.
+**equicost** ``BOOLEAN`` (optional). When ``true`` the nodes will only appear in the closest start_v list. Default is ``false`` which resembles several calls using the single starting point signatures. Tie brakes are arbitrary.
================ ================= =================================================
diff --git a/src/withPoints/doc/pgr_withPointsKSP.rst b/src/withPoints/doc/pgr_withPointsKSP.rst
index a449715..eeb0a82 100644
--- a/src/withPoints/doc/pgr_withPointsKSP.rst
+++ b/src/withPoints/doc/pgr_withPointsKSP.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,19 +19,21 @@ Name
``pgr_withPointsKSP`` - Find the K shortest paths using Yen's algorithm.
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: 2.2.0
+
Synopsis
-------------------------------------------------------------------------------
-Modifies the graph to include the points defined in the ``points_sql`` and
+Modifies the graph to include the points defined in the ``points_sql`` and
using Yen algorithm, finds the K shortest paths.
@@ -99,11 +101,11 @@ Description of the Signatures
..
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
@@ -145,10 +147,10 @@ Column Type Description
**path_seq** ``INTEGER`` Relative position in the path of node and edge. Has value 1 for the beginning of a path.
**path_id** ``INTEGER`` Path identifier. The ordering of the paths: For two paths i, j if i < j then agg_cost(i) <= agg_cost(j).
**node** ``BIGINT`` Identifier of the node in the path. Negative values are the identifiers of a point.
-**edge** ``BIGINT`` Identifier of the edge used to go from ``node`` to the next node in the path sequence.
+**edge** ``BIGINT`` Identifier of the edge used to go from ``node`` to the next node in the path sequence.
- ``-1`` for the last row in the path sequence.
-**cost** ``FLOAT`` Cost to traverse from ``node`` using ``edge`` to the next ``node`` in the path sequence.
+**cost** ``FLOAT`` Cost to traverse from ``node`` using ``edge`` to the next ``node`` in the path sequence.
- ``0`` for the last row in the path sequence.
**agg_cost** ``FLOAT`` Aggregate cost from ``start_pid`` to ``node``.
@@ -183,7 +185,7 @@ The queries use the :ref:`sampledata` network.
See Also
-------------------------------------------------------------------------------
-* :ref:`withPoints`
+* :ref:`withPoints`
.. rubric:: Indices and tables
diff --git a/src/withPoints/doc/pgr_withPointsVia.rst b/src/withPoints/doc/pgr_withPointsVia.rst
index 4ad9fea..1f58ef9 100644
--- a/src/withPoints/doc/pgr_withPointsVia.rst
+++ b/src/withPoints/doc/pgr_withPointsVia.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -19,21 +19,23 @@ Name
``pgr_withPointsVia`` - Get a path using the vertices/points indicated
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
-.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
+.. figure:: images/boost-inside.jpeg
:target: http://www.boost.org/libs/graph
Boost Graph Inside
+.. rubric:: Availability: PENDING.
+
Synopsis
-------------------------------------------------------------------------------
-Modify the graph to include points and
+Modify the graph to include points and
using Dijkstra algorithm, extracts all the nodes and points that have costs less
than or equal to the value ``distance`` from the starting point.
The edges extracted will conform the corresponding spanning tree.
@@ -102,11 +104,11 @@ Description of the Signatures
..
description of the sql queries
-.. include:: ../../common/src/edges_input.h
+.. include:: pgRouting-concepts.rst
:start-after: basic_edges_sql_start
:end-before: basic_edges_sql_end
-.. include:: ../../common/src/points_input.h
+.. include:: pgRouting-concepts.rst
:start-after: points_sql_start
:end-before: points_sql_end
diff --git a/src/withPoints/doc/withPoints.rst b/src/withPoints/doc/withPoints-family.rst
similarity index 88%
rename from src/withPoints/doc/withPoints.rst
rename to src/withPoints/doc/withPoints-family.rst
index 3aa5489..192e8b7 100644
--- a/src/withPoints/doc/withPoints.rst
+++ b/src/withPoints/doc/withPoints-family.rst
@@ -1,4 +1,4 @@
-..
+..
****************************************************************************
pgRouting Manual
Copyright(c) pgRouting Contributors
@@ -15,24 +15,28 @@ withPoints - Family of functions
When points are also given as input:
- - :ref:`pgr_withPoints` - Route from/to points anywhere on the graph.
- - :ref:`pgr_withPointsCost` - Costs of the shortest paths.
- - :ref:`pgr_withPointsCostMatrix` - Costs of the shortest paths.
- - :ref:`pgr_withPointsKSP` - K shortest paths.
- - :ref:`pgr_withPointsDD` - Driving distance.
+.. index from here
+
+- :ref:`pgr_withPoints` - Route from/to points anywhere on the graph.
+- :ref:`pgr_withPointsCost` - Costs of the shortest paths.
+- :ref:`pgr_withPointsCostMatrix` - Costs of the shortest paths.
+- :ref:`pgr_withPointsKSP` - K shortest paths.
+- :ref:`pgr_withPointsDD` - Driving distance.
+
+.. index to here
.. toctree::
- :hidden:
+ :hidden:
- ./pgr_withPoints
- ./pgr_withPointsCost
- ../../costMatrix/doc/pgr_withPointsCostMatrix
- ./pgr_withPointsKSP
- ./pgr_withPointsDD
+ pgr_withPoints
+ pgr_withPointsCost
+ pgr_withPointsCostMatrix
+ pgr_withPointsKSP
+ pgr_withPointsDD
-.. include:: ../../proposedNext.rst
+.. include:: proposed.rst
:start-after: begin-warning
:end-before: end-warning
@@ -76,12 +80,12 @@ information about which `side` of the edge the point is on, then routing
from arbitrary points more accurately reflect routing vehicles in road networks,
-I talk about a family of functios because it includes different functionalities.
+I talk about a family of functions because it includes different functionalities.
- pgr_withPoints is pgr_dijkstra based
- pgr_withPointsCost is pgr_dijkstraCost based
- pgr_withPointsKSP is pgr_ksp based
- pgr_withPointsDD is pgr_drivingDistance based
-
+
In all this functions we have to take care of as many aspects as possible:
- Must work for routing:
@@ -108,7 +112,7 @@ In all this functions we have to take care of as many aspects as possible:
- Original point identifiers are to be positive.
- Transformation to negative is done internally.
- - For results for involving vertices identifiers
+ - For results for involving vertices identifiers
- positive sign is a vertex of the original grpah
- negative sign is a point of the temporary points
@@ -128,13 +132,13 @@ Graph & edges
Point Definition
----------------
-- A point is defined by the quadruplet: :math:`(pid, eid, fraction, side)`
+- A point is defined by the quadruplet: :math:`(pid, eid, fraction, side)`
- :ped: is the point identifier
- :eid: is an edge id of the `edges_sql`
- :fraction: represents where the edge `eid` will be cut.
- :side: Indicates the side of the edge where the point is located.
-
+
Creating Temporary Vertices in the Graph
----------------------------------------
diff --git a/src/withPoints/src/CMakeLists.txt b/src/withPoints/src/CMakeLists.txt
index 95cfff5..8975899 100644
--- a/src/withPoints/src/CMakeLists.txt
+++ b/src/withPoints/src/CMakeLists.txt
@@ -8,8 +8,5 @@ ADD_LIBRARY(withPoints OBJECT
get_new_queries.cpp
pgr_withPoints.cpp
- one_to_one_withPoints_driver.cpp
- many_to_one_withPoints_driver.cpp
many_to_many_withPoints_driver.cpp
- one_to_many_withPoints_driver.cpp
)
diff --git a/src/withPoints/src/get_new_queries.cpp b/src/withPoints/src/get_new_queries.cpp
index 4065fe4..ffa2bf7 100644
--- a/src/withPoints/src/get_new_queries.cpp
+++ b/src/withPoints/src/get_new_queries.cpp
@@ -27,10 +27,19 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "string.h"
-#include <sstream>
#include "./get_new_queries.h"
+#include <string.h>
+#include <sstream>
+char
+estimate_drivingSide(char driving_side) {
+ char d_side = static_cast<char>(tolower(driving_side));
+ if (!((d_side == 'r')
+ || (d_side == 'l'))) {
+ d_side = 'b';
+ }
+ return d_side;
+}
void
get_new_queries(
@@ -50,9 +59,9 @@ get_new_queries(
edges_no_points_sql << "WITH "
<< " edges AS (" << edges_sql << "), "
<< " points AS (" << points_sql << ")"
- << " SELECT edges.* FROM edges WHERE NOT EXISTS (SELECT edge_id FROM points WHERE id = edge_id)";
+ << " SELECT edges.*"
+ << " FROM edges"
+ << " WHERE NOT EXISTS (SELECT edge_id FROM points WHERE id = edge_id)";
*edges_no_points_query = strdup(edges_no_points_sql.str().c_str());
}
-
-
diff --git a/src/withPoints/src/get_new_queries.h b/src/withPoints/src/get_new_queries.h
index 6d5f9dd..946beb4 100644
--- a/src/withPoints/src/get_new_queries.h
+++ b/src/withPoints/src/get_new_queries.h
@@ -34,6 +34,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
extern "C" {
#endif
+ char estimate_drivingSide(char driving_side);
+
void get_new_queries(
char *edges_sql,
char *points_sql,
diff --git a/src/withPoints/src/many_to_many_withPoints.c b/src/withPoints/src/many_to_many_withPoints.c
index 94886d1..93a3a41 100644
--- a/src/withPoints/src/many_to_many_withPoints.c
+++ b/src/withPoints/src/many_to_many_withPoints.c
@@ -27,21 +27,13 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./../../common/src/points_input.h"
@@ -49,21 +41,17 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./many_to_many_withPoints_driver.h"
PGDLLEXPORT Datum many_to_many_withPoints(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(many_to_many_withPoints);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char* edges_sql,
char* points_sql,
- int64_t *start_pidsArr,
- size_t size_start_pidsArr,
-
- int64_t *end_pidsArr,
- size_t size_end_pidsArr,
+ ArrayType *starts,
+ ArrayType *ends,
bool directed,
char *driving_side,
@@ -71,9 +59,16 @@ process(
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
+ driving_side[0] = estimate_drivingSide(driving_side[0]);
pgr_SPI_connect();
+ size_t size_start_pidsArr = 0;
+ int64_t* start_pidsArr = pgr_get_bigIntArray(&size_start_pidsArr, starts);
+
+ size_t size_end_pidsArr = 0;
+ int64_t* end_pidsArr = pgr_get_bigIntArray(&size_end_pidsArr, ends);
+
Point_on_edge_t *points = NULL;
size_t total_points = 0;
pgr_get_points(points_sql, &points, &total_points);
@@ -89,7 +84,8 @@ process(
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
+ pgr_get_edges(
+ edges_of_points_query, &edges_of_points, &total_edges_of_points);
pgr_edge_t *edges = NULL;
@@ -100,62 +96,70 @@ process(
free(edges_no_points_query);
if ((total_edges + total_edges_of_points) == 0) {
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- char *err_msg = NULL;
- char *log_msg = NULL;
clock_t start_t = clock();
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+
do_pgr_many_to_many_withPoints(
edges, total_edges,
points, total_points,
edges_of_points, total_edges_of_points,
start_pidsArr, size_start_pidsArr,
end_pidsArr, size_end_pidsArr,
+
driving_side[0],
details,
directed,
only_cost,
- result_tuples,
- result_count,
+ true,
+
+ result_tuples, result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg("Processing withPoints many to many", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", err_msg);
- if (log_msg) free(log_msg);
-
- if (err_msg) {
- free(start_pidsArr);
- free(end_pidsArr);
- free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+
+ if (only_cost) {
+ time_msg("processing pgr_withPointsCost(one to one)", start_t, clock());
+ } else {
+ time_msg("processing pgr_withPoints(one to one)", start_t, clock());
}
- pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+#if 0
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (points) pfree(points);
+ if (edges_of_points) pfree(edges_of_points);
+ if (start_pidsArr) pfree(start_pidsArr);
+ if (end_pidsArr) pfree(end_pidsArr);
+#endif
pgr_SPI_finish();
}
-/* */
-/*******************************************************************************/
-PG_FUNCTION_INFO_V1(many_to_many_withPoints);
PGDLLEXPORT Datum
many_to_many_withPoints(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
General_path_element_t *result_tuples = 0;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -163,12 +167,11 @@ many_to_many_withPoints(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPoint(
// edges_sql TEXT,
// points_sql TEXT,
- // start_pid BIGINT,
+ // start_pid ANYARRAY,
// end_pids ANYARRAY,
// driving_side CHAR -- DEFAULT 'b',
// details BOOLEAN -- DEFAULT false,
@@ -176,36 +179,28 @@ many_to_many_withPoints(PG_FUNCTION_ARGS) {
// only_cost BOOLEAN DEFAULT false,
- int64_t* start_pidsArr;
- size_t size_start_pidsArr;
- start_pidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_pidsArr, PG_GETARG_ARRAYTYPE_P(2));
-
- int64_t* end_pidsArr;
- size_t size_end_pidsArr;
- end_pidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_pidsArr, PG_GETARG_ARRAYTYPE_P(3));
-
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
- start_pidsArr, size_start_pidsArr,
- end_pidsArr, size_end_pidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
+ PG_GETARG_ARRAYTYPE_P(2),
+ PG_GETARG_ARRAYTYPE_P(3),
PG_GETARG_BOOL(4),
- pgr_text2char(PG_GETARG_TEXT_P(5)),
+ text_to_cstring(PG_GETARG_TEXT_P(5)),
PG_GETARG_BOOL(6),
PG_GETARG_BOOL(7),
&result_tuples,
&result_count);
- if (start_pidsArr) free(start_pidsArr);
- if (end_pidsArr) free(end_pidsArr);
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -216,19 +211,16 @@ many_to_many_withPoints(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// OUT seq BIGINT,
// OUT path_seq,
// OUT node BIGINT,
@@ -246,24 +238,20 @@ many_to_many_withPoints(PG_FUNCTION_ARGS) {
}
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[4] = Int64GetDatum(result_tuples[call_cntr].node);
- values[5] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[7] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[5] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[7] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/withPoints/src/many_to_many_withPoints_driver.cpp b/src/withPoints/src/many_to_many_withPoints_driver.cpp
index 2a35349..9f6d7de 100644
--- a/src/withPoints/src/many_to_many_withPoints_driver.cpp
+++ b/src/withPoints/src/many_to_many_withPoints_driver.cpp
@@ -27,27 +27,50 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#include "./many_to_many_withPoints_driver.h"
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
+#include <algorithm>
#include <sstream>
#include <deque>
-#include <algorithm>
-#include <set>
#include <vector>
#include <cassert>
#include "./pgr_dijkstra.hpp"
#include "./pgr_withPoints.hpp"
-#include "./many_to_many_withPoints_driver.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/pgr_assert.h"
+
#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_assert.h"
+#include "./../../common/src/pgr_types.h"
+
+template < class G >
+std::deque< Path >
+pgr_dijkstra(
+ G &graph,
+ std::vector < int64_t > sources,
+ std::vector < int64_t > targets,
+ bool only_cost,
+ bool normal) {
+ std::sort(sources.begin(), sources.end());
+ sources.erase(
+ std::unique(sources.begin(), sources.end()),
+ sources.end());
+
+ std::sort(targets.begin(), targets.end());
+ targets.erase(
+ std::unique(targets.begin(), targets.end()),
+ targets.end());
+
+ Pgr_dijkstra< G > fn_dijkstra;
+ auto paths = fn_dijkstra.dijkstra(graph, sources, targets, only_cost);
+
+ if (!normal) {
+ for (auto &path : paths) {
+ path.reverse();
+ }
+ }
+ return paths;
+}
// CREATE OR REPLACE FUNCTION pgr_withPoint(
@@ -57,101 +80,111 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
// end_pid BIGINT,
// directed BOOLEAN DEFAULT true
-int
+void
do_pgr_many_to_many_withPoints(
- pgr_edge_t *edges,
- size_t total_edges,
- Point_on_edge_t *points_p,
- size_t total_points,
- pgr_edge_t *edges_of_points,
- size_t total_edges_of_points,
- int64_t *start_pidsArr,
- size_t size_start_pidsArr,
- int64_t *end_pidsArr,
- size_t size_end_pidsArr,
+ pgr_edge_t *edges, size_t total_edges,
+ Point_on_edge_t *points_p, size_t total_points,
+ pgr_edge_t *edges_of_points, size_t total_edges_of_points,
+ int64_t *start_pidsArr, size_t size_start_pidsArr,
+ int64_t *end_pidsArr, size_t size_end_pidsArr,
char driving_side,
bool details,
bool directed,
bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** err_msg) {
+ bool normal,
+
+ General_path_element_t **return_tuples, size_t *return_count,
+
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg) {
std::ostringstream log;
+ std::ostringstream notice;
+ std::ostringstream err;
try {
+ pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
+ pgassert(!(*err_msg));
+ pgassert(!(*return_tuples));
+ pgassert((*return_count) == 0);
+ pgassert(edges);
+ pgassert(points_p);
+ pgassert(edges_of_points);
+ pgassert(start_pidsArr);
+ pgassert(end_pidsArr);
+
std::vector< Point_on_edge_t >
points(points_p, points_p + total_points);
+ if (!normal) {
+ for (auto &point : points) {
+ if (point.side == 'r') {
+ point.side = 'l';
+ } else if (point.side == 'l') {
+ point.side = 'r';
+ }
+ point.fraction = 1 - point.fraction;
+ }
+ if (driving_side == 'r') {
+ driving_side = 'l';
+ } else if (driving_side == 'l') {
+ driving_side = 'r';
+ }
+ }
+
int errcode = check_points(points, log);
if (errcode) {
- /* Point(s) with same pid but different edge/fraction/side combination found */
- *err_msg = strdup(log.str().c_str());
- return errcode;
+ *log_msg = strdup(log.str().c_str());
+ err << "Unexpected point(s) with same pid"
+ << " but different edge/fraction/side combination found.";
+ *err_msg = pgr_msg(err.str().c_str());
+ return;
}
+
std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
+ edges_to_modify(
+ edges_of_points, edges_of_points + total_edges_of_points);
std::vector< pgr_edge_t > new_edges;
create_new_edges(
points,
edges_to_modify,
driving_side,
- new_edges);
-
+ new_edges, log);
- std::set< int64_t > s_start_vertices(start_pidsArr, start_pidsArr + size_start_pidsArr);
- std::set< int64_t > s_end_vertices(end_pidsArr, end_pidsArr + size_end_pidsArr);
- std::vector< int64_t > start_vertices(s_start_vertices.begin(), s_start_vertices.end());
- std::vector< int64_t > end_vertices(s_end_vertices.begin(), s_end_vertices.end());
+ std::vector<int64_t>
+ start_vertices(start_pidsArr, start_pidsArr + size_start_pidsArr);
+ std::vector< int64_t >
+ end_vertices(end_pidsArr, end_pidsArr + size_end_pidsArr);
-#if 0
-
- std::set< int64_t > start_vertices;
- std::set< int64_t > end_vertices;
- for (const auto &start_pid : start_points) {
- for (const auto point : points) {
- if (point.pid == start_pid) {
- start_vertices.insert(point.vertex_id);
- break;
- }
- }
- }
- for (const auto &end_pid : end_points) {
- for (const auto point : points) {
- if (point.pid == end_pid) {
- end_vertices.insert(point.vertex_id);
- break;
- }
- }
- }
-#endif
graphType gType = directed? DIRECTED: UNDIRECTED;
std::deque< Path > paths;
-
if (directed) {
log << "Working with directed Graph\n";
pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
- pgr_dijkstra(digraph, paths, start_vertices, end_vertices, only_cost);
+ digraph.insert_edges(edges, total_edges);
+ digraph.insert_edges(new_edges);
+ paths = pgr_dijkstra(
+ digraph,
+ start_vertices, end_vertices,
+ only_cost, normal);
} else {
log << "Working with Undirected Graph\n";
pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
- pgr_dijkstra(undigraph, paths, start_vertices, end_vertices, only_cost);
+ undigraph.insert_edges(edges, total_edges);
+ undigraph.insert_edges(new_edges);
+ paths = pgr_dijkstra(
+ undigraph,
+ start_vertices, end_vertices,
+ only_cost, normal);
}
-#if 0
- for (auto &path : paths) {
- adjust_pids(points, path);
- }
-#endif
if (!details) {
for (auto &path : paths) {
eliminate_details(path, edges_to_modify);
@@ -177,34 +210,41 @@ do_pgr_many_to_many_withPoints(
if (count == 0) {
(*return_tuples) = NULL;
(*return_count) = 0;
+#if 0
log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
- return 0;
+ "No paths found";
+ *err_msg = pgr_msg(log.str().c_str());
+#endif
+ return;
}
(*return_tuples) = pgr_alloc(count, (*return_tuples));
log << "Converting a set of paths into the tuples\n";
(*return_count) = (collapse_paths(return_tuples, paths));
- return 0;
+ *log_msg = log.str().empty()?
+ *log_msg :
+ pgr_msg(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ *notice_msg :
+ pgr_msg(notice.str().c_str());
} catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- log << except.what() << "\n";
- *err_msg = strdup(log.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
+ } catch (std::exception &except) {
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- log << except.what() << "\n";
- *err_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
} catch(...) {
- if (*return_tuples) free(*return_tuples);
+ (*return_tuples) = pgr_free(*return_tuples);
(*return_count) = 0;
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
+ err << "Caught unknown exception!";
+ *err_msg = pgr_msg(err.str().c_str());
+ *log_msg = pgr_msg(log.str().c_str());
}
-
- return 1000;
}
-
diff --git a/src/withPoints/src/many_to_many_withPoints_driver.h b/src/withPoints/src/many_to_many_withPoints_driver.h
index c419749..9a7dcd3 100644
--- a/src/withPoints/src/many_to_many_withPoints_driver.h
+++ b/src/withPoints/src/many_to_many_withPoints_driver.h
@@ -43,7 +43,7 @@ extern "C" {
// start_pid ANYARRAY,
// end_pid BIGINT,
// directed BOOLEAN DEFAULT true,
- int do_pgr_many_to_many_withPoints(
+ void do_pgr_many_to_many_withPoints(
pgr_edge_t *edges,
size_t total_edges,
@@ -64,9 +64,13 @@ extern "C" {
bool details,
bool directed,
bool only_cost,
+ bool normal,
+
General_path_element_t **return_tuples,
size_t *return_count,
- char ** err_msg);
+ char** log_msg,
+ char** notice_msg,
+ char** err_msg);
#ifdef __cplusplus
}
diff --git a/src/withPoints/src/many_to_one_withPoints.c b/src/withPoints/src/many_to_one_withPoints.c
index 6971526..51bed34 100644
--- a/src/withPoints/src/many_to_one_withPoints.c
+++ b/src/withPoints/src/many_to_one_withPoints.c
@@ -27,50 +27,45 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./../../common/src/points_input.h"
#include "./get_new_queries.h"
-#include "./many_to_one_withPoints_driver.h"
+#include "./many_to_many_withPoints_driver.h"
PGDLLEXPORT Datum many_to_one_withPoints(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(many_to_one_withPoints);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char* edges_sql,
char* points_sql,
- int64_t *start_pidsArr,
- size_t size_start_pidsArr,
+ ArrayType *starts,
int64_t end_pid,
bool directed,
- char *driving_side,
+ char* driving_side,
bool details,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- driving_side[0] = (char) tolower(driving_side[0]);
+ driving_side[0] = estimate_drivingSide(driving_side[0]);
+ PGR_DBG("estimated driving side:%c", driving_side[0]);
pgr_SPI_connect();
+ size_t size_start_pidsArr = 0;
+ int64_t* start_pidsArr =
+ pgr_get_bigIntArray(&size_start_pidsArr, starts);
+
Point_on_edge_t *points = NULL;
size_t total_points = 0;
pgr_get_points(points_sql, &points, &total_points);
@@ -86,12 +81,13 @@ process(
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
+ pgr_get_edges_reversed(
+ edges_of_points_query, &edges_of_points, &total_edges_of_points);
pgr_edge_t *edges = NULL;
size_t total_edges = 0;
- pgr_get_edges(edges_no_points_query, &edges, &total_edges);
+ pgr_get_edges_reversed(edges_no_points_query, &edges, &total_edges);
free(edges_of_points_query);
free(edges_no_points_query);
@@ -103,55 +99,62 @@ process(
return;
}
- char *err_msg = NULL;
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- int errcode = do_pgr_many_to_one_withPoints(
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_withPoints(
edges, total_edges,
points, total_points,
edges_of_points, total_edges_of_points,
+ &end_pid, 1,
start_pidsArr, size_start_pidsArr,
- end_pid,
driving_side[0],
details,
directed,
only_cost,
+ false,
result_tuples,
result_count,
+ &log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing withPoints many to one", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("Returned message = %s\n", err_msg);
- if (err_msg) free(err_msg);
+ if (only_cost) {
+ time_msg("processing pgr_withPointsCost(many to one)",
+ start_t, clock());
+ } else {
+ time_msg("processing pgr_withPoints(many to one)", start_t, clock());
+ }
- pfree(edges);
- pgr_SPI_finish();
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+ pgr_global_report(log_msg, notice_msg, err_msg);
- if (errcode) {
- free(start_pidsArr);
- pgr_send_error(errcode);
- }
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (start_pidsArr) pfree(start_pidsArr);
+
+ pgr_SPI_finish();
}
-/* */
-/*******************************************************************************/
-PG_FUNCTION_INFO_V1(many_to_one_withPoints);
PGDLLEXPORT Datum
many_to_one_withPoints(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ /**********************************************************************/
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -159,8 +162,7 @@ many_to_one_withPoints(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPoint(
// edges_sql TEXT,
// points_sql TEXT,
@@ -171,31 +173,28 @@ many_to_one_withPoints(PG_FUNCTION_ARGS) {
// directed BOOLEAN -- DEFAULT true,
// only_cost BOOLEAN DEFAULT false,
-
- int64_t* start_pidsArr;
- size_t size_start_pidsArr;
- start_pidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_start_pidsArr, PG_GETARG_ARRAYTYPE_P(2));
-
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
- start_pidsArr, size_start_pidsArr,
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
+ PG_GETARG_ARRAYTYPE_P(2),
PG_GETARG_INT64(3),
PG_GETARG_BOOL(4),
- pgr_text2char(PG_GETARG_TEXT_P(5)),
+ text_to_cstring(PG_GETARG_TEXT_P(5)),
PG_GETARG_BOOL(6),
PG_GETARG_BOOL(7),
&result_tuples,
&result_count);
- if (start_pidsArr) free(start_pidsArr);
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -206,19 +205,16 @@ many_to_one_withPoints(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// OUT seq BIGINT,
// OUT path_seq,
// OUT node BIGINT,
@@ -237,23 +233,20 @@ many_to_one_withPoints(PG_FUNCTION_ARGS) {
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].start_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
+
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/src/withPoints/src/many_to_one_withPoints_driver.cpp b/src/withPoints/src/many_to_one_withPoints_driver.cpp
deleted file mode 100644
index 83ac5b6..0000000
--- a/src/withPoints/src/many_to_one_withPoints_driver.cpp
+++ /dev/null
@@ -1,171 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: one_to_many_withPoints_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <algorithm>
-#include <set>
-#include <sstream>
-#include <deque>
-#include <vector>
-#include <cassert>
-
-#include "./pgr_dijkstra.hpp"
-#include "./pgr_withPoints.hpp"
-#include "./many_to_one_withPoints_driver.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/pgr_alloc.hpp"
-
-
-// CREATE OR REPLACE FUNCTION pgr_withPoint(
-// edges_sql TEXT,
-// points_sql TEXT,
-// start_pid ANYARRAY,
-// end_pid BIGINT,
-// directed BOOLEAN DEFAULT true
-
-
-int
-do_pgr_many_to_one_withPoints(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points_p, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t *start_pidsArr, size_t size_start_pidsArr,
- int64_t end_vid,
- char driving_side,
- bool details,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples, size_t *return_count,
- char ** err_msg) {
- std::ostringstream log;
- try {
- std::vector< Point_on_edge_t >
- points(points_p, points_p + total_points);
-
- int errcode = check_points(points, log);
- if (errcode) {
- /* Point(s) with same pid but different edge/fraction/side combination found */
- *err_msg = strdup(log.str().c_str());
- return errcode;
- }
-
- std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
-
- std::vector< pgr_edge_t > new_edges;
-
- create_new_edges(
- points,
- edges_to_modify,
- driving_side,
- new_edges);
-
-
- std::set< int64_t > s_start_vertices(start_pidsArr, start_pidsArr + size_start_pidsArr);
- std::vector< int64_t > start_vertices(s_start_vertices.begin(), s_start_vertices.end());
-
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- std::deque< Path > paths;
-
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
- pgr_dijkstra(digraph, paths, start_vertices, end_vid, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
- pgr_dijkstra(undigraph, paths, start_vertices, end_vid, only_cost);
- }
-
-#if 0
- for (auto &path : paths) {
- adjust_pids(points, path);
- }
-#endif
- if (!details) {
- for (auto &path : paths) {
- eliminate_details(path, edges_to_modify);
- }
- }
-
- /*
- * order paths based on the start_pid
- */
- std::sort(paths.begin(), paths.end(), [](const Path &a, const Path &b) {
- return a.start_id() < b.start_id();
- });
-
- size_t count(0);
- count = count_tuples(paths);
-
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *err_msg = strdup(log.str().c_str());
- return 0;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
-#ifndef NDEBUG
- {
- std::ostringstream log;
- log << "OK";
- *err_msg = strdup(log.str().c_str());
- }
-
-#else
- *err_msg = strdup(log.str().c_str());
-#endif
- return 0;
- } catch ( ... ) {
- log << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
- return 1000;
- }
- return 0;
-}
-
diff --git a/src/withPoints/src/many_to_one_withPoints_driver.h b/src/withPoints/src/many_to_one_withPoints_driver.h
deleted file mode 100644
index 1f986d4..0000000
--- a/src/withPoints/src/many_to_one_withPoints_driver.h
+++ /dev/null
@@ -1,66 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: withPoints_driver.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_WITHPOINTS_SRC_MANY_TO_ONE_WITHPOINTS_DRIVER_H_
-#define SRC_WITHPOINTS_SRC_MANY_TO_ONE_WITHPOINTS_DRIVER_H_
-
-#pragma once
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-// CREATE OR REPLACE FUNCTION pgr_withPoint(
-// edges_sql TEXT,
-// points_sql TEXT,
-// start_pid ANYARRAY,
-// end_pid BIGINT,
-// directed BOOLEAN DEFAULT true,
- int do_pgr_many_to_one_withPoints(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t *start_pidsArr, size_t size_start_pidsArr,
-
- int64_t end_pid,
-
-
- char driving_side,
- bool details,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples, size_t *return_count,
- char ** err_msg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_WITHPOINTS_SRC_MANY_TO_ONE_WITHPOINTS_DRIVER_H_
diff --git a/src/withPoints/src/msg_logger.hpp b/src/withPoints/src/msg_logger.hpp
deleted file mode 100644
index da51caf..0000000
--- a/src/withPoints/src/msg_logger.hpp
+++ /dev/null
@@ -1,47 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: msg_logger.hpp
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#pragma once
-
-#include <string>
-#include <vector>
-#include "./../../common/src/pgr_types.h"
-
-void
-PGR_LOG_POINTS(
- std::ostringstream &log,
- const std::vector< Point_on_edge_t > &points,
- const std::string &title) {
- log << title << "\n";
- for (const auto &p : points) {
- log << p.pid << "\t"
- << p.edge_id << "\t"
- << p.fraction << "\t"
- << p.side << "\n";
- }
-}
diff --git a/src/withPoints/src/one_to_many_withPoints.c b/src/withPoints/src/one_to_many_withPoints.c
index 32ed61e..57d789d 100644
--- a/src/withPoints/src/one_to_many_withPoints.c
+++ b/src/withPoints/src/one_to_many_withPoints.c
@@ -27,71 +27,49 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/arrays_input.h"
#include "./../../common/src/points_input.h"
#include "./get_new_queries.h"
-#include "./one_to_many_withPoints_driver.h"
+#include "./many_to_many_withPoints_driver.h"
PGDLLEXPORT Datum one_to_many_withPoints(PG_FUNCTION_ARGS);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
char* edges_sql,
char* points_sql,
int64_t start_pid,
- int64_t *end_pidsArr,
- size_t size_end_pidsArr,
+ ArrayType *ends,
bool directed,
char *driving_side,
bool details,
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- driving_side[0] = (char) tolower(driving_side[0]);
- PGR_DBG("driving side:%c", driving_side[0]);
- if (!((driving_side[0] == 'r')
- || (driving_side[0] == 'l'))) {
- driving_side[0] = 'b';
- }
+ driving_side[0] = estimate_drivingSide(driving_side[0]);
PGR_DBG("estimated driving side:%c", driving_side[0]);
+
pgr_SPI_connect();
+ size_t size_end_pidsArr = 0;
+ int64_t* end_pidsArr =
+ pgr_get_bigIntArray(&size_end_pidsArr, ends);
+
PGR_DBG("load the points");
- Point_on_edge_t *points = NULL;
size_t total_points = 0;
+ Point_on_edge_t *points = NULL;
pgr_get_points(points_sql, &points, &total_points);
-#if 0
-#ifndef NDEBUG
- size_t i = 0;
- for (i = 0; i < total_points; i ++) {
- PGR_DBG("%ld\t%ld\t%f\t%c", points[i].pid, points[i].edge_id, points[i].fraction, points[i].side);
- }
-#endif
-#endif
- /*
- * TODO move this code to c++
- */
PGR_DBG(" -- change the query");
char *edges_of_points_query = NULL;
char *edges_no_points_query = NULL;
@@ -106,21 +84,10 @@ process(
PGR_DBG("load the edges that match the points");
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
+ pgr_get_edges(
+ edges_of_points_query, &edges_of_points, &total_edges_of_points);
PGR_DBG("Total %ld edges in query:", total_edges_of_points);
-#if 0
-#ifndef NDEBUG
- for (i = 0; i < total_edges_of_points; i ++) {
- PGR_DBG("%ld\t%ld\t%ld\t%f\t%f",
- edges_of_points[i].id,
- edges_of_points[i].source,
- edges_of_points[i].target,
- edges_of_points[i].cost,
- edges_of_points[i].reverse_cost);
- }
-#endif
-#endif
PGR_DBG("load the edges that don't match the points");
@@ -129,82 +96,76 @@ process(
pgr_get_edges(edges_no_points_query, &edges, &total_edges);
PGR_DBG("Total %ld edges in query:", total_edges);
-#if 0
-#ifndef NDEBUG
- for (i = 0; i < total_edges; i ++) {
- PGR_DBG("%ld\t%ld\t%ld\t%f\t%f",
- edges[i].id,
- edges[i].source,
- edges[i].target,
- edges[i].cost,
- edges[i].reverse_cost);
- }
-#endif
- PGR_DBG("freeing allocated memory not used anymore");
-#endif
+
free(edges_of_points_query);
free(edges_no_points_query);
if ((total_edges + total_edges_of_points) == 0) {
PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- do_pgr_one_to_many_withPoints(
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_withPoints(
edges, total_edges,
points, total_points,
edges_of_points, total_edges_of_points,
- start_pid,
+ &start_pid, 1,
end_pidsArr, size_end_pidsArr,
+
driving_side[0],
details,
directed,
only_cost,
- result_tuples,
- result_count,
+ true,
+
+ result_tuples, result_count,
+
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing withPoints one to many", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
+ if (only_cost) {
+ time_msg("processing pgr_withPointsCost(one to many)",
+ start_t, clock());
+ } else {
+ time_msg("processing pgr_withPoints(one to many)", start_t, clock());
+ }
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- if (end_pidsArr) free(end_pidsArr);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
}
- pfree(edges);
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (points) pfree(points);
+ if (edges_of_points) pfree(edges_of_points);
+ if (end_pidsArr) pfree(end_pidsArr);
pgr_SPI_finish();
}
-/* */
-/*******************************************************************************/
PG_FUNCTION_INFO_V1(one_to_many_withPoints);
PGDLLEXPORT Datum
one_to_many_withPoints(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
- General_path_element_t *result_tuples = 0;
+ /**********************************************************************/
+ General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -212,8 +173,7 @@ one_to_many_withPoints(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPoint(
// edges_sql TEXT,
// points_sql TEXT,
@@ -225,32 +185,29 @@ one_to_many_withPoints(PG_FUNCTION_ARGS) {
// only_cost BOOLEAN DEFAULT false,
- PGR_DBG("Initializing arrays");
- int64_t* end_pidsArr;
- size_t size_end_pidsArr;
- end_pidsArr = (int64_t*)
- pgr_get_bigIntArray(&size_end_pidsArr, PG_GETARG_ARRAYTYPE_P(3));
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
PG_GETARG_INT64(2),
- end_pidsArr, size_end_pidsArr,
+ PG_GETARG_ARRAYTYPE_P(3),
PG_GETARG_BOOL(4),
- pgr_text2char(PG_GETARG_TEXT_P(5)),
+ text_to_cstring(PG_GETARG_TEXT_P(5)),
PG_GETARG_BOOL(6),
PG_GETARG_BOOL(7),
&result_tuples,
&result_count);
- PGR_DBG("Cleaning arrays");
- free(end_pidsArr);
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -261,19 +218,16 @@ one_to_many_withPoints(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// OUT seq BIGINT,
// OUT path_seq,
// OUT node BIGINT,
@@ -292,22 +246,20 @@ one_to_many_withPoints(PG_FUNCTION_ARGS) {
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].node);
- values[4] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[5] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[6] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].end_id);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[4] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[6] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
+
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/withPoints/src/one_to_many_withPoints_driver.cpp b/src/withPoints/src/one_to_many_withPoints_driver.cpp
deleted file mode 100644
index 50e0366..0000000
--- a/src/withPoints/src/one_to_many_withPoints_driver.cpp
+++ /dev/null
@@ -1,209 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: one_to_many_withPoints_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <set>
-#include <algorithm>
-#include <sstream>
-#include <deque>
-#include <vector>
-#include <cassert>
-
-
-#include "./pgr_dijkstra.hpp"
-#include "./pgr_withPoints.hpp"
-#include "./one_to_many_withPoints_driver.h"
-
-#include "./../../common/src/basic_vertex.h"
-#include "./../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/pgr_assert.h"
-
-// CREATE OR REPLACE FUNCTION pgr_withPoint(
-// edges_sql TEXT,
-// points_sql TEXT,
-// start_pid BIGINT,
-// end_pid BIGINT,
-// directed BOOLEAN DEFAULT true
-
-
-void
-do_pgr_one_to_many_withPoints(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points_p, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t start_vid,
- int64_t *end_pidsArr, size_t size_end_pidsArr,
- char driving_side,
- bool details,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples, size_t *return_count,
- char ** log_msg,
- char ** err_msg) {
- std::ostringstream log;
- std::ostringstream err;
- try {
- pgassert(!(*return_tuples));
- pgassert((*return_count) == 0);
- pgassert(!(*log_msg));
- pgassert(!(*err_msg));
-
- /*
- * DOCUMENT:
- * - Points are treated as the same point when the pid is the same
- * therefore when two points have the same pid, but different edge/fraction
- * an error is generated.
- */
- std::vector< Point_on_edge_t >
- points(points_p, points_p + total_points);
-
- int errcode = check_points(points, log);
- if (errcode) {
- *log_msg = strdup(log.str().c_str());
- err << "Unexpected point(s) with same pid but different edge/fraction/side combination found.";
- *err_msg = strdup(err.str().c_str());
- return;
- }
-
-
- std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
-
- std::vector< pgr_edge_t > new_edges;
-
- log << "driving_side" << driving_side << "\n";
- create_new_edges(
- points,
- edges_to_modify,
- driving_side,
- new_edges);
-
- log << "Inserting points into a c++ vector structure\n";
- /*
- * Eliminating duplicates
- * & ordering the points
- */
- std::set< int64_t > s_end_vertices(end_pidsArr, end_pidsArr + size_end_pidsArr);
-
- std::vector< int64_t > end_vertices(s_end_vertices.begin(), s_end_vertices.end());
-
- log << "start_vid" << start_vid << "\n";
- log << "end_vertices";
-
- for (const auto &vid : end_vertices) {
- log << vid << "\n";
- }
-
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- std::deque< Path > paths;
-
-
- if (directed) {
- log << "Working with directed Graph\n";
- pgrouting::DirectedGraph digraph(
- pgrouting::extract_vertices(
- pgrouting::extract_vertices(edges, total_edges),
- new_edges),
- gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
- pgr_dijkstra(digraph, paths, start_vid, end_vertices, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
- auto vertices(pgrouting::extract_vertices(edges, total_edges));
- vertices = pgrouting::extract_vertices(vertices, new_edges);
- pgrouting::UndirectedGraph undigraph(vertices, gType);
- vertices.clear();
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
- pgr_dijkstra(undigraph, paths, start_vid, end_vertices, only_cost);
- }
-
- if (!details) {
- for (auto &path : paths) {
- eliminate_details(path, edges_to_modify);
- }
- }
- /*
- * order paths based on the end_pid
- */
- std::sort(paths.begin(), paths.end(), [](const Path &a, const Path &b) {
- return a.end_id() < b.end_id();
- });
-
- size_t count(0);
- count = count_tuples(paths);
-
-
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *log_msg = strdup(log.str().c_str());
- return;
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
-
-
- *log_msg = strdup(log.str().c_str());
- pgassert(!(*err_msg));
- return;
- } catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- } catch(...) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- }
-}
-
diff --git a/src/withPoints/src/one_to_many_withPoints_driver.h b/src/withPoints/src/one_to_many_withPoints_driver.h
deleted file mode 100644
index a92ffa0..0000000
--- a/src/withPoints/src/one_to_many_withPoints_driver.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: withPoints_driver.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_WITHPOINTS_SRC_ONE_TO_MANY_WITHPOINTS_DRIVER_H_
-#define SRC_WITHPOINTS_SRC_ONE_TO_MANY_WITHPOINTS_DRIVER_H_
-
-#pragma once
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
- // CREATE OR REPLACE FUNCTION pgr_withPoint(
- // edges_sql TEXT,
- // points_sql TEXT,
- // start_pid BIGINT,
- // end_pid BIGINT,
- // directed BOOLEAN DEFAULT true,
- void do_pgr_one_to_many_withPoints(
- pgr_edge_t *edges,
- size_t total_edges,
-
- Point_on_edge_t *points,
- size_t total_points,
-
- pgr_edge_t *edges_of_points,
- size_t total_edges_of_points,
-
- int64_t start_pid,
-
- int64_t *end_pidsArr,
- size_t size_end_pidsArr,
-
- char driving_side,
- bool details,
- bool directed,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_WITHPOINTS_SRC_ONE_TO_MANY_WITHPOINTS_DRIVER_H_
diff --git a/src/withPoints/src/one_to_one_withPoints.c b/src/withPoints/src/one_to_one_withPoints.c
index d80836a..0f32926 100644
--- a/src/withPoints/src/one_to_one_withPoints.c
+++ b/src/withPoints/src/one_to_one_withPoints.c
@@ -27,30 +27,21 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
-#include "funcapi.h"
+#include "./../../common/src/postgres_connection.h"
#include "utils/array.h"
-#include "catalog/pg_type.h"
-#if PGSQL_VERSION > 92
-#include "access/htup_details.h"
-#endif
-
-#include "fmgr.h"
+#include "./../../common/src/debug_macro.h"
+#include "./../../common/src/e_report.h"
+#include "./../../common/src/time_msg.h"
#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
#include "./../../common/src/edges_input.h"
#include "./../../common/src/points_input.h"
#include "./get_new_queries.h"
-#include "./one_to_one_withPoints_driver.h"
-#include "./../../common/src/debug_macro.h"
-#include "./../../common/src/time_msg.h"
+#include "./many_to_many_withPoints_driver.h"
PGDLLEXPORT Datum one_to_one_withPoints(PG_FUNCTION_ARGS);
+PG_FUNCTION_INFO_V1(one_to_one_withPoints);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
static
void
process(
@@ -64,12 +55,7 @@ process(
bool only_cost,
General_path_element_t **result_tuples,
size_t *result_count) {
- driving_side[0] = (char) tolower(driving_side[0]);
- PGR_DBG("driving side:%c", driving_side[0]);
- if (!((driving_side[0] == 'r')
- || (driving_side[0] == 'l'))) {
- driving_side[0] = 'b';
- }
+ driving_side[0] = estimate_drivingSide(driving_side[0]);
PGR_DBG("estimated driving side:%c", driving_side[0]);
pgr_SPI_connect();
@@ -79,13 +65,6 @@ process(
size_t total_points = 0;
pgr_get_points(points_sql, &points, &total_points);
-#ifndef NDEBUG
- size_t i = 0;
- for (i = 0; i < total_points; i ++) {
- PGR_DBG("%ld\t%ld\t%f\t%c", points[i].pid, points[i].edge_id, points[i].fraction, points[i].side);
- }
-#endif
-
PGR_DBG(" -- change the query");
char *edges_of_points_query = NULL;
char *edges_no_points_query = NULL;
@@ -100,20 +79,10 @@ process(
PGR_DBG("load the edges that match the points");
pgr_edge_t *edges_of_points = NULL;
size_t total_edges_of_points = 0;
- pgr_get_edges(edges_of_points_query, &edges_of_points, &total_edges_of_points);
+ pgr_get_edges(
+ edges_of_points_query, &edges_of_points, &total_edges_of_points);
PGR_DBG("Total %ld edges in query:", total_edges_of_points);
-#ifndef NDEBUG
- for (i = 0; i < total_edges_of_points; i ++) {
- PGR_DBG("%ld\t%ld\t%ld\t%f\t%f",
- edges_of_points[i].id,
- edges_of_points[i].source,
- edges_of_points[i].target,
- edges_of_points[i].cost,
- edges_of_points[i].reverse_cost);
- }
-#endif
-
PGR_DBG("load the edges that don't match the points");
@@ -122,16 +91,6 @@ process(
pgr_get_edges(edges_no_points_query, &edges, &total_edges);
PGR_DBG("Total %ld edges in query:", total_edges);
-#ifndef NDEBUG
- for (i = 0; i < total_edges; i ++) {
- PGR_DBG("%ld\t%ld\t%ld\t%f\t%f",
- edges[i].id,
- edges[i].source,
- edges[i].target,
- edges[i].cost,
- edges[i].reverse_cost);
- }
-#endif
PGR_DBG("freeing allocated memory not used anymore");
free(edges_of_points_query);
@@ -139,65 +98,65 @@ process(
if ((total_edges + total_edges_of_points) == 0) {
PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
- PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
+ PGR_DBG("Starting timer");
clock_t start_t = clock();
- do_pgr_withPoints(
- edges,
- total_edges,
- points,
- total_points,
- edges_of_points,
- total_edges_of_points,
- start_pid,
- end_pid,
- directed,
+ char* log_msg = NULL;
+ char* notice_msg = NULL;
+ char* err_msg = NULL;
+ do_pgr_many_to_many_withPoints(
+ edges, total_edges,
+ points, total_points,
+ edges_of_points, total_edges_of_points,
+ &start_pid, 1,
+ &end_pid, 1,
driving_side[0],
details,
+ directed,
only_cost,
- result_tuples,
- result_count,
+ true,
+ result_tuples, result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing withPoints one to one", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
-
- if (err_msg) {
- if (*result_tuples) free(*result_tuples);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
+
+ if (only_cost) {
+ time_msg("processing pgr_withPointsCost(one to one)", start_t, clock());
+ } else {
+ time_msg("processing pgr_withPoints(one to one)", start_t, clock());
}
- pfree(edges);
+
+ if (err_msg && (*result_tuples)) {
+ pfree(*result_tuples);
+ (*result_count) = 0;
+ (*result_tuples) = NULL;
+ }
+
+ pgr_global_report(log_msg, notice_msg, err_msg);
+
+ if (log_msg) pfree(log_msg);
+ if (notice_msg) pfree(notice_msg);
+ if (err_msg) pfree(err_msg);
+ if (edges) pfree(edges);
+ if (points) pfree(points);
+ if (edges_of_points) pfree(edges_of_points);
+
pgr_SPI_finish();
}
-/* */
-/*******************************************************************************/
-PG_FUNCTION_INFO_V1(one_to_one_withPoints);
PGDLLEXPORT Datum
one_to_one_withPoints(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
- /* */
+ /**********************************************************************/
General_path_element_t *result_tuples = NULL;
size_t result_count = 0;
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
if (SRF_IS_FIRSTCALL()) {
MemoryContext oldcontext;
@@ -205,8 +164,7 @@ one_to_one_withPoints(PG_FUNCTION_ARGS) {
oldcontext = MemoryContextSwitchTo(funcctx->multi_call_memory_ctx);
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// CREATE OR REPLACE FUNCTION pgr_withPoint(
// edges_sql TEXT,
// points_sql TEXT,
@@ -217,25 +175,27 @@ one_to_one_withPoints(PG_FUNCTION_ARGS) {
// details BOOLEAN -- DEFAULT true,
// only_cost BOOLEAN DEFAULT false,
- PGR_DBG("Calling process");
- PGR_DBG("initial driving side:%s", pgr_text2char(PG_GETARG_TEXT_P(5)));
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
- pgr_text2char(PG_GETARG_TEXT_P(1)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(1)),
PG_GETARG_INT64(2),
PG_GETARG_INT64(3),
PG_GETARG_BOOL(4),
- pgr_text2char(PG_GETARG_TEXT_P(5)),
+ text_to_cstring(PG_GETARG_TEXT_P(5)),
PG_GETARG_BOOL(6),
PG_GETARG_BOOL(7),
&result_tuples,
&result_count);
- /* */
- /*******************************************************************************/
+ /**********************************************************************/
+#if PGSQL_VERSION > 95
+ funcctx->max_calls = result_count;
+#else
funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE)
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
@@ -246,19 +206,16 @@ one_to_one_withPoints(PG_FUNCTION_ARGS) {
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = (uint32_t)funcctx->call_cntr;
- max_calls = (uint32_t)funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (General_path_element_t*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool * nulls;
- /*******************************************************************************/
- /* MODIFY AS NEEDED */
+ /**********************************************************************/
// OUT seq BIGINT,
// OUT path_seq,
// OUT node BIGINT,
@@ -275,23 +232,19 @@ one_to_one_withPoints(PG_FUNCTION_ARGS) {
nulls[i] = false;
}
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
- // postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].node);
- values[3] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[4] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[5] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
-
SRF_RETURN_DONE(funcctx);
}
}
diff --git a/src/withPoints/src/one_to_one_withPoints_driver.cpp b/src/withPoints/src/one_to_one_withPoints_driver.cpp
deleted file mode 100644
index 6c2e8dc..0000000
--- a/src/withPoints/src/one_to_one_withPoints_driver.cpp
+++ /dev/null
@@ -1,191 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: withPoints_driver.cpp
-
-Generated with Template by:
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
-
-#include <sstream>
-#include <deque>
-#include <vector>
-#include "./pgr_dijkstra.hpp"
-#include "./pgr_withPoints.hpp"
-#include "./one_to_one_withPoints_driver.h"
-
-
-#include "./../../common/src/basic_vertex.h"
-#include "./../../common/src/pgr_alloc.hpp"
-#include "./../../common/src/pgr_assert.h"
-
-
-// CREATE OR REPLACE FUNCTION pgr_withPoint(
-// edges_sql TEXT,
-// points_sql TEXT,
-// start_pid BIGINT,
-// end_pid BIGINT,
-// directed BOOLEAN DEFAULT true
-
-
-void
-do_pgr_withPoints(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points_p, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t start_pid,
- int64_t end_pid,
- bool directed,
- char driving_side,
- bool details,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg) {
- std::ostringstream log;
- std::ostringstream err;
- try {
- pgassert(!(*return_tuples));
- pgassert((*return_count) == 0);
- pgassert(!(*log_msg));
- pgassert(!(*err_msg));
-
- log << "ntering do_pgr_withPoints\n";
- std::vector< Point_on_edge_t >
- points(points_p, points_p + total_points);
-
- log << "total points" << points.size() << "\n";
-
- /*
- * This test is easier in C++
- */
- int errcode = check_points(points, log);
- if (errcode) {
- *log_msg = strdup(log.str().c_str());
- err << "Unexpected point(s) with same pid but different edge/fraction/side combination found.";
- *err_msg = strdup(err.str().c_str());
- return;
- }
-
- std::vector< pgr_edge_t >
- edges_to_modify(edges_of_points, edges_of_points + total_edges_of_points);
-
- std::vector< pgr_edge_t > new_edges;
- log << "start_pid" << start_pid << "\n";
- log << "end_pid" << end_pid << "\n";
- log << "driving_side" << driving_side << "\n";
- create_new_edges(
- points,
- edges_to_modify,
- driving_side,
- new_edges,
- log);
-
- int64_t start_vid(start_pid);
- int64_t end_vid(end_pid);
-
- log << "start_vid" << start_vid << "\n";
- log << "end_vid" << end_vid << "\n";
- graphType gType = directed? DIRECTED: UNDIRECTED;
-
- Path path;
-
- auto vertices(pgrouting::extract_vertices(edges, total_edges));
- vertices = pgrouting::extract_vertices(vertices, new_edges);
-
- log << "extracted vertices: ";
- for (const auto v : vertices) {
- log << v.id << ", ";
- }
- log << "\n";
-
- if (directed) {
- log << "Working with directed Graph\n";
-
- pgrouting::DirectedGraph digraph(vertices, gType);
- digraph.graph_insert_data(edges, total_edges);
- digraph.graph_insert_data(new_edges);
-
-
- pgr_dijkstra(digraph, path, start_vid, end_vid, only_cost);
- } else {
- log << "Working with Undirected Graph\n";
-
- pgrouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(edges, total_edges);
- undigraph.graph_insert_data(new_edges);
-
- pgr_dijkstra(undigraph, path, start_vid, end_vid, only_cost);
- }
-
-
- size_t count(path.size());
- if (count == 0) {
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err <<
- "No paths found between Starting and any of the Ending vertices\n";
- *log_msg = strdup(err.str().c_str());
- return;
- }
-
- if (!details) {
- eliminate_details(path, edges_to_modify);
- }
-
- (*return_tuples) = pgr_alloc(count, (*return_tuples));
- size_t sequence = 0;
- path.generate_postgres_data(return_tuples, sequence);
- (*return_count) = sequence;
-
- *log_msg = strdup(log.str().c_str());
- pgassert(!*err_msg);
- } catch (AssertFailedException &except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- } catch (std::exception& except) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << except.what() << "\n";
- *err_msg = strdup(err.str().c_str());
- } catch(...) {
- if (*return_tuples) free(*return_tuples);
- (*return_count) = 0;
- *log_msg = strdup(log.str().c_str());
- err << "Caught unknown exception!\n";
- *err_msg = strdup(err.str().c_str());
- }
-}
diff --git a/src/withPoints/src/one_to_one_withPoints_driver.h b/src/withPoints/src/one_to_one_withPoints_driver.h
deleted file mode 100644
index 2b63600..0000000
--- a/src/withPoints/src/one_to_one_withPoints_driver.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/*PGR-GNU*****************************************************************
-File: withPoints_driver.h
-
-Copyright (c) 2015 pgRouting developers
-Mail: project at pgrouting.org
-
-Function's developer:
-Copyright (c) 2015 Celia Virginia Vergara Castillo
-Mail:
-
-------
-
-This program is free software; you can redistribute it and/or modify
-it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 2 of the License, or
-(at your option) any later version.
-
-This program is distributed in the hope that it will be useful,
-but WITHOUT ANY WARRANTY; without even the implied warranty of
-MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-GNU General Public License for more details.
-
-You should have received a copy of the GNU General Public License
-along with this program; if not, write to the Free Software
-Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-
-********************************************************************PGR-GNU*/
-
-#ifndef SRC_WITHPOINTS_SRC_ONE_TO_ONE_WITHPOINTS_DRIVER_H_
-#define SRC_WITHPOINTS_SRC_ONE_TO_ONE_WITHPOINTS_DRIVER_H_
-#pragma once
-
-#include "./../../common/src/pgr_types.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-
- // CREATE OR REPLACE FUNCTION pgr_withPoint(
- // edges_sql TEXT,
- // points_sql TEXT,
- // start_pid BIGINT,
- // end_pid BIGINT,
- // directed BOOLEAN DEFAULT true,
- void do_pgr_withPoints(
- pgr_edge_t *edges, size_t total_edges,
- Point_on_edge_t *points, size_t total_points,
- pgr_edge_t *edges_of_points, size_t total_edges_of_points,
- int64_t start_pid,
- int64_t end_pid,
- bool directed,
- char driving_side,
- bool details,
- bool only_cost,
- General_path_element_t **return_tuples,
- size_t *return_count,
- char ** log_msg,
- char ** err_msg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif // SRC_WITHPOINTS_SRC_ONE_TO_ONE_WITHPOINTS_DRIVER_H_
diff --git a/src/withPoints/src/pgr_withPoints.cpp b/src/withPoints/src/pgr_withPoints.cpp
index b33c416..bb814fd 100644
--- a/src/withPoints/src/pgr_withPoints.cpp
+++ b/src/withPoints/src/pgr_withPoints.cpp
@@ -28,23 +28,34 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#if defined(__MINGW32__) || defined(_MSC_VER)
-#include <winsock2.h>
-#include <windows.h>
-#endif
-
+#include "./pgr_withPoints.hpp"
#include <sstream>
#include <deque>
#include <set>
#include <vector>
+#include <string>
#include <algorithm>
#include <cassert>
-#include "./pgr_withPoints.hpp"
-#include "./msg_logger.hpp"
+#include "./../../common/src/pgr_assert.h"
#include "./../../common/src/pgr_types.h"
+static
+void
+PGR_LOG_POINTS(
+ std::ostringstream &log,
+ const std::vector< Point_on_edge_t > &points,
+ const std::string &title) {
+ log << title << "\n";
+ for (const auto &p : points) {
+ log << p.pid << "\t"
+ << p.edge_id << "\t"
+ << p.fraction << "\t"
+ << p.side << "\n";
+ }
+}
+
/*
* 0 = success
* non 0 = error code
@@ -58,7 +69,7 @@ int check_points(std::vector< Point_on_edge_t > &points,
*/
std::sort(points.begin(), points.end(),
[](const Point_on_edge_t &a, const Point_on_edge_t &b)
- -> bool {
+ -> bool {
if (a.pid != b.pid) return a.pid < b.pid;
if (a.edge_id != b.edge_id) return a.edge_id < b.edge_id;
if (a.fraction != b.fraction) return a.fraction < b.fraction;
@@ -103,8 +114,8 @@ eliminate_details_dd(
Path newPath(path.start_id(), path.end_id());
for (const auto &pathstop : path) {
if ((pathstop.node == path.start_id())
- || (pathstop.node == path.end_id())
- || (pathstop.node > 0)) {
+ || (pathstop.node == path.end_id())
+ || (pathstop.node > 0)) {
newPath.push_back(pathstop);
}
}
@@ -126,8 +137,8 @@ eliminate_details(
double cost = 0.0;
for (const auto &pathstop : path) {
if ((pathstop.node == path.start_id())
- || (pathstop.node == path.end_id())
- || (pathstop.node > 0)) {
+ || (pathstop.node == path.end_id())
+ || (pathstop.node > 0)) {
newPath.push_back(pathstop);
if (pathstop.node != path.end_id()) cost = 0.0;
continue;
@@ -208,8 +219,10 @@ adjust_pids(
struct pointCompare {
- bool operator() (const Point_on_edge_t& lhs, const Point_on_edge_t& rhs) const
- { return lhs.fraction < rhs.fraction? true : lhs.pid < rhs.pid;}
+ bool operator() (
+ const Point_on_edge_t& lhs,
+ const Point_on_edge_t& rhs) const
+ {return lhs.fraction < rhs.fraction? true : lhs.pid < rhs.pid;}
};
bool
@@ -256,7 +269,8 @@ create_new_edges(
}
}
if (points_on_edge.empty()) {
- log << "For some reason we didn't find a point belonging to the edge, must be an error\n";
+ log << "For some reason didn't find a point belonging to the edge"
+ << ", must be an error\n";
return false;
}
#if 0
@@ -275,7 +289,8 @@ create_new_edges(
double agg_rcost = 0;
double last_cost = 0;
double last_rcost = 0;
- std::vector< Point_on_edge_t> the_points(points_on_edge.begin(), points_on_edge.end());
+ std::vector<Point_on_edge_t> the_points(
+ points_on_edge.begin(), points_on_edge.end());
for (auto &point : the_points) {
/* the point either has
@@ -289,15 +304,16 @@ create_new_edges(
<< "/t" << point.fraction
<< "\t" << point.side << "\n";
if (point.fraction <= 0 || point.fraction >= 1) {
- log << "For some reason an invalid fraction was accepted, must be an error\n";
+ log << "For some reason an invalid fraction was accepted,"
+ << " must be an error\n";
return false;
}
if (point.fraction == 0) {
- log << "vertex_id of the point is the source" << edge.source << "\n";
+ log << "Point's vertex_id = source" << edge.source << "\n";
point.vertex_id = edge.source;
}
if (point.fraction == 1) {
- log << "vertex_id of the point is the target" << edge.target << "\n";
+ log << "point's vertex_id = target" << edge.target << "\n";
point.vertex_id = edge.target;
}
if (point.fraction > 0 && point.fraction < 1) {
@@ -310,18 +326,27 @@ create_new_edges(
double deltaFraction = point.fraction - prev_fraction;
double deltarFraction = point.fraction - prev_rfraction;
if ((edge.cost < 0 || edge.reverse_cost < 0)
- || driving_side == 'b'
- || point.side == 'b') {
- log << "Edge is one way or driving side is both or point side is both\n";
- log << "Edge is one way: " << (edge.cost < 0 || edge.reverse_cost < 0) << "\n";
+ || driving_side == 'b'
+ || point.side == 'b') {
+ log << "Edge is one way "
+ << " or driving side is both or point side is both\n";
+ log << "Edge is one way: "
+ << (edge.cost < 0 || edge.reverse_cost < 0)
+ << "\n";
log << "driving side: " << driving_side << "\n";
log << "point side: " << point.side << "\n";
if (point.fraction > 0 && point.fraction < 1) {
if (edge.cost >= 0) {
last_cost = deltaFraction * edge.cost;
- pgr_edge_t new_edge = {edge.id , prev_target, point.vertex_id, last_cost, -1};
+ pgr_edge_t new_edge = {
+ edge.id,
+ prev_target,
+ point.vertex_id,
+ last_cost,
+ -1};
new_edges.push_back(new_edge);
- log << "new_edge: (id, source, target, cost, reverse_cost) = ("
+ log << "new_edge("
+ << "id, source, target, cost, reverse_cost) = ("
<< new_edge.id << "\t"
<< new_edge.source << "\t"
<< new_edge.target << "\t"
@@ -330,9 +355,15 @@ create_new_edges(
}
if (edge.reverse_cost >= 0) {
last_rcost = deltarFraction * edge.reverse_cost;
- pgr_edge_t new_edge = {edge.id , prev_target, point.vertex_id, -1, last_rcost};
+ pgr_edge_t new_edge = {
+ edge.id,
+ prev_target,
+ point.vertex_id,
+ -1,
+ last_rcost};
new_edges.push_back(new_edge);
- log << "new_edge: (id, source, target, cost, reverse_cost) = ("
+ log << "new_edge("
+ << "id, source, target, cost, reverse_cost) = ("
<< new_edge.id << "\t"
<< new_edge.source << "\t"
<< new_edge.target << "\t"
@@ -350,17 +381,19 @@ create_new_edges(
continue;
}
- assert(edge.cost > 0 && edge.reverse_cost > 0);
- assert(point.side != 'b');
+ pgassert(edge.cost > 0 && edge.reverse_cost > 0);
+ pgassert(point.side != 'b');
if (driving_side == point.side) {
- log << "two way and driving side is == than the side of the point\n";
- log << "Breaking (source, target) edge only when its not the extreme of the segment\n";
+ log << "two way and driving side == the side of the point\n";
+ log << "Breaking (source, target) when its not the extreme\n";
if (point.fraction > 0 && point.fraction < 1) {
last_cost = deltaFraction * edge.cost;
- pgr_edge_t new_edge = {edge.id , prev_target, point.vertex_id, last_cost, -1};
+ pgr_edge_t new_edge = {
+ edge.id, prev_target, point.vertex_id, last_cost, -1};
new_edges.push_back(new_edge);
- log << "new_edge: (id, source, target, cost, reverse_cost) = ("
+ log << "new_edge("
+ << "id, source, target, cost, reverse_cost) = ("
<< new_edge.id << "\t"
<< new_edge.source << "\t"
<< new_edge.target << "\t"
@@ -373,7 +406,7 @@ create_new_edges(
continue;
}
- log << "two way and driving side is != than the side of the point\n";
+ log << "\ntwo way and driving side != the side of the point";
if (point.fraction > 0 && point.fraction < 1) {
last_rcost = deltarFraction * edge.reverse_cost;
pgr_edge_t new_edge = {
@@ -383,7 +416,7 @@ create_new_edges(
-1,
last_rcost};
new_edges.push_back(new_edge);
- log << "new_edge: (id, source, target, cost, reverse_cost) = ("
+ log << "\nnew_edge(id, source, target, cost, reverse_cost) = ("
<< new_edge.id << "\t"
<< new_edge.source << "\t"
<< new_edge.target << "\t"
diff --git a/src/withPoints/src/pgr_withPoints.hpp b/src/withPoints/src/pgr_withPoints.hpp
index 260a5a7..986c87e 100644
--- a/src/withPoints/src/pgr_withPoints.hpp
+++ b/src/withPoints/src/pgr_withPoints.hpp
@@ -26,6 +26,8 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
+#ifndef SRC_WITHPOINTS_SRC_PGR_WITHPOINTS_HPP_
+#define SRC_WITHPOINTS_SRC_PGR_WITHPOINTS_HPP_
#pragma once
#include <vector>
@@ -33,8 +35,9 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#include "./../../common/src/basePath_SSEC.hpp"
int
-check_points(std::vector< Point_on_edge_t > &points,
- std::ostringstream &log);
+check_points(
+ std::vector< Point_on_edge_t > &points,
+ std::ostringstream &log);
void
eliminate_details_dd(
@@ -65,3 +68,5 @@ create_new_edges(
char driving_side,
std::vector< pgr_edge_t > &new_edges,
std::ostringstream &log);
+
+#endif // SRC_WITHPOINTS_SRC_PGR_WITHPOINTS_HPP_
diff --git a/src/withPoints/test/doc-pgr_withPoints.test.sql b/src/withPoints/test/doc-pgr_withPoints.test.sql
index e263fed..b7af800 100644
--- a/src/withPoints/test/doc-pgr_withPoints.test.sql
+++ b/src/withPoints/test/doc-pgr_withPoints.test.sql
@@ -1,75 +1,71 @@
-BEGIN;
- \echo --e1
- SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -3);
- \echo --e2
- SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3,
- details := true);
- \echo --e3
- SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, ARRAY[-3,5]);
- \echo --e4
- SELECT * FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], -3);
- \echo --e5
- SELECT * FROM pgr_withPoints(
+\echo --e1
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -3);
+\echo --e2
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3,
+ details := true);
+\echo --e3
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, ARRAY[-3,5]);
+\echo --e4
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], -3);
+\echo --e5
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7]);
+
+\echo --q2
+SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
+ CASE WHEN edge = -1 THEN ' visits'
+ ELSE ' passes in front of'
+ END as status,
+ CASE WHEN node < 0 THEN 'Point'
+ ELSE 'Vertex'
+ END as is_a,
+ abs(node) as id
+ FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7]);
-
- \echo --q2
- SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
- CASE WHEN edge = -1 THEN ' visits'
- ELSE ' passes in front of'
- END as status,
- CASE WHEN node < 0 THEN 'Point'
- ELSE 'Vertex'
- END as is_a,
- abs(node) as id
- FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
- driving_side := 'r',
- details := true)
- WHERE node IN (-6,6);
- \echo --q3
- SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
- CASE WHEN edge = -1 THEN ' visits'
- ELSE ' passes in front of'
- END as status,
- CASE WHEN node < 0 THEN 'Point'
- ELSE 'Vertex'
- END as is_a,
- abs(node) as id
- FROM pgr_withPoints(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
- driving_side := 'l',
- details := true)
- WHERE node IN (-6,6);
- \echo --q4
- SELECT * FROM pgr_withPoints(
+ ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
+ driving_side := 'r',
+ details := true)
+ WHERE node IN (-6,6);
+\echo --q3
+SELECT ('(' || start_pid || ' => ' || end_pid ||') at ' || path_seq || 'th step:')::TEXT AS path_at,
+ CASE WHEN edge = -1 THEN ' visits'
+ ELSE ' passes in front of'
+ END as status,
+ CASE WHEN node < 0 THEN 'Point'
+ ELSE 'Vertex'
+ END as is_a,
+ abs(node) as id
+ FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- directed := false,
- details := true);
- \echo --q5
-
-
- ROLLBACK;
+ ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
+ driving_side := 'l',
+ details := true)
+ WHERE node IN (-6,6);
+\echo --q4
+SELECT * FROM pgr_withPoints(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ directed := false,
+ details := true);
+\echo --q5
diff --git a/src/withPoints/test/doc-pgr_withPointsCost.test.sql b/src/withPoints/test/doc-pgr_withPointsCost.test.sql
index f01defa..16b0661 100644
--- a/src/withPoints/test/doc-pgr_withPointsCost.test.sql
+++ b/src/withPoints/test/doc-pgr_withPointsCost.test.sql
@@ -1,55 +1,47 @@
-BEGIN;
-
- \echo --e1
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -3);
- \echo --e2
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3,
- directed := false);
- \echo --e3
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, ARRAY[-3,5]);
- \echo --e4
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], -3);
- \echo --e5
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7]);
-
- \echo --q2
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'l');
- \echo --q3
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'r');
- \echo --q4
- SELECT * FROM pgr_withPointsCost(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[-1,2], ARRAY[-3,7],
- driving_side := 'b');
- \echo --q5
-
-
-
- ROLLBACK;
-
-
+\echo --e1
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -3);
+\echo --e2
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3,
+ directed := false);
+\echo --e3
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, ARRAY[-3,5]);
+\echo --e4
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], -3);
+\echo --e5
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7]);
+
+\echo --q2
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'l');
+\echo --q3
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'r');
+\echo --q4
+SELECT * FROM pgr_withPointsCost(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[-1,2], ARRAY[-3,7],
+ driving_side := 'b');
+\echo --q5
diff --git a/src/withPoints/test/doc-pgr_withPointsDD.test.sql b/src/withPoints/test/doc-pgr_withPointsDD.test.sql
index c633207..326587e 100644
--- a/src/withPoints/test/doc-pgr_withPointsDD.test.sql
+++ b/src/withPoints/test/doc-pgr_withPointsDD.test.sql
@@ -1,36 +1,29 @@
-BEGIN;
-
- \echo --q1
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8);
- \echo --q2
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'r',
- details := true);
- \echo --q3
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'l',
- details := true);
- \echo --q4
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 3.8,
- driving_side := 'b',
- details := true);
- \echo --q5
-
-
-
- ROLLBACK;
-
+\echo --q1
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8);
+\echo --q2
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'r',
+ details := true);
+\echo --q3
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'l',
+ details := true);
+\echo --q4
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 3.8,
+ driving_side := 'b',
+ details := true);
+\echo --q5
diff --git a/src/withPoints/test/doc-pgr_withPointsKSP.result b/src/withPoints/test/doc-pgr_withPointsKSP-cygwin.result
similarity index 97%
copy from src/withPoints/test/doc-pgr_withPointsKSP.result
copy to src/withPoints/test/doc-pgr_withPointsKSP-cygwin.result
index 0fd3968..7b92f64 100644
--- a/src/withPoints/test/doc-pgr_withPointsKSP.result
+++ b/src/withPoints/test/doc-pgr_withPointsKSP-cygwin.result
@@ -35,7 +35,7 @@
3|1|3|-6|4|0.3|1.3
4|1|4|5|8|1|1.6
5|1|5|6|11|1|2.6
-6|1|6|11|13|1|3.6
+6|1|6|9|13|1|3.6
7|1|7|12|15|0.6|4.6
8|1|8|-2|-1|0|5.2
9|2|1|-1|1|0.6|0
@@ -43,7 +43,7 @@
11|2|3|-6|4|0.3|1.3
12|2|4|5|8|1|1.6
13|2|5|6|9|1|2.6
-14|2|6|9|15|1|3.6
+14|2|6|11|15|1|3.6
15|2|7|12|15|0.6|4.6
16|2|8|-2|-1|0|5.2
--q4
diff --git a/src/withPoints/test/doc-pgr_withPointsKSP-cygwin.test.sql b/src/withPoints/test/doc-pgr_withPointsKSP-cygwin.test.sql
new file mode 100644
index 0000000..69ad292
--- /dev/null
+++ b/src/withPoints/test/doc-pgr_withPointsKSP-cygwin.test.sql
@@ -0,0 +1,26 @@
+
+
+\echo --q1
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2);
+\echo --q2
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 6, 2, details := true);
+\echo --q3
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ driving_side := 'l', details := true);
+\echo --q4
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ heap_paths := true, driving_side := 'r', details := true);
+\echo --q5
+
diff --git a/src/withPoints/test/doc-pgr_withPointsKSP.result b/src/withPoints/test/doc-pgr_withPointsKSP.result
index 0fd3968..d956f34 100644
--- a/src/withPoints/test/doc-pgr_withPointsKSP.result
+++ b/src/withPoints/test/doc-pgr_withPointsKSP.result
@@ -34,16 +34,16 @@
2|1|2|2|4|0.7|0.6
3|1|3|-6|4|0.3|1.3
4|1|4|5|8|1|1.6
-5|1|5|6|11|1|2.6
-6|1|6|11|13|1|3.6
+5|1|5|6|9|1|2.6
+6|1|6|9|15|1|3.6
7|1|7|12|15|0.6|4.6
8|1|8|-2|-1|0|5.2
9|2|1|-1|1|0.6|0
10|2|2|2|4|0.7|0.6
11|2|3|-6|4|0.3|1.3
12|2|4|5|8|1|1.6
-13|2|5|6|9|1|2.6
-14|2|6|9|15|1|3.6
+13|2|5|6|11|1|2.6
+14|2|6|11|13|1|3.6
15|2|7|12|15|0.6|4.6
16|2|8|-2|-1|0|5.2
--q4
diff --git a/src/withPoints/test/doc-pgr_withPointsKSP.test.sql b/src/withPoints/test/doc-pgr_withPointsKSP.test.sql
index fae7642..69ad292 100644
--- a/src/withPoints/test/doc-pgr_withPointsKSP.test.sql
+++ b/src/withPoints/test/doc-pgr_withPointsKSP.test.sql
@@ -1,32 +1,26 @@
-BEGIN;
-
- \echo --q1
- SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2);
- \echo --q2
- SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, 6, 2, details := true);
- \echo --q3
- SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2,
- driving_side := 'l', details := true);
- \echo --q4
- SELECT * FROM pgr_withPointsKSP(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- -1, -2, 2,
- heap_paths := true, driving_side := 'r', details := true);
- \echo --q5
-
-
-
- ROLLBACK;
+\echo --q1
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2);
+\echo --q2
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, 6, 2, details := true);
+\echo --q3
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ driving_side := 'l', details := true);
+\echo --q4
+SELECT * FROM pgr_withPointsKSP(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ -1, -2, 2,
+ heap_paths := true, driving_side := 'r', details := true);
+\echo --q5
diff --git a/src/withPoints/test/doc-pgr_withPointsVia.test.sql b/src/withPoints/test/doc-pgr_withPointsVia.test.sql
index f7823d3..5b2dfc6 100644
--- a/src/withPoints/test/doc-pgr_withPointsVia.test.sql
+++ b/src/withPoints/test/doc-pgr_withPointsVia.test.sql
@@ -1,36 +1,30 @@
-BEGIN;
-
- \echo --q1
- SELECT * FROM pgr_withPointsVia(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- ARRAY[1,3,5]);
- \echo --q2
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- 3, 3.0,
- driving_side := 'r',
- details := true);
- \echo --q3
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- 3, 3.0,
- driving_side := 'l',
- details := true);
- \echo --q4
- SELECT * FROM pgr_withPointsDD(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
- 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
- 3, 3.0,
- driving_side := 'b',
- details := true);
- \echo --q5
-
-
-
- ROLLBACK;
+\echo --q1
+SELECT * FROM pgr_withPointsVia(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ ARRAY[1,3,5]);
+\echo --q2
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ 3, 3.0,
+ driving_side := 'r',
+ details := true);
+\echo --q3
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ 3, 3.0,
+ driving_side := 'l',
+ details := true);
+\echo --q4
+SELECT * FROM pgr_withPointsDD(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
+ 'SELECT pid, edge_id, fraction, side from pointsOfInterest',
+ 3, 3.0,
+ driving_side := 'b',
+ details := true);
+\echo --q5
diff --git a/src/withPoints/test/pgtap/many_to_one_eq_one_to_one_withPoint.test.sql b/src/withPoints/test/pgtap/many_to_one_eq_one_to_one_withPoint.test.sql
index 61cd393..1078de3 100644
--- a/src/withPoints/test/pgtap/many_to_one_eq_one_to_one_withPoint.test.sql
+++ b/src/withPoints/test/pgtap/many_to_one_eq_one_to_one_withPoint.test.sql
@@ -6,7 +6,7 @@ SELECT PLAN(7);
PREPARE q1 AS
-SELECT path_seq, node, agg_cost FROM pgr_withPoints(
+SELECT path_seq, node, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
ARRAY[-1], -5,
@@ -15,7 +15,7 @@ SELECT path_seq, node, agg_cost FROM pgr_withPoints(
details := true);
PREPARE q2 AS
-SELECT path_seq, node, agg_cost FROM pgr_withPoints(
+SELECT path_seq, node, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
-1, -5,
@@ -26,7 +26,7 @@ SELECT path_seq, node, agg_cost FROM pgr_withPoints(
SELECT set_eq('q1', 'q2', '1: Right: from point ARRAY[-1] to -5 same as one to one');
PREPARE q3 AS
-SELECT path_seq, node, agg_cost FROM pgr_withPoints(
+SELECT path_seq, node, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
ARRAY[-4], -5,
@@ -35,7 +35,7 @@ SELECT path_seq, node, agg_cost FROM pgr_withPoints(
details := true);
PREPARE q4 AS
-SELECT path_seq, node, agg_cost FROM pgr_withPoints(
+SELECT path_seq, node, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
-4, -5,
@@ -46,7 +46,7 @@ SELECT path_seq, node, agg_cost FROM pgr_withPoints(
SELECT set_eq('q3','q4','2: Right: from ARRAY[-4] to -5 same as one to one');
PREPARE q5 AS
-SELECT path_seq, node, agg_cost FROM pgr_withPoints(
+SELECT path_seq, node, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
ARRAY[-1, -4], -5,
@@ -62,7 +62,7 @@ SELECT set_has('q5', 'q4', '6: Right: from point ARRAY[-1,-4] to -5 has results
PREPARE q9 AS
-SELECT -1 AS start_vid, -5 AS end_vid, agg_cost FROM pgr_withPoints(
+SELECT -1 AS start_vid, -5 AS end_vid, agg_cost::text FROM pgr_withPoints(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
ARRAY[-1], -5,
@@ -72,7 +72,7 @@ SELECT -1 AS start_vid, -5 AS end_vid, agg_cost FROM pgr_withPoints(
PREPARE q10 AS
-SELECT * FROM pgr_withPointsCost(
+SELECT start_pid, end_pid, agg_cost::text FROM pgr_withPointsCost(
'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
'SELECT pid, edge_id, fraction, side from pointsOfInterest',
-1, -5,
diff --git a/src/withPoints/test/test.conf b/src/withPoints/test/test.conf
index 8c22bbd..b1aa9a4 100644
--- a/src/withPoints/test/test.conf
+++ b/src/withPoints/test/test.conf
@@ -7,24 +7,24 @@
'tests' => [qw(
doc-pgr_withPoints
doc-pgr_withPointsCost
- doc-pgr_withPointsKSP
doc-pgr_withPointsDD
)],
'documentation' => [qw(
doc-pgr_withPoints
doc-pgr_withPointsCost
- doc-pgr_withPointsKSP
doc-pgr_withPointsDD
+ doc-pgr_withPointsKSP
+ )],
+ 'linux' => [qw(
+ doc-pgr_withPointsKSP
+ )],
+ 'cygwin' => [qw(
+ doc-pgr_withPointsKSP-cygwin
)],
'not on 2.2' => [qw(
doc-pgr_withPointsVia
)],
},
-# I don't know what this are for or how to use them.
-# TODO ask Steve
-# 'vpg-vpgis' => {}, # for version specific tests
-# '8-1' => {}, # for pg 8.x and postgis 1.x
-# '9.2-2.1' => {}, # for pg 9.2 and postgis 2.1
);
1;
diff --git a/tools/build-extension-update-files b/tools/build-extension-update-files.pl
similarity index 94%
rename from tools/build-extension-update-files
rename to tools/build-extension-update-files.pl
index cce3a1c..6d95b23 100755
--- a/tools/build-extension-update-files
+++ b/tools/build-extension-update-files.pl
@@ -84,6 +84,7 @@ File::Find::find({wanted => \&wanted}, $sig_dir);
# foreach old files
for my $old_file ( sort @old_files ) {
+ print "\ngenerating $old_file upgrade file\n" if $DEBUG;
# read and parse the .sig
my $old_hash = read_sig_file( $old_file );
# and generate and write the update script file
@@ -149,33 +150,6 @@ sub generate_upgrade_script {
my $n_ver = $new->{VERSION};
my $o_ver = $old->{VERSION};
- # analyze types
-
- my $ntype = $new->{types};
- my $otype = $old->{types};
-
- # create a hash like <name> => <column_list> for new types
- my %ntype_h = ();
- for my $x (@{$ntype}) {
- $x =~ m/(\w+)(\([^\)]+\))$/;
- $ntype_h{lc($1)} = lc($2);
- }
-
- # check if old type exists with different column types
- for my $x (@{$otype}) {
- $x =~ m/(\w+)(\([^\)]+\))$/;
- my $name = lc($1);
- my $cols = lc($2);
- if ($ntype_h{$name}) {
- if ($ntype_h{$name} ne $cols) {
- warn "WARNING: old type '$name$cols' changed to '$name$ntype_h{$name}' !\n";
- $err = 1;
- }
- else {
- push @types2remove, $name;
- }
- }
- }
# analyze function sigs
@@ -207,6 +181,30 @@ sub generate_upgrade_script {
push @commands, "DROP FUNCTION IF EXISTS $x;\n";
}
+ # analyze types
+
+ my $ntype = $new->{types};
+ my $otype = $old->{types};
+
+ # create a hash like <name> => <column_list> for new types
+ my %ntype_h = ();
+ for my $x (@{$ntype}) {
+ #$x =~ m/(\w+)(\([^\)]+\))$/;
+ $ntype_h{lc($x)} = lc($x);
+ }
+
+ # check if old type exists with different column types
+ for my $x (@{$otype}) {
+ my $name = lc($x);
+ if (!exists $ntype_h{$name}) {
+ #types no longer used are droped form the extension
+ push @commands, "ALTER EXTENSION pgrouting DROP TYPE $name;\n";
+ push @commands, "DROP TYPE $name;\n";
+ } else {
+ push @types2remove, $name;
+ }
+ }
+
# UGH! someone change the definition of the TYPE or reused an existing
# TYPE name which is VERY BAD because other poeple might be dependent
# on the old TYPE so we can DROP TYPE <type> CASCADE; or we might drop
diff --git a/tools/clean/clean.sh b/tools/clean/clean.sh
index adbf83d..c9567eb 100644
--- a/tools/clean/clean.sh
+++ b/tools/clean/clean.sh
@@ -17,7 +17,7 @@ EXTENSION=$1
echo $EXTENSION
# remove trailing spaces
-perl -pi -e 's/\s\+$//' *.$EXTENSION
+perl -pi -e 's/\s+$//' *.$EXTENSION
# " )" -> ")"
perl -pi -e 's/\s\+\)/)/g' *.$EXTENSION
diff --git a/tools/cpplint.py b/tools/cpplint.py
deleted file mode 100755
index 756dafb..0000000
--- a/tools/cpplint.py
+++ /dev/null
@@ -1,6321 +0,0 @@
-#Copyright (c) 2009 Google Inc. All rights reserved.
-#
-# Redistribution and use in source and binary forms, with or without
-# modification, are permitted provided that the following conditions are
-# met:
-#
-# * Redistributions of source code must retain the above copyright
-# notice, this list of conditions and the following disclaimer.
-# * Redistributions in binary form must reproduce the above
-# copyright notice, this list of conditions and the following disclaimer
-# in the documentation and/or other materials provided with the
-# distribution.
-# * Neither the name of Google Inc. nor the names of its
-# contributors may be used to endorse or promote products derived from
-# this software without specific prior written permission.
-#
-# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-"""Does google-lint on c++ files.
-
-The goal of this script is to identify places in the code that *may*
-be in non-compliance with google style. It does not attempt to fix
-up these problems -- the point is to educate. It does also not
-attempt to find all problems, or to ensure that everything it does
-find is legitimately a problem.
-
-In particular, we can get very confused by /* and // inside strings!
-We do a small hack, which is to ignore //'s with "'s after them on the
-same line, but it is far from perfect (in either direction).
-"""
-
-import codecs
-import copy
-import getopt
-import math # for log
-import os
-import re
-import sre_compile
-import string
-import sys
-import unicodedata
-
-
-_USAGE = """
-Syntax: cpplint.py [--verbose=#] [--output=vs7] [--filter=-x,+y,...]
- [--counting=total|toplevel|detailed] [--root=subdir]
- [--linelength=digits]
- <file> [file] ...
-
- The style guidelines this tries to follow are those in
- http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
-
- Every problem is given a confidence score from 1-5, with 5 meaning we are
- certain of the problem, and 1 meaning it could be a legitimate construct.
- This will miss some errors, and is not a substitute for a code review.
-
- To suppress false-positive errors of a certain category, add a
- 'NOLINT(category)' comment to the line. NOLINT or NOLINT(*)
- suppresses errors of all categories on that line.
-
- The files passed in will be linted; at least one file must be provided.
- Default linted extensions are .cc, .cpp, .cu, .cuh and .h. Change the
- extensions with the --extensions flag.
-
- Flags:
-
- output=vs7
- By default, the output is formatted to ease emacs parsing. Visual Studio
- compatible output (vs7) may also be used. Other formats are unsupported.
-
- verbose=#
- Specify a number 0-5 to restrict errors to certain verbosity levels.
-
- filter=-x,+y,...
- Specify a comma-separated list of category-filters to apply: only
- error messages whose category names pass the filters will be printed.
- (Category names are printed with the message and look like
- "[whitespace/indent]".) Filters are evaluated left to right.
- "-FOO" and "FOO" means "do not print categories that start with FOO".
- "+FOO" means "do print categories that start with FOO".
-
- Examples: --filter=-whitespace,+whitespace/braces
- --filter=whitespace,runtime/printf,+runtime/printf_format
- --filter=-,+build/include_what_you_use
-
- To see a list of all the categories used in cpplint, pass no arg:
- --filter=
-
- counting=total|toplevel|detailed
- The total number of errors found is always printed. If
- 'toplevel' is provided, then the count of errors in each of
- the top-level categories like 'build' and 'whitespace' will
- also be printed. If 'detailed' is provided, then a count
- is provided for each category like 'build/class'.
-
- root=subdir
- The root directory used for deriving header guard CPP variable.
- By default, the header guard CPP variable is calculated as the relative
- path to the directory that contains .git, .hg, or .svn. When this flag
- is specified, the relative path is calculated from the specified
- directory. If the specified directory does not exist, this flag is
- ignored.
-
- Examples:
- Assuming that src/.git exists, the header guard CPP variables for
- src/chrome/browser/ui/browser.h are:
-
- No flag => CHROME_BROWSER_UI_BROWSER_H_
- --root=chrome => BROWSER_UI_BROWSER_H_
- --root=chrome/browser => UI_BROWSER_H_
-
- linelength=digits
- This is the allowed line length for the project. The default value is
- 80 characters.
-
- Examples:
- --linelength=120
-
- extensions=extension,extension,...
- The allowed file extensions that cpplint will check
-
- Examples:
- --extensions=hpp,cpp
-
- cpplint.py supports per-directory configurations specified in CPPLINT.cfg
- files. CPPLINT.cfg file can contain a number of key=value pairs.
- Currently the following options are supported:
-
- set noparent
- filter=+filter1,-filter2,...
- exclude_files=regex
- linelength=80
-
- "set noparent" option prevents cpplint from traversing directory tree
- upwards looking for more .cfg files in parent directories. This option
- is usually placed in the top-level project directory.
-
- The "filter" option is similar in function to --filter flag. It specifies
- message filters in addition to the |_DEFAULT_FILTERS| and those specified
- through --filter command-line flag.
-
- "exclude_files" allows to specify a regular expression to be matched against
- a file name. If the expression matches, the file is skipped and not run
- through liner.
-
- "linelength" allows to specify the allowed line length for the project.
-
- CPPLINT.cfg has an effect on files in the same directory and all
- sub-directories, unless overridden by a nested configuration file.
-
- Example file:
- filter=-build/include_order,+build/include_alpha
- exclude_files=.*\.cc
-
- The above example disables build/include_order warning and enables
- build/include_alpha as well as excludes all .cc from being
- processed by linter, in the current directory (where the .cfg
- file is located) and all sub-directories.
-"""
-
-# We categorize each error message we print. Here are the categories.
-# We want an explicit list so we can list them all in cpplint --filter=.
-# If you add a new error message with a new category, add it to the list
-# here! cpplint_unittest.py should tell you if you forget to do this.
-_ERROR_CATEGORIES = [
- 'build/class',
- 'build/c++11',
- 'build/deprecated',
- 'build/endif_comment',
- 'build/explicit_make_pair',
- 'build/forward_decl',
- 'build/header_guard',
- 'build/include',
- 'build/include_alpha',
- 'build/include_order',
- 'build/include_what_you_use',
- 'build/namespaces',
- 'build/printf_format',
- 'build/storage_class',
- 'legal/copyright',
- 'readability/alt_tokens',
- 'readability/braces',
- 'readability/casting',
- 'readability/check',
- 'readability/constructors',
- 'readability/fn_size',
- 'readability/function',
- 'readability/inheritance',
- 'readability/multiline_comment',
- 'readability/multiline_string',
- 'readability/namespace',
- 'readability/nolint',
- 'readability/nul',
- 'readability/strings',
- 'readability/todo',
- 'readability/utf8',
- 'runtime/arrays',
- 'runtime/casting',
- 'runtime/explicit',
- 'runtime/int',
- 'runtime/init',
- 'runtime/invalid_increment',
- 'runtime/member_string_references',
- 'runtime/memset',
- 'runtime/indentation_namespace',
- 'runtime/operator',
- 'runtime/printf',
- 'runtime/printf_format',
- 'runtime/references',
- 'runtime/string',
- 'runtime/threadsafe_fn',
- 'runtime/vlog',
- 'whitespace/blank_line',
- 'whitespace/braces',
- 'whitespace/comma',
- 'whitespace/comments',
- 'whitespace/empty_conditional_body',
- 'whitespace/empty_loop_body',
- 'whitespace/end_of_line',
- 'whitespace/ending_newline',
- 'whitespace/forcolon',
- 'whitespace/indent',
- 'whitespace/line_length',
- 'whitespace/newline',
- 'whitespace/operators',
- 'whitespace/parens',
- 'whitespace/semicolon',
- 'whitespace/tab',
- 'whitespace/todo',
- ]
-
-# These error categories are no longer enforced by cpplint, but for backwards-
-# compatibility they may still appear in NOLINT comments.
-_LEGACY_ERROR_CATEGORIES = [
- 'readability/streams',
- ]
-
-# The default state of the category filter. This is overridden by the --filter=
-# flag. By default all errors are on, so only add here categories that should be
-# off by default (i.e., categories that must be enabled by the --filter= flags).
-# All entries here should start with a '-' or '+', as in the --filter= flag.
-_DEFAULT_FILTERS = ['-build/include_alpha']
-
-# We used to check for high-bit characters, but after much discussion we
-# decided those were OK, as long as they were in UTF-8 and didn't represent
-# hard-coded international strings, which belong in a separate i18n file.
-
-# C++ headers
-_CPP_HEADERS = frozenset([
- # Legacy
- 'algobase.h',
- 'algo.h',
- 'alloc.h',
- 'builtinbuf.h',
- 'bvector.h',
- 'complex.h',
- 'defalloc.h',
- 'deque.h',
- 'editbuf.h',
- 'fstream.h',
- 'function.h',
- 'hash_map',
- 'hash_map.h',
- 'hash_set',
- 'hash_set.h',
- 'hashtable.h',
- 'heap.h',
- 'indstream.h',
- 'iomanip.h',
- 'iostream.h',
- 'istream.h',
- 'iterator.h',
- 'list.h',
- 'map.h',
- 'multimap.h',
- 'multiset.h',
- 'ostream.h',
- 'pair.h',
- 'parsestream.h',
- 'pfstream.h',
- 'procbuf.h',
- 'pthread_alloc',
- 'pthread_alloc.h',
- 'rope',
- 'rope.h',
- 'ropeimpl.h',
- 'set.h',
- 'slist',
- 'slist.h',
- 'stack.h',
- 'stdiostream.h',
- 'stl_alloc.h',
- 'stl_relops.h',
- 'streambuf.h',
- 'stream.h',
- 'strfile.h',
- 'strstream.h',
- 'tempbuf.h',
- 'tree.h',
- 'type_traits.h',
- 'vector.h',
- # 17.6.1.2 C++ library headers
- 'algorithm',
- 'array',
- 'atomic',
- 'bitset',
- 'chrono',
- 'codecvt',
- 'complex',
- 'condition_variable',
- 'deque',
- 'exception',
- 'forward_list',
- 'fstream',
- 'functional',
- 'future',
- 'initializer_list',
- 'iomanip',
- 'ios',
- 'iosfwd',
- 'iostream',
- 'istream',
- 'iterator',
- 'limits',
- 'list',
- 'locale',
- 'map',
- 'memory',
- 'mutex',
- 'new',
- 'numeric',
- 'ostream',
- 'queue',
- 'random',
- 'ratio',
- 'regex',
- 'set',
- 'sstream',
- 'stack',
- 'stdexcept',
- 'streambuf',
- 'string',
- 'strstream',
- 'system_error',
- 'thread',
- 'tuple',
- 'typeindex',
- 'typeinfo',
- 'type_traits',
- 'unordered_map',
- 'unordered_set',
- 'utility',
- 'valarray',
- 'vector',
- # 17.6.1.2 C++ headers for C library facilities
- 'cassert',
- 'ccomplex',
- 'cctype',
- 'cerrno',
- 'cfenv',
- 'cfloat',
- 'cinttypes',
- 'ciso646',
- 'climits',
- 'clocale',
- 'cmath',
- 'csetjmp',
- 'csignal',
- 'cstdalign',
- 'cstdarg',
- 'cstdbool',
- 'cstddef',
- 'cstdint',
- 'cstdio',
- 'cstdlib',
- 'cstring',
- 'ctgmath',
- 'ctime',
- 'cuchar',
- 'cwchar',
- 'cwctype',
- ])
-
-
-# These headers are excluded from [build/include] and [build/include_order]
-# checks:
-# - Anything not following google file name conventions (containing an
-# uppercase character, such as Python.h or nsStringAPI.h, for example).
-# - Lua headers.
-_THIRD_PARTY_HEADERS_PATTERN = re.compile(
- r'^(?:[^/]*[A-Z][^/]*\.h|lua\.h|lauxlib\.h|lualib\.h)$')
-
-
-# Assertion macros. These are defined in base/logging.h and
-# testing/base/gunit.h. Note that the _M versions need to come first
-# for substring matching to work.
-_CHECK_MACROS = [
- 'DCHECK', 'CHECK',
- 'EXPECT_TRUE_M', 'EXPECT_TRUE',
- 'ASSERT_TRUE_M', 'ASSERT_TRUE',
- 'EXPECT_FALSE_M', 'EXPECT_FALSE',
- 'ASSERT_FALSE_M', 'ASSERT_FALSE',
- ]
-
-# Replacement macros for CHECK/DCHECK/EXPECT_TRUE/EXPECT_FALSE
-_CHECK_REPLACEMENT = dict([(m, {}) for m in _CHECK_MACROS])
-
-for op, replacement in [('==', 'EQ'), ('!=', 'NE'),
- ('>=', 'GE'), ('>', 'GT'),
- ('<=', 'LE'), ('<', 'LT')]:
- _CHECK_REPLACEMENT['DCHECK'][op] = 'DCHECK_%s' % replacement
- _CHECK_REPLACEMENT['CHECK'][op] = 'CHECK_%s' % replacement
- _CHECK_REPLACEMENT['EXPECT_TRUE'][op] = 'EXPECT_%s' % replacement
- _CHECK_REPLACEMENT['ASSERT_TRUE'][op] = 'ASSERT_%s' % replacement
- _CHECK_REPLACEMENT['EXPECT_TRUE_M'][op] = 'EXPECT_%s_M' % replacement
- _CHECK_REPLACEMENT['ASSERT_TRUE_M'][op] = 'ASSERT_%s_M' % replacement
-
-for op, inv_replacement in [('==', 'NE'), ('!=', 'EQ'),
- ('>=', 'LT'), ('>', 'LE'),
- ('<=', 'GT'), ('<', 'GE')]:
- _CHECK_REPLACEMENT['EXPECT_FALSE'][op] = 'EXPECT_%s' % inv_replacement
- _CHECK_REPLACEMENT['ASSERT_FALSE'][op] = 'ASSERT_%s' % inv_replacement
- _CHECK_REPLACEMENT['EXPECT_FALSE_M'][op] = 'EXPECT_%s_M' % inv_replacement
- _CHECK_REPLACEMENT['ASSERT_FALSE_M'][op] = 'ASSERT_%s_M' % inv_replacement
-
-# Alternative tokens and their replacements. For full list, see section 2.5
-# Alternative tokens [lex.digraph] in the C++ standard.
-#
-# Digraphs (such as '%:') are not included here since it's a mess to
-# match those on a word boundary.
-_ALT_TOKEN_REPLACEMENT = {
- 'and': '&&',
- 'bitor': '|',
- 'or': '||',
- 'xor': '^',
- 'compl': '~',
- 'bitand': '&',
- 'and_eq': '&=',
- 'or_eq': '|=',
- 'xor_eq': '^=',
- 'not': '!',
- 'not_eq': '!='
- }
-
-# Compile regular expression that matches all the above keywords. The "[ =()]"
-# bit is meant to avoid matching these keywords outside of boolean expressions.
-#
-# False positives include C-style multi-line comments and multi-line strings
-# but those have always been troublesome for cpplint.
-_ALT_TOKEN_REPLACEMENT_PATTERN = re.compile(
- r'[ =()](' + ('|'.join(_ALT_TOKEN_REPLACEMENT.keys())) + r')(?=[ (]|$)')
-
-
-# These constants define types of headers for use with
-# _IncludeState.CheckNextIncludeOrder().
-_C_SYS_HEADER = 1
-_CPP_SYS_HEADER = 2
-_LIKELY_MY_HEADER = 3
-_POSSIBLE_MY_HEADER = 4
-_OTHER_HEADER = 5
-
-# These constants define the current inline assembly state
-_NO_ASM = 0 # Outside of inline assembly block
-_INSIDE_ASM = 1 # Inside inline assembly block
-_END_ASM = 2 # Last line of inline assembly block
-_BLOCK_ASM = 3 # The whole block is an inline assembly block
-
-# Match start of assembly blocks
-_MATCH_ASM = re.compile(r'^\s*(?:asm|_asm|__asm|__asm__)'
- r'(?:\s+(volatile|__volatile__))?'
- r'\s*[{(]')
-
-
-_regexp_compile_cache = {}
-
-# {str, set(int)}: a map from error categories to sets of linenumbers
-# on which those errors are expected and should be suppressed.
-_error_suppressions = {}
-
-# The root directory used for deriving header guard CPP variable.
-# This is set by --root flag.
-_root = None
-
-# The allowed line length of files.
-# This is set by --linelength flag.
-_line_length = 80
-
-# The allowed extensions for file names
-# This is set by --extensions flag.
-_valid_extensions = set(['cc', 'h', 'cpp', 'cu', 'cuh', 'c', 'hpp'])
-
-def ParseNolintSuppressions(filename, raw_line, linenum, error):
- """Updates the global list of error-suppressions.
-
- Parses any NOLINT comments on the current line, updating the global
- error_suppressions store. Reports an error if the NOLINT comment
- was malformed.
-
- Args:
- filename: str, the name of the input file.
- raw_line: str, the line of input text, with comments.
- linenum: int, the number of the current line.
- error: function, an error handler.
- """
- matched = Search(r'\bNOLINT(NEXTLINE)?\b(\([^)]+\))?', raw_line)
- if matched:
- if matched.group(1):
- suppressed_line = linenum + 1
- else:
- suppressed_line = linenum
- category = matched.group(2)
- if category in (None, '(*)'): # => "suppress all"
- _error_suppressions.setdefault(None, set()).add(suppressed_line)
- else:
- if category.startswith('(') and category.endswith(')'):
- category = category[1:-1]
- if category in _ERROR_CATEGORIES:
- _error_suppressions.setdefault(category, set()).add(suppressed_line)
- elif category not in _LEGACY_ERROR_CATEGORIES:
- error(filename, linenum, 'readability/nolint', 5,
- 'Unknown NOLINT error category: %s' % category)
-
-
-def ResetNolintSuppressions():
- """Resets the set of NOLINT suppressions to empty."""
- _error_suppressions.clear()
-
-
-def IsErrorSuppressedByNolint(category, linenum):
- """Returns true if the specified error category is suppressed on this line.
-
- Consults the global error_suppressions map populated by
- ParseNolintSuppressions/ResetNolintSuppressions.
-
- Args:
- category: str, the category of the error.
- linenum: int, the current line number.
- Returns:
- bool, True iff the error should be suppressed due to a NOLINT comment.
- """
- return (linenum in _error_suppressions.get(category, set()) or
- linenum in _error_suppressions.get(None, set()))
-
-
-def Match(pattern, s):
- """Matches the string with the pattern, caching the compiled regexp."""
- # The regexp compilation caching is inlined in both Match and Search for
- # performance reasons; factoring it out into a separate function turns out
- # to be noticeably expensive.
- if pattern not in _regexp_compile_cache:
- _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
- return _regexp_compile_cache[pattern].match(s)
-
-
-def ReplaceAll(pattern, rep, s):
- """Replaces instances of pattern in a string with a replacement.
-
- The compiled regex is kept in a cache shared by Match and Search.
-
- Args:
- pattern: regex pattern
- rep: replacement text
- s: search string
-
- Returns:
- string with replacements made (or original string if no replacements)
- """
- if pattern not in _regexp_compile_cache:
- _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
- return _regexp_compile_cache[pattern].sub(rep, s)
-
-
-def Search(pattern, s):
- """Searches the string for the pattern, caching the compiled regexp."""
- if pattern not in _regexp_compile_cache:
- _regexp_compile_cache[pattern] = sre_compile.compile(pattern)
- return _regexp_compile_cache[pattern].search(s)
-
-
-class _IncludeState(object):
- """Tracks line numbers for includes, and the order in which includes appear.
-
- include_list contains list of lists of (header, line number) pairs.
- It's a lists of lists rather than just one flat list to make it
- easier to update across preprocessor boundaries.
-
- Call CheckNextIncludeOrder() once for each header in the file, passing
- in the type constants defined above. Calls in an illegal order will
- raise an _IncludeError with an appropriate error message.
-
- """
- # self._section will move monotonically through this set. If it ever
- # needs to move backwards, CheckNextIncludeOrder will raise an error.
- _INITIAL_SECTION = 0
- _MY_H_SECTION = 1
- _C_SECTION = 2
- _CPP_SECTION = 3
- _OTHER_H_SECTION = 4
-
- _TYPE_NAMES = {
- _C_SYS_HEADER: 'C system header',
- _CPP_SYS_HEADER: 'C++ system header',
- _LIKELY_MY_HEADER: 'header this file implements',
- _POSSIBLE_MY_HEADER: 'header this file may implement',
- _OTHER_HEADER: 'other header',
- }
- _SECTION_NAMES = {
- _INITIAL_SECTION: "... nothing. (This can't be an error.)",
- _MY_H_SECTION: 'a header this file implements',
- _C_SECTION: 'C system header',
- _CPP_SECTION: 'C++ system header',
- _OTHER_H_SECTION: 'other header',
- }
-
- def __init__(self):
- self.include_list = [[]]
- self.ResetSection('')
-
- def FindHeader(self, header):
- """Check if a header has already been included.
-
- Args:
- header: header to check.
- Returns:
- Line number of previous occurrence, or -1 if the header has not
- been seen before.
- """
- for section_list in self.include_list:
- for f in section_list:
- if f[0] == header:
- return f[1]
- return -1
-
- def ResetSection(self, directive):
- """Reset section checking for preprocessor directive.
-
- Args:
- directive: preprocessor directive (e.g. "if", "else").
- """
- # The name of the current section.
- self._section = self._INITIAL_SECTION
- # The path of last found header.
- self._last_header = ''
-
- # Update list of includes. Note that we never pop from the
- # include list.
- if directive in ('if', 'ifdef', 'ifndef'):
- self.include_list.append([])
- elif directive in ('else', 'elif'):
- self.include_list[-1] = []
-
- def SetLastHeader(self, header_path):
- self._last_header = header_path
-
- def CanonicalizeAlphabeticalOrder(self, header_path):
- """Returns a path canonicalized for alphabetical comparison.
-
- - replaces "-" with "_" so they both cmp the same.
- - removes '-inl' since we don't require them to be after the main header.
- - lowercase everything, just in case.
-
- Args:
- header_path: Path to be canonicalized.
-
- Returns:
- Canonicalized path.
- """
- return header_path.replace('-inl.h', '.h').replace('-', '_').lower()
-
- def IsInAlphabeticalOrder(self, clean_lines, linenum, header_path):
- """Check if a header is in alphabetical order with the previous header.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- header_path: Canonicalized header to be checked.
-
- Returns:
- Returns true if the header is in alphabetical order.
- """
- # If previous section is different from current section, _last_header will
- # be reset to empty string, so it's always less than current header.
- #
- # If previous line was a blank line, assume that the headers are
- # intentionally sorted the way they are.
- if (self._last_header > header_path and
- Match(r'^\s*#\s*include\b', clean_lines.elided[linenum - 1])):
- return False
- return True
-
- def CheckNextIncludeOrder(self, header_type):
- """Returns a non-empty error message if the next header is out of order.
-
- This function also updates the internal state to be ready to check
- the next include.
-
- Args:
- header_type: One of the _XXX_HEADER constants defined above.
-
- Returns:
- The empty string if the header is in the right order, or an
- error message describing what's wrong.
-
- """
- error_message = ('Found %s after %s' %
- (self._TYPE_NAMES[header_type],
- self._SECTION_NAMES[self._section]))
-
- last_section = self._section
-
- if header_type == _C_SYS_HEADER:
- if self._section <= self._C_SECTION:
- self._section = self._C_SECTION
- else:
- self._last_header = ''
- return error_message
- elif header_type == _CPP_SYS_HEADER:
- if self._section <= self._CPP_SECTION:
- self._section = self._CPP_SECTION
- else:
- self._last_header = ''
- return error_message
- elif header_type == _LIKELY_MY_HEADER:
- if self._section <= self._MY_H_SECTION:
- self._section = self._MY_H_SECTION
- else:
- self._section = self._OTHER_H_SECTION
- elif header_type == _POSSIBLE_MY_HEADER:
- if self._section <= self._MY_H_SECTION:
- self._section = self._MY_H_SECTION
- else:
- # This will always be the fallback because we're not sure
- # enough that the header is associated with this file.
- self._section = self._OTHER_H_SECTION
- else:
- assert header_type == _OTHER_HEADER
- self._section = self._OTHER_H_SECTION
-
- if last_section != self._section:
- self._last_header = ''
-
- return ''
-
-
-class _CppLintState(object):
- """Maintains module-wide state.."""
-
- def __init__(self):
- self.verbose_level = 1 # global setting.
- self.error_count = 0 # global count of reported errors
- # filters to apply when emitting error messages
- self.filters = _DEFAULT_FILTERS[:]
- # backup of filter list. Used to restore the state after each file.
- self._filters_backup = self.filters[:]
- self.counting = 'total' # In what way are we counting errors?
- self.errors_by_category = {} # string to int dict storing error counts
-
- # output format:
- # "emacs" - format that emacs can parse (default)
- # "vs7" - format that Microsoft Visual Studio 7 can parse
- self.output_format = 'emacs'
-
- def SetOutputFormat(self, output_format):
- """Sets the output format for errors."""
- self.output_format = output_format
-
- def SetVerboseLevel(self, level):
- """Sets the module's verbosity, and returns the previous setting."""
- last_verbose_level = self.verbose_level
- self.verbose_level = level
- return last_verbose_level
-
- def SetCountingStyle(self, counting_style):
- """Sets the module's counting options."""
- self.counting = counting_style
-
- def SetFilters(self, filters):
- """Sets the error-message filters.
-
- These filters are applied when deciding whether to emit a given
- error message.
-
- Args:
- filters: A string of comma-separated filters (eg "+whitespace/indent").
- Each filter should start with + or -; else we die.
-
- Raises:
- ValueError: The comma-separated filters did not all start with '+' or '-'.
- E.g. "-,+whitespace,-whitespace/indent,whitespace/badfilter"
- """
- # Default filters always have less priority than the flag ones.
- self.filters = _DEFAULT_FILTERS[:]
- self.AddFilters(filters)
-
- def AddFilters(self, filters):
- """ Adds more filters to the existing list of error-message filters. """
- for filt in filters.split(','):
- clean_filt = filt.strip()
- if clean_filt:
- self.filters.append(clean_filt)
- for filt in self.filters:
- if not (filt.startswith('+') or filt.startswith('-')):
- raise ValueError('Every filter in --filters must start with + or -'
- ' (%s does not)' % filt)
-
- def BackupFilters(self):
- """ Saves the current filter list to backup storage."""
- self._filters_backup = self.filters[:]
-
- def RestoreFilters(self):
- """ Restores filters previously backed up."""
- self.filters = self._filters_backup[:]
-
- def ResetErrorCounts(self):
- """Sets the module's error statistic back to zero."""
- self.error_count = 0
- self.errors_by_category = {}
-
- def IncrementErrorCount(self, category):
- """Bumps the module's error statistic."""
- self.error_count += 1
- if self.counting in ('toplevel', 'detailed'):
- if self.counting != 'detailed':
- category = category.split('/')[0]
- if category not in self.errors_by_category:
- self.errors_by_category[category] = 0
- self.errors_by_category[category] += 1
-
- def PrintErrorCounts(self):
- """Print a summary of errors by category, and the total."""
- for category, count in self.errors_by_category.iteritems():
- sys.stderr.write('Category \'%s\' errors found: %d\n' %
- (category, count))
- sys.stderr.write('Total errors found: %d\n' % self.error_count)
-
-_cpplint_state = _CppLintState()
-
-
-def _OutputFormat():
- """Gets the module's output format."""
- return _cpplint_state.output_format
-
-
-def _SetOutputFormat(output_format):
- """Sets the module's output format."""
- _cpplint_state.SetOutputFormat(output_format)
-
-
-def _VerboseLevel():
- """Returns the module's verbosity setting."""
- return _cpplint_state.verbose_level
-
-
-def _SetVerboseLevel(level):
- """Sets the module's verbosity, and returns the previous setting."""
- return _cpplint_state.SetVerboseLevel(level)
-
-
-def _SetCountingStyle(level):
- """Sets the module's counting options."""
- _cpplint_state.SetCountingStyle(level)
-
-
-def _Filters():
- """Returns the module's list of output filters, as a list."""
- return _cpplint_state.filters
-
-
-def _SetFilters(filters):
- """Sets the module's error-message filters.
-
- These filters are applied when deciding whether to emit a given
- error message.
-
- Args:
- filters: A string of comma-separated filters (eg "whitespace/indent").
- Each filter should start with + or -; else we die.
- """
- _cpplint_state.SetFilters(filters)
-
-def _AddFilters(filters):
- """Adds more filter overrides.
-
- Unlike _SetFilters, this function does not reset the current list of filters
- available.
-
- Args:
- filters: A string of comma-separated filters (eg "whitespace/indent").
- Each filter should start with + or -; else we die.
- """
- _cpplint_state.AddFilters(filters)
-
-def _BackupFilters():
- """ Saves the current filter list to backup storage."""
- _cpplint_state.BackupFilters()
-
-def _RestoreFilters():
- """ Restores filters previously backed up."""
- _cpplint_state.RestoreFilters()
-
-class _FunctionState(object):
- """Tracks current function name and the number of lines in its body."""
-
- _NORMAL_TRIGGER = 250 # for --v=0, 500 for --v=1, etc.
- _TEST_TRIGGER = 400 # about 50% more than _NORMAL_TRIGGER.
-
- def __init__(self):
- self.in_a_function = False
- self.lines_in_function = 0
- self.current_function = ''
-
- def Begin(self, function_name):
- """Start analyzing function body.
-
- Args:
- function_name: The name of the function being tracked.
- """
- self.in_a_function = True
- self.lines_in_function = 0
- self.current_function = function_name
-
- def Count(self):
- """Count line in current function body."""
- if self.in_a_function:
- self.lines_in_function += 1
-
- def Check(self, error, filename, linenum):
- """Report if too many lines in function body.
-
- Args:
- error: The function to call with any errors found.
- filename: The name of the current file.
- linenum: The number of the line to check.
- """
- if Match(r'T(EST|est)', self.current_function):
- base_trigger = self._TEST_TRIGGER
- else:
- base_trigger = self._NORMAL_TRIGGER
- trigger = base_trigger * 2**_VerboseLevel()
-
- if self.lines_in_function > trigger:
- error_level = int(math.log(self.lines_in_function / base_trigger, 2))
- # 50 => 0, 100 => 1, 200 => 2, 400 => 3, 800 => 4, 1600 => 5, ...
- if error_level > 5:
- error_level = 5
- error(filename, linenum, 'readability/fn_size', error_level,
- 'Small and focused functions are preferred:'
- ' %s has %d non-comment lines'
- ' (error triggered by exceeding %d lines).' % (
- self.current_function, self.lines_in_function, trigger))
-
- def End(self):
- """Stop analyzing function body."""
- self.in_a_function = False
-
-
-class _IncludeError(Exception):
- """Indicates a problem with the include order in a file."""
- pass
-
-
-class FileInfo(object):
- """Provides utility functions for filenames.
-
- FileInfo provides easy access to the components of a file's path
- relative to the project root.
- """
-
- def __init__(self, filename):
- self._filename = filename
-
- def FullName(self):
- """Make Windows paths like Unix."""
- return os.path.abspath(self._filename).replace('\\', '/')
-
- def RepositoryName(self):
- """FullName after removing the local path to the repository.
-
- If we have a real absolute path name here we can try to do something smart:
- detecting the root of the checkout and truncating /path/to/checkout from
- the name so that we get header guards that don't include things like
- "C:\Documents and Settings\..." or "/home/username/..." in them and thus
- people on different computers who have checked the source out to different
- locations won't see bogus errors.
- """
- fullname = self.FullName()
-
- if os.path.exists(fullname):
- project_dir = os.path.dirname(fullname)
-
- if os.path.exists(os.path.join(project_dir, ".svn")):
- # If there's a .svn file in the current directory, we recursively look
- # up the directory tree for the top of the SVN checkout
- root_dir = project_dir
- one_up_dir = os.path.dirname(root_dir)
- while os.path.exists(os.path.join(one_up_dir, ".svn")):
- root_dir = os.path.dirname(root_dir)
- one_up_dir = os.path.dirname(one_up_dir)
-
- prefix = os.path.commonprefix([root_dir, project_dir])
- return fullname[len(prefix) + 1:]
-
- # Not SVN <= 1.6? Try to find a git, hg, or svn top level directory by
- # searching up from the current path.
- root_dir = os.path.dirname(fullname)
- while (root_dir != os.path.dirname(root_dir) and
- not os.path.exists(os.path.join(root_dir, ".git")) and
- not os.path.exists(os.path.join(root_dir, ".hg")) and
- not os.path.exists(os.path.join(root_dir, ".svn"))):
- root_dir = os.path.dirname(root_dir)
-
- if (os.path.exists(os.path.join(root_dir, ".git")) or
- os.path.exists(os.path.join(root_dir, ".hg")) or
- os.path.exists(os.path.join(root_dir, ".svn"))):
- prefix = os.path.commonprefix([root_dir, project_dir])
- return fullname[len(prefix) + 1:]
-
- # Don't know what to do; header guard warnings may be wrong...
- return fullname
-
- def Split(self):
- """Splits the file into the directory, basename, and extension.
-
- For 'chrome/browser/browser.cc', Split() would
- return ('chrome/browser', 'browser', '.cc')
-
- Returns:
- A tuple of (directory, basename, extension).
- """
-
- googlename = self.RepositoryName()
- project, rest = os.path.split(googlename)
- return (project,) + os.path.splitext(rest)
-
- def BaseName(self):
- """File base name - text after the final slash, before the final period."""
- return self.Split()[1]
-
- def Extension(self):
- """File extension - text following the final period."""
- return self.Split()[2]
-
- def NoExtension(self):
- """File has no source file extension."""
- return '/'.join(self.Split()[0:2])
-
- def IsSource(self):
- """File has a source file extension."""
- return self.Extension()[1:] in ('c', 'cc', 'cpp', 'cxx')
-
-
-def _ShouldPrintError(category, confidence, linenum):
- """If confidence >= verbose, category passes filter and is not suppressed."""
-
- # There are three ways we might decide not to print an error message:
- # a "NOLINT(category)" comment appears in the source,
- # the verbosity level isn't high enough, or the filters filter it out.
- if IsErrorSuppressedByNolint(category, linenum):
- return False
-
- if confidence < _cpplint_state.verbose_level:
- return False
-
- is_filtered = False
- for one_filter in _Filters():
- if one_filter.startswith('-'):
- if category.startswith(one_filter[1:]):
- is_filtered = True
- elif one_filter.startswith('+'):
- if category.startswith(one_filter[1:]):
- is_filtered = False
- else:
- assert False # should have been checked for in SetFilter.
- if is_filtered:
- return False
-
- return True
-
-
-def Error(filename, linenum, category, confidence, message):
- """Logs the fact we've found a lint error.
-
- We log where the error was found, and also our confidence in the error,
- that is, how certain we are this is a legitimate style regression, and
- not a misidentification or a use that's sometimes justified.
-
- False positives can be suppressed by the use of
- "cpplint(category)" comments on the offending line. These are
- parsed into _error_suppressions.
-
- Args:
- filename: The name of the file containing the error.
- linenum: The number of the line containing the error.
- category: A string used to describe the "category" this bug
- falls under: "whitespace", say, or "runtime". Categories
- may have a hierarchy separated by slashes: "whitespace/indent".
- confidence: A number from 1-5 representing a confidence score for
- the error, with 5 meaning that we are certain of the problem,
- and 1 meaning that it could be a legitimate construct.
- message: The error message.
- """
- if _ShouldPrintError(category, confidence, linenum):
- _cpplint_state.IncrementErrorCount(category)
- if _cpplint_state.output_format == 'vs7':
- sys.stderr.write('%s(%s): %s [%s] [%d]\n' % (
- filename, linenum, message, category, confidence))
- elif _cpplint_state.output_format == 'eclipse':
- sys.stderr.write('%s:%s: warning: %s [%s] [%d]\n' % (
- filename, linenum, message, category, confidence))
- else:
- sys.stderr.write('%s:%s: %s [%s] [%d]\n' % (
- filename, linenum, message, category, confidence))
-
-
-# Matches standard C++ escape sequences per 2.13.2.3 of the C++ standard.
-_RE_PATTERN_CLEANSE_LINE_ESCAPES = re.compile(
- r'\\([abfnrtv?"\\\']|\d+|x[0-9a-fA-F]+)')
-# Match a single C style comment on the same line.
-_RE_PATTERN_C_COMMENTS = r'/\*(?:[^*]|\*(?!/))*\*/'
-# Matches multi-line C style comments.
-# This RE is a little bit more complicated than one might expect, because we
-# have to take care of space removals tools so we can handle comments inside
-# statements better.
-# The current rule is: We only clear spaces from both sides when we're at the
-# end of the line. Otherwise, we try to remove spaces from the right side,
-# if this doesn't work we try on left side but only if there's a non-character
-# on the right.
-_RE_PATTERN_CLEANSE_LINE_C_COMMENTS = re.compile(
- r'(\s*' + _RE_PATTERN_C_COMMENTS + r'\s*$|' +
- _RE_PATTERN_C_COMMENTS + r'\s+|' +
- r'\s+' + _RE_PATTERN_C_COMMENTS + r'(?=\W)|' +
- _RE_PATTERN_C_COMMENTS + r')')
-
-
-def IsCppString(line):
- """Does line terminate so, that the next symbol is in string constant.
-
- This function does not consider single-line nor multi-line comments.
-
- Args:
- line: is a partial line of code starting from the 0..n.
-
- Returns:
- True, if next character appended to 'line' is inside a
- string constant.
- """
-
- line = line.replace(r'\\', 'XX') # after this, \\" does not match to \"
- return ((line.count('"') - line.count(r'\"') - line.count("'\"'")) & 1) == 1
-
-
-def CleanseRawStrings(raw_lines):
- """Removes C++11 raw strings from lines.
-
- Before:
- static const char kData[] = R"(
- multi-line string
- )";
-
- After:
- static const char kData[] = ""
- (replaced by blank line)
- "";
-
- Args:
- raw_lines: list of raw lines.
-
- Returns:
- list of lines with C++11 raw strings replaced by empty strings.
- """
-
- delimiter = None
- lines_without_raw_strings = []
- for line in raw_lines:
- if delimiter:
- # Inside a raw string, look for the end
- end = line.find(delimiter)
- if end >= 0:
- # Found the end of the string, match leading space for this
- # line and resume copying the original lines, and also insert
- # a "" on the last line.
- leading_space = Match(r'^(\s*)\S', line)
- line = leading_space.group(1) + '""' + line[end + len(delimiter):]
- delimiter = None
- else:
- # Haven't found the end yet, append a blank line.
- line = '""'
-
- # Look for beginning of a raw string, and replace them with
- # empty strings. This is done in a loop to handle multiple raw
- # strings on the same line.
- while delimiter is None:
- # Look for beginning of a raw string.
- # See 2.14.15 [lex.string] for syntax.
- matched = Match(r'^(.*)\b(?:R|u8R|uR|UR|LR)"([^\s\\()]*)\((.*)$', line)
- if matched:
- delimiter = ')' + matched.group(2) + '"'
-
- end = matched.group(3).find(delimiter)
- if end >= 0:
- # Raw string ended on same line
- line = (matched.group(1) + '""' +
- matched.group(3)[end + len(delimiter):])
- delimiter = None
- else:
- # Start of a multi-line raw string
- line = matched.group(1) + '""'
- else:
- break
-
- lines_without_raw_strings.append(line)
-
- # TODO(unknown): if delimiter is not None here, we might want to
- # emit a warning for unterminated string.
- return lines_without_raw_strings
-
-
-def FindNextMultiLineCommentStart(lines, lineix):
- """Find the beginning marker for a multiline comment."""
- while lineix < len(lines):
- if lines[lineix].strip().startswith('/*'):
- # Only return this marker if the comment goes beyond this line
- if lines[lineix].strip().find('*/', 2) < 0:
- return lineix
- lineix += 1
- return len(lines)
-
-
-def FindNextMultiLineCommentEnd(lines, lineix):
- """We are inside a comment, find the end marker."""
- while lineix < len(lines):
- if lines[lineix].strip().endswith('*/'):
- return lineix
- lineix += 1
- return len(lines)
-
-
-def RemoveMultiLineCommentsFromRange(lines, begin, end):
- """Clears a range of lines for multi-line comments."""
- # Having // dummy comments makes the lines non-empty, so we will not get
- # unnecessary blank line warnings later in the code.
- for i in range(begin, end):
- lines[i] = '/**/'
-
-
-def RemoveMultiLineComments(filename, lines, error):
- """Removes multiline (c-style) comments from lines."""
- lineix = 0
- while lineix < len(lines):
- lineix_begin = FindNextMultiLineCommentStart(lines, lineix)
- if lineix_begin >= len(lines):
- return
- lineix_end = FindNextMultiLineCommentEnd(lines, lineix_begin)
- if lineix_end >= len(lines):
- error(filename, lineix_begin + 1, 'readability/multiline_comment', 5,
- 'Could not find end of multi-line comment')
- return
- RemoveMultiLineCommentsFromRange(lines, lineix_begin, lineix_end + 1)
- lineix = lineix_end + 1
-
-
-def CleanseComments(line):
- """Removes //-comments and single-line C-style /* */ comments.
-
- Args:
- line: A line of C++ source.
-
- Returns:
- The line with single-line comments removed.
- """
- commentpos = line.find('//')
- if commentpos != -1 and not IsCppString(line[:commentpos]):
- line = line[:commentpos].rstrip()
- # get rid of /* ... */
- return _RE_PATTERN_CLEANSE_LINE_C_COMMENTS.sub('', line)
-
-
-class CleansedLines(object):
- """Holds 4 copies of all lines with different preprocessing applied to them.
-
- 1) elided member contains lines without strings and comments.
- 2) lines member contains lines without comments.
- 3) raw_lines member contains all the lines without processing.
- 4) lines_without_raw_strings member is same as raw_lines, but with C++11 raw
- strings removed.
- All these members are of <type 'list'>, and of the same length.
- """
-
- def __init__(self, lines):
- self.elided = []
- self.lines = []
- self.raw_lines = lines
- self.num_lines = len(lines)
- self.lines_without_raw_strings = CleanseRawStrings(lines)
- for linenum in range(len(self.lines_without_raw_strings)):
- self.lines.append(CleanseComments(
- self.lines_without_raw_strings[linenum]))
- elided = self._CollapseStrings(self.lines_without_raw_strings[linenum])
- self.elided.append(CleanseComments(elided))
-
- def NumLines(self):
- """Returns the number of lines represented."""
- return self.num_lines
-
- @staticmethod
- def _CollapseStrings(elided):
- """Collapses strings and chars on a line to simple "" or '' blocks.
-
- We nix strings first so we're not fooled by text like '"http://"'
-
- Args:
- elided: The line being processed.
-
- Returns:
- The line with collapsed strings.
- """
- if _RE_PATTERN_INCLUDE.match(elided):
- return elided
-
- # Remove escaped characters first to make quote/single quote collapsing
- # basic. Things that look like escaped characters shouldn't occur
- # outside of strings and chars.
- elided = _RE_PATTERN_CLEANSE_LINE_ESCAPES.sub('', elided)
-
- # Replace quoted strings and digit separators. Both single quotes
- # and double quotes are processed in the same loop, otherwise
- # nested quotes wouldn't work.
- collapsed = ''
- while True:
- # Find the first quote character
- match = Match(r'^([^\'"]*)([\'"])(.*)$', elided)
- if not match:
- collapsed += elided
- break
- head, quote, tail = match.groups()
-
- if quote == '"':
- # Collapse double quoted strings
- second_quote = tail.find('"')
- if second_quote >= 0:
- collapsed += head + '""'
- elided = tail[second_quote + 1:]
- else:
- # Unmatched double quote, don't bother processing the rest
- # of the line since this is probably a multiline string.
- collapsed += elided
- break
- else:
- # Found single quote, check nearby text to eliminate digit separators.
- #
- # There is no special handling for floating point here, because
- # the integer/fractional/exponent parts would all be parsed
- # correctly as long as there are digits on both sides of the
- # separator. So we are fine as long as we don't see something
- # like "0.'3" (gcc 4.9.0 will not allow this literal).
- if Search(r'\b(?:0[bBxX]?|[1-9])[0-9a-fA-F]*$', head):
- match_literal = Match(r'^((?:\'?[0-9a-zA-Z_])*)(.*)$', "'" + tail)
- collapsed += head + match_literal.group(1).replace("'", '')
- elided = match_literal.group(2)
- else:
- second_quote = tail.find('\'')
- if second_quote >= 0:
- collapsed += head + "''"
- elided = tail[second_quote + 1:]
- else:
- # Unmatched single quote
- collapsed += elided
- break
-
- return collapsed
-
-
-def FindEndOfExpressionInLine(line, startpos, stack):
- """Find the position just after the end of current parenthesized expression.
-
- Args:
- line: a CleansedLines line.
- startpos: start searching at this position.
- stack: nesting stack at startpos.
-
- Returns:
- On finding matching end: (index just after matching end, None)
- On finding an unclosed expression: (-1, None)
- Otherwise: (-1, new stack at end of this line)
- """
- for i in xrange(startpos, len(line)):
- char = line[i]
- if char in '([{':
- # Found start of parenthesized expression, push to expression stack
- stack.append(char)
- elif char == '<':
- # Found potential start of template argument list
- if i > 0 and line[i - 1] == '<':
- # Left shift operator
- if stack and stack[-1] == '<':
- stack.pop()
- if not stack:
- return (-1, None)
- elif i > 0 and Search(r'\boperator\s*$', line[0:i]):
- # operator<, don't add to stack
- continue
- else:
- # Tentative start of template argument list
- stack.append('<')
- elif char in ')]}':
- # Found end of parenthesized expression.
- #
- # If we are currently expecting a matching '>', the pending '<'
- # must have been an operator. Remove them from expression stack.
- while stack and stack[-1] == '<':
- stack.pop()
- if not stack:
- return (-1, None)
- if ((stack[-1] == '(' and char == ')') or
- (stack[-1] == '[' and char == ']') or
- (stack[-1] == '{' and char == '}')):
- stack.pop()
- if not stack:
- return (i + 1, None)
- else:
- # Mismatched parentheses
- return (-1, None)
- elif char == '>':
- # Found potential end of template argument list.
-
- # Ignore "->" and operator functions
- if (i > 0 and
- (line[i - 1] == '-' or Search(r'\boperator\s*$', line[0:i - 1]))):
- continue
-
- # Pop the stack if there is a matching '<'. Otherwise, ignore
- # this '>' since it must be an operator.
- if stack:
- if stack[-1] == '<':
- stack.pop()
- if not stack:
- return (i + 1, None)
- elif char == ';':
- # Found something that look like end of statements. If we are currently
- # expecting a '>', the matching '<' must have been an operator, since
- # template argument list should not contain statements.
- while stack and stack[-1] == '<':
- stack.pop()
- if not stack:
- return (-1, None)
-
- # Did not find end of expression or unbalanced parentheses on this line
- return (-1, stack)
-
-
-def CloseExpression(clean_lines, linenum, pos):
- """If input points to ( or { or [ or <, finds the position that closes it.
-
- If lines[linenum][pos] points to a '(' or '{' or '[' or '<', finds the
- linenum/pos that correspond to the closing of the expression.
-
- TODO(unknown): cpplint spends a fair bit of time matching parentheses.
- Ideally we would want to index all opening and closing parentheses once
- and have CloseExpression be just a simple lookup, but due to preprocessor
- tricks, this is not so easy.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- pos: A position on the line.
-
- Returns:
- A tuple (line, linenum, pos) pointer *past* the closing brace, or
- (line, len(lines), -1) if we never find a close. Note we ignore
- strings and comments when matching; and the line we return is the
- 'cleansed' line at linenum.
- """
-
- line = clean_lines.elided[linenum]
- if (line[pos] not in '({[<') or Match(r'<[<=]', line[pos:]):
- return (line, clean_lines.NumLines(), -1)
-
- # Check first line
- (end_pos, stack) = FindEndOfExpressionInLine(line, pos, [])
- if end_pos > -1:
- return (line, linenum, end_pos)
-
- # Continue scanning forward
- while stack and linenum < clean_lines.NumLines() - 1:
- linenum += 1
- line = clean_lines.elided[linenum]
- (end_pos, stack) = FindEndOfExpressionInLine(line, 0, stack)
- if end_pos > -1:
- return (line, linenum, end_pos)
-
- # Did not find end of expression before end of file, give up
- return (line, clean_lines.NumLines(), -1)
-
-
-def FindStartOfExpressionInLine(line, endpos, stack):
- """Find position at the matching start of current expression.
-
- This is almost the reverse of FindEndOfExpressionInLine, but note
- that the input position and returned position differs by 1.
-
- Args:
- line: a CleansedLines line.
- endpos: start searching at this position.
- stack: nesting stack at endpos.
-
- Returns:
- On finding matching start: (index at matching start, None)
- On finding an unclosed expression: (-1, None)
- Otherwise: (-1, new stack at beginning of this line)
- """
- i = endpos
- while i >= 0:
- char = line[i]
- if char in ')]}':
- # Found end of expression, push to expression stack
- stack.append(char)
- elif char == '>':
- # Found potential end of template argument list.
- #
- # Ignore it if it's a "->" or ">=" or "operator>"
- if (i > 0 and
- (line[i - 1] == '-' or
- Match(r'\s>=\s', line[i - 1:]) or
- Search(r'\boperator\s*$', line[0:i]))):
- i -= 1
- else:
- stack.append('>')
- elif char == '<':
- # Found potential start of template argument list
- if i > 0 and line[i - 1] == '<':
- # Left shift operator
- i -= 1
- else:
- # If there is a matching '>', we can pop the expression stack.
- # Otherwise, ignore this '<' since it must be an operator.
- if stack and stack[-1] == '>':
- stack.pop()
- if not stack:
- return (i, None)
- elif char in '([{':
- # Found start of expression.
- #
- # If there are any unmatched '>' on the stack, they must be
- # operators. Remove those.
- while stack and stack[-1] == '>':
- stack.pop()
- if not stack:
- return (-1, None)
- if ((char == '(' and stack[-1] == ')') or
- (char == '[' and stack[-1] == ']') or
- (char == '{' and stack[-1] == '}')):
- stack.pop()
- if not stack:
- return (i, None)
- else:
- # Mismatched parentheses
- return (-1, None)
- elif char == ';':
- # Found something that look like end of statements. If we are currently
- # expecting a '<', the matching '>' must have been an operator, since
- # template argument list should not contain statements.
- while stack and stack[-1] == '>':
- stack.pop()
- if not stack:
- return (-1, None)
-
- i -= 1
-
- return (-1, stack)
-
-
-def ReverseCloseExpression(clean_lines, linenum, pos):
- """If input points to ) or } or ] or >, finds the position that opens it.
-
- If lines[linenum][pos] points to a ')' or '}' or ']' or '>', finds the
- linenum/pos that correspond to the opening of the expression.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- pos: A position on the line.
-
- Returns:
- A tuple (line, linenum, pos) pointer *at* the opening brace, or
- (line, 0, -1) if we never find the matching opening brace. Note
- we ignore strings and comments when matching; and the line we
- return is the 'cleansed' line at linenum.
- """
- line = clean_lines.elided[linenum]
- if line[pos] not in ')}]>':
- return (line, 0, -1)
-
- # Check last line
- (start_pos, stack) = FindStartOfExpressionInLine(line, pos, [])
- if start_pos > -1:
- return (line, linenum, start_pos)
-
- # Continue scanning backward
- while stack and linenum > 0:
- linenum -= 1
- line = clean_lines.elided[linenum]
- (start_pos, stack) = FindStartOfExpressionInLine(line, len(line) - 1, stack)
- if start_pos > -1:
- return (line, linenum, start_pos)
-
- # Did not find start of expression before beginning of file, give up
- return (line, 0, -1)
-
-
-def CheckForCopyright(filename, lines, error):
- """Logs an error if no Copyright message appears at the top of the file."""
-
- # We'll say it should occur by line 10. Don't forget there's a
- # dummy line at the front.
- for line in xrange(1, min(len(lines), 11)):
- if re.search(r'Copyright', lines[line], re.I): break
- else: # means no copyright line was found
- error(filename, 0, 'legal/copyright', 5,
- 'No copyright message found. '
- 'You should have a line: "Copyright [year] <Copyright Owner>"')
-
-
-def GetIndentLevel(line):
- """Return the number of leading spaces in line.
-
- Args:
- line: A string to check.
-
- Returns:
- An integer count of leading spaces, possibly zero.
- """
- indent = Match(r'^( *)\S', line)
- if indent:
- return len(indent.group(1))
- else:
- return 0
-
-
-def GetHeaderGuardCPPVariable(filename):
- """Returns the CPP variable that should be used as a header guard.
-
- Args:
- filename: The name of a C++ header file.
-
- Returns:
- The CPP variable that should be used as a header guard in the
- named file.
-
- """
-
- # Restores original filename in case that cpplint is invoked from Emacs's
- # flymake.
- filename = re.sub(r'_flymake\.h$', '.h', filename)
- filename = re.sub(r'/\.flymake/([^/]*)$', r'/\1', filename)
- # Replace 'c++' with 'cpp'.
- filename = filename.replace('C++', 'cpp').replace('c++', 'cpp')
-
- fileinfo = FileInfo(filename)
- file_path_from_root = fileinfo.RepositoryName()
- if _root:
- file_path_from_root = re.sub('^' + _root + os.sep, '', file_path_from_root)
- return re.sub(r'[^a-zA-Z0-9]', '_', file_path_from_root).upper() + '_'
-
-
-def CheckForHeaderGuard(filename, clean_lines, error):
- """Checks that the file contains a header guard.
-
- Logs an error if no #ifndef header guard is present. For other
- headers, checks that the full pathname is used.
-
- Args:
- filename: The name of the C++ header file.
- clean_lines: A CleansedLines instance containing the file.
- error: The function to call with any errors found.
- """
-
- # Don't check for header guards if there are error suppression
- # comments somewhere in this file.
- #
- # Because this is silencing a warning for a nonexistent line, we
- # only support the very specific NOLINT(build/header_guard) syntax,
- # and not the general NOLINT or NOLINT(*) syntax.
- raw_lines = clean_lines.lines_without_raw_strings
- for i in raw_lines:
- if Search(r'//\s*NOLINT\(build/header_guard\)', i):
- return
-
- cppvar = GetHeaderGuardCPPVariable(filename)
-
- ifndef = ''
- ifndef_linenum = 0
- define = ''
- endif = ''
- endif_linenum = 0
- for linenum, line in enumerate(raw_lines):
- linesplit = line.split()
- if len(linesplit) >= 2:
- # find the first occurrence of #ifndef and #define, save arg
- if not ifndef and linesplit[0] == '#ifndef':
- # set ifndef to the header guard presented on the #ifndef line.
- ifndef = linesplit[1]
- ifndef_linenum = linenum
- if not define and linesplit[0] == '#define':
- define = linesplit[1]
- # find the last occurrence of #endif, save entire line
- if line.startswith('#endif'):
- endif = line
- endif_linenum = linenum
-
- if not ifndef or not define or ifndef != define:
- error(filename, 0, 'build/header_guard', 5,
- 'No #ifndef header guard found, suggested CPP variable is: %s' %
- cppvar)
- return
-
- # The guard should be PATH_FILE_H_, but we also allow PATH_FILE_H__
- # for backward compatibility.
- if ifndef != cppvar:
- error_level = 0
- if ifndef != cppvar + '_':
- error_level = 5
-
- ParseNolintSuppressions(filename, raw_lines[ifndef_linenum], ifndef_linenum,
- error)
- error(filename, ifndef_linenum, 'build/header_guard', error_level,
- '#ifndef header guard has wrong style, please use: %s' % cppvar)
-
- # Check for "//" comments on endif line.
- ParseNolintSuppressions(filename, raw_lines[endif_linenum], endif_linenum,
- error)
- match = Match(r'#endif\s*//\s*' + cppvar + r'(_)?\b', endif)
- if match:
- if match.group(1) == '_':
- # Issue low severity warning for deprecated double trailing underscore
- error(filename, endif_linenum, 'build/header_guard', 0,
- '#endif line should be "#endif // %s"' % cppvar)
- return
-
- # Didn't find the corresponding "//" comment. If this file does not
- # contain any "//" comments at all, it could be that the compiler
- # only wants "/**/" comments, look for those instead.
- no_single_line_comments = True
- for i in xrange(1, len(raw_lines) - 1):
- line = raw_lines[i]
- if Match(r'^(?:(?:\'(?:\.|[^\'])*\')|(?:"(?:\.|[^"])*")|[^\'"])*//', line):
- no_single_line_comments = False
- break
-
- if no_single_line_comments:
- match = Match(r'#endif\s*/\*\s*' + cppvar + r'(_)?\s*\*/', endif)
- if match:
- if match.group(1) == '_':
- # Low severity warning for double trailing underscore
- error(filename, endif_linenum, 'build/header_guard', 0,
- '#endif line should be "#endif /* %s */"' % cppvar)
- return
-
- # Didn't find anything
- error(filename, endif_linenum, 'build/header_guard', 5,
- '#endif line should be "#endif // %s"' % cppvar)
-
-
-def CheckHeaderFileIncluded(filename, include_state, error):
- """Logs an error if a .cc file does not include its header."""
-
- # Do not check test files
- if filename.endswith('_test.cc') or filename.endswith('_unittest.cc'):
- return
-
- fileinfo = FileInfo(filename)
- headerfile = filename[0:len(filename) - 2] + 'h'
- if not os.path.exists(headerfile):
- return
- headername = FileInfo(headerfile).RepositoryName()
- first_include = 0
- for section_list in include_state.include_list:
- for f in section_list:
- if headername in f[0] or f[0] in headername:
- return
- if not first_include:
- first_include = f[1]
-
- error(filename, first_include, 'build/include', 5,
- '%s should include its header file %s' % (fileinfo.RepositoryName(),
- headername))
-
-
-def CheckForBadCharacters(filename, lines, error):
- """Logs an error for each line containing bad characters.
-
- Two kinds of bad characters:
-
- 1. Unicode replacement characters: These indicate that either the file
- contained invalid UTF-8 (likely) or Unicode replacement characters (which
- it shouldn't). Note that it's possible for this to throw off line
- numbering if the invalid UTF-8 occurred adjacent to a newline.
-
- 2. NUL bytes. These are problematic for some tools.
-
- Args:
- filename: The name of the current file.
- lines: An array of strings, each representing a line of the file.
- error: The function to call with any errors found.
- """
- for linenum, line in enumerate(lines):
- if u'\ufffd' in line:
- error(filename, linenum, 'readability/utf8', 5,
- 'Line contains invalid UTF-8 (or Unicode replacement character).')
- if '\0' in line:
- error(filename, linenum, 'readability/nul', 5, 'Line contains NUL byte.')
-
-
-def CheckForNewlineAtEOF(filename, lines, error):
- """Logs an error if there is no newline char at the end of the file.
-
- Args:
- filename: The name of the current file.
- lines: An array of strings, each representing a line of the file.
- error: The function to call with any errors found.
- """
-
- # The array lines() was created by adding two newlines to the
- # original file (go figure), then splitting on \n.
- # To verify that the file ends in \n, we just have to make sure the
- # last-but-two element of lines() exists and is empty.
- if len(lines) < 3 or lines[-2]:
- error(filename, len(lines) - 2, 'whitespace/ending_newline', 5,
- 'Could not find a newline character at the end of the file.')
-
-
-def CheckForMultilineCommentsAndStrings(filename, clean_lines, linenum, error):
- """Logs an error if we see /* ... */ or "..." that extend past one line.
-
- /* ... */ comments are legit inside macros, for one line.
- Otherwise, we prefer // comments, so it's ok to warn about the
- other. Likewise, it's ok for strings to extend across multiple
- lines, as long as a line continuation character (backslash)
- terminates each line. Although not currently prohibited by the C++
- style guide, it's ugly and unnecessary. We don't do well with either
- in this lint program, so we warn about both.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Remove all \\ (escaped backslashes) from the line. They are OK, and the
- # second (escaped) slash may trigger later \" detection erroneously.
- line = line.replace('\\\\', '')
-
- if line.count('/*') > line.count('*/'):
- error(filename, linenum, 'readability/multiline_comment', 5,
- 'Complex multi-line /*...*/-style comment found. '
- 'Lint may give bogus warnings. '
- 'Consider replacing these with //-style comments, '
- 'with #if 0...#endif, '
- 'or with more clearly structured multi-line comments.')
-
- if (line.count('"') - line.count('\\"')) % 2:
- error(filename, linenum, 'readability/multiline_string', 5,
- 'Multi-line string ("...") found. This lint script doesn\'t '
- 'do well with such strings, and may give bogus warnings. '
- 'Use C++11 raw strings or concatenation instead.')
-
-
-# (non-threadsafe name, thread-safe alternative, validation pattern)
-#
-# The validation pattern is used to eliminate false positives such as:
-# _rand(); // false positive due to substring match.
-# ->rand(); // some member function rand().
-# ACMRandom rand(seed); // some variable named rand.
-# ISAACRandom rand(); // another variable named rand.
-#
-# Basically we require the return value of these functions to be used
-# in some expression context on the same line by matching on some
-# operator before the function name. This eliminates constructors and
-# member function calls.
-_UNSAFE_FUNC_PREFIX = r'(?:[-+*/=%^&|(<]\s*|>\s+)'
-_THREADING_LIST = (
- ('asctime(', 'asctime_r(', _UNSAFE_FUNC_PREFIX + r'asctime\([^)]+\)'),
- ('ctime(', 'ctime_r(', _UNSAFE_FUNC_PREFIX + r'ctime\([^)]+\)'),
- ('getgrgid(', 'getgrgid_r(', _UNSAFE_FUNC_PREFIX + r'getgrgid\([^)]+\)'),
- ('getgrnam(', 'getgrnam_r(', _UNSAFE_FUNC_PREFIX + r'getgrnam\([^)]+\)'),
- ('getlogin(', 'getlogin_r(', _UNSAFE_FUNC_PREFIX + r'getlogin\(\)'),
- ('getpwnam(', 'getpwnam_r(', _UNSAFE_FUNC_PREFIX + r'getpwnam\([^)]+\)'),
- ('getpwuid(', 'getpwuid_r(', _UNSAFE_FUNC_PREFIX + r'getpwuid\([^)]+\)'),
- ('gmtime(', 'gmtime_r(', _UNSAFE_FUNC_PREFIX + r'gmtime\([^)]+\)'),
- ('localtime(', 'localtime_r(', _UNSAFE_FUNC_PREFIX + r'localtime\([^)]+\)'),
- ('rand(', 'rand_r(', _UNSAFE_FUNC_PREFIX + r'rand\(\)'),
- ('strtok(', 'strtok_r(',
- _UNSAFE_FUNC_PREFIX + r'strtok\([^)]+\)'),
- ('ttyname(', 'ttyname_r(', _UNSAFE_FUNC_PREFIX + r'ttyname\([^)]+\)'),
- )
-
-
-def CheckPosixThreading(filename, clean_lines, linenum, error):
- """Checks for calls to thread-unsafe functions.
-
- Much code has been originally written without consideration of
- multi-threading. Also, engineers are relying on their old experience;
- they have learned posix before threading extensions were added. These
- tests guide the engineers to use thread-safe functions (when using
- posix directly).
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
- for single_thread_func, multithread_safe_func, pattern in _THREADING_LIST:
- # Additional pattern matching check to confirm that this is the
- # function we are looking for
- if Search(pattern, line):
- error(filename, linenum, 'runtime/threadsafe_fn', 2,
- 'Consider using ' + multithread_safe_func +
- '...) instead of ' + single_thread_func +
- '...) for improved thread safety.')
-
-
-def CheckVlogArguments(filename, clean_lines, linenum, error):
- """Checks that VLOG() is only used for defining a logging level.
-
- For example, VLOG(2) is correct. VLOG(INFO), VLOG(WARNING), VLOG(ERROR), and
- VLOG(FATAL) are not.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
- if Search(r'\bVLOG\((INFO|ERROR|WARNING|DFATAL|FATAL)\)', line):
- error(filename, linenum, 'runtime/vlog', 5,
- 'VLOG() should be used with numeric verbosity level. '
- 'Use LOG() if you want symbolic severity levels.')
-
-# Matches invalid increment: *count++, which moves pointer instead of
-# incrementing a value.
-_RE_PATTERN_INVALID_INCREMENT = re.compile(
- r'^\s*\*\w+(\+\+|--);')
-
-
-def CheckInvalidIncrement(filename, clean_lines, linenum, error):
- """Checks for invalid increment *count++.
-
- For example following function:
- void increment_counter(int* count) {
- *count++;
- }
- is invalid, because it effectively does count++, moving pointer, and should
- be replaced with ++*count, (*count)++ or *count += 1.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
- if _RE_PATTERN_INVALID_INCREMENT.match(line):
- error(filename, linenum, 'runtime/invalid_increment', 5,
- 'Changing pointer instead of value (or unused value of operator*).')
-
-
-def IsMacroDefinition(clean_lines, linenum):
- if Search(r'^#define', clean_lines[linenum]):
- return True
-
- if linenum > 0 and Search(r'\\$', clean_lines[linenum - 1]):
- return True
-
- return False
-
-
-def IsForwardClassDeclaration(clean_lines, linenum):
- return Match(r'^\s*(\btemplate\b)*.*class\s+\w+;\s*$', clean_lines[linenum])
-
-
-class _BlockInfo(object):
- """Stores information about a generic block of code."""
-
- def __init__(self, seen_open_brace):
- self.seen_open_brace = seen_open_brace
- self.open_parentheses = 0
- self.inline_asm = _NO_ASM
- self.check_namespace_indentation = False
-
- def CheckBegin(self, filename, clean_lines, linenum, error):
- """Run checks that applies to text up to the opening brace.
-
- This is mostly for checking the text after the class identifier
- and the "{", usually where the base class is specified. For other
- blocks, there isn't much to check, so we always pass.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- pass
-
- def CheckEnd(self, filename, clean_lines, linenum, error):
- """Run checks that applies to text after the closing brace.
-
- This is mostly used for checking end of namespace comments.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- pass
-
- def IsBlockInfo(self):
- """Returns true if this block is a _BlockInfo.
-
- This is convenient for verifying that an object is an instance of
- a _BlockInfo, but not an instance of any of the derived classes.
-
- Returns:
- True for this class, False for derived classes.
- """
- return self.__class__ == _BlockInfo
-
-
-class _ExternCInfo(_BlockInfo):
- """Stores information about an 'extern "C"' block."""
-
- def __init__(self):
- _BlockInfo.__init__(self, True)
-
-
-class _ClassInfo(_BlockInfo):
- """Stores information about a class."""
-
- def __init__(self, name, class_or_struct, clean_lines, linenum):
- _BlockInfo.__init__(self, False)
- self.name = name
- self.starting_linenum = linenum
- self.is_derived = False
- self.check_namespace_indentation = True
- if class_or_struct == 'struct':
- self.access = 'public'
- self.is_struct = True
- else:
- self.access = 'private'
- self.is_struct = False
-
- # Remember initial indentation level for this class. Using raw_lines here
- # instead of elided to account for leading comments.
- self.class_indent = GetIndentLevel(clean_lines.raw_lines[linenum])
-
- # Try to find the end of the class. This will be confused by things like:
- # class A {
- # } *x = { ...
- #
- # But it's still good enough for CheckSectionSpacing.
- self.last_line = 0
- depth = 0
- for i in range(linenum, clean_lines.NumLines()):
- line = clean_lines.elided[i]
- depth += line.count('{') - line.count('}')
- if not depth:
- self.last_line = i
- break
-
- def CheckBegin(self, filename, clean_lines, linenum, error):
- # Look for a bare ':'
- if Search('(^|[^:]):($|[^:])', clean_lines.elided[linenum]):
- self.is_derived = True
-
- def CheckEnd(self, filename, clean_lines, linenum, error):
- # If there is a DISALLOW macro, it should appear near the end of
- # the class.
- seen_last_thing_in_class = False
- for i in xrange(linenum - 1, self.starting_linenum, -1):
- match = Search(
- r'\b(DISALLOW_COPY_AND_ASSIGN|DISALLOW_IMPLICIT_CONSTRUCTORS)\(' +
- self.name + r'\)',
- clean_lines.elided[i])
- if match:
- if seen_last_thing_in_class:
- error(filename, i, 'readability/constructors', 3,
- match.group(1) + ' should be the last thing in the class')
- break
-
- if not Match(r'^\s*$', clean_lines.elided[i]):
- seen_last_thing_in_class = True
-
- # Check that closing brace is aligned with beginning of the class.
- # Only do this if the closing brace is indented by only whitespaces.
- # This means we will not check single-line class definitions.
- indent = Match(r'^( *)\}', clean_lines.elided[linenum])
- if indent and len(indent.group(1)) != self.class_indent:
- if self.is_struct:
- parent = 'struct ' + self.name
- else:
- parent = 'class ' + self.name
- error(filename, linenum, 'whitespace/indent', 3,
- 'Closing brace should be aligned with beginning of %s' % parent)
-
-
-class _NamespaceInfo(_BlockInfo):
- """Stores information about a namespace."""
-
- def __init__(self, name, linenum):
- _BlockInfo.__init__(self, False)
- self.name = name or ''
- self.starting_linenum = linenum
- self.check_namespace_indentation = True
-
- def CheckEnd(self, filename, clean_lines, linenum, error):
- """Check end of namespace comments."""
- line = clean_lines.raw_lines[linenum]
-
- # Check how many lines is enclosed in this namespace. Don't issue
- # warning for missing namespace comments if there aren't enough
- # lines. However, do apply checks if there is already an end of
- # namespace comment and it's incorrect.
- #
- # TODO(unknown): We always want to check end of namespace comments
- # if a namespace is large, but sometimes we also want to apply the
- # check if a short namespace contained nontrivial things (something
- # other than forward declarations). There is currently no logic on
- # deciding what these nontrivial things are, so this check is
- # triggered by namespace size only, which works most of the time.
- if (linenum - self.starting_linenum < 10
- and not Match(r'};*\s*(//|/\*).*\bnamespace\b', line)):
- return
-
- # Look for matching comment at end of namespace.
- #
- # Note that we accept C style "/* */" comments for terminating
- # namespaces, so that code that terminate namespaces inside
- # preprocessor macros can be cpplint clean.
- #
- # We also accept stuff like "// end of namespace <name>." with the
- # period at the end.
- #
- # Besides these, we don't accept anything else, otherwise we might
- # get false negatives when existing comment is a substring of the
- # expected namespace.
- if self.name:
- # Named namespace
- if not Match((r'};*\s*(//|/\*).*\bnamespace\s+' + re.escape(self.name) +
- r'[\*/\.\\\s]*$'),
- line):
- error(filename, linenum, 'readability/namespace', 5,
- 'Namespace should be terminated with "// namespace %s"' %
- self.name)
- else:
- # Anonymous namespace
- if not Match(r'};*\s*(//|/\*).*\bnamespace[\*/\.\\\s]*$', line):
- # If "// namespace anonymous" or "// anonymous namespace (more text)",
- # mention "// anonymous namespace" as an acceptable form
- if Match(r'}.*\b(namespace anonymous|anonymous namespace)\b', line):
- error(filename, linenum, 'readability/namespace', 5,
- 'Anonymous namespace should be terminated with "// namespace"'
- ' or "// anonymous namespace"')
- else:
- error(filename, linenum, 'readability/namespace', 5,
- 'Anonymous namespace should be terminated with "// namespace"')
-
-
-class _PreprocessorInfo(object):
- """Stores checkpoints of nesting stacks when #if/#else is seen."""
-
- def __init__(self, stack_before_if):
- # The entire nesting stack before #if
- self.stack_before_if = stack_before_if
-
- # The entire nesting stack up to #else
- self.stack_before_else = []
-
- # Whether we have already seen #else or #elif
- self.seen_else = False
-
-
-class NestingState(object):
- """Holds states related to parsing braces."""
-
- def __init__(self):
- # Stack for tracking all braces. An object is pushed whenever we
- # see a "{", and popped when we see a "}". Only 3 types of
- # objects are possible:
- # - _ClassInfo: a class or struct.
- # - _NamespaceInfo: a namespace.
- # - _BlockInfo: some other type of block.
- self.stack = []
-
- # Top of the previous stack before each Update().
- #
- # Because the nesting_stack is updated at the end of each line, we
- # had to do some convoluted checks to find out what is the current
- # scope at the beginning of the line. This check is simplified by
- # saving the previous top of nesting stack.
- #
- # We could save the full stack, but we only need the top. Copying
- # the full nesting stack would slow down cpplint by ~10%.
- self.previous_stack_top = []
-
- # Stack of _PreprocessorInfo objects.
- self.pp_stack = []
-
- def SeenOpenBrace(self):
- """Check if we have seen the opening brace for the innermost block.
-
- Returns:
- True if we have seen the opening brace, False if the innermost
- block is still expecting an opening brace.
- """
- return (not self.stack) or self.stack[-1].seen_open_brace
-
- def InNamespaceBody(self):
- """Check if we are currently one level inside a namespace body.
-
- Returns:
- True if top of the stack is a namespace block, False otherwise.
- """
- return self.stack and isinstance(self.stack[-1], _NamespaceInfo)
-
- def InExternC(self):
- """Check if we are currently one level inside an 'extern "C"' block.
-
- Returns:
- True if top of the stack is an extern block, False otherwise.
- """
- return self.stack and isinstance(self.stack[-1], _ExternCInfo)
-
- def InClassDeclaration(self):
- """Check if we are currently one level inside a class or struct declaration.
-
- Returns:
- True if top of the stack is a class/struct, False otherwise.
- """
- return self.stack and isinstance(self.stack[-1], _ClassInfo)
-
- def InAsmBlock(self):
- """Check if we are currently one level inside an inline ASM block.
-
- Returns:
- True if the top of the stack is a block containing inline ASM.
- """
- return self.stack and self.stack[-1].inline_asm != _NO_ASM
-
- def InTemplateArgumentList(self, clean_lines, linenum, pos):
- """Check if current position is inside template argument list.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- pos: position just after the suspected template argument.
- Returns:
- True if (linenum, pos) is inside template arguments.
- """
- while linenum < clean_lines.NumLines():
- # Find the earliest character that might indicate a template argument
- line = clean_lines.elided[linenum]
- match = Match(r'^[^{};=\[\]\.<>]*(.)', line[pos:])
- if not match:
- linenum += 1
- pos = 0
- continue
- token = match.group(1)
- pos += len(match.group(0))
-
- # These things do not look like template argument list:
- # class Suspect {
- # class Suspect x; }
- if token in ('{', '}', ';'): return False
-
- # These things look like template argument list:
- # template <class Suspect>
- # template <class Suspect = default_value>
- # template <class Suspect[]>
- # template <class Suspect...>
- if token in ('>', '=', '[', ']', '.'): return True
-
- # Check if token is an unmatched '<'.
- # If not, move on to the next character.
- if token != '<':
- pos += 1
- if pos >= len(line):
- linenum += 1
- pos = 0
- continue
-
- # We can't be sure if we just find a single '<', and need to
- # find the matching '>'.
- (_, end_line, end_pos) = CloseExpression(clean_lines, linenum, pos - 1)
- if end_pos < 0:
- # Not sure if template argument list or syntax error in file
- return False
- linenum = end_line
- pos = end_pos
- return False
-
- def UpdatePreprocessor(self, line):
- """Update preprocessor stack.
-
- We need to handle preprocessors due to classes like this:
- #ifdef SWIG
- struct ResultDetailsPageElementExtensionPoint {
- #else
- struct ResultDetailsPageElementExtensionPoint : public Extension {
- #endif
-
- We make the following assumptions (good enough for most files):
- - Preprocessor condition evaluates to true from #if up to first
- #else/#elif/#endif.
-
- - Preprocessor condition evaluates to false from #else/#elif up
- to #endif. We still perform lint checks on these lines, but
- these do not affect nesting stack.
-
- Args:
- line: current line to check.
- """
- if Match(r'^\s*#\s*(if|ifdef|ifndef)\b', line):
- # Beginning of #if block, save the nesting stack here. The saved
- # stack will allow us to restore the parsing state in the #else case.
- self.pp_stack.append(_PreprocessorInfo(copy.deepcopy(self.stack)))
- elif Match(r'^\s*#\s*(else|elif)\b', line):
- # Beginning of #else block
- if self.pp_stack:
- if not self.pp_stack[-1].seen_else:
- # This is the first #else or #elif block. Remember the
- # whole nesting stack up to this point. This is what we
- # keep after the #endif.
- self.pp_stack[-1].seen_else = True
- self.pp_stack[-1].stack_before_else = copy.deepcopy(self.stack)
-
- # Restore the stack to how it was before the #if
- self.stack = copy.deepcopy(self.pp_stack[-1].stack_before_if)
- else:
- # TODO(unknown): unexpected #else, issue warning?
- pass
- elif Match(r'^\s*#\s*endif\b', line):
- # End of #if or #else blocks.
- if self.pp_stack:
- # If we saw an #else, we will need to restore the nesting
- # stack to its former state before the #else, otherwise we
- # will just continue from where we left off.
- if self.pp_stack[-1].seen_else:
- # Here we can just use a shallow copy since we are the last
- # reference to it.
- self.stack = self.pp_stack[-1].stack_before_else
- # Drop the corresponding #if
- self.pp_stack.pop()
- else:
- # TODO(unknown): unexpected #endif, issue warning?
- pass
-
- # TODO(unknown): Update() is too long, but we will refactor later.
- def Update(self, filename, clean_lines, linenum, error):
- """Update nesting state with current line.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Remember top of the previous nesting stack.
- #
- # The stack is always pushed/popped and not modified in place, so
- # we can just do a shallow copy instead of copy.deepcopy. Using
- # deepcopy would slow down cpplint by ~28%.
- if self.stack:
- self.previous_stack_top = self.stack[-1]
- else:
- self.previous_stack_top = None
-
- # Update pp_stack
- self.UpdatePreprocessor(line)
-
- # Count parentheses. This is to avoid adding struct arguments to
- # the nesting stack.
- if self.stack:
- inner_block = self.stack[-1]
- depth_change = line.count('(') - line.count(')')
- inner_block.open_parentheses += depth_change
-
- # Also check if we are starting or ending an inline assembly block.
- if inner_block.inline_asm in (_NO_ASM, _END_ASM):
- if (depth_change != 0 and
- inner_block.open_parentheses == 1 and
- _MATCH_ASM.match(line)):
- # Enter assembly block
- inner_block.inline_asm = _INSIDE_ASM
- else:
- # Not entering assembly block. If previous line was _END_ASM,
- # we will now shift to _NO_ASM state.
- inner_block.inline_asm = _NO_ASM
- elif (inner_block.inline_asm == _INSIDE_ASM and
- inner_block.open_parentheses == 0):
- # Exit assembly block
- inner_block.inline_asm = _END_ASM
-
- # Consume namespace declaration at the beginning of the line. Do
- # this in a loop so that we catch same line declarations like this:
- # namespace proto2 { namespace bridge { class MessageSet; } }
- while True:
- # Match start of namespace. The "\b\s*" below catches namespace
- # declarations even if it weren't followed by a whitespace, this
- # is so that we don't confuse our namespace checker. The
- # missing spaces will be flagged by CheckSpacing.
- namespace_decl_match = Match(r'^\s*namespace\b\s*([:\w]+)?(.*)$', line)
- if not namespace_decl_match:
- break
-
- new_namespace = _NamespaceInfo(namespace_decl_match.group(1), linenum)
- self.stack.append(new_namespace)
-
- line = namespace_decl_match.group(2)
- if line.find('{') != -1:
- new_namespace.seen_open_brace = True
- line = line[line.find('{') + 1:]
-
- # Look for a class declaration in whatever is left of the line
- # after parsing namespaces. The regexp accounts for decorated classes
- # such as in:
- # class LOCKABLE API Object {
- # };
- class_decl_match = Match(
- r'^(\s*(?:template\s*<[\w\s<>,:]*>\s*)?'
- r'(class|struct)\s+(?:[A-Z_]+\s+)*(\w+(?:::\w+)*))'
- r'(.*)$', line)
- if (class_decl_match and
- (not self.stack or self.stack[-1].open_parentheses == 0)):
- # We do not want to accept classes that are actually template arguments:
- # template <class Ignore1,
- # class Ignore2 = Default<Args>,
- # template <Args> class Ignore3>
- # void Function() {};
- #
- # To avoid template argument cases, we scan forward and look for
- # an unmatched '>'. If we see one, assume we are inside a
- # template argument list.
- end_declaration = len(class_decl_match.group(1))
- if not self.InTemplateArgumentList(clean_lines, linenum, end_declaration):
- self.stack.append(_ClassInfo(
- class_decl_match.group(3), class_decl_match.group(2),
- clean_lines, linenum))
- line = class_decl_match.group(4)
-
- # If we have not yet seen the opening brace for the innermost block,
- # run checks here.
- if not self.SeenOpenBrace():
- self.stack[-1].CheckBegin(filename, clean_lines, linenum, error)
-
- # Update access control if we are inside a class/struct
- if self.stack and isinstance(self.stack[-1], _ClassInfo):
- classinfo = self.stack[-1]
- access_match = Match(
- r'^(.*)\b(public|private|protected|signals)(\s+(?:slots\s*)?)?'
- r':(?:[^:]|$)',
- line)
- if access_match:
- classinfo.access = access_match.group(2)
-
- # Check that access keywords are indented +1 space. Skip this
- # check if the keywords are not preceded by whitespaces.
- indent = access_match.group(1)
- if (len(indent) != classinfo.class_indent + 1 and
- Match(r'^\s*$', indent)):
- if classinfo.is_struct:
- parent = 'struct ' + classinfo.name
- else:
- parent = 'class ' + classinfo.name
- slots = ''
- if access_match.group(3):
- slots = access_match.group(3)
- error(filename, linenum, 'whitespace/indent', 3,
- '%s%s: should be indented +1 space inside %s' % (
- access_match.group(2), slots, parent))
-
- # Consume braces or semicolons from what's left of the line
- while True:
- # Match first brace, semicolon, or closed parenthesis.
- matched = Match(r'^[^{;)}]*([{;)}])(.*)$', line)
- if not matched:
- break
-
- token = matched.group(1)
- if token == '{':
- # If namespace or class hasn't seen a opening brace yet, mark
- # namespace/class head as complete. Push a new block onto the
- # stack otherwise.
- if not self.SeenOpenBrace():
- self.stack[-1].seen_open_brace = True
- elif Match(r'^extern\s*"[^"]*"\s*\{', line):
- self.stack.append(_ExternCInfo())
- else:
- self.stack.append(_BlockInfo(True))
- if _MATCH_ASM.match(line):
- self.stack[-1].inline_asm = _BLOCK_ASM
-
- elif token == ';' or token == ')':
- # If we haven't seen an opening brace yet, but we already saw
- # a semicolon, this is probably a forward declaration. Pop
- # the stack for these.
- #
- # Similarly, if we haven't seen an opening brace yet, but we
- # already saw a closing parenthesis, then these are probably
- # function arguments with extra "class" or "struct" keywords.
- # Also pop these stack for these.
- if not self.SeenOpenBrace():
- self.stack.pop()
- else: # token == '}'
- # Perform end of block checks and pop the stack.
- if self.stack:
- self.stack[-1].CheckEnd(filename, clean_lines, linenum, error)
- self.stack.pop()
- line = matched.group(2)
-
- def InnermostClass(self):
- """Get class info on the top of the stack.
-
- Returns:
- A _ClassInfo object if we are inside a class, or None otherwise.
- """
- for i in range(len(self.stack), 0, -1):
- classinfo = self.stack[i - 1]
- if isinstance(classinfo, _ClassInfo):
- return classinfo
- return None
-
- def CheckCompletedBlocks(self, filename, error):
- """Checks that all classes and namespaces have been completely parsed.
-
- Call this when all lines in a file have been processed.
- Args:
- filename: The name of the current file.
- error: The function to call with any errors found.
- """
- # Note: This test can result in false positives if #ifdef constructs
- # get in the way of brace matching. See the testBuildClass test in
- # cpplint_unittest.py for an example of this.
- for obj in self.stack:
- if isinstance(obj, _ClassInfo):
- error(filename, obj.starting_linenum, 'build/class', 5,
- 'Failed to find complete declaration of class %s' %
- obj.name)
- elif isinstance(obj, _NamespaceInfo):
- error(filename, obj.starting_linenum, 'build/namespaces', 5,
- 'Failed to find complete declaration of namespace %s' %
- obj.name)
-
-
-def CheckForNonStandardConstructs(filename, clean_lines, linenum,
- nesting_state, error):
- r"""Logs an error if we see certain non-ANSI constructs ignored by gcc-2.
-
- Complain about several constructs which gcc-2 accepts, but which are
- not standard C++. Warning about these in lint is one way to ease the
- transition to new compilers.
- - put storage class first (e.g. "static const" instead of "const static").
- - "%lld" instead of %qd" in printf-type functions.
- - "%1$d" is non-standard in printf-type functions.
- - "\%" is an undefined character escape sequence.
- - text after #endif is not allowed.
- - invalid inner-style forward declaration.
- - >? and <? operators, and their >?= and <?= cousins.
-
- Additionally, check for constructor/destructor style violations and reference
- members, as it is very convenient to do so while checking for
- gcc-2 compliance.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: A callable to which errors are reported, which takes 4 arguments:
- filename, line number, error level, and message
- """
-
- # Remove comments from the line, but leave in strings for now.
- line = clean_lines.lines[linenum]
-
- if Search(r'printf\s*\(.*".*%[-+ ]?\d*q', line):
- error(filename, linenum, 'runtime/printf_format', 3,
- '%q in format strings is deprecated. Use %ll instead.')
-
- if Search(r'printf\s*\(.*".*%\d+\$', line):
- error(filename, linenum, 'runtime/printf_format', 2,
- '%N$ formats are unconventional. Try rewriting to avoid them.')
-
- # Remove escaped backslashes before looking for undefined escapes.
- line = line.replace('\\\\', '')
-
- if Search(r'("|\').*\\(%|\[|\(|{)', line):
- error(filename, linenum, 'build/printf_format', 3,
- '%, [, (, and { are undefined character escapes. Unescape them.')
-
- # For the rest, work with both comments and strings removed.
- line = clean_lines.elided[linenum]
-
- if Search(r'\b(const|volatile|void|char|short|int|long'
- r'|float|double|signed|unsigned'
- r'|schar|u?int8|u?int16|u?int32|u?int64)'
- r'\s+(register|static|extern|typedef)\b',
- line):
- error(filename, linenum, 'build/storage_class', 5,
- 'Storage class (static, extern, typedef, etc) should be first.')
-
- if Match(r'\s*#\s*endif\s*[^/\s]+', line):
- error(filename, linenum, 'build/endif_comment', 5,
- 'Uncommented text after #endif is non-standard. Use a comment.')
-
- if Match(r'\s*class\s+(\w+\s*::\s*)+\w+\s*;', line):
- error(filename, linenum, 'build/forward_decl', 5,
- 'Inner-style forward declarations are invalid. Remove this line.')
-
- if Search(r'(\w+|[+-]?\d+(\.\d*)?)\s*(<|>)\?=?\s*(\w+|[+-]?\d+)(\.\d*)?',
- line):
- error(filename, linenum, 'build/deprecated', 3,
- '>? and <? (max and min) operators are non-standard and deprecated.')
-
- if Search(r'^\s*const\s*string\s*&\s*\w+\s*;', line):
- # TODO(unknown): Could it be expanded safely to arbitrary references,
- # without triggering too many false positives? The first
- # attempt triggered 5 warnings for mostly benign code in the regtest, hence
- # the restriction.
- # Here's the original regexp, for the reference:
- # type_name = r'\w+((\s*::\s*\w+)|(\s*<\s*\w+?\s*>))?'
- # r'\s*const\s*' + type_name + '\s*&\s*\w+\s*;'
- error(filename, linenum, 'runtime/member_string_references', 2,
- 'const string& members are dangerous. It is much better to use '
- 'alternatives, such as pointers or simple constants.')
-
- # Everything else in this function operates on class declarations.
- # Return early if the top of the nesting stack is not a class, or if
- # the class head is not completed yet.
- classinfo = nesting_state.InnermostClass()
- if not classinfo or not classinfo.seen_open_brace:
- return
-
- # The class may have been declared with namespace or classname qualifiers.
- # The constructor and destructor will not have those qualifiers.
- base_classname = classinfo.name.split('::')[-1]
-
- # Look for single-argument constructors that aren't marked explicit.
- # Technically a valid construct, but against style. Also look for
- # non-single-argument constructors which are also technically valid, but
- # strongly suggest something is wrong.
- explicit_constructor_match = Match(
- r'\s+(?:inline\s+)?(explicit\s+)?(?:inline\s+)?%s\s*'
- r'\(((?:[^()]|\([^()]*\))*)\)'
- % re.escape(base_classname),
- line)
-
- if explicit_constructor_match:
- is_marked_explicit = explicit_constructor_match.group(1)
-
- if not explicit_constructor_match.group(2):
- constructor_args = []
- else:
- constructor_args = explicit_constructor_match.group(2).split(',')
-
- # collapse arguments so that commas in template parameter lists and function
- # argument parameter lists don't split arguments in two
- i = 0
- while i < len(constructor_args):
- constructor_arg = constructor_args[i]
- while (constructor_arg.count('<') > constructor_arg.count('>') or
- constructor_arg.count('(') > constructor_arg.count(')')):
- constructor_arg += ',' + constructor_args[i + 1]
- del constructor_args[i + 1]
- constructor_args[i] = constructor_arg
- i += 1
-
- defaulted_args = [arg for arg in constructor_args if '=' in arg]
- noarg_constructor = (not constructor_args or # empty arg list
- # 'void' arg specifier
- (len(constructor_args) == 1 and
- constructor_args[0].strip() == 'void'))
- onearg_constructor = ((len(constructor_args) == 1 and # exactly one arg
- not noarg_constructor) or
- # all but at most one arg defaulted
- (len(constructor_args) >= 1 and
- not noarg_constructor and
- len(defaulted_args) >= len(constructor_args) - 1))
- initializer_list_constructor = bool(
- onearg_constructor and
- Search(r'\bstd\s*::\s*initializer_list\b', constructor_args[0]))
- copy_constructor = bool(
- onearg_constructor and
- Match(r'(const\s+)?%s(\s*<[^>]*>)?(\s+const)?\s*(?:<\w+>\s*)?&'
- % re.escape(base_classname), constructor_args[0].strip()))
-
- if (not is_marked_explicit and
- onearg_constructor and
- not initializer_list_constructor and
- not copy_constructor):
- if defaulted_args:
- error(filename, linenum, 'runtime/explicit', 5,
- 'Constructors callable with one argument '
- 'should be marked explicit.')
- else:
- error(filename, linenum, 'runtime/explicit', 5,
- 'Single-parameter constructors should be marked explicit.')
- elif is_marked_explicit and not onearg_constructor:
- if noarg_constructor:
- error(filename, linenum, 'runtime/explicit', 5,
- 'Zero-parameter constructors should not be marked explicit.')
- else:
- error(filename, linenum, 'runtime/explicit', 0,
- 'Constructors that require multiple arguments '
- 'should not be marked explicit.')
-
-
-def CheckSpacingForFunctionCall(filename, clean_lines, linenum, error):
- """Checks for the correctness of various spacing around function calls.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Since function calls often occur inside if/for/while/switch
- # expressions - which have their own, more liberal conventions - we
- # first see if we should be looking inside such an expression for a
- # function call, to which we can apply more strict standards.
- fncall = line # if there's no control flow construct, look at whole line
- for pattern in (r'\bif\s*\((.*)\)\s*{',
- r'\bfor\s*\((.*)\)\s*{',
- r'\bwhile\s*\((.*)\)\s*[{;]',
- r'\bswitch\s*\((.*)\)\s*{'):
- match = Search(pattern, line)
- if match:
- fncall = match.group(1) # look inside the parens for function calls
- break
-
- # Except in if/for/while/switch, there should never be space
- # immediately inside parens (eg "f( 3, 4 )"). We make an exception
- # for nested parens ( (a+b) + c ). Likewise, there should never be
- # a space before a ( when it's a function argument. I assume it's a
- # function argument when the char before the whitespace is legal in
- # a function name (alnum + _) and we're not starting a macro. Also ignore
- # pointers and references to arrays and functions coz they're too tricky:
- # we use a very simple way to recognize these:
- # " (something)(maybe-something)" or
- # " (something)(maybe-something," or
- # " (something)[something]"
- # Note that we assume the contents of [] to be short enough that
- # they'll never need to wrap.
- if ( # Ignore control structures.
- not Search(r'\b(if|for|while|switch|return|new|delete|catch|sizeof)\b',
- fncall) and
- # Ignore pointers/references to functions.
- not Search(r' \([^)]+\)\([^)]*(\)|,$)', fncall) and
- # Ignore pointers/references to arrays.
- not Search(r' \([^)]+\)\[[^\]]+\]', fncall)):
- if Search(r'\w\s*\(\s(?!\s*\\$)', fncall): # a ( used for a fn call
- error(filename, linenum, 'whitespace/parens', 4,
- 'Extra space after ( in function call')
- elif Search(r'\(\s+(?!(\s*\\)|\()', fncall):
- error(filename, linenum, 'whitespace/parens', 2,
- 'Extra space after (')
- if (Search(r'\w\s+\(', fncall) and
- not Search(r'#\s*define|typedef|using\s+\w+\s*=', fncall) and
- not Search(r'\w\s+\((\w+::)*\*\w+\)\(', fncall) and
- not Search(r'\bcase\s+\(', fncall)):
- # TODO(unknown): Space after an operator function seem to be a common
- # error, silence those for now by restricting them to highest verbosity.
- if Search(r'\boperator_*\b', line):
- error(filename, linenum, 'whitespace/parens', 0,
- 'Extra space before ( in function call')
- else:
- error(filename, linenum, 'whitespace/parens', 4,
- 'Extra space before ( in function call')
- # If the ) is followed only by a newline or a { + newline, assume it's
- # part of a control statement (if/while/etc), and don't complain
- if Search(r'[^)]\s+\)\s*[^{\s]', fncall):
- # If the closing parenthesis is preceded by only whitespaces,
- # try to give a more descriptive error message.
- if Search(r'^\s+\)', fncall):
- error(filename, linenum, 'whitespace/parens', 2,
- 'Closing ) should be moved to the previous line')
- else:
- error(filename, linenum, 'whitespace/parens', 2,
- 'Extra space before )')
-
-
-def IsBlankLine(line):
- """Returns true if the given line is blank.
-
- We consider a line to be blank if the line is empty or consists of
- only white spaces.
-
- Args:
- line: A line of a string.
-
- Returns:
- True, if the given line is blank.
- """
- return not line or line.isspace()
-
-
-def CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line,
- error):
- is_namespace_indent_item = (
- len(nesting_state.stack) > 1 and
- nesting_state.stack[-1].check_namespace_indentation and
- isinstance(nesting_state.previous_stack_top, _NamespaceInfo) and
- nesting_state.previous_stack_top == nesting_state.stack[-2])
-
- if ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item,
- clean_lines.elided, line):
- CheckItemIndentationInNamespace(filename, clean_lines.elided,
- line, error)
-
-
-def CheckForFunctionLengths(filename, clean_lines, linenum,
- function_state, error):
- """Reports for long function bodies.
-
- For an overview why this is done, see:
- http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Write_Short_Functions
-
- Uses a simplistic algorithm assuming other style guidelines
- (especially spacing) are followed.
- Only checks unindented functions, so class members are unchecked.
- Trivial bodies are unchecked, so constructors with huge initializer lists
- may be missed.
- Blank/comment lines are not counted so as to avoid encouraging the removal
- of vertical space and comments just to get through a lint check.
- NOLINT *on the last line of a function* disables this check.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- function_state: Current function name and lines in body so far.
- error: The function to call with any errors found.
- """
- lines = clean_lines.lines
- line = lines[linenum]
- joined_line = ''
-
- starting_func = False
- regexp = r'(\w(\w|::|\*|\&|\s)*)\(' # decls * & space::name( ...
- match_result = Match(regexp, line)
- if match_result:
- # If the name is all caps and underscores, figure it's a macro and
- # ignore it, unless it's TEST or TEST_F.
- function_name = match_result.group(1).split()[-1]
- if function_name == 'TEST' or function_name == 'TEST_F' or (
- not Match(r'[A-Z_]+$', function_name)):
- starting_func = True
-
- if starting_func:
- body_found = False
- for start_linenum in xrange(linenum, clean_lines.NumLines()):
- start_line = lines[start_linenum]
- joined_line += ' ' + start_line.lstrip()
- if Search(r'(;|})', start_line): # Declarations and trivial functions
- body_found = True
- break # ... ignore
- elif Search(r'{', start_line):
- body_found = True
- function = Search(r'((\w|:)*)\(', line).group(1)
- if Match(r'TEST', function): # Handle TEST... macros
- parameter_regexp = Search(r'(\(.*\))', joined_line)
- if parameter_regexp: # Ignore bad syntax
- function += parameter_regexp.group(1)
- else:
- function += '()'
- function_state.Begin(function)
- break
- if not body_found:
- # No body for the function (or evidence of a non-function) was found.
- error(filename, linenum, 'readability/fn_size', 5,
- 'Lint failed to find start of function body.')
- elif Match(r'^\}\s*$', line): # function end
- function_state.Check(error, filename, linenum)
- function_state.End()
- elif not Match(r'^\s*$', line):
- function_state.Count() # Count non-blank/non-comment lines.
-
-
-_RE_PATTERN_TODO = re.compile(r'^//(\s*)TODO(\(.+?\))?:?(\s|$)?')
-
-
-def CheckComment(line, filename, linenum, next_line_start, error):
- """Checks for common mistakes in comments.
-
- Args:
- line: The line in question.
- filename: The name of the current file.
- linenum: The number of the line to check.
- next_line_start: The first non-whitespace column of the next line.
- error: The function to call with any errors found.
- """
- commentpos = line.find('//')
- if commentpos != -1:
- # Check if the // may be in quotes. If so, ignore it
- # Comparisons made explicit for clarity -- pylint: disable=g-explicit-bool-comparison
- if (line.count('"', 0, commentpos) -
- line.count('\\"', 0, commentpos)) % 2 == 0: # not in quotes
- # Allow one space for new scopes, two spaces otherwise:
- if (not (Match(r'^.*{ *//', line) and next_line_start == commentpos) and
- ((commentpos >= 1 and
- line[commentpos-1] not in string.whitespace) or
- (commentpos >= 2 and
- line[commentpos-2] not in string.whitespace))):
- error(filename, linenum, 'whitespace/comments', 2,
- 'At least two spaces is best between code and comments')
-
- # Checks for common mistakes in TODO comments.
- comment = line[commentpos:]
- match = _RE_PATTERN_TODO.match(comment)
- if match:
- # One whitespace is correct; zero whitespace is handled elsewhere.
- leading_whitespace = match.group(1)
- if len(leading_whitespace) > 1:
- error(filename, linenum, 'whitespace/todo', 2,
- 'Too many spaces before TODO')
-
- username = match.group(2)
- if not username:
- error(filename, linenum, 'readability/todo', 2,
- 'Missing username in TODO; it should look like '
- '"// TODO(my_username): Stuff."')
-
- middle_whitespace = match.group(3)
- # Comparisons made explicit for correctness -- pylint: disable=g-explicit-bool-comparison
- if middle_whitespace != ' ' and middle_whitespace != '':
- error(filename, linenum, 'whitespace/todo', 2,
- 'TODO(my_username) should be followed by a space')
-
- # If the comment contains an alphanumeric character, there
- # should be a space somewhere between it and the // unless
- # it's a /// or //! Doxygen comment.
- if (Match(r'//[^ ]*\w', comment) and
- not Match(r'(///|//\!)(\s+|$)', comment)):
- error(filename, linenum, 'whitespace/comments', 4,
- 'Should have a space between // and comment')
-
-
-def CheckAccess(filename, clean_lines, linenum, nesting_state, error):
- """Checks for improper use of DISALLOW* macros.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum] # get rid of comments and strings
-
- matched = Match((r'\s*(DISALLOW_COPY_AND_ASSIGN|'
- r'DISALLOW_IMPLICIT_CONSTRUCTORS)'), line)
- if not matched:
- return
- if nesting_state.stack and isinstance(nesting_state.stack[-1], _ClassInfo):
- if nesting_state.stack[-1].access != 'private':
- error(filename, linenum, 'readability/constructors', 3,
- '%s must be in the private: section' % matched.group(1))
-
- else:
- # Found DISALLOW* macro outside a class declaration, or perhaps it
- # was used inside a function when it should have been part of the
- # class declaration. We could issue a warning here, but it
- # probably resulted in a compiler error already.
- pass
-
-
-def CheckSpacing(filename, clean_lines, linenum, nesting_state, error):
- """Checks for the correctness of various spacing issues in the code.
-
- Things we check for: spaces around operators, spaces after
- if/for/while/switch, no spaces around parens in function calls, two
- spaces between code and comment, don't start a block with a blank
- line, don't end a function with a blank line, don't add a blank line
- after public/protected/private, don't have too many blank lines in a row.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
-
- # Don't use "elided" lines here, otherwise we can't check commented lines.
- # Don't want to use "raw" either, because we don't want to check inside C++11
- # raw strings,
- raw = clean_lines.lines_without_raw_strings
- line = raw[linenum]
-
- # Before nixing comments, check if the line is blank for no good
- # reason. This includes the first line after a block is opened, and
- # blank lines at the end of a function (ie, right before a line like '}'
- #
- # Skip all the blank line checks if we are immediately inside a
- # namespace body. In other words, don't issue blank line warnings
- # for this block:
- # namespace {
- #
- # }
- #
- # A warning about missing end of namespace comments will be issued instead.
- #
- # Also skip blank line checks for 'extern "C"' blocks, which are formatted
- # like namespaces.
- if (IsBlankLine(line) and
- not nesting_state.InNamespaceBody() and
- not nesting_state.InExternC()):
- elided = clean_lines.elided
- prev_line = elided[linenum - 1]
- prevbrace = prev_line.rfind('{')
- # TODO(unknown): Don't complain if line before blank line, and line after,
- # both start with alnums and are indented the same amount.
- # This ignores whitespace at the start of a namespace block
- # because those are not usually indented.
- if prevbrace != -1 and prev_line[prevbrace:].find('}') == -1:
- # OK, we have a blank line at the start of a code block. Before we
- # complain, we check if it is an exception to the rule: The previous
- # non-empty line has the parameters of a function header that are indented
- # 4 spaces (because they did not fit in a 80 column line when placed on
- # the same line as the function name). We also check for the case where
- # the previous line is indented 6 spaces, which may happen when the
- # initializers of a constructor do not fit into a 80 column line.
- exception = False
- if Match(r' {6}\w', prev_line): # Initializer list?
- # We are looking for the opening column of initializer list, which
- # should be indented 4 spaces to cause 6 space indentation afterwards.
- search_position = linenum-2
- while (search_position >= 0
- and Match(r' {6}\w', elided[search_position])):
- search_position -= 1
- exception = (search_position >= 0
- and elided[search_position][:5] == ' :')
- else:
- # Search for the function arguments or an initializer list. We use a
- # simple heuristic here: If the line is indented 4 spaces; and we have a
- # closing paren, without the opening paren, followed by an opening brace
- # or colon (for initializer lists) we assume that it is the last line of
- # a function header. If we have a colon indented 4 spaces, it is an
- # initializer list.
- exception = (Match(r' {4}\w[^\(]*\)\s*(const\s*)?(\{\s*$|:)',
- prev_line)
- or Match(r' {4}:', prev_line))
-
- if not exception:
- error(filename, linenum, 'whitespace/blank_line', 2,
- 'Redundant blank line at the start of a code block '
- 'should be deleted.')
- # Ignore blank lines at the end of a block in a long if-else
- # chain, like this:
- # if (condition1) {
- # // Something followed by a blank line
- #
- # } else if (condition2) {
- # // Something else
- # }
- if linenum + 1 < clean_lines.NumLines():
- next_line = raw[linenum + 1]
- if (next_line
- and Match(r'\s*}', next_line)
- and next_line.find('} else ') == -1):
- error(filename, linenum, 'whitespace/blank_line', 3,
- 'Redundant blank line at the end of a code block '
- 'should be deleted.')
-
- matched = Match(r'\s*(public|protected|private):', prev_line)
- if matched:
- error(filename, linenum, 'whitespace/blank_line', 3,
- 'Do not leave a blank line after "%s:"' % matched.group(1))
-
- # Next, check comments
- next_line_start = 0
- if linenum + 1 < clean_lines.NumLines():
- next_line = raw[linenum + 1]
- next_line_start = len(next_line) - len(next_line.lstrip())
- CheckComment(line, filename, linenum, next_line_start, error)
-
- # get rid of comments and strings
- line = clean_lines.elided[linenum]
-
- # You shouldn't have spaces before your brackets, except maybe after
- # 'delete []' or 'return []() {};'
- if Search(r'\w\s+\[', line) and not Search(r'(?:delete|return)\s+\[', line):
- error(filename, linenum, 'whitespace/braces', 5,
- 'Extra space before [')
-
- # In range-based for, we wanted spaces before and after the colon, but
- # not around "::" tokens that might appear.
- if (Search(r'for *\(.*[^:]:[^: ]', line) or
- Search(r'for *\(.*[^: ]:[^:]', line)):
- error(filename, linenum, 'whitespace/forcolon', 2,
- 'Missing space around colon in range-based for loop')
-
-
-def CheckOperatorSpacing(filename, clean_lines, linenum, error):
- """Checks for horizontal spacing around operators.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Don't try to do spacing checks for operator methods. Do this by
- # replacing the troublesome characters with something else,
- # preserving column position for all other characters.
- #
- # The replacement is done repeatedly to avoid false positives from
- # operators that call operators.
- while True:
- match = Match(r'^(.*\boperator\b)(\S+)(\s*\(.*)$', line)
- if match:
- line = match.group(1) + ('_' * len(match.group(2))) + match.group(3)
- else:
- break
-
- # We allow no-spaces around = within an if: "if ( (a=Foo()) == 0 )".
- # Otherwise not. Note we only check for non-spaces on *both* sides;
- # sometimes people put non-spaces on one side when aligning ='s among
- # many lines (not that this is behavior that I approve of...)
- if ((Search(r'[\w.]=', line) or
- Search(r'=[\w.]', line))
- and not Search(r'\b(if|while|for) ', line)
- # Operators taken from [lex.operators] in C++11 standard.
- and not Search(r'(>=|<=|==|!=|&=|\^=|\|=|\+=|\*=|\/=|\%=)', line)
- and not Search(r'operator=', line)):
- error(filename, linenum, 'whitespace/operators', 4,
- 'Missing spaces around =')
-
- # It's ok not to have spaces around binary operators like + - * /, but if
- # there's too little whitespace, we get concerned. It's hard to tell,
- # though, so we punt on this one for now. TODO.
-
- # You should always have whitespace around binary operators.
- #
- # Check <= and >= first to avoid false positives with < and >, then
- # check non-include lines for spacing around < and >.
- #
- # If the operator is followed by a comma, assume it's be used in a
- # macro context and don't do any checks. This avoids false
- # positives.
- #
- # Note that && is not included here. Those are checked separately
- # in CheckRValueReference
- match = Search(r'[^<>=!\s](==|!=|<=|>=|\|\|)[^<>=!\s,;\)]', line)
- if match:
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around %s' % match.group(1))
- elif not Match(r'#.*include', line):
- # Look for < that is not surrounded by spaces. This is only
- # triggered if both sides are missing spaces, even though
- # technically should should flag if at least one side is missing a
- # space. This is done to avoid some false positives with shifts.
- match = Match(r'^(.*[^\s<])<[^\s=<,]', line)
- if match:
- (_, _, end_pos) = CloseExpression(
- clean_lines, linenum, len(match.group(1)))
- if end_pos <= -1:
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around <')
-
- # Look for > that is not surrounded by spaces. Similar to the
- # above, we only trigger if both sides are missing spaces to avoid
- # false positives with shifts.
- match = Match(r'^(.*[^-\s>])>[^\s=>,]', line)
- if match:
- (_, _, start_pos) = ReverseCloseExpression(
- clean_lines, linenum, len(match.group(1)))
- if start_pos <= -1:
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around >')
-
- # We allow no-spaces around << when used like this: 10<<20, but
- # not otherwise (particularly, not when used as streams)
- #
- # We also allow operators following an opening parenthesis, since
- # those tend to be macros that deal with operators.
- match = Search(r'(operator|[^\s(<])(?:L|UL|ULL|l|ul|ull)?<<([^\s,=<])', line)
- if (match and not (match.group(1).isdigit() and match.group(2).isdigit()) and
- not (match.group(1) == 'operator' and match.group(2) == ';')):
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around <<')
-
- # We allow no-spaces around >> for almost anything. This is because
- # C++11 allows ">>" to close nested templates, which accounts for
- # most cases when ">>" is not followed by a space.
- #
- # We still warn on ">>" followed by alpha character, because that is
- # likely due to ">>" being used for right shifts, e.g.:
- # value >> alpha
- #
- # When ">>" is used to close templates, the alphanumeric letter that
- # follows would be part of an identifier, and there should still be
- # a space separating the template type and the identifier.
- # type<type<type>> alpha
- match = Search(r'>>[a-zA-Z_]', line)
- if match:
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around >>')
-
- # There shouldn't be space around unary operators
- match = Search(r'(!\s|~\s|[\s]--[\s;]|[\s]\+\+[\s;])', line)
- if match:
- error(filename, linenum, 'whitespace/operators', 4,
- 'Extra space for operator %s' % match.group(1))
-
-
-def CheckParenthesisSpacing(filename, clean_lines, linenum, error):
- """Checks for horizontal spacing around parentheses.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # No spaces after an if, while, switch, or for
- match = Search(r' (if\(|for\(|while\(|switch\()', line)
- if match:
- error(filename, linenum, 'whitespace/parens', 5,
- 'Missing space before ( in %s' % match.group(1))
-
- # For if/for/while/switch, the left and right parens should be
- # consistent about how many spaces are inside the parens, and
- # there should either be zero or one spaces inside the parens.
- # We don't want: "if ( foo)" or "if ( foo )".
- # Exception: "for ( ; foo; bar)" and "for (foo; bar; )" are allowed.
- match = Search(r'\b(if|for|while|switch)\s*'
- r'\(([ ]*)(.).*[^ ]+([ ]*)\)\s*{\s*$',
- line)
- if match:
- if len(match.group(2)) != len(match.group(4)):
- if not (match.group(3) == ';' and
- len(match.group(2)) == 1 + len(match.group(4)) or
- not match.group(2) and Search(r'\bfor\s*\(.*; \)', line)):
- error(filename, linenum, 'whitespace/parens', 5,
- 'Mismatching spaces inside () in %s' % match.group(1))
- if len(match.group(2)) not in [0, 1]:
- error(filename, linenum, 'whitespace/parens', 5,
- 'Should have zero or one spaces inside ( and ) in %s' %
- match.group(1))
-
-
-def CheckCommaSpacing(filename, clean_lines, linenum, error):
- """Checks for horizontal spacing near commas and semicolons.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- raw = clean_lines.lines_without_raw_strings
- line = clean_lines.elided[linenum]
-
- # You should always have a space after a comma (either as fn arg or operator)
- #
- # This does not apply when the non-space character following the
- # comma is another comma, since the only time when that happens is
- # for empty macro arguments.
- #
- # We run this check in two passes: first pass on elided lines to
- # verify that lines contain missing whitespaces, second pass on raw
- # lines to confirm that those missing whitespaces are not due to
- # elided comments.
- if (Search(r',[^,\s]', ReplaceAll(r'\boperator\s*,\s*\(', 'F(', line)) and
- Search(r',[^,\s]', raw[linenum])):
- error(filename, linenum, 'whitespace/comma', 3,
- 'Missing space after ,')
-
- # You should always have a space after a semicolon
- # except for few corner cases
- # TODO(unknown): clarify if 'if (1) { return 1;}' is requires one more
- # space after ;
- if Search(r';[^\s};\\)/]', line):
- error(filename, linenum, 'whitespace/semicolon', 3,
- 'Missing space after ;')
-
-
-def CheckBracesSpacing(filename, clean_lines, linenum, error):
- """Checks for horizontal spacing near commas.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Except after an opening paren, or after another opening brace (in case of
- # an initializer list, for instance), you should have spaces before your
- # braces. And since you should never have braces at the beginning of a line,
- # this is an easy test.
- match = Match(r'^(.*[^ ({>]){', line)
- if match:
- # Try a bit harder to check for brace initialization. This
- # happens in one of the following forms:
- # Constructor() : initializer_list_{} { ... }
- # Constructor{}.MemberFunction()
- # Type variable{};
- # FunctionCall(type{}, ...);
- # LastArgument(..., type{});
- # LOG(INFO) << type{} << " ...";
- # map_of_type[{...}] = ...;
- # ternary = expr ? new type{} : nullptr;
- # OuterTemplate<InnerTemplateConstructor<Type>{}>
- #
- # We check for the character following the closing brace, and
- # silence the warning if it's one of those listed above, i.e.
- # "{.;,)<>]:".
- #
- # To account for nested initializer list, we allow any number of
- # closing braces up to "{;,)<". We can't simply silence the
- # warning on first sight of closing brace, because that would
- # cause false negatives for things that are not initializer lists.
- # Silence this: But not this:
- # Outer{ if (...) {
- # Inner{...} if (...){ // Missing space before {
- # }; }
- #
- # There is a false negative with this approach if people inserted
- # spurious semicolons, e.g. "if (cond){};", but we will catch the
- # spurious semicolon with a separate check.
- (endline, endlinenum, endpos) = CloseExpression(
- clean_lines, linenum, len(match.group(1)))
- trailing_text = ''
- if endpos > -1:
- trailing_text = endline[endpos:]
- for offset in xrange(endlinenum + 1,
- min(endlinenum + 3, clean_lines.NumLines() - 1)):
- trailing_text += clean_lines.elided[offset]
- if not Match(r'^[\s}]*[{.;,)<>\]:]', trailing_text):
- error(filename, linenum, 'whitespace/braces', 5,
- 'Missing space before {')
-
- # Make sure '} else {' has spaces.
- if Search(r'}else', line):
- error(filename, linenum, 'whitespace/braces', 5,
- 'Missing space before else')
-
- # You shouldn't have a space before a semicolon at the end of the line.
- # There's a special case for "for" since the style guide allows space before
- # the semicolon there.
- if Search(r':\s*;\s*$', line):
- error(filename, linenum, 'whitespace/semicolon', 5,
- 'Semicolon defining empty statement. Use {} instead.')
- elif Search(r'^\s*;\s*$', line):
- error(filename, linenum, 'whitespace/semicolon', 5,
- 'Line contains only semicolon. If this should be an empty statement, '
- 'use {} instead.')
- elif (Search(r'\s+;\s*$', line) and
- not Search(r'\bfor\b', line)):
- error(filename, linenum, 'whitespace/semicolon', 5,
- 'Extra space before last semicolon. If this should be an empty '
- 'statement, use {} instead.')
-
-
-def IsDecltype(clean_lines, linenum, column):
- """Check if the token ending on (linenum, column) is decltype().
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: the number of the line to check.
- column: end column of the token to check.
- Returns:
- True if this token is decltype() expression, False otherwise.
- """
- (text, _, start_col) = ReverseCloseExpression(clean_lines, linenum, column)
- if start_col < 0:
- return False
- if Search(r'\bdecltype\s*$', text[0:start_col]):
- return True
- return False
-
-
-def IsTemplateParameterList(clean_lines, linenum, column):
- """Check if the token ending on (linenum, column) is the end of template<>.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: the number of the line to check.
- column: end column of the token to check.
- Returns:
- True if this token is end of a template parameter list, False otherwise.
- """
- (_, startline, startpos) = ReverseCloseExpression(
- clean_lines, linenum, column)
- if (startpos > -1 and
- Search(r'\btemplate\s*$', clean_lines.elided[startline][0:startpos])):
- return True
- return False
-
-
-def IsRValueType(typenames, clean_lines, nesting_state, linenum, column):
- """Check if the token ending on (linenum, column) is a type.
-
- Assumes that text to the right of the column is "&&" or a function
- name.
-
- Args:
- typenames: set of type names from template-argument-list.
- clean_lines: A CleansedLines instance containing the file.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- linenum: the number of the line to check.
- column: end column of the token to check.
- Returns:
- True if this token is a type, False if we are not sure.
- """
- prefix = clean_lines.elided[linenum][0:column]
-
- # Get one word to the left. If we failed to do so, this is most
- # likely not a type, since it's unlikely that the type name and "&&"
- # would be split across multiple lines.
- match = Match(r'^(.*)(\b\w+|[>*)&])\s*$', prefix)
- if not match:
- return False
-
- # Check text following the token. If it's "&&>" or "&&," or "&&...", it's
- # most likely a rvalue reference used inside a template.
- suffix = clean_lines.elided[linenum][column:]
- if Match(r'&&\s*(?:[>,]|\.\.\.)', suffix):
- return True
-
- # Check for known types and end of templates:
- # int&& variable
- # vector<int>&& variable
- #
- # Because this function is called recursively, we also need to
- # recognize pointer and reference types:
- # int* Function()
- # int& Function()
- if (match.group(2) in typenames or
- match.group(2) in ['char', 'char16_t', 'char32_t', 'wchar_t', 'bool',
- 'short', 'int', 'long', 'signed', 'unsigned',
- 'float', 'double', 'void', 'auto', '>', '*', '&']):
- return True
-
- # If we see a close parenthesis, look for decltype on the other side.
- # decltype would unambiguously identify a type, anything else is
- # probably a parenthesized expression and not a type.
- if match.group(2) == ')':
- return IsDecltype(
- clean_lines, linenum, len(match.group(1)) + len(match.group(2)) - 1)
-
- # Check for casts and cv-qualifiers.
- # match.group(1) remainder
- # -------------- ---------
- # const_cast< type&&
- # const type&&
- # type const&&
- if Search(r'\b(?:const_cast\s*<|static_cast\s*<|dynamic_cast\s*<|'
- r'reinterpret_cast\s*<|\w+\s)\s*$',
- match.group(1)):
- return True
-
- # Look for a preceding symbol that might help differentiate the context.
- # These are the cases that would be ambiguous:
- # match.group(1) remainder
- # -------------- ---------
- # Call ( expression &&
- # Declaration ( type&&
- # sizeof ( type&&
- # if ( expression &&
- # while ( expression &&
- # for ( type&&
- # for( ; expression &&
- # statement ; type&&
- # block { type&&
- # constructor { expression &&
- start = linenum
- line = match.group(1)
- match_symbol = None
- while start >= 0:
- # We want to skip over identifiers and commas to get to a symbol.
- # Commas are skipped so that we can find the opening parenthesis
- # for function parameter lists.
- match_symbol = Match(r'^(.*)([^\w\s,])[\w\s,]*$', line)
- if match_symbol:
- break
- start -= 1
- line = clean_lines.elided[start]
-
- if not match_symbol:
- # Probably the first statement in the file is an rvalue reference
- return True
-
- if match_symbol.group(2) == '}':
- # Found closing brace, probably an indicate of this:
- # block{} type&&
- return True
-
- if match_symbol.group(2) == ';':
- # Found semicolon, probably one of these:
- # for(; expression &&
- # statement; type&&
-
- # Look for the previous 'for(' in the previous lines.
- before_text = match_symbol.group(1)
- for i in xrange(start - 1, max(start - 6, 0), -1):
- before_text = clean_lines.elided[i] + before_text
- if Search(r'for\s*\([^{};]*$', before_text):
- # This is the condition inside a for-loop
- return False
-
- # Did not find a for-init-statement before this semicolon, so this
- # is probably a new statement and not a condition.
- return True
-
- if match_symbol.group(2) == '{':
- # Found opening brace, probably one of these:
- # block{ type&& = ... ; }
- # constructor{ expression && expression }
-
- # Look for a closing brace or a semicolon. If we see a semicolon
- # first, this is probably a rvalue reference.
- line = clean_lines.elided[start][0:len(match_symbol.group(1)) + 1]
- end = start
- depth = 1
- while True:
- for ch in line:
- if ch == ';':
- return True
- elif ch == '{':
- depth += 1
- elif ch == '}':
- depth -= 1
- if depth == 0:
- return False
- end += 1
- if end >= clean_lines.NumLines():
- break
- line = clean_lines.elided[end]
- # Incomplete program?
- return False
-
- if match_symbol.group(2) == '(':
- # Opening parenthesis. Need to check what's to the left of the
- # parenthesis. Look back one extra line for additional context.
- before_text = match_symbol.group(1)
- if linenum > 1:
- before_text = clean_lines.elided[linenum - 1] + before_text
- before_text = match_symbol.group(1)
-
- # Patterns that are likely to be types:
- # [](type&&
- # for (type&&
- # sizeof(type&&
- # operator=(type&&
- #
- if Search(r'(?:\]|\bfor|\bsizeof|\boperator\s*\S+\s*)\s*$', before_text):
- return True
-
- # Patterns that are likely to be expressions:
- # if (expression &&
- # while (expression &&
- # : initializer(expression &&
- # , initializer(expression &&
- # ( FunctionCall(expression &&
- # + FunctionCall(expression &&
- # + (expression &&
- #
- # The last '+' represents operators such as '+' and '-'.
- if Search(r'(?:\bif|\bwhile|[-+=%^(<!?:,&*]\s*)$', before_text):
- return False
-
- # Something else. Check that tokens to the left look like
- # return_type function_name
- match_func = Match(r'^(.*\S.*)\s+\w(?:\w|::)*(?:<[^<>]*>)?\s*$',
- match_symbol.group(1))
- if match_func:
- # Check for constructors, which don't have return types.
- if Search(r'\b(?:explicit|inline)$', match_func.group(1)):
- return True
- implicit_constructor = Match(r'\s*(\w+)\((?:const\s+)?(\w+)', prefix)
- if (implicit_constructor and
- implicit_constructor.group(1) == implicit_constructor.group(2)):
- return True
- return IsRValueType(typenames, clean_lines, nesting_state, linenum,
- len(match_func.group(1)))
-
- # Nothing before the function name. If this is inside a block scope,
- # this is probably a function call.
- return not (nesting_state.previous_stack_top and
- nesting_state.previous_stack_top.IsBlockInfo())
-
- if match_symbol.group(2) == '>':
- # Possibly a closing bracket, check that what's on the other side
- # looks like the start of a template.
- return IsTemplateParameterList(
- clean_lines, start, len(match_symbol.group(1)))
-
- # Some other symbol, usually something like "a=b&&c". This is most
- # likely not a type.
- return False
-
-
-def IsDeletedOrDefault(clean_lines, linenum):
- """Check if current constructor or operator is deleted or default.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- Returns:
- True if this is a deleted or default constructor.
- """
- open_paren = clean_lines.elided[linenum].find('(')
- if open_paren < 0:
- return False
- (close_line, _, close_paren) = CloseExpression(
- clean_lines, linenum, open_paren)
- if close_paren < 0:
- return False
- return Match(r'\s*=\s*(?:delete|default)\b', close_line[close_paren:])
-
-
-def IsRValueAllowed(clean_lines, linenum, typenames):
- """Check if RValue reference is allowed on a particular line.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- typenames: set of type names from template-argument-list.
- Returns:
- True if line is within the region where RValue references are allowed.
- """
- # Allow region marked by PUSH/POP macros
- for i in xrange(linenum, 0, -1):
- line = clean_lines.elided[i]
- if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):
- if not line.endswith('PUSH'):
- return False
- for j in xrange(linenum, clean_lines.NumLines(), 1):
- line = clean_lines.elided[j]
- if Match(r'GOOGLE_ALLOW_RVALUE_REFERENCES_(?:PUSH|POP)', line):
- return line.endswith('POP')
-
- # Allow operator=
- line = clean_lines.elided[linenum]
- if Search(r'\boperator\s*=\s*\(', line):
- return IsDeletedOrDefault(clean_lines, linenum)
-
- # Allow constructors
- match = Match(r'\s*(?:[\w<>]+::)*([\w<>]+)\s*::\s*([\w<>]+)\s*\(', line)
- if match and match.group(1) == match.group(2):
- return IsDeletedOrDefault(clean_lines, linenum)
- if Search(r'\b(?:explicit|inline)\s+[\w<>]+\s*\(', line):
- return IsDeletedOrDefault(clean_lines, linenum)
-
- if Match(r'\s*[\w<>]+\s*\(', line):
- previous_line = 'ReturnType'
- if linenum > 0:
- previous_line = clean_lines.elided[linenum - 1]
- if Match(r'^\s*$', previous_line) or Search(r'[{}:;]\s*$', previous_line):
- return IsDeletedOrDefault(clean_lines, linenum)
-
- # Reject types not mentioned in template-argument-list
- while line:
- match = Match(r'^.*?(\w+)\s*&&(.*)$', line)
- if not match:
- break
- if match.group(1) not in typenames:
- return False
- line = match.group(2)
-
- # All RValue types that were in template-argument-list should have
- # been removed by now. Those were allowed, assuming that they will
- # be forwarded.
- #
- # If there are no remaining RValue types left (i.e. types that were
- # not found in template-argument-list), flag those as not allowed.
- return line.find('&&') < 0
-
-
-def GetTemplateArgs(clean_lines, linenum):
- """Find list of template arguments associated with this function declaration.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: Line number containing the start of the function declaration,
- usually one line after the end of the template-argument-list.
- Returns:
- Set of type names, or empty set if this does not appear to have
- any template parameters.
- """
- # Find start of function
- func_line = linenum
- while func_line > 0:
- line = clean_lines.elided[func_line]
- if Match(r'^\s*$', line):
- return set()
- if line.find('(') >= 0:
- break
- func_line -= 1
- if func_line == 0:
- return set()
-
- # Collapse template-argument-list into a single string
- argument_list = ''
- match = Match(r'^(\s*template\s*)<', clean_lines.elided[func_line])
- if match:
- # template-argument-list on the same line as function name
- start_col = len(match.group(1))
- _, end_line, end_col = CloseExpression(clean_lines, func_line, start_col)
- if end_col > -1 and end_line == func_line:
- start_col += 1 # Skip the opening bracket
- argument_list = clean_lines.elided[func_line][start_col:end_col]
-
- elif func_line > 1:
- # template-argument-list one line before function name
- match = Match(r'^(.*)>\s*$', clean_lines.elided[func_line - 1])
- if match:
- end_col = len(match.group(1))
- _, start_line, start_col = ReverseCloseExpression(
- clean_lines, func_line - 1, end_col)
- if start_col > -1:
- start_col += 1 # Skip the opening bracket
- while start_line < func_line - 1:
- argument_list += clean_lines.elided[start_line][start_col:]
- start_col = 0
- start_line += 1
- argument_list += clean_lines.elided[func_line - 1][start_col:end_col]
-
- if not argument_list:
- return set()
-
- # Extract type names
- typenames = set()
- while True:
- match = Match(r'^[,\s]*(?:typename|class)(?:\.\.\.)?\s+(\w+)(.*)$',
- argument_list)
- if not match:
- break
- typenames.add(match.group(1))
- argument_list = match.group(2)
- return typenames
-
-
-def CheckRValueReference(filename, clean_lines, linenum, nesting_state, error):
- """Check for rvalue references.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
- # Find lines missing spaces around &&.
- # TODO(unknown): currently we don't check for rvalue references
- # with spaces surrounding the && to avoid false positives with
- # boolean expressions.
- line = clean_lines.elided[linenum]
- match = Match(r'^(.*\S)&&', line)
- if not match:
- match = Match(r'(.*)&&\S', line)
- if (not match) or '(&&)' in line or Search(r'\boperator\s*$', match.group(1)):
- return
-
- # Either poorly formed && or an rvalue reference, check the context
- # to get a more accurate error message. Mostly we want to determine
- # if what's to the left of "&&" is a type or not.
- typenames = GetTemplateArgs(clean_lines, linenum)
- and_pos = len(match.group(1))
- if IsRValueType(typenames, clean_lines, nesting_state, linenum, and_pos):
- if not IsRValueAllowed(clean_lines, linenum, typenames):
- error(filename, linenum, 'build/c++11', 3,
- 'RValue references are an unapproved C++ feature.')
- else:
- error(filename, linenum, 'whitespace/operators', 3,
- 'Missing spaces around &&')
-
-
-def CheckSectionSpacing(filename, clean_lines, class_info, linenum, error):
- """Checks for additional blank line issues related to sections.
-
- Currently the only thing checked here is blank line before protected/private.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- class_info: A _ClassInfo objects.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- # Skip checks if the class is small, where small means 25 lines or less.
- # 25 lines seems like a good cutoff since that's the usual height of
- # terminals, and any class that can't fit in one screen can't really
- # be considered "small".
- #
- # Also skip checks if we are on the first line. This accounts for
- # classes that look like
- # class Foo { public: ... };
- #
- # If we didn't find the end of the class, last_line would be zero,
- # and the check will be skipped by the first condition.
- if (class_info.last_line - class_info.starting_linenum <= 24 or
- linenum <= class_info.starting_linenum):
- return
-
- matched = Match(r'\s*(public|protected|private):', clean_lines.lines[linenum])
- if matched:
- # Issue warning if the line before public/protected/private was
- # not a blank line, but don't do this if the previous line contains
- # "class" or "struct". This can happen two ways:
- # - We are at the beginning of the class.
- # - We are forward-declaring an inner class that is semantically
- # private, but needed to be public for implementation reasons.
- # Also ignores cases where the previous line ends with a backslash as can be
- # common when defining classes in C macros.
- prev_line = clean_lines.lines[linenum - 1]
- if (not IsBlankLine(prev_line) and
- not Search(r'\b(class|struct)\b', prev_line) and
- not Search(r'\\$', prev_line)):
- # Try a bit harder to find the beginning of the class. This is to
- # account for multi-line base-specifier lists, e.g.:
- # class Derived
- # : public Base {
- end_class_head = class_info.starting_linenum
- for i in range(class_info.starting_linenum, linenum):
- if Search(r'\{\s*$', clean_lines.lines[i]):
- end_class_head = i
- break
- if end_class_head < linenum - 1:
- error(filename, linenum, 'whitespace/blank_line', 3,
- '"%s:" should be preceded by a blank line' % matched.group(1))
-
-
-def GetPreviousNonBlankLine(clean_lines, linenum):
- """Return the most recent non-blank line and its line number.
-
- Args:
- clean_lines: A CleansedLines instance containing the file contents.
- linenum: The number of the line to check.
-
- Returns:
- A tuple with two elements. The first element is the contents of the last
- non-blank line before the current line, or the empty string if this is the
- first non-blank line. The second is the line number of that line, or -1
- if this is the first non-blank line.
- """
-
- prevlinenum = linenum - 1
- while prevlinenum >= 0:
- prevline = clean_lines.elided[prevlinenum]
- if not IsBlankLine(prevline): # if not a blank line...
- return (prevline, prevlinenum)
- prevlinenum -= 1
- return ('', -1)
-
-
-def CheckBraces(filename, clean_lines, linenum, error):
- """Looks for misplaced braces (e.g. at the end of line).
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
-
- line = clean_lines.elided[linenum] # get rid of comments and strings
-
- if Match(r'\s*{\s*$', line):
- # We allow an open brace to start a line in the case where someone is using
- # braces in a block to explicitly create a new scope, which is commonly used
- # to control the lifetime of stack-allocated variables. Braces are also
- # used for brace initializers inside function calls. We don't detect this
- # perfectly: we just don't complain if the last non-whitespace character on
- # the previous non-blank line is ',', ';', ':', '(', '{', or '}', or if the
- # previous line starts a preprocessor block.
- prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
- if (not Search(r'[,;:}{(]\s*$', prevline) and
- not Match(r'\s*#', prevline)):
- error(filename, linenum, 'whitespace/braces', 4,
- '{ should almost always be at the end of the previous line')
-
- # An else clause should be on the same line as the preceding closing brace.
- if Match(r'\s*else\b\s*(?:if\b|\{|$)', line):
- prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
- if Match(r'\s*}\s*$', prevline):
- error(filename, linenum, 'whitespace/newline', 4,
- 'An else should appear on the same line as the preceding }')
-
- # If braces come on one side of an else, they should be on both.
- # However, we have to worry about "else if" that spans multiple lines!
- if Search(r'else if\s*\(', line): # could be multi-line if
- brace_on_left = bool(Search(r'}\s*else if\s*\(', line))
- # find the ( after the if
- pos = line.find('else if')
- pos = line.find('(', pos)
- if pos > 0:
- (endline, _, endpos) = CloseExpression(clean_lines, linenum, pos)
- brace_on_right = endline[endpos:].find('{') != -1
- if brace_on_left != brace_on_right: # must be brace after if
- error(filename, linenum, 'readability/braces', 5,
- 'If an else has a brace on one side, it should have it on both')
- elif Search(r'}\s*else[^{]*$', line) or Match(r'[^}]*else\s*{', line):
- error(filename, linenum, 'readability/braces', 5,
- 'If an else has a brace on one side, it should have it on both')
-
- # Likewise, an else should never have the else clause on the same line
- if Search(r'\belse [^\s{]', line) and not Search(r'\belse if\b', line):
- error(filename, linenum, 'whitespace/newline', 4,
- 'Else clause should never be on same line as else (use 2 lines)')
-
- # In the same way, a do/while should never be on one line
- if Match(r'\s*do [^\s{]', line):
- error(filename, linenum, 'whitespace/newline', 4,
- 'do/while clauses should not be on a single line')
-
- # Check single-line if/else bodies. The style guide says 'curly braces are not
- # required for single-line statements'. We additionally allow multi-line,
- # single statements, but we reject anything with more than one semicolon in
- # it. This means that the first semicolon after the if should be at the end of
- # its line, and the line after that should have an indent level equal to or
- # lower than the if. We also check for ambiguous if/else nesting without
- # braces.
- if_else_match = Search(r'\b(if\s*\(|else\b)', line)
- if if_else_match and not Match(r'\s*#', line):
- if_indent = GetIndentLevel(line)
- endline, endlinenum, endpos = line, linenum, if_else_match.end()
- if_match = Search(r'\bif\s*\(', line)
- if if_match:
- # This could be a multiline if condition, so find the end first.
- pos = if_match.end() - 1
- (endline, endlinenum, endpos) = CloseExpression(clean_lines, linenum, pos)
- # Check for an opening brace, either directly after the if or on the next
- # line. If found, this isn't a single-statement conditional.
- if (not Match(r'\s*{', endline[endpos:])
- and not (Match(r'\s*$', endline[endpos:])
- and endlinenum < (len(clean_lines.elided) - 1)
- and Match(r'\s*{', clean_lines.elided[endlinenum + 1]))):
- while (endlinenum < len(clean_lines.elided)
- and ';' not in clean_lines.elided[endlinenum][endpos:]):
- endlinenum += 1
- endpos = 0
- if endlinenum < len(clean_lines.elided):
- endline = clean_lines.elided[endlinenum]
- # We allow a mix of whitespace and closing braces (e.g. for one-liner
- # methods) and a single \ after the semicolon (for macros)
- endpos = endline.find(';')
- if not Match(r';[\s}]*(\\?)$', endline[endpos:]):
- # Semicolon isn't the last character, there's something trailing.
- # Output a warning if the semicolon is not contained inside
- # a lambda expression.
- if not Match(r'^[^{};]*\[[^\[\]]*\][^{}]*\{[^{}]*\}\s*\)*[;,]\s*$',
- endline):
- error(filename, linenum, 'readability/braces', 4,
- 'If/else bodies with multiple statements require braces')
- elif endlinenum < len(clean_lines.elided) - 1:
- # Make sure the next line is dedented
- next_line = clean_lines.elided[endlinenum + 1]
- next_indent = GetIndentLevel(next_line)
- # With ambiguous nested if statements, this will error out on the
- # if that *doesn't* match the else, regardless of whether it's the
- # inner one or outer one.
- if (if_match and Match(r'\s*else\b', next_line)
- and next_indent != if_indent):
- error(filename, linenum, 'readability/braces', 4,
- 'Else clause should be indented at the same level as if. '
- 'Ambiguous nested if/else chains require braces.')
- elif next_indent > if_indent:
- error(filename, linenum, 'readability/braces', 4,
- 'If/else bodies with multiple statements require braces')
-
-
-def CheckTrailingSemicolon(filename, clean_lines, linenum, error):
- """Looks for redundant trailing semicolon.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
-
- line = clean_lines.elided[linenum]
-
- # Block bodies should not be followed by a semicolon. Due to C++11
- # brace initialization, there are more places where semicolons are
- # required than not, so we use a whitelist approach to check these
- # rather than a blacklist. These are the places where "};" should
- # be replaced by just "}":
- # 1. Some flavor of block following closing parenthesis:
- # for (;;) {};
- # while (...) {};
- # switch (...) {};
- # Function(...) {};
- # if (...) {};
- # if (...) else if (...) {};
- #
- # 2. else block:
- # if (...) else {};
- #
- # 3. const member function:
- # Function(...) const {};
- #
- # 4. Block following some statement:
- # x = 42;
- # {};
- #
- # 5. Block at the beginning of a function:
- # Function(...) {
- # {};
- # }
- #
- # Note that naively checking for the preceding "{" will also match
- # braces inside multi-dimensional arrays, but this is fine since
- # that expression will not contain semicolons.
- #
- # 6. Block following another block:
- # while (true) {}
- # {};
- #
- # 7. End of namespaces:
- # namespace {};
- #
- # These semicolons seems far more common than other kinds of
- # redundant semicolons, possibly due to people converting classes
- # to namespaces. For now we do not warn for this case.
- #
- # Try matching case 1 first.
- match = Match(r'^(.*\)\s*)\{', line)
- if match:
- # Matched closing parenthesis (case 1). Check the token before the
- # matching opening parenthesis, and don't warn if it looks like a
- # macro. This avoids these false positives:
- # - macro that defines a base class
- # - multi-line macro that defines a base class
- # - macro that defines the whole class-head
- #
- # But we still issue warnings for macros that we know are safe to
- # warn, specifically:
- # - TEST, TEST_F, TEST_P, MATCHER, MATCHER_P
- # - TYPED_TEST
- # - INTERFACE_DEF
- # - EXCLUSIVE_LOCKS_REQUIRED, SHARED_LOCKS_REQUIRED, LOCKS_EXCLUDED:
- #
- # We implement a whitelist of safe macros instead of a blacklist of
- # unsafe macros, even though the latter appears less frequently in
- # google code and would have been easier to implement. This is because
- # the downside for getting the whitelist wrong means some extra
- # semicolons, while the downside for getting the blacklist wrong
- # would result in compile errors.
- #
- # In addition to macros, we also don't want to warn on
- # - Compound literals
- # - Lambdas
- # - alignas specifier with anonymous structs:
- closing_brace_pos = match.group(1).rfind(')')
- opening_parenthesis = ReverseCloseExpression(
- clean_lines, linenum, closing_brace_pos)
- if opening_parenthesis[2] > -1:
- line_prefix = opening_parenthesis[0][0:opening_parenthesis[2]]
- macro = Search(r'\b([A-Z_]+)\s*$', line_prefix)
- func = Match(r'^(.*\])\s*$', line_prefix)
- if ((macro and
- macro.group(1) not in (
- 'TEST', 'TEST_F', 'MATCHER', 'MATCHER_P', 'TYPED_TEST',
- 'EXCLUSIVE_LOCKS_REQUIRED', 'SHARED_LOCKS_REQUIRED',
- 'LOCKS_EXCLUDED', 'INTERFACE_DEF')) or
- (func and not Search(r'\boperator\s*\[\s*\]', func.group(1))) or
- Search(r'\b(?:struct|union)\s+alignas\s*$', line_prefix) or
- Search(r'\s+=\s*$', line_prefix)):
- match = None
- if (match and
- opening_parenthesis[1] > 1 and
- Search(r'\]\s*$', clean_lines.elided[opening_parenthesis[1] - 1])):
- # Multi-line lambda-expression
- match = None
-
- else:
- # Try matching cases 2-3.
- match = Match(r'^(.*(?:else|\)\s*const)\s*)\{', line)
- if not match:
- # Try matching cases 4-6. These are always matched on separate lines.
- #
- # Note that we can't simply concatenate the previous line to the
- # current line and do a single match, otherwise we may output
- # duplicate warnings for the blank line case:
- # if (cond) {
- # // blank line
- # }
- prevline = GetPreviousNonBlankLine(clean_lines, linenum)[0]
- if prevline and Search(r'[;{}]\s*$', prevline):
- match = Match(r'^(\s*)\{', line)
-
- # Check matching closing brace
- if match:
- (endline, endlinenum, endpos) = CloseExpression(
- clean_lines, linenum, len(match.group(1)))
- if endpos > -1 and Match(r'^\s*;', endline[endpos:]):
- # Current {} pair is eligible for semicolon check, and we have found
- # the redundant semicolon, output warning here.
- #
- # Note: because we are scanning forward for opening braces, and
- # outputting warnings for the matching closing brace, if there are
- # nested blocks with trailing semicolons, we will get the error
- # messages in reversed order.
- error(filename, endlinenum, 'readability/braces', 4,
- "You don't need a ; after a }")
-
-
-def CheckEmptyBlockBody(filename, clean_lines, linenum, error):
- """Look for empty loop/conditional body with only a single semicolon.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
-
- # Search for loop keywords at the beginning of the line. Because only
- # whitespaces are allowed before the keywords, this will also ignore most
- # do-while-loops, since those lines should start with closing brace.
- #
- # We also check "if" blocks here, since an empty conditional block
- # is likely an error.
- line = clean_lines.elided[linenum]
- matched = Match(r'\s*(for|while|if)\s*\(', line)
- if matched:
- # Find the end of the conditional expression
- (end_line, end_linenum, end_pos) = CloseExpression(
- clean_lines, linenum, line.find('('))
-
- # Output warning if what follows the condition expression is a semicolon.
- # No warning for all other cases, including whitespace or newline, since we
- # have a separate check for semicolons preceded by whitespace.
- if end_pos >= 0 and Match(r';', end_line[end_pos:]):
- if matched.group(1) == 'if':
- error(filename, end_linenum, 'whitespace/empty_conditional_body', 5,
- 'Empty conditional bodies should use {}')
- else:
- error(filename, end_linenum, 'whitespace/empty_loop_body', 5,
- 'Empty loop bodies should use {} or continue')
-
-
-def FindCheckMacro(line):
- """Find a replaceable CHECK-like macro.
-
- Args:
- line: line to search on.
- Returns:
- (macro name, start position), or (None, -1) if no replaceable
- macro is found.
- """
- for macro in _CHECK_MACROS:
- i = line.find(macro)
- if i >= 0:
- # Find opening parenthesis. Do a regular expression match here
- # to make sure that we are matching the expected CHECK macro, as
- # opposed to some other macro that happens to contain the CHECK
- # substring.
- matched = Match(r'^(.*\b' + macro + r'\s*)\(', line)
- if not matched:
- continue
- return (macro, len(matched.group(1)))
- return (None, -1)
-
-
-def CheckCheck(filename, clean_lines, linenum, error):
- """Checks the use of CHECK and EXPECT macros.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
-
- # Decide the set of replacement macros that should be suggested
- lines = clean_lines.elided
- (check_macro, start_pos) = FindCheckMacro(lines[linenum])
- if not check_macro:
- return
-
- # Find end of the boolean expression by matching parentheses
- (last_line, end_line, end_pos) = CloseExpression(
- clean_lines, linenum, start_pos)
- if end_pos < 0:
- return
-
- # If the check macro is followed by something other than a
- # semicolon, assume users will log their own custom error messages
- # and don't suggest any replacements.
- if not Match(r'\s*;', last_line[end_pos:]):
- return
-
- if linenum == end_line:
- expression = lines[linenum][start_pos + 1:end_pos - 1]
- else:
- expression = lines[linenum][start_pos + 1:]
- for i in xrange(linenum + 1, end_line):
- expression += lines[i]
- expression += last_line[0:end_pos - 1]
-
- # Parse expression so that we can take parentheses into account.
- # This avoids false positives for inputs like "CHECK((a < 4) == b)",
- # which is not replaceable by CHECK_LE.
- lhs = ''
- rhs = ''
- operator = None
- while expression:
- matched = Match(r'^\s*(<<|<<=|>>|>>=|->\*|->|&&|\|\||'
- r'==|!=|>=|>|<=|<|\()(.*)$', expression)
- if matched:
- token = matched.group(1)
- if token == '(':
- # Parenthesized operand
- expression = matched.group(2)
- (end, _) = FindEndOfExpressionInLine(expression, 0, ['('])
- if end < 0:
- return # Unmatched parenthesis
- lhs += '(' + expression[0:end]
- expression = expression[end:]
- elif token in ('&&', '||'):
- # Logical and/or operators. This means the expression
- # contains more than one term, for example:
- # CHECK(42 < a && a < b);
- #
- # These are not replaceable with CHECK_LE, so bail out early.
- return
- elif token in ('<<', '<<=', '>>', '>>=', '->*', '->'):
- # Non-relational operator
- lhs += token
- expression = matched.group(2)
- else:
- # Relational operator
- operator = token
- rhs = matched.group(2)
- break
- else:
- # Unparenthesized operand. Instead of appending to lhs one character
- # at a time, we do another regular expression match to consume several
- # characters at once if possible. Trivial benchmark shows that this
- # is more efficient when the operands are longer than a single
- # character, which is generally the case.
- matched = Match(r'^([^-=!<>()&|]+)(.*)$', expression)
- if not matched:
- matched = Match(r'^(\s*\S)(.*)$', expression)
- if not matched:
- break
- lhs += matched.group(1)
- expression = matched.group(2)
-
- # Only apply checks if we got all parts of the boolean expression
- if not (lhs and operator and rhs):
- return
-
- # Check that rhs do not contain logical operators. We already know
- # that lhs is fine since the loop above parses out && and ||.
- if rhs.find('&&') > -1 or rhs.find('||') > -1:
- return
-
- # At least one of the operands must be a constant literal. This is
- # to avoid suggesting replacements for unprintable things like
- # CHECK(variable != iterator)
- #
- # The following pattern matches decimal, hex integers, strings, and
- # characters (in that order).
- lhs = lhs.strip()
- rhs = rhs.strip()
- match_constant = r'^([-+]?(\d+|0[xX][0-9a-fA-F]+)[lLuU]{0,3}|".*"|\'.*\')$'
- if Match(match_constant, lhs) or Match(match_constant, rhs):
- # Note: since we know both lhs and rhs, we can provide a more
- # descriptive error message like:
- # Consider using CHECK_EQ(x, 42) instead of CHECK(x == 42)
- # Instead of:
- # Consider using CHECK_EQ instead of CHECK(a == b)
- #
- # We are still keeping the less descriptive message because if lhs
- # or rhs gets long, the error message might become unreadable.
- error(filename, linenum, 'readability/check', 2,
- 'Consider using %s instead of %s(a %s b)' % (
- _CHECK_REPLACEMENT[check_macro][operator],
- check_macro, operator))
-
-
-def CheckAltTokens(filename, clean_lines, linenum, error):
- """Check alternative keywords being used in boolean expressions.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Avoid preprocessor lines
- if Match(r'^\s*#', line):
- return
-
- # Last ditch effort to avoid multi-line comments. This will not help
- # if the comment started before the current line or ended after the
- # current line, but it catches most of the false positives. At least,
- # it provides a way to workaround this warning for people who use
- # multi-line comments in preprocessor macros.
- #
- # TODO(unknown): remove this once cpplint has better support for
- # multi-line comments.
- if line.find('/*') >= 0 or line.find('*/') >= 0:
- return
-
- for match in _ALT_TOKEN_REPLACEMENT_PATTERN.finditer(line):
- error(filename, linenum, 'readability/alt_tokens', 2,
- 'Use operator %s instead of %s' % (
- _ALT_TOKEN_REPLACEMENT[match.group(1)], match.group(1)))
-
-
-def GetLineWidth(line):
- """Determines the width of the line in column positions.
-
- Args:
- line: A string, which may be a Unicode string.
-
- Returns:
- The width of the line in column positions, accounting for Unicode
- combining characters and wide characters.
- """
- if isinstance(line, unicode):
- width = 0
- for uc in unicodedata.normalize('NFC', line):
- if unicodedata.east_asian_width(uc) in ('W', 'F'):
- width += 2
- elif not unicodedata.combining(uc):
- width += 1
- return width
- else:
- return len(line)
-
-
-def CheckStyle(filename, clean_lines, linenum, file_extension, nesting_state,
- error):
- """Checks rules from the 'C++ style rules' section of cppguide.html.
-
- Most of these rules are hard to test (naming, comment style), but we
- do what we can. In particular we check for 2-space indents, line lengths,
- tab usage, spaces inside code, etc.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- file_extension: The extension (without the dot) of the filename.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
-
- # Don't use "elided" lines here, otherwise we can't check commented lines.
- # Don't want to use "raw" either, because we don't want to check inside C++11
- # raw strings,
- raw_lines = clean_lines.lines_without_raw_strings
- line = raw_lines[linenum]
-
- if line.find('\t') != -1:
- error(filename, linenum, 'whitespace/tab', 1,
- 'Tab found; better to use spaces')
-
- # One or three blank spaces at the beginning of the line is weird; it's
- # hard to reconcile that with 2-space indents.
- # NOTE: here are the conditions rob pike used for his tests. Mine aren't
- # as sophisticated, but it may be worth becoming so: RLENGTH==initial_spaces
- # if(RLENGTH > 20) complain = 0;
- # if(match($0, " +(error|private|public|protected):")) complain = 0;
- # if(match(prev, "&& *$")) complain = 0;
- # if(match(prev, "\\|\\| *$")) complain = 0;
- # if(match(prev, "[\",=><] *$")) complain = 0;
- # if(match($0, " <<")) complain = 0;
- # if(match(prev, " +for \\(")) complain = 0;
- # if(prevodd && match(prevprev, " +for \\(")) complain = 0;
- scope_or_label_pattern = r'\s*\w+\s*:\s*\\?$'
- classinfo = nesting_state.InnermostClass()
- initial_spaces = 0
- cleansed_line = clean_lines.elided[linenum]
- while initial_spaces < len(line) and line[initial_spaces] == ' ':
- initial_spaces += 1
- if line and line[-1].isspace():
- error(filename, linenum, 'whitespace/end_of_line', 4,
- 'Line ends in whitespace. Consider deleting these extra spaces.')
- # There are certain situations we allow one space, notably for
- # section labels, and also lines containing multi-line raw strings.
- elif ((initial_spaces == 1 or initial_spaces == 3) and
- not Match(scope_or_label_pattern, cleansed_line) and
- not (clean_lines.raw_lines[linenum] != line and
- Match(r'^\s*""', line))):
- error(filename, linenum, 'whitespace/indent', 3,
- 'Weird number of spaces at line-start. '
- 'Are you using a 2-space indent?')
-
- # Check if the line is a header guard.
- is_header_guard = False
- if file_extension == 'h' or file_extension == 'hpp':
- cppvar = GetHeaderGuardCPPVariable(filename)
- if (line.startswith('#ifndef %s' % cppvar) or
- line.startswith('#define %s' % cppvar) or
- line.startswith('#endif // %s' % cppvar)):
- is_header_guard = True
- # #include lines and header guards can be long, since there's no clean way to
- # split them.
- #
- # URLs can be long too. It's possible to split these, but it makes them
- # harder to cut&paste.
- #
- # The "$Id:...$" comment may also get very long without it being the
- # developers fault.
- if (not line.startswith('#include') and not is_header_guard and
- not Match(r'^\s*//.*http(s?)://\S*$', line) and
- not Match(r'^// \$Id:.*#[0-9]+ \$$', line)):
- line_width = GetLineWidth(line)
- extended_length = int((_line_length * 1.25))
- if line_width > extended_length:
- error(filename, linenum, 'whitespace/line_length', 4,
- 'Lines should very rarely be longer than %i characters' %
- extended_length)
- elif line_width > _line_length:
- error(filename, linenum, 'whitespace/line_length', 2,
- 'Lines should be <= %i characters long' % _line_length)
-
- if (cleansed_line.count(';') > 1 and
- # for loops are allowed two ;'s (and may run over two lines).
- cleansed_line.find('for') == -1 and
- (GetPreviousNonBlankLine(clean_lines, linenum)[0].find('for') == -1 or
- GetPreviousNonBlankLine(clean_lines, linenum)[0].find(';') != -1) and
- # It's ok to have many commands in a switch case that fits in 1 line
- not ((cleansed_line.find('case ') != -1 or
- cleansed_line.find('default:') != -1) and
- cleansed_line.find('break;') != -1)):
- error(filename, linenum, 'whitespace/newline', 0,
- 'More than one command on the same line')
-
- # Some more style checks
- CheckBraces(filename, clean_lines, linenum, error)
- CheckTrailingSemicolon(filename, clean_lines, linenum, error)
- CheckEmptyBlockBody(filename, clean_lines, linenum, error)
- CheckAccess(filename, clean_lines, linenum, nesting_state, error)
- CheckSpacing(filename, clean_lines, linenum, nesting_state, error)
- CheckOperatorSpacing(filename, clean_lines, linenum, error)
- CheckParenthesisSpacing(filename, clean_lines, linenum, error)
- CheckCommaSpacing(filename, clean_lines, linenum, error)
- CheckBracesSpacing(filename, clean_lines, linenum, error)
- CheckSpacingForFunctionCall(filename, clean_lines, linenum, error)
- CheckRValueReference(filename, clean_lines, linenum, nesting_state, error)
- CheckCheck(filename, clean_lines, linenum, error)
- CheckAltTokens(filename, clean_lines, linenum, error)
- classinfo = nesting_state.InnermostClass()
- if classinfo:
- CheckSectionSpacing(filename, clean_lines, classinfo, linenum, error)
-
-
-_RE_PATTERN_INCLUDE = re.compile(r'^\s*#\s*include\s*([<"])([^>"]*)[>"].*$')
-# Matches the first component of a filename delimited by -s and _s. That is:
-# _RE_FIRST_COMPONENT.match('foo').group(0) == 'foo'
-# _RE_FIRST_COMPONENT.match('foo.cc').group(0) == 'foo'
-# _RE_FIRST_COMPONENT.match('foo-bar_baz.cc').group(0) == 'foo'
-# _RE_FIRST_COMPONENT.match('foo_bar-baz.cc').group(0) == 'foo'
-_RE_FIRST_COMPONENT = re.compile(r'^[^-_.]+')
-
-
-def _DropCommonSuffixes(filename):
- """Drops common suffixes like _test.cc or -inl.h from filename.
-
- For example:
- >>> _DropCommonSuffixes('foo/foo-inl.h')
- 'foo/foo'
- >>> _DropCommonSuffixes('foo/bar/foo.cc')
- 'foo/bar/foo'
- >>> _DropCommonSuffixes('foo/foo_internal.h')
- 'foo/foo'
- >>> _DropCommonSuffixes('foo/foo_unusualinternal.h')
- 'foo/foo_unusualinternal'
-
- Args:
- filename: The input filename.
-
- Returns:
- The filename with the common suffix removed.
- """
- for suffix in ('test.cc', 'regtest.cc', 'unittest.cc',
- 'inl.h', 'impl.h', 'internal.h'):
- if (filename.endswith(suffix) and len(filename) > len(suffix) and
- filename[-len(suffix) - 1] in ('-', '_')):
- return filename[:-len(suffix) - 1]
- return os.path.splitext(filename)[0]
-
-
-def _IsTestFilename(filename):
- """Determines if the given filename has a suffix that identifies it as a test.
-
- Args:
- filename: The input filename.
-
- Returns:
- True if 'filename' looks like a test, False otherwise.
- """
- if (filename.endswith('_test.cc') or
- filename.endswith('_unittest.cc') or
- filename.endswith('_regtest.cc')):
- return True
- else:
- return False
-
-
-def _ClassifyInclude(fileinfo, include, is_system):
- """Figures out what kind of header 'include' is.
-
- Args:
- fileinfo: The current file cpplint is running over. A FileInfo instance.
- include: The path to a #included file.
- is_system: True if the #include used <> rather than "".
-
- Returns:
- One of the _XXX_HEADER constants.
-
- For example:
- >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'stdio.h', True)
- _C_SYS_HEADER
- >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'string', True)
- _CPP_SYS_HEADER
- >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/foo.h', False)
- _LIKELY_MY_HEADER
- >>> _ClassifyInclude(FileInfo('foo/foo_unknown_extension.cc'),
- ... 'bar/foo_other_ext.h', False)
- _POSSIBLE_MY_HEADER
- >>> _ClassifyInclude(FileInfo('foo/foo.cc'), 'foo/bar.h', False)
- _OTHER_HEADER
- """
- # This is a list of all standard c++ header files, except
- # those already checked for above.
- is_cpp_h = include in _CPP_HEADERS
-
- if is_system:
- if is_cpp_h:
- return _CPP_SYS_HEADER
- else:
- return _C_SYS_HEADER
-
- # If the target file and the include we're checking share a
- # basename when we drop common extensions, and the include
- # lives in . , then it's likely to be owned by the target file.
- target_dir, target_base = (
- os.path.split(_DropCommonSuffixes(fileinfo.RepositoryName())))
- include_dir, include_base = os.path.split(_DropCommonSuffixes(include))
- if target_base == include_base and (
- include_dir == target_dir or
- include_dir == os.path.normpath(target_dir + '/../public')):
- return _LIKELY_MY_HEADER
-
- # If the target and include share some initial basename
- # component, it's possible the target is implementing the
- # include, so it's allowed to be first, but we'll never
- # complain if it's not there.
- target_first_component = _RE_FIRST_COMPONENT.match(target_base)
- include_first_component = _RE_FIRST_COMPONENT.match(include_base)
- if (target_first_component and include_first_component and
- target_first_component.group(0) ==
- include_first_component.group(0)):
- return _POSSIBLE_MY_HEADER
-
- return _OTHER_HEADER
-
-
-
-def CheckIncludeLine(filename, clean_lines, linenum, include_state, error):
- """Check rules that are applicable to #include lines.
-
- Strings on #include lines are NOT removed from elided line, to make
- certain tasks easier. However, to prevent false positives, checks
- applicable to #include lines in CheckLanguage must be put here.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- include_state: An _IncludeState instance in which the headers are inserted.
- error: The function to call with any errors found.
- """
- fileinfo = FileInfo(filename)
- line = clean_lines.lines[linenum]
-
- # "include" should use the new style "foo/bar.h" instead of just "bar.h"
- # Only do this check if the included header follows google naming
- # conventions. If not, assume that it's a 3rd party API that
- # requires special include conventions.
- #
- # We also make an exception for Lua headers, which follow google
- # naming convention but not the include convention.
- match = Match(r'#include\s*"([^/]+\.h)"', line)
- if match and not _THIRD_PARTY_HEADERS_PATTERN.match(match.group(1)):
- error(filename, linenum, 'build/include', 4,
- 'Include the directory when naming .h files')
-
- # we shouldn't include a file more than once. actually, there are a
- # handful of instances where doing so is okay, but in general it's
- # not.
- match = _RE_PATTERN_INCLUDE.search(line)
- if match:
- include = match.group(2)
- is_system = (match.group(1) == '<')
- duplicate_line = include_state.FindHeader(include)
- if duplicate_line >= 0:
- error(filename, linenum, 'build/include', 4,
- '"%s" already included at %s:%s' %
- (include, filename, duplicate_line))
- elif (include.endswith('.cc') and
- os.path.dirname(fileinfo.RepositoryName()) != os.path.dirname(include)):
- error(filename, linenum, 'build/include', 4,
- 'Do not include .cc files from other packages')
- elif not _THIRD_PARTY_HEADERS_PATTERN.match(include):
- include_state.include_list[-1].append((include, linenum))
-
- # We want to ensure that headers appear in the right order:
- # 1) for foo.cc, foo.h (preferred location)
- # 2) c system files
- # 3) cpp system files
- # 4) for foo.cc, foo.h (deprecated location)
- # 5) other google headers
- #
- # We classify each include statement as one of those 5 types
- # using a number of techniques. The include_state object keeps
- # track of the highest type seen, and complains if we see a
- # lower type after that.
- error_message = include_state.CheckNextIncludeOrder(
- _ClassifyInclude(fileinfo, include, is_system))
- if error_message:
- error(filename, linenum, 'build/include_order', 4,
- '%s. Should be: %s.h, c system, c++ system, other.' %
- (error_message, fileinfo.BaseName()))
- canonical_include = include_state.CanonicalizeAlphabeticalOrder(include)
- if not include_state.IsInAlphabeticalOrder(
- clean_lines, linenum, canonical_include):
- error(filename, linenum, 'build/include_alpha', 4,
- 'Include "%s" not in alphabetical order' % include)
- include_state.SetLastHeader(canonical_include)
-
-
-
-def _GetTextInside(text, start_pattern):
- r"""Retrieves all the text between matching open and close parentheses.
-
- Given a string of lines and a regular expression string, retrieve all the text
- following the expression and between opening punctuation symbols like
- (, [, or {, and the matching close-punctuation symbol. This properly nested
- occurrences of the punctuations, so for the text like
- printf(a(), b(c()));
- a call to _GetTextInside(text, r'printf\(') will return 'a(), b(c())'.
- start_pattern must match string having an open punctuation symbol at the end.
-
- Args:
- text: The lines to extract text. Its comments and strings must be elided.
- It can be single line and can span multiple lines.
- start_pattern: The regexp string indicating where to start extracting
- the text.
- Returns:
- The extracted text.
- None if either the opening string or ending punctuation could not be found.
- """
- # TODO(unknown): Audit cpplint.py to see what places could be profitably
- # rewritten to use _GetTextInside (and use inferior regexp matching today).
-
- # Give opening punctuations to get the matching close-punctuations.
- matching_punctuation = {'(': ')', '{': '}', '[': ']'}
- closing_punctuation = set(matching_punctuation.itervalues())
-
- # Find the position to start extracting text.
- match = re.search(start_pattern, text, re.M)
- if not match: # start_pattern not found in text.
- return None
- start_position = match.end(0)
-
- assert start_position > 0, (
- 'start_pattern must ends with an opening punctuation.')
- assert text[start_position - 1] in matching_punctuation, (
- 'start_pattern must ends with an opening punctuation.')
- # Stack of closing punctuations we expect to have in text after position.
- punctuation_stack = [matching_punctuation[text[start_position - 1]]]
- position = start_position
- while punctuation_stack and position < len(text):
- if text[position] == punctuation_stack[-1]:
- punctuation_stack.pop()
- elif text[position] in closing_punctuation:
- # A closing punctuation without matching opening punctuations.
- return None
- elif text[position] in matching_punctuation:
- punctuation_stack.append(matching_punctuation[text[position]])
- position += 1
- if punctuation_stack:
- # Opening punctuations left without matching close-punctuations.
- return None
- # punctuations match.
- return text[start_position:position - 1]
-
-
-# Patterns for matching call-by-reference parameters.
-#
-# Supports nested templates up to 2 levels deep using this messy pattern:
-# < (?: < (?: < [^<>]*
-# >
-# | [^<>] )*
-# >
-# | [^<>] )*
-# >
-_RE_PATTERN_IDENT = r'[_a-zA-Z]\w*' # =~ [[:alpha:]][[:alnum:]]*
-_RE_PATTERN_TYPE = (
- r'(?:const\s+)?(?:typename\s+|class\s+|struct\s+|union\s+|enum\s+)?'
- r'(?:\w|'
- r'\s*<(?:<(?:<[^<>]*>|[^<>])*>|[^<>])*>|'
- r'::)+')
-# A call-by-reference parameter ends with '& identifier'.
-_RE_PATTERN_REF_PARAM = re.compile(
- r'(' + _RE_PATTERN_TYPE + r'(?:\s*(?:\bconst\b|[*]))*\s*'
- r'&\s*' + _RE_PATTERN_IDENT + r')\s*(?:=[^,()]+)?[,)]')
-# A call-by-const-reference parameter either ends with 'const& identifier'
-# or looks like 'const type& identifier' when 'type' is atomic.
-_RE_PATTERN_CONST_REF_PARAM = (
- r'(?:.*\s*\bconst\s*&\s*' + _RE_PATTERN_IDENT +
- r'|const\s+' + _RE_PATTERN_TYPE + r'\s*&\s*' + _RE_PATTERN_IDENT + r')')
-
-
-def CheckLanguage(filename, clean_lines, linenum, file_extension,
- include_state, nesting_state, error):
- """Checks rules from the 'C++ language rules' section of cppguide.html.
-
- Some of these rules are hard to test (function overloading, using
- uint32 inappropriately), but we do the best we can.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- file_extension: The extension (without the dot) of the filename.
- include_state: An _IncludeState instance in which the headers are inserted.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
- # If the line is empty or consists of entirely a comment, no need to
- # check it.
- line = clean_lines.elided[linenum]
- if not line:
- return
-
- match = _RE_PATTERN_INCLUDE.search(line)
- if match:
- CheckIncludeLine(filename, clean_lines, linenum, include_state, error)
- return
-
- # Reset include state across preprocessor directives. This is meant
- # to silence warnings for conditional includes.
- match = Match(r'^\s*#\s*(if|ifdef|ifndef|elif|else|endif)\b', line)
- if match:
- include_state.ResetSection(match.group(1))
-
- # Make Windows paths like Unix.
- fullname = os.path.abspath(filename).replace('\\', '/')
-
- # Perform other checks now that we are sure that this is not an include line
- CheckCasts(filename, clean_lines, linenum, error)
- CheckGlobalStatic(filename, clean_lines, linenum, error)
- CheckPrintf(filename, clean_lines, linenum, error)
-
- if file_extension == 'h':
- # TODO(unknown): check that 1-arg constructors are explicit.
- # How to tell it's a constructor?
- # (handled in CheckForNonStandardConstructs for now)
- # TODO(unknown): check that classes declare or disable copy/assign
- # (level 1 error)
- pass
-
- # Check if people are using the verboten C basic types. The only exception
- # we regularly allow is "unsigned short port" for port.
- if Search(r'\bshort port\b', line):
- if not Search(r'\bunsigned short port\b', line):
- error(filename, linenum, 'runtime/int', 4,
- 'Use "unsigned short" for ports, not "short"')
- else:
- match = Search(r'\b(short|long(?! +double)|long long)\b', line)
- if match:
- error(filename, linenum, 'runtime/int', 4,
- 'Use int16/int64/etc, rather than the C type %s' % match.group(1))
-
- # Check if some verboten operator overloading is going on
- # TODO(unknown): catch out-of-line unary operator&:
- # class X {};
- # int operator&(const X& x) { return 42; } // unary operator&
- # The trick is it's hard to tell apart from binary operator&:
- # class Y { int operator&(const Y& x) { return 23; } }; // binary operator&
- if Search(r'\boperator\s*&\s*\(\s*\)', line):
- error(filename, linenum, 'runtime/operator', 4,
- 'Unary operator& is dangerous. Do not use it.')
-
- # Check for suspicious usage of "if" like
- # } if (a == b) {
- if Search(r'\}\s*if\s*\(', line):
- error(filename, linenum, 'readability/braces', 4,
- 'Did you mean "else if"? If not, start a new line for "if".')
-
- # Check for potential format string bugs like printf(foo).
- # We constrain the pattern not to pick things like DocidForPrintf(foo).
- # Not perfect but it can catch printf(foo.c_str()) and printf(foo->c_str())
- # TODO(unknown): Catch the following case. Need to change the calling
- # convention of the whole function to process multiple line to handle it.
- # printf(
- # boy_this_is_a_really_long_variable_that_cannot_fit_on_the_prev_line);
- printf_args = _GetTextInside(line, r'(?i)\b(string)?printf\s*\(')
- if printf_args:
- match = Match(r'([\w.\->()]+)$', printf_args)
- if match and match.group(1) != '__VA_ARGS__':
- function_name = re.search(r'\b((?:string)?printf)\s*\(',
- line, re.I).group(1)
- error(filename, linenum, 'runtime/printf', 4,
- 'Potential format string bug. Do %s("%%s", %s) instead.'
- % (function_name, match.group(1)))
-
- # Check for potential memset bugs like memset(buf, sizeof(buf), 0).
- match = Search(r'memset\s*\(([^,]*),\s*([^,]*),\s*0\s*\)', line)
- if match and not Match(r"^''|-?[0-9]+|0x[0-9A-Fa-f]$", match.group(2)):
- error(filename, linenum, 'runtime/memset', 4,
- 'Did you mean "memset(%s, 0, %s)"?'
- % (match.group(1), match.group(2)))
-
- if Search(r'\busing namespace\b', line):
- error(filename, linenum, 'build/namespaces', 5,
- 'Do not use namespace using-directives. '
- 'Use using-declarations instead.')
-
- # Detect variable-length arrays.
- match = Match(r'\s*(.+::)?(\w+) [a-z]\w*\[(.+)];', line)
- if (match and match.group(2) != 'return' and match.group(2) != 'delete' and
- match.group(3).find(']') == -1):
- # Split the size using space and arithmetic operators as delimiters.
- # If any of the resulting tokens are not compile time constants then
- # report the error.
- tokens = re.split(r'\s|\+|\-|\*|\/|<<|>>]', match.group(3))
- is_const = True
- skip_next = False
- for tok in tokens:
- if skip_next:
- skip_next = False
- continue
-
- if Search(r'sizeof\(.+\)', tok): continue
- if Search(r'arraysize\(\w+\)', tok): continue
-
- tok = tok.lstrip('(')
- tok = tok.rstrip(')')
- if not tok: continue
- if Match(r'\d+', tok): continue
- if Match(r'0[xX][0-9a-fA-F]+', tok): continue
- if Match(r'k[A-Z0-9]\w*', tok): continue
- if Match(r'(.+::)?k[A-Z0-9]\w*', tok): continue
- if Match(r'(.+::)?[A-Z][A-Z0-9_]*', tok): continue
- # A catch all for tricky sizeof cases, including 'sizeof expression',
- # 'sizeof(*type)', 'sizeof(const type)', 'sizeof(struct StructName)'
- # requires skipping the next token because we split on ' ' and '*'.
- if tok.startswith('sizeof'):
- skip_next = True
- continue
- is_const = False
- break
- if not is_const:
- error(filename, linenum, 'runtime/arrays', 1,
- 'Do not use variable-length arrays. Use an appropriately named '
- "('k' followed by CamelCase) compile-time constant for the size.")
-
- # Check for use of unnamed namespaces in header files. Registration
- # macros are typically OK, so we allow use of "namespace {" on lines
- # that end with backslashes.
- if (file_extension == 'h'
- and Search(r'\bnamespace\s*{', line)
- and line[-1] != '\\'):
- error(filename, linenum, 'build/namespaces', 4,
- 'Do not use unnamed namespaces in header files. See '
- 'http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Namespaces'
- ' for more information.')
-
-
-def CheckGlobalStatic(filename, clean_lines, linenum, error):
- """Check for unsafe global or static objects.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Match two lines at a time to support multiline declarations
- if linenum + 1 < clean_lines.NumLines() and not Search(r'[;({]', line):
- line += clean_lines.elided[linenum + 1].strip()
-
- # Check for people declaring static/global STL strings at the top level.
- # This is dangerous because the C++ language does not guarantee that
- # globals with constructors are initialized before the first access.
- match = Match(
- r'((?:|static +)(?:|const +))string +([a-zA-Z0-9_:]+)\b(.*)',
- line)
-
- # Remove false positives:
- # - String pointers (as opposed to values).
- # string *pointer
- # const string *pointer
- # string const *pointer
- # string *const pointer
- #
- # - Functions and template specializations.
- # string Function<Type>(...
- # string Class<Type>::Method(...
- #
- # - Operators. These are matched separately because operator names
- # cross non-word boundaries, and trying to match both operators
- # and functions at the same time would decrease accuracy of
- # matching identifiers.
- # string Class::operator*()
- if (match and
- not Search(r'\bstring\b(\s+const)?\s*\*\s*(const\s+)?\w', line) and
- not Search(r'\boperator\W', line) and
- not Match(r'\s*(<.*>)?(::[a-zA-Z0-9_]+)*\s*\(([^"]|$)', match.group(3))):
- error(filename, linenum, 'runtime/string', 4,
- 'For a static/global string constant, use a C style string instead: '
- '"%schar %s[]".' %
- (match.group(1), match.group(2)))
-
- if Search(r'\b([A-Za-z0-9_]*_)\(\1\)', line):
- error(filename, linenum, 'runtime/init', 4,
- 'You seem to be initializing a member variable with itself.')
-
-
-def CheckPrintf(filename, clean_lines, linenum, error):
- """Check for printf related issues.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # When snprintf is used, the second argument shouldn't be a literal.
- match = Search(r'snprintf\s*\(([^,]*),\s*([0-9]*)\s*,', line)
- if match and match.group(2) != '0':
- # If 2nd arg is zero, snprintf is used to calculate size.
- error(filename, linenum, 'runtime/printf', 3,
- 'If you can, use sizeof(%s) instead of %s as the 2nd arg '
- 'to snprintf.' % (match.group(1), match.group(2)))
-
- # Check if some verboten C functions are being used.
- if Search(r'\bsprintf\s*\(', line):
- error(filename, linenum, 'runtime/printf', 5,
- 'Never use sprintf. Use snprintf instead.')
- match = Search(r'\b(strcpy|strcat)\s*\(', line)
- if match:
- error(filename, linenum, 'runtime/printf', 4,
- 'Almost always, snprintf is better than %s' % match.group(1))
-
-
-def IsDerivedFunction(clean_lines, linenum):
- """Check if current line contains an inherited function.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- Returns:
- True if current line contains a function with "override"
- virt-specifier.
- """
- # Scan back a few lines for start of current function
- for i in xrange(linenum, max(-1, linenum - 10), -1):
- match = Match(r'^([^()]*\w+)\(', clean_lines.elided[i])
- if match:
- # Look for "override" after the matching closing parenthesis
- line, _, closing_paren = CloseExpression(
- clean_lines, i, len(match.group(1)))
- return (closing_paren >= 0 and
- Search(r'\boverride\b', line[closing_paren:]))
- return False
-
-
-def IsOutOfLineMethodDefinition(clean_lines, linenum):
- """Check if current line contains an out-of-line method definition.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- Returns:
- True if current line contains an out-of-line method definition.
- """
- # Scan back a few lines for start of current function
- for i in xrange(linenum, max(-1, linenum - 10), -1):
- if Match(r'^([^()]*\w+)\(', clean_lines.elided[i]):
- return Match(r'^[^()]*\w+::\w+\(', clean_lines.elided[i]) is not None
- return False
-
-
-def IsInitializerList(clean_lines, linenum):
- """Check if current line is inside constructor initializer list.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- Returns:
- True if current line appears to be inside constructor initializer
- list, False otherwise.
- """
- for i in xrange(linenum, 1, -1):
- line = clean_lines.elided[i]
- if i == linenum:
- remove_function_body = Match(r'^(.*)\{\s*$', line)
- if remove_function_body:
- line = remove_function_body.group(1)
-
- if Search(r'\s:\s*\w+[({]', line):
- # A lone colon tend to indicate the start of a constructor
- # initializer list. It could also be a ternary operator, which
- # also tend to appear in constructor initializer lists as
- # opposed to parameter lists.
- return True
- if Search(r'\}\s*,\s*$', line):
- # A closing brace followed by a comma is probably the end of a
- # brace-initialized member in constructor initializer list.
- return True
- if Search(r'[{};]\s*$', line):
- # Found one of the following:
- # - A closing brace or semicolon, probably the end of the previous
- # function.
- # - An opening brace, probably the start of current class or namespace.
- #
- # Current line is probably not inside an initializer list since
- # we saw one of those things without seeing the starting colon.
- return False
-
- # Got to the beginning of the file without seeing the start of
- # constructor initializer list.
- return False
-
-
-def CheckForNonConstReference(filename, clean_lines, linenum,
- nesting_state, error):
- """Check for non-const references.
-
- Separate from CheckLanguage since it scans backwards from current
- line, instead of scanning forward.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: The function to call with any errors found.
- """
- # Do nothing if there is no '&' on current line.
- line = clean_lines.elided[linenum]
- if '&' not in line:
- return
-
- # If a function is inherited, current function doesn't have much of
- # a choice, so any non-const references should not be blamed on
- # derived function.
- if IsDerivedFunction(clean_lines, linenum):
- return
-
- # Don't warn on out-of-line method definitions, as we would warn on the
- # in-line declaration, if it isn't marked with 'override'.
- if IsOutOfLineMethodDefinition(clean_lines, linenum):
- return
-
- # Long type names may be broken across multiple lines, usually in one
- # of these forms:
- # LongType
- # ::LongTypeContinued &identifier
- # LongType::
- # LongTypeContinued &identifier
- # LongType<
- # ...>::LongTypeContinued &identifier
- #
- # If we detected a type split across two lines, join the previous
- # line to current line so that we can match const references
- # accordingly.
- #
- # Note that this only scans back one line, since scanning back
- # arbitrary number of lines would be expensive. If you have a type
- # that spans more than 2 lines, please use a typedef.
- if linenum > 1:
- previous = None
- if Match(r'\s*::(?:[\w<>]|::)+\s*&\s*\S', line):
- # previous_line\n + ::current_line
- previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+[\w<>])\s*$',
- clean_lines.elided[linenum - 1])
- elif Match(r'\s*[a-zA-Z_]([\w<>]|::)+\s*&\s*\S', line):
- # previous_line::\n + current_line
- previous = Search(r'\b((?:const\s*)?(?:[\w<>]|::)+::)\s*$',
- clean_lines.elided[linenum - 1])
- if previous:
- line = previous.group(1) + line.lstrip()
- else:
- # Check for templated parameter that is split across multiple lines
- endpos = line.rfind('>')
- if endpos > -1:
- (_, startline, startpos) = ReverseCloseExpression(
- clean_lines, linenum, endpos)
- if startpos > -1 and startline < linenum:
- # Found the matching < on an earlier line, collect all
- # pieces up to current line.
- line = ''
- for i in xrange(startline, linenum + 1):
- line += clean_lines.elided[i].strip()
-
- # Check for non-const references in function parameters. A single '&' may
- # found in the following places:
- # inside expression: binary & for bitwise AND
- # inside expression: unary & for taking the address of something
- # inside declarators: reference parameter
- # We will exclude the first two cases by checking that we are not inside a
- # function body, including one that was just introduced by a trailing '{'.
- # TODO(unknown): Doesn't account for 'catch(Exception& e)' [rare].
- if (nesting_state.previous_stack_top and
- not (isinstance(nesting_state.previous_stack_top, _ClassInfo) or
- isinstance(nesting_state.previous_stack_top, _NamespaceInfo))):
- # Not at toplevel, not within a class, and not within a namespace
- return
-
- # Avoid initializer lists. We only need to scan back from the
- # current line for something that starts with ':'.
- #
- # We don't need to check the current line, since the '&' would
- # appear inside the second set of parentheses on the current line as
- # opposed to the first set.
- if linenum > 0:
- for i in xrange(linenum - 1, max(0, linenum - 10), -1):
- previous_line = clean_lines.elided[i]
- if not Search(r'[),]\s*$', previous_line):
- break
- if Match(r'^\s*:\s+\S', previous_line):
- return
-
- # Avoid preprocessors
- if Search(r'\\\s*$', line):
- return
-
- # Avoid constructor initializer lists
- if IsInitializerList(clean_lines, linenum):
- return
-
- # We allow non-const references in a few standard places, like functions
- # called "swap()" or iostream operators like "<<" or ">>". Do not check
- # those function parameters.
- #
- # We also accept & in static_assert, which looks like a function but
- # it's actually a declaration expression.
- whitelisted_functions = (r'(?:[sS]wap(?:<\w:+>)?|'
- r'operator\s*[<>][<>]|'
- r'static_assert|COMPILE_ASSERT'
- r')\s*\(')
- if Search(whitelisted_functions, line):
- return
- elif not Search(r'\S+\([^)]*$', line):
- # Don't see a whitelisted function on this line. Actually we
- # didn't see any function name on this line, so this is likely a
- # multi-line parameter list. Try a bit harder to catch this case.
- for i in xrange(2):
- if (linenum > i and
- Search(whitelisted_functions, clean_lines.elided[linenum - i - 1])):
- return
-
- decls = ReplaceAll(r'{[^}]*}', ' ', line) # exclude function body
- for parameter in re.findall(_RE_PATTERN_REF_PARAM, decls):
- if not Match(_RE_PATTERN_CONST_REF_PARAM, parameter):
- error(filename, linenum, 'runtime/references', 2,
- 'Is this a non-const reference? '
- 'If so, make const or use a pointer: ' +
- ReplaceAll(' *<', '<', parameter))
-
-
-def CheckCasts(filename, clean_lines, linenum, error):
- """Various cast related checks.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Check to see if they're using an conversion function cast.
- # I just try to capture the most common basic types, though there are more.
- # Parameterless conversion functions, such as bool(), are allowed as they are
- # probably a member operator declaration or default constructor.
- match = Search(
- r'(\bnew\s+|\S<\s*(?:const\s+)?)?\b'
- r'(int|float|double|bool|char|int32|uint32|int64|uint64)'
- r'(\([^)].*)', line)
- expecting_function = ExpectingFunctionArgs(clean_lines, linenum)
- if match and not expecting_function:
- matched_type = match.group(2)
-
- # matched_new_or_template is used to silence two false positives:
- # - New operators
- # - Template arguments with function types
- #
- # For template arguments, we match on types immediately following
- # an opening bracket without any spaces. This is a fast way to
- # silence the common case where the function type is the first
- # template argument. False negative with less-than comparison is
- # avoided because those operators are usually followed by a space.
- #
- # function<double(double)> // bracket + no space = false positive
- # value < double(42) // bracket + space = true positive
- matched_new_or_template = match.group(1)
-
- # Avoid arrays by looking for brackets that come after the closing
- # parenthesis.
- if Match(r'\([^()]+\)\s*\[', match.group(3)):
- return
-
- # Other things to ignore:
- # - Function pointers
- # - Casts to pointer types
- # - Placement new
- # - Alias declarations
- matched_funcptr = match.group(3)
- if (matched_new_or_template is None and
- not (matched_funcptr and
- (Match(r'\((?:[^() ]+::\s*\*\s*)?[^() ]+\)\s*\(',
- matched_funcptr) or
- matched_funcptr.startswith('(*)'))) and
- not Match(r'\s*using\s+\S+\s*=\s*' + matched_type, line) and
- not Search(r'new\(\S+\)\s*' + matched_type, line)):
- error(filename, linenum, 'readability/casting', 4,
- 'Using deprecated casting style. '
- 'Use static_cast<%s>(...) instead' %
- matched_type)
-
- if not expecting_function:
- CheckCStyleCast(filename, clean_lines, linenum, 'static_cast',
- r'\((int|float|double|bool|char|u?int(16|32|64))\)', error)
-
- # This doesn't catch all cases. Consider (const char * const)"hello".
- #
- # (char *) "foo" should always be a const_cast (reinterpret_cast won't
- # compile).
- if CheckCStyleCast(filename, clean_lines, linenum, 'const_cast',
- r'\((char\s?\*+\s?)\)\s*"', error):
- pass
- else:
- # Check pointer casts for other than string constants
- CheckCStyleCast(filename, clean_lines, linenum, 'reinterpret_cast',
- r'\((\w+\s?\*+\s?)\)', error)
-
- # In addition, we look for people taking the address of a cast. This
- # is dangerous -- casts can assign to temporaries, so the pointer doesn't
- # point where you think.
- #
- # Some non-identifier character is required before the '&' for the
- # expression to be recognized as a cast. These are casts:
- # expression = &static_cast<int*>(temporary());
- # function(&(int*)(temporary()));
- #
- # This is not a cast:
- # reference_type&(int* function_param);
- match = Search(
- r'(?:[^\w]&\(([^)*][^)]*)\)[\w(])|'
- r'(?:[^\w]&(static|dynamic|down|reinterpret)_cast\b)', line)
- if match:
- # Try a better error message when the & is bound to something
- # dereferenced by the casted pointer, as opposed to the casted
- # pointer itself.
- parenthesis_error = False
- match = Match(r'^(.*&(?:static|dynamic|down|reinterpret)_cast\b)<', line)
- if match:
- _, y1, x1 = CloseExpression(clean_lines, linenum, len(match.group(1)))
- if x1 >= 0 and clean_lines.elided[y1][x1] == '(':
- _, y2, x2 = CloseExpression(clean_lines, y1, x1)
- if x2 >= 0:
- extended_line = clean_lines.elided[y2][x2:]
- if y2 < clean_lines.NumLines() - 1:
- extended_line += clean_lines.elided[y2 + 1]
- if Match(r'\s*(?:->|\[)', extended_line):
- parenthesis_error = True
-
- if parenthesis_error:
- error(filename, linenum, 'readability/casting', 4,
- ('Are you taking an address of something dereferenced '
- 'from a cast? Wrapping the dereferenced expression in '
- 'parentheses will make the binding more obvious'))
- else:
- error(filename, linenum, 'runtime/casting', 4,
- ('Are you taking an address of a cast? '
- 'This is dangerous: could be a temp var. '
- 'Take the address before doing the cast, rather than after'))
-
-
-def CheckCStyleCast(filename, clean_lines, linenum, cast_type, pattern, error):
- """Checks for a C-style cast by looking for the pattern.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- cast_type: The string for the C++ cast to recommend. This is either
- reinterpret_cast, static_cast, or const_cast, depending.
- pattern: The regular expression used to find C-style casts.
- error: The function to call with any errors found.
-
- Returns:
- True if an error was emitted.
- False otherwise.
- """
- line = clean_lines.elided[linenum]
- match = Search(pattern, line)
- if not match:
- return False
-
- # Exclude lines with keywords that tend to look like casts
- context = line[0:match.start(1) - 1]
- if Match(r'.*\b(?:sizeof|alignof|alignas|[_A-Z][_A-Z0-9]*)\s*$', context):
- return False
-
- # Try expanding current context to see if we one level of
- # parentheses inside a macro.
- if linenum > 0:
- for i in xrange(linenum - 1, max(0, linenum - 5), -1):
- context = clean_lines.elided[i] + context
- if Match(r'.*\b[_A-Z][_A-Z0-9]*\s*\((?:\([^()]*\)|[^()])*$', context):
- return False
-
- # operator++(int) and operator--(int)
- if context.endswith(' operator++') or context.endswith(' operator--'):
- return False
-
- # A single unnamed argument for a function tends to look like old
- # style cast. If we see those, don't issue warnings for deprecated
- # casts, instead issue warnings for unnamed arguments where
- # appropriate.
- #
- # These are things that we want warnings for, since the style guide
- # explicitly require all parameters to be named:
- # Function(int);
- # Function(int) {
- # ConstMember(int) const;
- # ConstMember(int) const {
- # ExceptionMember(int) throw (...);
- # ExceptionMember(int) throw (...) {
- # PureVirtual(int) = 0;
- # [](int) -> bool {
- #
- # These are functions of some sort, where the compiler would be fine
- # if they had named parameters, but people often omit those
- # identifiers to reduce clutter:
- # (FunctionPointer)(int);
- # (FunctionPointer)(int) = value;
- # Function((function_pointer_arg)(int))
- # Function((function_pointer_arg)(int), int param)
- # <TemplateArgument(int)>;
- # <(FunctionPointerTemplateArgument)(int)>;
- remainder = line[match.end(0):]
- if Match(r'^\s*(?:;|const\b|throw\b|final\b|override\b|[=>{),]|->)',
- remainder):
- # Looks like an unnamed parameter.
-
- # Don't warn on any kind of template arguments.
- if Match(r'^\s*>', remainder):
- return False
-
- # Don't warn on assignments to function pointers, but keep warnings for
- # unnamed parameters to pure virtual functions. Note that this pattern
- # will also pass on assignments of "0" to function pointers, but the
- # preferred values for those would be "nullptr" or "NULL".
- matched_zero = Match(r'^\s=\s*(\S+)\s*;', remainder)
- if matched_zero and matched_zero.group(1) != '0':
- return False
-
- # Don't warn on function pointer declarations. For this we need
- # to check what came before the "(type)" string.
- if Match(r'.*\)\s*$', line[0:match.start(0)]):
- return False
-
- # Don't warn if the parameter is named with block comments, e.g.:
- # Function(int /*unused_param*/);
- raw_line = clean_lines.raw_lines[linenum]
- if '/*' in raw_line:
- return False
-
- # Passed all filters, issue warning here.
- error(filename, linenum, 'readability/function', 3,
- 'All parameters should be named in a function')
- return True
-
- # At this point, all that should be left is actual casts.
- error(filename, linenum, 'readability/casting', 4,
- 'Using C-style cast. Use %s<%s>(...) instead' %
- (cast_type, match.group(1)))
-
- return True
-
-
-def ExpectingFunctionArgs(clean_lines, linenum):
- """Checks whether where function type arguments are expected.
-
- Args:
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
-
- Returns:
- True if the line at 'linenum' is inside something that expects arguments
- of function types.
- """
- line = clean_lines.elided[linenum]
- return (Match(r'^\s*MOCK_(CONST_)?METHOD\d+(_T)?\(', line) or
- (linenum >= 2 and
- (Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\((?:\S+,)?\s*$',
- clean_lines.elided[linenum - 1]) or
- Match(r'^\s*MOCK_(?:CONST_)?METHOD\d+(?:_T)?\(\s*$',
- clean_lines.elided[linenum - 2]) or
- Search(r'\bstd::m?function\s*\<\s*$',
- clean_lines.elided[linenum - 1]))))
-
-
-_HEADERS_CONTAINING_TEMPLATES = (
- ('<deque>', ('deque',)),
- ('<functional>', ('unary_function', 'binary_function',
- 'plus', 'minus', 'multiplies', 'divides', 'modulus',
- 'negate',
- 'equal_to', 'not_equal_to', 'greater', 'less',
- 'greater_equal', 'less_equal',
- 'logical_and', 'logical_or', 'logical_not',
- 'unary_negate', 'not1', 'binary_negate', 'not2',
- 'bind1st', 'bind2nd',
- 'pointer_to_unary_function',
- 'pointer_to_binary_function',
- 'ptr_fun',
- 'mem_fun_t', 'mem_fun', 'mem_fun1_t', 'mem_fun1_ref_t',
- 'mem_fun_ref_t',
- 'const_mem_fun_t', 'const_mem_fun1_t',
- 'const_mem_fun_ref_t', 'const_mem_fun1_ref_t',
- 'mem_fun_ref',
- )),
- ('<limits>', ('numeric_limits',)),
- ('<list>', ('list',)),
- ('<map>', ('map', 'multimap',)),
- ('<memory>', ('allocator',)),
- ('<queue>', ('queue', 'priority_queue',)),
- ('<set>', ('set', 'multiset',)),
- ('<stack>', ('stack',)),
- ('<string>', ('char_traits', 'basic_string',)),
- ('<tuple>', ('tuple',)),
- ('<utility>', ('pair',)),
- ('<vector>', ('vector',)),
-
- # gcc extensions.
- # Note: std::hash is their hash, ::hash is our hash
- ('<hash_map>', ('hash_map', 'hash_multimap',)),
- ('<hash_set>', ('hash_set', 'hash_multiset',)),
- ('<slist>', ('slist',)),
- )
-
-_RE_PATTERN_STRING = re.compile(r'\bstring\b')
-
-_re_pattern_algorithm_header = []
-for _template in ('copy', 'max', 'min', 'min_element', 'sort', 'swap',
- 'transform'):
- # Match max<type>(..., ...), max(..., ...), but not foo->max, foo.max or
- # type::max().
- _re_pattern_algorithm_header.append(
- (re.compile(r'[^>.]\b' + _template + r'(<.*?>)?\([^\)]'),
- _template,
- '<algorithm>'))
-
-_re_pattern_templates = []
-for _header, _templates in _HEADERS_CONTAINING_TEMPLATES:
- for _template in _templates:
- _re_pattern_templates.append(
- (re.compile(r'(\<|\b)' + _template + r'\s*\<'),
- _template + '<>',
- _header))
-
-
-def FilesBelongToSameModule(filename_cc, filename_h):
- """Check if these two filenames belong to the same module.
-
- The concept of a 'module' here is a as follows:
- foo.h, foo-inl.h, foo.cc, foo_test.cc and foo_unittest.cc belong to the
- same 'module' if they are in the same directory.
- some/path/public/xyzzy and some/path/internal/xyzzy are also considered
- to belong to the same module here.
-
- If the filename_cc contains a longer path than the filename_h, for example,
- '/absolute/path/to/base/sysinfo.cc', and this file would include
- 'base/sysinfo.h', this function also produces the prefix needed to open the
- header. This is used by the caller of this function to more robustly open the
- header file. We don't have access to the real include paths in this context,
- so we need this guesswork here.
-
- Known bugs: tools/base/bar.cc and base/bar.h belong to the same module
- according to this implementation. Because of this, this function gives
- some false positives. This should be sufficiently rare in practice.
-
- Args:
- filename_cc: is the path for the .cc file
- filename_h: is the path for the header path
-
- Returns:
- Tuple with a bool and a string:
- bool: True if filename_cc and filename_h belong to the same module.
- string: the additional prefix needed to open the header file.
- """
-
- if not filename_cc.endswith('.cc'):
- return (False, '')
- filename_cc = filename_cc[:-len('.cc')]
- if filename_cc.endswith('_unittest'):
- filename_cc = filename_cc[:-len('_unittest')]
- elif filename_cc.endswith('_test'):
- filename_cc = filename_cc[:-len('_test')]
- filename_cc = filename_cc.replace('/public/', '/')
- filename_cc = filename_cc.replace('/internal/', '/')
-
- if not filename_h.endswith('.h'):
- return (False, '')
- filename_h = filename_h[:-len('.h')]
- if filename_h.endswith('-inl'):
- filename_h = filename_h[:-len('-inl')]
- filename_h = filename_h.replace('/public/', '/')
- filename_h = filename_h.replace('/internal/', '/')
-
- files_belong_to_same_module = filename_cc.endswith(filename_h)
- common_path = ''
- if files_belong_to_same_module:
- common_path = filename_cc[:-len(filename_h)]
- return files_belong_to_same_module, common_path
-
-
-def UpdateIncludeState(filename, include_dict, io=codecs):
- """Fill up the include_dict with new includes found from the file.
-
- Args:
- filename: the name of the header to read.
- include_dict: a dictionary in which the headers are inserted.
- io: The io factory to use to read the file. Provided for testability.
-
- Returns:
- True if a header was successfully added. False otherwise.
- """
- headerfile = None
- try:
- headerfile = io.open(filename, 'r', 'utf8', 'replace')
- except IOError:
- return False
- linenum = 0
- for line in headerfile:
- linenum += 1
- clean_line = CleanseComments(line)
- match = _RE_PATTERN_INCLUDE.search(clean_line)
- if match:
- include = match.group(2)
- include_dict.setdefault(include, linenum)
- return True
-
-
-def CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error,
- io=codecs):
- """Reports for missing stl includes.
-
- This function will output warnings to make sure you are including the headers
- necessary for the stl containers and functions that you use. We only give one
- reason to include a header. For example, if you use both equal_to<> and
- less<> in a .h file, only one (the latter in the file) of these will be
- reported as a reason to include the <functional>.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- include_state: An _IncludeState instance.
- error: The function to call with any errors found.
- io: The IO factory to use to read the header file. Provided for unittest
- injection.
- """
- required = {} # A map of header name to linenumber and the template entity.
- # Example of required: { '<functional>': (1219, 'less<>') }
-
- for linenum in xrange(clean_lines.NumLines()):
- line = clean_lines.elided[linenum]
- if not line or line[0] == '#':
- continue
-
- # String is special -- it is a non-templatized type in STL.
- matched = _RE_PATTERN_STRING.search(line)
- if matched:
- # Don't warn about strings in non-STL namespaces:
- # (We check only the first match per line; good enough.)
- prefix = line[:matched.start()]
- if prefix.endswith('std::') or not prefix.endswith('::'):
- required['<string>'] = (linenum, 'string')
-
- for pattern, template, header in _re_pattern_algorithm_header:
- if pattern.search(line):
- required[header] = (linenum, template)
-
- # The following function is just a speed up, no semantics are changed.
- if not '<' in line: # Reduces the cpu time usage by skipping lines.
- continue
-
- for pattern, template, header in _re_pattern_templates:
- if pattern.search(line):
- required[header] = (linenum, template)
-
- # The policy is that if you #include something in foo.h you don't need to
- # include it again in foo.cc. Here, we will look at possible includes.
- # Let's flatten the include_state include_list and copy it into a dictionary.
- include_dict = dict([item for sublist in include_state.include_list
- for item in sublist])
-
- # Did we find the header for this file (if any) and successfully load it?
- header_found = False
-
- # Use the absolute path so that matching works properly.
- abs_filename = FileInfo(filename).FullName()
-
- # For Emacs's flymake.
- # If cpplint is invoked from Emacs's flymake, a temporary file is generated
- # by flymake and that file name might end with '_flymake.cc'. In that case,
- # restore original file name here so that the corresponding header file can be
- # found.
- # e.g. If the file name is 'foo_flymake.cc', we should search for 'foo.h'
- # instead of 'foo_flymake.h'
- abs_filename = re.sub(r'_flymake\.cc$', '.cc', abs_filename)
-
- # include_dict is modified during iteration, so we iterate over a copy of
- # the keys.
- header_keys = include_dict.keys()
- for header in header_keys:
- (same_module, common_path) = FilesBelongToSameModule(abs_filename, header)
- fullpath = common_path + header
- if same_module and UpdateIncludeState(fullpath, include_dict, io):
- header_found = True
-
- # If we can't find the header file for a .cc, assume it's because we don't
- # know where to look. In that case we'll give up as we're not sure they
- # didn't include it in the .h file.
- # TODO(unknown): Do a better job of finding .h files so we are confident that
- # not having the .h file means there isn't one.
- if filename.endswith('.cc') and not header_found:
- return
-
- # All the lines have been processed, report the errors found.
- for required_header_unstripped in required:
- template = required[required_header_unstripped][1]
- if required_header_unstripped.strip('<>"') not in include_dict:
- error(filename, required[required_header_unstripped][0],
- 'build/include_what_you_use', 4,
- 'Add #include ' + required_header_unstripped + ' for ' + template)
-
-
-_RE_PATTERN_EXPLICIT_MAKEPAIR = re.compile(r'\bmake_pair\s*<')
-
-
-def CheckMakePairUsesDeduction(filename, clean_lines, linenum, error):
- """Check that make_pair's template arguments are deduced.
-
- G++ 4.6 in C++11 mode fails badly if make_pair's template arguments are
- specified explicitly, and such use isn't intended in any case.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
- match = _RE_PATTERN_EXPLICIT_MAKEPAIR.search(line)
- if match:
- error(filename, linenum, 'build/explicit_make_pair',
- 4, # 4 = high confidence
- 'For C++11-compatibility, omit template arguments from make_pair'
- ' OR use pair directly OR if appropriate, construct a pair directly')
-
-
-def CheckDefaultLambdaCaptures(filename, clean_lines, linenum, error):
- """Check that default lambda captures are not used.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # A lambda introducer specifies a default capture if it starts with "[="
- # or if it starts with "[&" _not_ followed by an identifier.
- match = Match(r'^(.*)\[\s*(?:=|&[^\w])', line)
- if match:
- # Found a potential error, check what comes after the lambda-introducer.
- # If it's not open parenthesis (for lambda-declarator) or open brace
- # (for compound-statement), it's not a lambda.
- line, _, pos = CloseExpression(clean_lines, linenum, len(match.group(1)))
- if pos >= 0 and Match(r'^\s*[{(]', line[pos:]):
- error(filename, linenum, 'build/c++11',
- 4, # 4 = high confidence
- 'Default lambda captures are an unapproved C++ feature.')
-
-
-def CheckRedundantVirtual(filename, clean_lines, linenum, error):
- """Check if line contains a redundant "virtual" function-specifier.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- # Look for "virtual" on current line.
- line = clean_lines.elided[linenum]
- virtual = Match(r'^(.*)(\bvirtual\b)(.*)$', line)
- if not virtual: return
-
- # Ignore "virtual" keywords that are near access-specifiers. These
- # are only used in class base-specifier and do not apply to member
- # functions.
- if (Search(r'\b(public|protected|private)\s+$', virtual.group(1)) or
- Match(r'^\s+(public|protected|private)\b', virtual.group(3))):
- return
-
- # Ignore the "virtual" keyword from virtual base classes. Usually
- # there is a column on the same line in these cases (virtual base
- # classes are rare in google3 because multiple inheritance is rare).
- if Match(r'^.*[^:]:[^:].*$', line): return
-
- # Look for the next opening parenthesis. This is the start of the
- # parameter list (possibly on the next line shortly after virtual).
- # TODO(unknown): doesn't work if there are virtual functions with
- # decltype() or other things that use parentheses, but csearch suggests
- # that this is rare.
- end_col = -1
- end_line = -1
- start_col = len(virtual.group(2))
- for start_line in xrange(linenum, min(linenum + 3, clean_lines.NumLines())):
- line = clean_lines.elided[start_line][start_col:]
- parameter_list = Match(r'^([^(]*)\(', line)
- if parameter_list:
- # Match parentheses to find the end of the parameter list
- (_, end_line, end_col) = CloseExpression(
- clean_lines, start_line, start_col + len(parameter_list.group(1)))
- break
- start_col = 0
-
- if end_col < 0:
- return # Couldn't find end of parameter list, give up
-
- # Look for "override" or "final" after the parameter list
- # (possibly on the next few lines).
- for i in xrange(end_line, min(end_line + 3, clean_lines.NumLines())):
- line = clean_lines.elided[i][end_col:]
- match = Search(r'\b(override|final)\b', line)
- if match:
- error(filename, linenum, 'readability/inheritance', 4,
- ('"virtual" is redundant since function is '
- 'already declared as "%s"' % match.group(1)))
-
- # Set end_col to check whole lines after we are done with the
- # first line.
- end_col = 0
- if Search(r'[^\w]\s*$', line):
- break
-
-
-def CheckRedundantOverrideOrFinal(filename, clean_lines, linenum, error):
- """Check if line contains a redundant "override" or "final" virt-specifier.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- # Look for closing parenthesis nearby. We need one to confirm where
- # the declarator ends and where the virt-specifier starts to avoid
- # false positives.
- line = clean_lines.elided[linenum]
- declarator_end = line.rfind(')')
- if declarator_end >= 0:
- fragment = line[declarator_end:]
- else:
- if linenum > 1 and clean_lines.elided[linenum - 1].rfind(')') >= 0:
- fragment = line
- else:
- return
-
- # Check that at most one of "override" or "final" is present, not both
- if Search(r'\boverride\b', fragment) and Search(r'\bfinal\b', fragment):
- error(filename, linenum, 'readability/inheritance', 4,
- ('"override" is redundant since function is '
- 'already declared as "final"'))
-
-
-
-
-# Returns true if we are at a new block, and it is directly
-# inside of a namespace.
-def IsBlockInNameSpace(nesting_state, is_forward_declaration):
- """Checks that the new block is directly in a namespace.
-
- Args:
- nesting_state: The _NestingState object that contains info about our state.
- is_forward_declaration: If the class is a forward declared class.
- Returns:
- Whether or not the new block is directly in a namespace.
- """
- if is_forward_declaration:
- if len(nesting_state.stack) >= 1 and (
- isinstance(nesting_state.stack[-1], _NamespaceInfo)):
- return True
- else:
- return False
-
- return (len(nesting_state.stack) > 1 and
- nesting_state.stack[-1].check_namespace_indentation and
- isinstance(nesting_state.stack[-2], _NamespaceInfo))
-
-
-def ShouldCheckNamespaceIndentation(nesting_state, is_namespace_indent_item,
- raw_lines_no_comments, linenum):
- """This method determines if we should apply our namespace indentation check.
-
- Args:
- nesting_state: The current nesting state.
- is_namespace_indent_item: If we just put a new class on the stack, True.
- If the top of the stack is not a class, or we did not recently
- add the class, False.
- raw_lines_no_comments: The lines without the comments.
- linenum: The current line number we are processing.
-
- Returns:
- True if we should apply our namespace indentation check. Currently, it
- only works for classes and namespaces inside of a namespace.
- """
-
- is_forward_declaration = IsForwardClassDeclaration(raw_lines_no_comments,
- linenum)
-
- if not (is_namespace_indent_item or is_forward_declaration):
- return False
-
- # If we are in a macro, we do not want to check the namespace indentation.
- if IsMacroDefinition(raw_lines_no_comments, linenum):
- return False
-
- return IsBlockInNameSpace(nesting_state, is_forward_declaration)
-
-
-# Call this method if the line is directly inside of a namespace.
-# If the line above is blank (excluding comments) or the start of
-# an inner namespace, it cannot be indented.
-def CheckItemIndentationInNamespace(filename, raw_lines_no_comments, linenum,
- error):
- line = raw_lines_no_comments[linenum]
- if Match(r'^\s+', line):
- error(filename, linenum, 'runtime/indentation_namespace', 4,
- 'Do not indent within a namespace')
-
-
-def ProcessLine(filename, file_extension, clean_lines, line,
- include_state, function_state, nesting_state, error,
- extra_check_functions=[]):
- """Processes a single line in the file.
-
- Args:
- filename: Filename of the file that is being processed.
- file_extension: The extension (dot not included) of the file.
- clean_lines: An array of strings, each representing a line of the file,
- with comments stripped.
- line: Number of line being processed.
- include_state: An _IncludeState instance in which the headers are inserted.
- function_state: A _FunctionState instance which counts function lines, etc.
- nesting_state: A NestingState instance which maintains information about
- the current stack of nested blocks being parsed.
- error: A callable to which errors are reported, which takes 4 arguments:
- filename, line number, error level, and message
- extra_check_functions: An array of additional check functions that will be
- run on each source line. Each function takes 4
- arguments: filename, clean_lines, line, error
- """
- raw_lines = clean_lines.raw_lines
- ParseNolintSuppressions(filename, raw_lines[line], line, error)
- nesting_state.Update(filename, clean_lines, line, error)
- CheckForNamespaceIndentation(filename, nesting_state, clean_lines, line,
- error)
- if nesting_state.InAsmBlock(): return
- CheckForFunctionLengths(filename, clean_lines, line, function_state, error)
- CheckForMultilineCommentsAndStrings(filename, clean_lines, line, error)
- CheckStyle(filename, clean_lines, line, file_extension, nesting_state, error)
- CheckLanguage(filename, clean_lines, line, file_extension, include_state,
- nesting_state, error)
- CheckForNonConstReference(filename, clean_lines, line, nesting_state, error)
- CheckForNonStandardConstructs(filename, clean_lines, line,
- nesting_state, error)
- CheckVlogArguments(filename, clean_lines, line, error)
- CheckPosixThreading(filename, clean_lines, line, error)
- CheckInvalidIncrement(filename, clean_lines, line, error)
- CheckMakePairUsesDeduction(filename, clean_lines, line, error)
- CheckDefaultLambdaCaptures(filename, clean_lines, line, error)
- CheckRedundantVirtual(filename, clean_lines, line, error)
- CheckRedundantOverrideOrFinal(filename, clean_lines, line, error)
- for check_fn in extra_check_functions:
- check_fn(filename, clean_lines, line, error)
-
-def FlagCxx11Features(filename, clean_lines, linenum, error):
- """Flag those c++11 features that we only allow in certain places.
-
- Args:
- filename: The name of the current file.
- clean_lines: A CleansedLines instance containing the file.
- linenum: The number of the line to check.
- error: The function to call with any errors found.
- """
- line = clean_lines.elided[linenum]
-
- # Flag unapproved C++11 headers.
- include = Match(r'\s*#\s*include\s+[<"]([^<"]+)[">]', line)
- if include and include.group(1) in ('cfenv',
- 'condition_variable',
- 'fenv.h',
- 'future',
- 'mutex',
- 'thread',
- 'chrono',
- 'ratio',
- 'regex',
- 'system_error',
- ):
- error(filename, linenum, 'build/c++11', 5,
- ('<%s> is an unapproved C++11 header.') % include.group(1))
-
- # The only place where we need to worry about C++11 keywords and library
- # features in preprocessor directives is in macro definitions.
- if Match(r'\s*#', line) and not Match(r'\s*#\s*define\b', line): return
-
- # These are classes and free functions. The classes are always
- # mentioned as std::*, but we only catch the free functions if
- # they're not found by ADL. They're alphabetical by header.
- for top_name in (
- # type_traits
- 'alignment_of',
- 'aligned_union',
- ):
- if Search(r'\bstd::%s\b' % top_name, line):
- error(filename, linenum, 'build/c++11', 5,
- ('std::%s is an unapproved C++11 class or function. Send c-style '
- 'an example of where it would make your code more readable, and '
- 'they may let you use it.') % top_name)
-
-
-def ProcessFileData(filename, file_extension, lines, error,
- extra_check_functions=[]):
- """Performs lint checks and reports any errors to the given error function.
-
- Args:
- filename: Filename of the file that is being processed.
- file_extension: The extension (dot not included) of the file.
- lines: An array of strings, each representing a line of the file, with the
- last element being empty if the file is terminated with a newline.
- error: A callable to which errors are reported, which takes 4 arguments:
- filename, line number, error level, and message
- extra_check_functions: An array of additional check functions that will be
- run on each source line. Each function takes 4
- arguments: filename, clean_lines, line, error
- """
- lines = (['// marker so line numbers and indices both start at 1'] + lines +
- ['// marker so line numbers end in a known way'])
-
- include_state = _IncludeState()
- function_state = _FunctionState()
- nesting_state = NestingState()
-
- ResetNolintSuppressions()
-
- CheckForCopyright(filename, lines, error)
-
- RemoveMultiLineComments(filename, lines, error)
- clean_lines = CleansedLines(lines)
-
- if file_extension == 'h':
- CheckForHeaderGuard(filename, clean_lines, error)
-
- for line in xrange(clean_lines.NumLines()):
- ProcessLine(filename, file_extension, clean_lines, line,
- include_state, function_state, nesting_state, error,
- extra_check_functions)
- FlagCxx11Features(filename, clean_lines, line, error)
- nesting_state.CheckCompletedBlocks(filename, error)
-
- CheckForIncludeWhatYouUse(filename, clean_lines, include_state, error)
-
- # Check that the .cc file has included its header if it exists.
- if file_extension == 'cc':
- CheckHeaderFileIncluded(filename, include_state, error)
-
- # We check here rather than inside ProcessLine so that we see raw
- # lines rather than "cleaned" lines.
- CheckForBadCharacters(filename, lines, error)
-
- CheckForNewlineAtEOF(filename, lines, error)
-
-def ProcessConfigOverrides(filename):
- """ Loads the configuration files and processes the config overrides.
-
- Args:
- filename: The name of the file being processed by the linter.
-
- Returns:
- False if the current |filename| should not be processed further.
- """
-
- abs_filename = os.path.abspath(filename)
- cfg_filters = []
- keep_looking = True
- while keep_looking:
- abs_path, base_name = os.path.split(abs_filename)
- if not base_name:
- break # Reached the root directory.
-
- cfg_file = os.path.join(abs_path, "CPPLINT.cfg")
- abs_filename = abs_path
- if not os.path.isfile(cfg_file):
- continue
-
- try:
- with open(cfg_file) as file_handle:
- for line in file_handle:
- line, _, _ = line.partition('#') # Remove comments.
- if not line.strip():
- continue
-
- name, _, val = line.partition('=')
- name = name.strip()
- val = val.strip()
- if name == 'set noparent':
- keep_looking = False
- elif name == 'filter':
- cfg_filters.append(val)
- elif name == 'exclude_files':
- # When matching exclude_files pattern, use the base_name of
- # the current file name or the directory name we are processing.
- # For example, if we are checking for lint errors in /foo/bar/baz.cc
- # and we found the .cfg file at /foo/CPPLINT.cfg, then the config
- # file's "exclude_files" filter is meant to be checked against "bar"
- # and not "baz" nor "bar/baz.cc".
- if base_name:
- pattern = re.compile(val)
- if pattern.match(base_name):
- sys.stderr.write('Ignoring "%s": file excluded by "%s". '
- 'File path component "%s" matches '
- 'pattern "%s"\n' %
- (filename, cfg_file, base_name, val))
- return False
- elif name == 'linelength':
- global _line_length
- try:
- _line_length = int(val)
- except ValueError:
- sys.stderr.write('Line length must be numeric.')
- else:
- sys.stderr.write(
- 'Invalid configuration option (%s) in file %s\n' %
- (name, cfg_file))
-
- except IOError:
- sys.stderr.write(
- "Skipping config file '%s': Can't open for reading\n" % cfg_file)
- keep_looking = False
-
- # Apply all the accumulated filters in reverse order (top-level directory
- # config options having the least priority).
- for filter in reversed(cfg_filters):
- _AddFilters(filter)
-
- return True
-
-
-def ProcessFile(filename, vlevel, extra_check_functions=[]):
- """Does google-lint on a single file.
-
- Args:
- filename: The name of the file to parse.
-
- vlevel: The level of errors to report. Every error of confidence
- >= verbose_level will be reported. 0 is a good default.
-
- extra_check_functions: An array of additional check functions that will be
- run on each source line. Each function takes 4
- arguments: filename, clean_lines, line, error
- """
-
- _SetVerboseLevel(vlevel)
- _BackupFilters()
-
- if not ProcessConfigOverrides(filename):
- _RestoreFilters()
- return
-
- lf_lines = []
- crlf_lines = []
- try:
- # Support the UNIX convention of using "-" for stdin. Note that
- # we are not opening the file with universal newline support
- # (which codecs doesn't support anyway), so the resulting lines do
- # contain trailing '\r' characters if we are reading a file that
- # has CRLF endings.
- # If after the split a trailing '\r' is present, it is removed
- # below.
- if filename == '-':
- lines = codecs.StreamReaderWriter(sys.stdin,
- codecs.getreader('utf8'),
- codecs.getwriter('utf8'),
- 'replace').read().split('\n')
- else:
- lines = codecs.open(filename, 'r', 'utf8', 'replace').read().split('\n')
-
- # Remove trailing '\r'.
- # The -1 accounts for the extra trailing blank line we get from split()
- for linenum in range(len(lines) - 1):
- if lines[linenum].endswith('\r'):
- lines[linenum] = lines[linenum].rstrip('\r')
- crlf_lines.append(linenum + 1)
- else:
- lf_lines.append(linenum + 1)
-
- except IOError:
- sys.stderr.write(
- "Skipping input '%s': Can't open for reading\n" % filename)
- _RestoreFilters()
- return
-
- # Note, if no dot is found, this will give the entire filename as the ext.
- file_extension = filename[filename.rfind('.') + 1:]
-
- # When reading from stdin, the extension is unknown, so no cpplint tests
- # should rely on the extension.
- if filename != '-' and file_extension not in _valid_extensions:
- sys.stderr.write('Ignoring %s; not a valid file name '
- '(%s)\n' % (filename, ', '.join(_valid_extensions)))
- else:
- ProcessFileData(filename, file_extension, lines, Error,
- extra_check_functions)
-
- # If end-of-line sequences are a mix of LF and CR-LF, issue
- # warnings on the lines with CR.
- #
- # Don't issue any warnings if all lines are uniformly LF or CR-LF,
- # since critique can handle these just fine, and the style guide
- # doesn't dictate a particular end of line sequence.
- #
- # We can't depend on os.linesep to determine what the desired
- # end-of-line sequence should be, since that will return the
- # server-side end-of-line sequence.
- if lf_lines and crlf_lines:
- # Warn on every line with CR. An alternative approach might be to
- # check whether the file is mostly CRLF or just LF, and warn on the
- # minority, we bias toward LF here since most tools prefer LF.
- for linenum in crlf_lines:
- Error(filename, linenum, 'whitespace/newline', 1,
- 'Unexpected \\r (^M) found; better to use only \\n')
-
- sys.stderr.write('Done processing %s\n' % filename)
- _RestoreFilters()
-
-
-def PrintUsage(message):
- """Prints a brief usage string and exits, optionally with an error message.
-
- Args:
- message: The optional error message.
- """
- sys.stderr.write(_USAGE)
- if message:
- sys.exit('\nFATAL ERROR: ' + message)
- else:
- sys.exit(1)
-
-
-def PrintCategories():
- """Prints a list of all the error-categories used by error messages.
-
- These are the categories used to filter messages via --filter.
- """
- sys.stderr.write(''.join(' %s\n' % cat for cat in _ERROR_CATEGORIES))
- sys.exit(0)
-
-
-def ParseArguments(args):
- """Parses the command line arguments.
-
- This may set the output format and verbosity level as side-effects.
-
- Args:
- args: The command line arguments:
-
- Returns:
- The list of filenames to lint.
- """
- try:
- (opts, filenames) = getopt.getopt(args, '', ['help', 'output=', 'verbose=',
- 'counting=',
- 'filter=',
- 'root=',
- 'linelength=',
- 'extensions='])
- except getopt.GetoptError:
- PrintUsage('Invalid arguments.')
-
- verbosity = _VerboseLevel()
- output_format = _OutputFormat()
- filters = ''
- counting_style = ''
-
- for (opt, val) in opts:
- if opt == '--help':
- PrintUsage(None)
- elif opt == '--output':
- if val not in ('emacs', 'vs7', 'eclipse'):
- PrintUsage('The only allowed output formats are emacs, vs7 and eclipse.')
- output_format = val
- elif opt == '--verbose':
- verbosity = int(val)
- elif opt == '--filter':
- filters = val
- if not filters:
- PrintCategories()
- elif opt == '--counting':
- if val not in ('total', 'toplevel', 'detailed'):
- PrintUsage('Valid counting options are total, toplevel, and detailed')
- counting_style = val
- elif opt == '--root':
- global _root
- _root = val
- elif opt == '--linelength':
- global _line_length
- try:
- _line_length = int(val)
- except ValueError:
- PrintUsage('Line length must be digits.')
- elif opt == '--extensions':
- global _valid_extensions
- try:
- _valid_extensions = set(val.split(','))
- except ValueError:
- PrintUsage('Extensions must be comma seperated list.')
-
- if not filenames:
- PrintUsage('No files were specified.')
-
- _SetOutputFormat(output_format)
- _SetVerboseLevel(verbosity)
- _SetFilters(filters)
- _SetCountingStyle(counting_style)
-
- return filenames
-
-
-def main():
- filenames = ParseArguments(sys.argv[1:])
-
- # Change stderr to write with replacement characters so we don't die
- # if we try to print something containing non-ASCII characters.
- sys.stderr = codecs.StreamReaderWriter(sys.stderr,
- codecs.getreader('utf8'),
- codecs.getwriter('utf8'),
- 'replace')
-
- _cpplint_state.ResetErrorCounts()
- for filename in filenames:
- ProcessFile(filename, _cpplint_state.verbose_level)
- _cpplint_state.PrintErrorCounts()
-
- sys.exit(_cpplint_state.error_count > 0)
-
-
-if __name__ == '__main__':
- main()
diff --git a/tools/curr-sig/pgrouting--2.3.2.sig b/tools/curr-sig/pgrouting--2.3.2.sig
deleted file mode 100644
index b24e09e..0000000
--- a/tools/curr-sig/pgrouting--2.3.2.sig
+++ /dev/null
@@ -1,141 +0,0 @@
-#VERSION pgrouting 2.3.2
-#TYPES
-contraction_vertex(int,int,char,text)
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
-#FUNCTIONS
-_pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_maxflow(text,bigint,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,bigint,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pickdeliver(text,integer,float,float ,integer ,out integer,out integer,out integer,out bigint,out float,out float,out float,out float,out float )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_tsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
-pgr_apspjohnson(text)
-pgr_apspwarshall(text,boolean,boolean)
-pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_astar(text,integer,integer,boolean,boolean)
-pgr_bdastar(text,integer,integer,boolean,boolean)
-pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_contractgraph(text,bigint[],integer ,bigint[] ,boolean ,out integer,out text,out bigint,out bigint[],out bigint,out bigint,out float)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracostmatrix(text,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_edgedisjointpaths(in text,in bigint,in bigint,in boolean ,out integer,out integer,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in bigint,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in bigint,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint )
-pgr_endpoint(geometry)
-pgr_euclediantsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
-pgr_fakecontraction(text,integer[])
-pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
-pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer )
-pgr_iscolumnintable(text,text)
-pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_maxflowboykovkolmogorov(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maximumcardinalitymatching(text,boolean ,out integer,out bigint,out bigint,out bigint )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
-pgr_quote_ident(text)
-pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
-pgr_version()
-pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscostmatrix(text,text,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
diff --git a/tools/curr-sig/pgrouting--2.4.0.sig b/tools/curr-sig/pgrouting--2.4.0.sig
new file mode 100644
index 0000000..44da2d6
--- /dev/null
+++ b/tools/curr-sig/pgrouting--2.4.0.sig
@@ -0,0 +1,156 @@
+#VERSION pgrouting 2.4.0
+#TYPES
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
+#FUNCTIONS
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
+pgr_apspjohnson(text)
+pgr_apspwarshall(text,boolean,boolean)
+pgr_astarcostmatrix(text,anyarray,boolean,integer,double precision,double precision)
+pgr_astarcost(text,anyarray,anyarray,boolean,integer,double precision,double precision)
+pgr_astarcost(text,anyarray,bigint,boolean,integer,double precision,double precision)
+pgr_astarcost(text,bigint,anyarray,boolean,integer,double precision,double precision)
+pgr_astarcost(text,bigint,bigint,boolean,integer,double precision,double precision)
+pgr_astar(text,anyarray,anyarray,boolean,integer,double precision,double precision)
+_pgr_astar(text,anyarray,anyarray,boolean,integer,double precision,double precision,boolean)
+pgr_astar(text,anyarray,bigint,boolean,integer,double precision,double precision)
+_pgr_astar(text,anyarray,bigint,boolean,integer,double precision,double precision,boolean)
+pgr_astar(text,bigint,anyarray,boolean,integer,double precision,double precision)
+_pgr_astar(text,bigint,anyarray,boolean,integer,double precision,double precision,boolean)
+pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision)
+_pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision,boolean)
+pgr_astar(text,integer,integer,boolean,boolean)
+pgr_bdastar(text,integer,integer,boolean,boolean)
+pgr_bddijkstra(text,bigint,bigint)
+pgr_bddijkstra(text,bigint,bigint,boolean)
+_pgr_bddijkstra(text,bigint,bigint,boolean,boolean)
+pgr_bddijkstra(text,integer,integer,boolean,boolean)
+_pgr_checkverttab(text,text[],integer,text)
+pgr_contractgraph(text,bigint[],integer,bigint[],boolean)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracostmatrix(text,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
+pgr_dijkstra(text,integer,integer,boolean,boolean)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+pgr_edgedisjointpaths(text,anyarray,anyarray,boolean)
+pgr_edgedisjointpaths(text,anyarray,bigint,boolean)
+pgr_edgedisjointpaths(text,bigint,anyarray,boolean)
+pgr_edgedisjointpaths(text,bigint,bigint,boolean)
+_pgr_endpoint(geometry)
+pgr_endpoint(geometry)
+pgr_euclediantsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_flipedges(geometry[])
+pgr_floydwarshall(text,boolean)
+pgr_getcolumnname(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
+pgr_iscolumnindexed(text,text)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,integer,integer,integer,boolean)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+pgr_maxflowboykovkolmogorov(text,anyarray,anyarray)
+pgr_maxflowboykovkolmogorov(text,anyarray,bigint)
+pgr_maxflowboykovkolmogorov(text,bigint,anyarray)
+pgr_maxflowboykovkolmogorov(text,bigint,bigint)
+pgr_maxflowedmondskarp(text,anyarray,anyarray)
+pgr_maxflowedmondskarp(text,anyarray,bigint)
+pgr_maxflowedmondskarp(text,bigint,anyarray)
+pgr_maxflowedmondskarp(text,bigint,bigint)
+pgr_maxflowpushrelabel(text,anyarray,anyarray)
+pgr_maxflowpushrelabel(text,anyarray,bigint)
+pgr_maxflowpushrelabel(text,bigint,anyarray)
+pgr_maxflowpushrelabel(text,bigint,bigint)
+pgr_maxflow(text,anyarray,anyarray)
+_pgr_maxflow(text,anyarray,anyarray,text,boolean)
+pgr_maxflow(text,anyarray,bigint)
+_pgr_maxflow(text,anyarray,bigint,text,boolean)
+pgr_maxflow(text,bigint,anyarray)
+_pgr_maxflow(text,bigint,anyarray,text,boolean)
+pgr_maxflow(text,bigint,bigint)
+_pgr_maxflow(text,bigint,bigint,text,boolean)
+pgr_maximumcardinalitymatching(text,boolean)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+_pgr_pickdeliver(text,integer,double precision,double precision,integer)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
+pgr_quote_ident(text)
+_pgr_startpoint(geometry)
+pgr_startpoint(geometry)
+pgr_texttopoints(text,integer)
+_pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_tsp(text,integer,integer)
+_pgr_unnest_matrix(double precision[])
+pgr_version()
+_pgr_versionless(text,text)
+pgr_versionless(text,text)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscostmatrix(text,text,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/git-tools/gitattributes b/tools/git-tools/gitattributes
new file mode 100644
index 0000000..46475ef
--- /dev/null
+++ b/tools/git-tools/gitattributes
@@ -0,0 +1,19 @@
+# Set the default behavior, in case people don't have core.autocrlf set.
+* text=auto
+
+# Explicitly declare text files you want to always be normalized and converted
+# to native line endings on checkout.
+*.c text eol=lf
+*.h text eol=lf
+*.cpp text eol=lf
+*.hpp text eol=lf
+*.rst text eol=lf
+*.queries text eol=lf
+*.dox text eol=lf
+*.sh text eol=lf
+*.md text eol=lf
+*.queries text eol=lf
+
+# Denote all files that are truly binary and should not be modified.
+*.png binary
+*.jpg binary
diff --git a/tools/mk-signature-file b/tools/mk-signature-file.pl
similarity index 100%
rename from tools/mk-signature-file
rename to tools/mk-signature-file.pl
diff --git a/tools/release-scripts/check-release.sh b/tools/release-scripts/check-release.sh
new file mode 100755
index 0000000..acc7c3c
--- /dev/null
+++ b/tools/release-scripts/check-release.sh
@@ -0,0 +1,327 @@
+#!/bin/bash
+
+set -e
+
+if [[ -z $1 ]]; then
+ echo "Mayor missing";
+ echo "Usage"
+ echo "tools/release-scripts/release-check.sh Mayor Minor Micro Last";
+ exit 1;
+fi
+if [[ -z $2 ]]; then
+ echo "Minor missing";
+ echo "Usage"
+ echo "tools/release-scripts/release-check.sh Mayor Minor Micro Last";
+ exit 1;
+fi
+
+if [[ -z $3 ]]; then
+ echo "Micro missing";
+ echo "Usage"
+ echo "tools/release-scripts/release-check.sh Mayor Minor Micro Last";
+ exit 1;
+fi
+
+if [[ -z $4 ]]; then
+ echo "Last Micro missing";
+ echo "Usage"
+ echo "tools/release-scripts/release-check.sh Mayor Minor Micro Last";
+ exit 1;
+fi
+
+MAYOR=$1
+MINOR=$2
+MICRO=0
+PREV_REL=$4
+RC=""
+
+#---------------------------------------------------------------------
+echo "### Verify branch to be release/$MAYOR.$MINOR"
+echo
+#---------------------------------------------------------------------
+
+BRANCH="$(git rev-parse --abbrev-ref HEAD)"
+echo "- [x] Working Branch: release/$MAYOR.$MINOR";
+
+if [[ "release/$MAYOR.$MINOR" == "$BRANCH" ]]; then
+ echo " - [x] Already in branch $BRANCH";
+else
+ echo " - Current Branch: $BRANCH";
+ echo " - [x] Changing to branch $BRANCH";
+ echo "\`\`\`"
+ echo git checkout release/$MAYOR.$MINOR
+ echo "\`\`\`"
+ git checkout release/$MAYOR.$MINOR
+fi
+
+#---------------------------------------------------------------------
+echo
+echo "### Verify typos"
+echo
+#---------------------------------------------------------------------
+
+echo "\`\`\`"
+echo sh tools/scripts/fix_typos.sh
+echo "\`\`\`"
+
+sh tools/scripts/fix_typos.sh
+
+if [[ $? != 0 ]]; then
+ echo "FATAL: Typos were found"
+ exit 1
+else
+ echo "- [x] Typos checked: OK"
+fi
+
+
+#---------------------------------------------------------------------
+echo
+echo "### Verify Current NEWS & CHANGLOG"
+echo
+#---------------------------------------------------------------------
+echo
+echo "- [x] Checking NEWS section $MAYOR.$MINOR.$MICRO exists"
+echo "\`\`\`"
+echo "grep $MAYOR.$MINOR.$MICRO NEWS"
+echo "\`\`\`"
+CURRENTNEWS=$(grep $MAYOR.$MINOR.$MICRO NEWS)
+if [[ $? != 0 ]]; then
+ echo "FATAL: Section $MAYOR.$MINOR.$MICRO in NEWS file is missing"
+ exit 1
+else
+ echo
+fi
+
+
+echo "- [x] Checking release_notes.rst file section $MAYOR.$MINOR.$MICRO exists"
+echo "\`\`\`"
+echo "grep $MAYOR.$MINOR.$MICRO doc/src/release_notes.rst | grep ref"
+echo "\`\`\`"
+CURRENTNEWS=$(grep $MAYOR.$MINOR.$MICRO doc/src/release_notes.rst | grep ref)
+if [[ $? != 0 ]]; then
+ echo "FATAL: Section $MAYOR.$MINOR.$MICRO in release_notes.rst file are missing"
+ exit 1
+else
+ echo
+fi
+
+
+
+#---------------------------------------------------------------------
+echo
+echo "### Verify $PREV_REL NEWS & CHANGLOG"
+echo
+#---------------------------------------------------------------------
+
+echo "- [x] Checking NEWS section $PREV_REL exists"
+echo "\`\`\`"
+echo "grep $PREV_REL NEWS"
+echo "\`\`\`"
+OLDNEWS=$(grep $PREV_REL NEWS)
+if [[ $? != 0 ]]; then
+ echo "$PREV_REL NEWS are missing in NEWS file"
+ exit 1
+else
+ echo
+fi
+
+
+echo "- [x] Checking release_notes.rst section $PREV_REL exists"
+echo "\`\`\`"
+grep $PREV_REL doc/src/release_notes.rst | grep ref
+echo "\`\`\`"
+OLDNEWS=$(grep $PREV_REL doc/src/release_notes.rst | grep ref)
+if [[ $? != 0 ]]; then
+ echo "$PREV_REL NEWS are missing in release_notes.rst file"
+ exit 1
+else
+ echo
+fi
+
+
+
+
+#---------------------------------------------------------------------
+echo
+echo "### Check version information"
+echo
+#---------------------------------------------------------------------
+echo "- [x] Check mayor information"
+echo "\`\`\`"
+echo "cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_MAJOR \"$MAYOR\")'"
+echo "\`\`\`"
+if [[ $(cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_MAJOR' | grep $MAYOR) != "set(PGROUTING_VERSION_MAJOR \"$MAYOR\")" ]]; then
+ echo "FATAL: PGROUTING_VERSION_MAJOR is not $MAYOR"
+ exit 1
+else
+ echo
+fi
+
+
+echo "- [x] Check minor information"
+echo "\`\`\`"
+echo "cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_MINOR \"$MINOR\")'"
+echo "\`\`\`"
+if [[ $(cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_MINOR' | grep $MINOR) != "set(PGROUTING_VERSION_MINOR \"$MINOR\")" ]]; then
+ echo "FATAL: PGROUTING_VERSION_MINOR is not $MINOR"
+ exit 1
+else
+ echo
+fi
+
+echo "- [x] Check patch information"
+echo "\`\`\`"
+echo "cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_PATCH \"0\")'"
+echo "\`\`\`"
+if [[ $(cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_PATCH' | grep $MICRO) != "set(PGROUTING_VERSION_PATCH \"$MICRO\")" ]]; then
+ echo "FATAL: PGROUTING_VERSION_PATCH is not $MICRO"
+ exit 1
+else
+ echo
+fi
+
+echo "- [x] Check dev information"
+echo "\`\`\`"
+echo "cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_DEV \"$RC\")'"
+echo "\`\`\`"
+if [[ $(cat CMakeLists.txt | grep 'set(PGROUTING_VERSION_DEV' ) != "set(PGROUTING_VERSION_DEV \"$RC\")" ]]; then
+ echo "FATAL: PGROUTING_VERSION_DEV is not $RC"
+ exit 1
+else
+ echo
+fi
+
+
+#---------------------------------------------------------------------
+echo
+echo "### Check pgr_version test result"
+echo
+#---------------------------------------------------------------------
+
+echo "\`\`\`"
+echo "cat doc/test/utilities-any.result | grep \"$MAYOR.$MINOR.$MICRO\""
+echo "\`\`\`"
+if [[ $(cat doc/test/utilities-any.result | grep "$MAYOR.$MINOR.$MICRO") != "$MAYOR.$MINOR.$MICRO" ]]; then
+ echo "FATAL: doc/test/utilities-any.result is not $MAYOR.$MINOR.$MICRO"
+ exit 1
+else
+ echo "- [x] pgr_version result: OK"
+fi
+
+echo "\`\`\`"
+echo "cat VERSION | grep \"release/$MAYOR.$MINOR\""
+echo "\`\`\`"
+if [[ $(cat VERSION | grep "release/$MAYOR.$MINOR") != *"release/$MAYOR.$MINOR" ]]; then
+ echo "FATAL: VERSION branch should be release/$MAYOR.$MINOR"
+ #exit 1
+else
+ echo " -[x] VERSION file branch: OK"
+fi
+
+#---------------------------------------------------------------------
+function test_file {
+
+if [ -f tools/sigs/pgrouting--$1.sig ]
+then
+ echo "- [x] tools/sigs/pgrouting--$1.sig"
+else
+ echo " FATAL: tools/sigs/pgrouting--$1.sig Not found"
+fi
+}
+
+#---------------------------------------------------------------------
+echo "### Checking signature files"
+test_file 2.3.2
+test_file 2.3.1
+test_file 2.3.0
+test_file 2.2.4
+test_file 2.2.3
+test_file 2.2.2
+test_file 2.2.1
+test_file 2.2.0
+test_file 2.1.0
+test_file 2.0.1
+test_file 2.0.0
+
+
+#---------------------------------------------------------------------
+echo "### Locally make a clean build as Release"
+#---------------------------------------------------------------------
+echo "\`\`\`"
+echo "sudo rm -f /usr/lib/postgresql/9.3/lib/libpgrouting-2.4.so"
+echo "sudo rm -f /usr/share/postgresql/9.3/extension/pgrouting*2.4.0*"
+echo "rm -rf build"
+echo cd build
+echo cmake -DWITH_DOC=ON -DBUILD_DOXY=ON -DCMAKE_BUILD_TYPE=Release ..
+echo make
+echo sudo make install
+echo make doc
+echo make doxy
+echo cd ..
+echo "\`\`\`"
+
+echo - [x] completed local builds
+
+bash tools/release-scripts/compile-release.sh 5
+bash tools/release-scripts/compile-release.sh 4.9
+bash tools/release-scripts/compile-release.sh 4.6
+bash tools/release-scripts/compile-release.sh 4.8
+
+#---------------------------------------------------------------------
+echo "### checking the signature files dont change"
+#---------------------------------------------------------------------
+
+sh tools/release-scripts/get_signatures.sh 2.4.0 ___sig_generate___ curr-sig > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.3.2 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.3.1 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.3.0 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.2.4 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.2.3 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.2.2 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.2.1 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.2.0 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.1.0 ___sig_generate___ sigs > build/tmp_sigs.txt
+#version 2.0.1 can not be upgraded
+#sh tools/release-scripts/get_signatures.sh 2.0.1 ___sig_generate___ sigs > build/tmp_sigs.txt
+sh tools/release-scripts/get_signatures.sh 2.0.0 ___sig_generate___ sigs > build/tmp_sigs.txt
+
+echo
+echo - [x] completed check: OK
+echo
+
+#---------------------------------------------------------------------
+echo "### Locally run the update tester"
+#---------------------------------------------------------------------
+echo "\`\`\`"
+echo bash tools/testers/update-tester.sh
+echo "\`\`\`"
+bash tools/testers/update-tester.sh
+if [[ $? != 0 ]]; then
+ echo "FATAL on the update-tester"
+ exit 1
+fi
+echo - [x] completed update testing
+
+
+#---------------------------------------------------------------------
+echo "### execute the documentation queries"
+#---------------------------------------------------------------------
+echo "\`\`\`"
+echo tools/testers/algorithm-tester.pl -documentation
+echo git status
+echo "\`\`\`"
+tools/testers/algorithm-tester.pl -documentation > build/tmp_generate_doc.txt
+if [[ $? != 0 ]]; then
+ echo "FATAL errors found generating documentation result files"
+ exit 1
+fi
+
+if [[ $(git status | grep 'Changes not staged for commit:') ]]; then
+ echo "FATAL: at least one result file changed"
+ exit 1
+fi
+
+echo - [x] No files changed
+
+
+echo "End of check"
diff --git a/tools/release-scripts/compile-release.sh b/tools/release-scripts/compile-release.sh
new file mode 100755
index 0000000..a5d94fa
--- /dev/null
+++ b/tools/release-scripts/compile-release.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+
+set -e
+
+CPPVERSION=$1
+
+function test_compile {
+
+echo ------------------------------------
+echo ------------------------------------
+echo Compiling with $1
+echo ------------------------------------
+
+sudo update-alternatives --set gcc /usr/bin/gcc-$1
+
+cd build/
+cmake -DWITH_DOC=ON -DBUILD_DOXY=ON -DCMAKE_BUILD_TYPE=Release .. > tmp_cmake.txt
+make > tmp_make.txt 2>tmp_make_err.txt
+sudo make install > tmp_make_install.txt
+cp lib/pgrouting--2.4.0.sig ../tools/curr-sig/
+cd ..
+
+echo " - [x] Compilation OK"
+
+tools/testers/algorithm-tester.pl > build/tmp_tests.txt
+echo " - [x] Documentation tests OK"
+
+
+dropdb --if-exists ___pgr___test___
+createdb ___pgr___test___
+sh ./tools/testers/pg_prove_tests.sh vicky > build/tmp_pgtap.txt
+dropdb ___pgr___test___
+echo ' - [x] Pgtap tests OK'
+
+if [[ "$1" == "4.8" ]]; then
+ cd build
+ make doc
+ echo " - [x] Build Users documentation OK"
+ make doxy
+ echo " - [x] Build developers documentation OK"
+ cd ..
+fi
+
+}
+
+sudo rm -f /usr/lib/postgresql/9.3/lib/libpgrouting-2.4.so
+sudo rm -f /usr/share/postgresql/9.3/extension/pgrouting*2.4.0*
+rm -rf build/*
+test_compile $CPPVERSION
+
+exit 0
diff --git a/tools/release-scripts/get_signatures.sh b/tools/release-scripts/get_signatures.sh
new file mode 100755
index 0000000..d5dde28
--- /dev/null
+++ b/tools/release-scripts/get_signatures.sh
@@ -0,0 +1,41 @@
+#!/bin/sh
+
+set -e
+
+if [ "$#" -lt 3 ] ; then
+ echo "Usage: getSignatures.sh VERSION DB_ARGS"
+ echo " VERSION like '2.4.0'"
+ echo " DB_NAME like 'routing'"
+ echo " DIR: 'curr-sig' OR 'sigs'"
+ echo " (optional) DB_ARGS like -U postgres -h localhost -p 5432 "
+ exit 0
+fi
+
+VERSION=$1
+DB_NAME=$2
+DIR=$3
+shift
+shift
+shift
+# DB_ARGS is the remaining of the arguments
+
+FILE=tools/$DIR/pgrouting--$VERSION.sig
+#FILE=test.sig
+
+createdb $* $DB_NAME
+
+psql $* $DB_NAME <<EOF
+SET client_min_messages = WARNING;
+drop extension if exists pgrouting;
+drop extension if exists postgis;
+create extension postgis;
+create extension pgrouting with version '$VERSION';
+EOF
+
+echo "#VERSION pgrouting $VERSION" > $FILE
+echo "#TYPES" >> $FILE
+psql $* $DB_NAME -c '\dx+ pgrouting' -A | grep '^type' | cut -d ' ' -f2- | sort >> $FILE
+echo "#FUNCTIONS" >> $FILE
+psql $* $DB_NAME -c '\dx+ pgrouting' -A | grep '^function' | cut -d ' ' -f2- | sort >> $FILE
+
+dropdb --if-exists $* $DB_NAME
diff --git a/tools/scripts/README.txt b/tools/scripts/README.txt
new file mode 100644
index 0000000..4568f62
--- /dev/null
+++ b/tools/scripts/README.txt
@@ -0,0 +1,32 @@
+scripts for developers
+----------------------
+
+To be executed from the root of the repository
+cd /path/to/repo/
+
+Spell checker
+..............
+
+sh tools/scripts/fix_typos.sh
+
+- creates a directory fix_typos:
+ - contains the code and dictonaries
+- checks the spelling of the:
+ - src
+ - doc
+- does not check:
+ - tools
+
+
+Code linter
+...........
+
+Requierements
+- python
+
+sh tools/scripts/code_checker.sh <directory>
+
+- if no directory is given:
+ - it works on all src/*/src
+
+- output is grouped by extension
diff --git a/tools/scripts/code_checker.sh b/tools/scripts/code_checker.sh
new file mode 100644
index 0000000..992049b
--- /dev/null
+++ b/tools/scripts/code_checker.sh
@@ -0,0 +1,78 @@
+#!/bin/sh
+# -*- coding: utf-8 -*-
+###############################################################################
+#
+# Project: pgRouting
+# Purpose: (Interactive) script to lint C and C++ code
+# Author: Vicky Vergara <vicky_vergara at hotmail.com>
+#
+###############################################################################
+# Copyright (c) 2016, Vicky Vergara <vicky_vergara at hotmail.com>
+#
+# Permission is hereby granted, free of charge, to any person obtaining a
+# copy of this software and associated documentation files (the "Software"),
+# to deal in the Software without restriction, including without limitation
+# the rights to use, copy, modify, merge, publish, distribute, sublicense,
+# and/or sell copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following conditions:
+#
+# The above copyright notice and this permission notice shall be included
+# in all copies or substantial portions of the Software.
+#
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+# DEALINGS IN THE SOFTWARE.
+###############################################################################
+
+if ! test -d code_linter; then
+ # Get our fork of codespell that adds --words-white-list and full filename support for -S option
+ mkdir code_linter
+ cd code_linter
+ git clone https://github.com/google/styleguide
+ cd styleguide
+ git checkout gh-pages
+ cd ../..
+fi
+
+DIRECTORY=$1
+if test -z "$DIRECTORY"; then
+ echo --------------------
+ echo ------ *.h ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py src/*/src/*.h
+ echo --------------------
+ echo ------ *.hpp ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --extensions=hpp --headers=hpp --filter=-runtime/references src/*/src/*.hpp
+ echo --------------------
+ echo ------ *.c ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --extensions=c src/*/src/*.c
+ echo --------------------
+ echo ------ *.cpp ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --filter=-runtime/references src/*/src/*.cpp
+else
+ echo --------------------
+ echo ------ *.c ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --extensions=c --filter=-readability/casting src/$DIRECTORY/src/*.c
+ echo --------------------
+ echo ------ *.cpp ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --filter=-runtime/references src/$DIRECTORY/src/*.cpp
+ echo --------------------
+ echo ------ *.h ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py src/$DIRECTORY/src/*.h
+ echo --------------------
+ echo ------ *.hpp ------
+ echo --------------------
+ python code_linter/styleguide/cpplint/cpplint.py --extensions=hpp --headers=hpp --filter=-runtime/references src/$DIRECTORY/src/*.hpp
+fi
+
+
diff --git a/tools/scripts/fix_typos.sh b/tools/scripts/fix_typos.sh
index db5d744..c35b6db 100644
--- a/tools/scripts/fix_typos.sh
+++ b/tools/scripts/fix_typos.sh
@@ -47,15 +47,14 @@ if ! test -d fix_typos; then
fi
EXCLUDED_FILES="*/doc/i18n/*"
-#EXCLUDED_FILES="$EXCLUDED_FILES,*/src/*/test/*"
EXCLUDED_FILES="$EXCLUDED_FILES,*/src/*/test/pgtap/*"
-#EXCLUDED_FILES="$EXCLUDED_FILES,*/src/*/src/*"
-#EXCLUDED_FILES="$EXCLUDED_FILES,*/src/*/sql/*"
-#EXCLUDED_FILES="$EXCLUDED_FILES,*/src/*/doc/*"
-EXCLUDED_FILES="$EXCLUDED_FILES,*/fix_typos/*,*/build/*"
+EXCLUDED_FILES="$EXCLUDED_FILES,*/fix_typos/*"
+EXCLUDED_FILES="$EXCLUDED_FILES,*/build/*"
+EXCLUDED_FILES="$EXCLUDED_FILES,*/code_linter/*"
EXCLUDED_FILES="$EXCLUDED_FILES,*/.git/*"
EXCLUDED_FILES="$EXCLUDED_FILES,*/tools/*"
+
#WORDS_WHITE_LIST="poSession,FIDN,TRAFIC,HTINK,repID,oCurr,INTREST,oPosition"
#WORDS_WHITE_LIST="$WORDS_WHITE_LIST,CPL_SUPRESS_CPLUSPLUS,SRP_NAM,ADRG_NAM,'SRP_NAM,AuxilaryTarget"
# IRIS driver metadata item names: FIXME ?
diff --git a/tools/sigs/pgrouting--2.0.0.sig b/tools/sigs/pgrouting--2.0.0.sig
index df4e0dc..33a4204 100644
--- a/tools/sigs/pgrouting--2.0.0.sig
+++ b/tools/sigs/pgrouting--2.0.0.sig
@@ -1,12 +1,12 @@
#VERSION pgrouting 2.0.0
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-pgr_alphashape(text,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
+pgr_alphashape(text)
pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
@@ -15,23 +15,24 @@ pgr_bddijkstra(text,integer,integer,boolean,boolean)
pgr_createtopology(text,double precision,text,text,text,text,text)
pgr_createverticestable(text,text,text,text,text)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_drivingdistance(text,integer,float8,boolean,boolean)
+pgr_drivingdistance(text,integer,double precision,boolean,boolean)
pgr_endpoint(geometry)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
+pgr_gettablename(text)
+pgr_iscolumnindexed(text,text)
pgr_iscolumnintable(text,text)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_makedistancematrix(text,out double precision[],out integer[])
+pgr_makedistancematrix(text)
pgr_nodenetwork(text,double precision,text,text,text)
+pgr_pointsaspolygon(character varying)
pgr_pointtoid(geometry,double precision,text,integer)
-pgr_pointsaspolygon(varchar)
pgr_quote_ident(text)
pgr_startpoint(geometry)
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
pgr_trsp(text,integer,integer,boolean,boolean,text)
-pgr_tsp(float8[][],integer,integer,out integer,out integer)
+pgr_tsp(double precision[],integer,integer)
pgr_tsp(text,integer,integer)
pgr_version()
pgr_versionless(text,text)
diff --git a/tools/sigs/pgrouting--2.0.1.sig b/tools/sigs/pgrouting--2.0.1.sig
index 2f22ebb..f94f2f9 100644
--- a/tools/sigs/pgrouting--2.0.1.sig
+++ b/tools/sigs/pgrouting--2.0.1.sig
@@ -1,12 +1,12 @@
#VERSION pgrouting 2.0.1
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-pgr_alphashape(text,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
+pgr_alphashape(text)
pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
@@ -15,23 +15,24 @@ pgr_bddijkstra(text,integer,integer,boolean,boolean)
pgr_createtopology(text,double precision,text,text,text,text,text)
pgr_createverticestable(text,text,text,text,text)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_drivingdistance(text,integer,float8,boolean,boolean)
+pgr_drivingdistance(text,integer,double precision,boolean,boolean)
pgr_endpoint(geometry)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
+pgr_gettablename(text)
+pgr_iscolumnindexed(text,text)
pgr_iscolumnintable(text,text)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_makedistancematrix(text,out double precision[],out integer[])
+pgr_makedistancematrix(text)
pgr_nodenetwork(text,double precision,text,text,text)
+pgr_pointsaspolygon(character varying)
pgr_pointtoid(geometry,double precision,text,integer)
-pgr_pointsaspolygon(varchar)
pgr_quote_ident(text)
pgr_startpoint(geometry)
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
pgr_trsp(text,integer,integer,boolean,boolean,text)
-pgr_tsp(float8[][],integer,integer,out integer,out integer)
+pgr_tsp(double precision[],integer,integer)
pgr_tsp(text,integer,integer)
pgr_version()
pgr_versionless(text,text)
diff --git a/tools/sigs/pgrouting--2.1.0.sig b/tools/sigs/pgrouting--2.1.0.sig
index a6a67bf..2034648 100644
--- a/tools/sigs/pgrouting--2.1.0.sig
+++ b/tools/sigs/pgrouting--2.1.0.sig
@@ -1,88 +1,86 @@
#VERSION pgrouting 2.1.0
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean,boolean,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean,boolean,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_versionless(text,text)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,bigint,bigint,boolean,boolean)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,bigint,float8,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean,boolean)
+pgr_drivingdistance(text,bigint,double precision)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_makedistancematrix(text,out double precision[],out integer[])
-pgr_nodenetwork(text,double precision,text ,text ,text )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer[],float8[],boolean,boolean,text )
-pgr_trsp(text,integer[],boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,integer[],boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer[],boolean,boolean,text)
+pgr_trsp(text,integer[],double precision[],boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
diff --git a/tools/sigs/pgrouting--2.2.0.sig b/tools/sigs/pgrouting--2.2.0.sig
index 215c855..e658c85 100644
--- a/tools/sigs/pgrouting--2.2.0.sig
+++ b/tools/sigs/pgrouting--2.2.0.sig
@@ -1,109 +1,109 @@
#VERSION pgrouting 2.2.0
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.2.1.sig b/tools/sigs/pgrouting--2.2.1.sig
index 740f8cf..4a7a0b7 100644
--- a/tools/sigs/pgrouting--2.2.1.sig
+++ b/tools/sigs/pgrouting--2.2.1.sig
@@ -1,109 +1,109 @@
#VERSION pgrouting 2.2.1
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.2.2.sig b/tools/sigs/pgrouting--2.2.2.sig
index 22f3147..239a0fd 100644
--- a/tools/sigs/pgrouting--2.2.2.sig
+++ b/tools/sigs/pgrouting--2.2.2.sig
@@ -1,109 +1,109 @@
#VERSION pgrouting 2.2.2
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.2.3.sig b/tools/sigs/pgrouting--2.2.3.sig
index d96653c..56aa6d1 100644
--- a/tools/sigs/pgrouting--2.2.3.sig
+++ b/tools/sigs/pgrouting--2.2.3.sig
@@ -1,109 +1,109 @@
#VERSION pgrouting 2.2.3
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.2.4.sig b/tools/sigs/pgrouting--2.2.4.sig
index 6afe484..3d1e6dc 100644
--- a/tools/sigs/pgrouting--2.2.4.sig
+++ b/tools/sigs/pgrouting--2.2.4.sig
@@ -1,109 +1,109 @@
#VERSION pgrouting 2.2.4
#TYPES
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer,out integer,out integer,out integer,out integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
-pgr_vidstodmatrix(text,integer[],bool,bool,bool)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.3.0.sig b/tools/sigs/pgrouting--2.3.0.sig
index d22bfe3..2799108 100644
--- a/tools/sigs/pgrouting--2.3.0.sig
+++ b/tools/sigs/pgrouting--2.3.0.sig
@@ -1,140 +1,140 @@
#VERSION pgrouting 2.3.0
#TYPES
-contraction_vertex(int,int,char,text)
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+contraction_vertex
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_maxflow(text,bigint,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,bigint,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pickdeliver(text,integer,float,float ,integer ,out integer,out integer,out integer,out bigint,out float,out float,out float,out float,out float )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_tsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
-pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision)
+_pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_contractgraph(text,bigint[],integer ,bigint[] ,boolean ,out integer,out text,out bigint,out bigint[],out bigint,out bigint,out float)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+pgr_contractgraph(text,bigint[],integer,bigint[],boolean)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracostmatrix(text,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracostmatrix(text,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_edgedisjointpaths(in text,in bigint,in bigint,in boolean ,out integer,out integer,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in bigint,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in bigint,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint )
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+pgr_edgedisjointpaths(text,anyarray,anyarray,boolean)
+pgr_edgedisjointpaths(text,anyarray,bigint,boolean)
+pgr_edgedisjointpaths(text,bigint,anyarray,boolean)
+pgr_edgedisjointpaths(text,bigint,bigint,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
-pgr_euclediantsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
+pgr_euclediantsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
pgr_fakecontraction(text,integer[])
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_maxflowboykovkolmogorov(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maximumcardinalitymatching(text,boolean ,out integer,out bigint,out bigint,out bigint )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+pgr_maxflowboykovkolmogorov(text,anyarray,anyarray)
+pgr_maxflowboykovkolmogorov(text,anyarray,bigint)
+pgr_maxflowboykovkolmogorov(text,bigint,anyarray)
+pgr_maxflowboykovkolmogorov(text,bigint,bigint)
+pgr_maxflowedmondskarp(text,anyarray,anyarray)
+pgr_maxflowedmondskarp(text,anyarray,bigint)
+pgr_maxflowedmondskarp(text,bigint,anyarray)
+pgr_maxflowedmondskarp(text,bigint,bigint)
+pgr_maxflowpushrelabel(text,anyarray,anyarray)
+pgr_maxflowpushrelabel(text,anyarray,bigint)
+pgr_maxflowpushrelabel(text,bigint,anyarray)
+pgr_maxflowpushrelabel(text,bigint,bigint)
+_pgr_maxflow(text,anyarray,anyarray,text)
+_pgr_maxflow(text,anyarray,bigint,text)
+_pgr_maxflow(text,bigint,anyarray,text)
+_pgr_maxflow(text,bigint,bigint,text)
+pgr_maximumcardinalitymatching(text,boolean)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+_pgr_pickdeliver(text,integer,double precision,double precision,integer)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscostmatrix(text,text,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscostmatrix(text,text,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.3.1.sig b/tools/sigs/pgrouting--2.3.1.sig
index bf44758..3b50cce 100644
--- a/tools/sigs/pgrouting--2.3.1.sig
+++ b/tools/sigs/pgrouting--2.3.1.sig
@@ -1,141 +1,141 @@
#VERSION pgrouting 2.3.1
#TYPES
-contraction_vertex(int,int,char,text)
-pgr_costResult(integer,integer,integer,float8)
-pgr_costResult3(integer,integer,integer,integer,float8)
-pgr_geomResult(integer,integer,integer,geometry)
+contraction_vertex
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
#FUNCTIONS
-_pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_checkverttab(text,text[],in int ,in text ,out text,out text)
-_pgr_createindex(text,text,text,text,in int ,in text )
-_pgr_createindex(text,text,text,in int ,in text )
-_pgr_dijkstra(text,bigint,bigint,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,bigint,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,bigint,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_dijkstra(text,anyarray,anyarray,boolean ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,bigint,float8,boolean,out integer,out bigint,out bigint,out float,out float)
-_pgr_drivingdistance(text,anyarray,float8,boolean,boolean,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_endpoint(geometry)
-_pgr_getcolumnname(text,text,text,in int ,in text )
-_pgr_getcolumnname(text,text,in int ,in text )
-_pgr_getcolumntype(text,text,text,in int ,in text )
-_pgr_getcolumntype(text,text,in int ,in text )
-_pgr_gettablename(in text,in int ,in text ,out text,out text)
-_pgr_get_statement(text)
-_pgr_iscolumnintable(text,text)
-_pgr_iscolumnindexed(text,text,text,in int ,in text )
-_pgr_iscolumnindexed(text,text,in int ,in text )
-_pgr_ksp(text,bigint,bigint,integer,boolean,boolean,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_makedistancematrix(text,out double precision[],out integer[])
-_pgr_maxflow(text,bigint,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,bigint,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,bigint,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_maxflow(text,anyarray,anyarray,text ,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-_pgr_msg(in int,in text,in text )
-_pgr_onerror(in boolean,in int,in text,in text,in text ,in text )
-_pgr_parameter_check(text,text,boolean )
-_pgr_pickdeliver(text,integer,float,float ,integer ,out integer,out integer,out integer,out bigint,out float,out float,out float,out float,out float )
-_pgr_pointtoid(geometry,double precision,text,integer)
-_pgr_quote_ident(text)
-_pgr_startpoint(geometry)
-_pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-_pgr_trsp(text,integer,integer,boolean,boolean,text )
-_pgr_trspviavertices(text,integer[],boolean,boolean,text )
-_pgr_versionless(text,text)
-_pgr_withpoints(text,text,bigint,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,bigint,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,bigint,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpoints(text,text,anyarray,anyarray,boolean,char,boolean,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-_pgr_withpointsvia(text,bigint[],float[],boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_tsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
-pgr_alphashape(text,float8 ,out float8,out float8)
-pgr_analyzeoneway(text,text[],text[],text[],text[],boolean ,text ,text ,text )
-pgr_analyzegraph(text,double precision,text ,text ,text ,text ,text )
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
pgr_apspjohnson(text)
pgr_apspwarshall(text,boolean,boolean)
-pgr_astar(text,bigint,bigint,boolean ,integer ,float ,float ,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision)
+_pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision,boolean)
pgr_astar(text,integer,integer,boolean,boolean)
pgr_bdastar(text,integer,integer,boolean,boolean)
pgr_bddijkstra(text,integer,integer,boolean,boolean)
-pgr_contractgraph(text,bigint[],integer ,bigint[] ,boolean ,out integer,out text,out bigint,out bigint[],out bigint,out bigint,out float)
-pgr_createtopology(text,double precision,text ,text ,text ,text ,text ,boolean )
-pgr_createverticestable(text,text ,text ,text ,text )
-pgr_dijkstra(text,bigint,bigint,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,bigint,boolean,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,bigint,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
+_pgr_checkverttab(text,text[],integer,text)
+pgr_contractgraph(text,bigint[],integer,bigint[],boolean)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracostmatrix(text,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
pgr_dijkstra(text,integer,integer,boolean,boolean)
-pgr_dijkstra(text,anyarray,bigint,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstra(text,anyarray,anyarray,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_dijkstracost(text,bigint,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,bigint,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,bigint,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracost(text,anyarray,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstracostmatrix(text,anyarray,boolean ,out bigint,out bigint,out float)
-pgr_dijkstravia(text,anyarray,boolean ,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float,out float)
-pgr_drivingdistance(text,bigint,float8,boolean,boolean)
-pgr_drivingdistance(text,bigint,float8,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_drivingdistance(text,anyarray,float8,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_edgedisjointpaths(in text,in bigint,in bigint,in boolean ,out integer,out integer,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in bigint,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in bigint,in boolean ,out integer,out integer,out bigint,out bigint,out bigint )
-pgr_edgedisjointpaths(in text,in anyarray,in anyarray,in boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint )
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+pgr_edgedisjointpaths(text,anyarray,anyarray,boolean)
+pgr_edgedisjointpaths(text,anyarray,bigint,boolean)
+pgr_edgedisjointpaths(text,bigint,anyarray,boolean)
+pgr_edgedisjointpaths(text,bigint,bigint,boolean)
+_pgr_endpoint(geometry)
pgr_endpoint(geometry)
-pgr_euclediantsp(text,bigint ,bigint ,float ,integer ,integer ,integer ,float ,float ,float ,boolean ,out integer,out bigint,out float,out float)
+pgr_euclediantsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
pgr_fakecontraction(text,integer[])
pgr_flipedges(geometry[])
-pgr_floydwarshall(text,boolean ,out bigint,out bigint,out float)
+pgr_floydwarshall(text,boolean)
pgr_getcolumnname(text,text)
-pgr_gettablename(in text,out text,out text)
-pgr_gsoc_vrppdtw(text,integer,integer )
-pgr_iscolumnintable(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
pgr_iscolumnindexed(text,text)
-pgr_johnson(text,boolean ,out bigint,out bigint,out float)
-pgr_kdijkstrapath(text,integer,integer array,boolean,boolean)
-pgr_kdijkstracost(text,integer,integer array,boolean,boolean)
-pgr_ksp(text,bigint,bigint,integer,boolean ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
pgr_ksp(text,integer,integer,integer,boolean)
-pgr_labelgraph(text,text ,text ,text ,text ,text )
-pgr_maxflowboykovkolmogorov(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowboykovkolmogorov(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowedmondskarp(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,bigint,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,bigint,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maxflowpushrelabel(text,anyarray,anyarray,out integer,out bigint,out bigint,out bigint,out bigint,out bigint )
-pgr_maximumcardinalitymatching(text,boolean ,out integer,out bigint,out bigint,out bigint )
-pgr_nodenetwork(text,double precision,text ,text ,text ,text ,boolean )
-pgr_pointsaspolygon(varchar,float8 )
-pgr_pointstodmatrix(geometry[],integer )
-pgr_pointstovids(geometry[],text,float8 )
-pgr_pointtoedgenode(text,geometry,float8)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+pgr_maxflowboykovkolmogorov(text,anyarray,anyarray)
+pgr_maxflowboykovkolmogorov(text,anyarray,bigint)
+pgr_maxflowboykovkolmogorov(text,bigint,anyarray)
+pgr_maxflowboykovkolmogorov(text,bigint,bigint)
+pgr_maxflowedmondskarp(text,anyarray,anyarray)
+pgr_maxflowedmondskarp(text,anyarray,bigint)
+pgr_maxflowedmondskarp(text,bigint,anyarray)
+pgr_maxflowedmondskarp(text,bigint,bigint)
+pgr_maxflowpushrelabel(text,anyarray,anyarray)
+pgr_maxflowpushrelabel(text,anyarray,bigint)
+pgr_maxflowpushrelabel(text,bigint,anyarray)
+pgr_maxflowpushrelabel(text,bigint,bigint)
+_pgr_maxflow(text,anyarray,anyarray,text)
+_pgr_maxflow(text,anyarray,bigint,text)
+_pgr_maxflow(text,bigint,anyarray,text)
+_pgr_maxflow(text,bigint,bigint,text)
+pgr_maximumcardinalitymatching(text,boolean)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+_pgr_pickdeliver(text,integer,double precision,double precision,integer)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
pgr_quote_ident(text)
+_pgr_startpoint(geometry)
pgr_startpoint(geometry)
-pgr_texttopoints(text,integer )
-pgr_trsp(text,integer,integer,boolean,boolean,text )
-pgr_trsp(text,integer,float8,integer,float8,boolean,boolean,text )
-pgr_trspviaedges(text,integer[],float8[],boolean,boolean,text )
-pgr_trspviavertices(text,anyarray,boolean,boolean,text )
-pgr_tsp(float8[][],integer,integer ,out integer,out integer)
-pgr_tsp(text,integer,integer )
+pgr_texttopoints(text,integer)
+_pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_tsp(text,integer,integer)
pgr_version()
+_pgr_versionless(text,text)
pgr_versionless(text,text)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
-pgr_vidstodmatrix(in integer[],in geometry[],in text,float8 )
-pgr_vrponedepot(text,text,text,integer,out integer,out integer,out integer,out integer,out integer)
-pgr_withpoints(text,text,bigint,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,bigint,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,bigint,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpoints(text,text,anyarray,anyarray,boolean ,char ,boolean ,out integer,out integer,out bigint,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointscost(text,text,bigint,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,bigint,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,bigint,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscost(text,text,anyarray,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointscostmatrix(text,text,anyarray,boolean ,char ,out bigint,out bigint,out float)
-pgr_withpointsdd(text,text,anyarray,float,boolean ,char ,boolean ,boolean ,out integer,out bigint,out bigint,out bigint,out float,out float)
-pgr_withpointsdd(text,text,bigint,float,boolean ,char ,boolean ,out integer,out bigint,out bigint,out float,out float)
-pgr_withpointsksp(text,text,bigint,bigint,integer,boolean ,boolean ,char ,boolean ,out integer,out integer,out integer,out bigint,out bigint,out float,out float)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscostmatrix(text,text,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/sigs/pgrouting--2.3.2.sig b/tools/sigs/pgrouting--2.3.2.sig
new file mode 100644
index 0000000..16950e9
--- /dev/null
+++ b/tools/sigs/pgrouting--2.3.2.sig
@@ -0,0 +1,141 @@
+#VERSION pgrouting 2.3.2
+#TYPES
+contraction_vertex
+pgr_costresult
+pgr_costresult3
+pgr_geomresult
+#FUNCTIONS
+pgr_alphashape(text,double precision)
+pgr_analyzegraph(text,double precision,text,text,text,text,text)
+pgr_analyzeoneway(text,text[],text[],text[],text[],boolean,text,text,text)
+pgr_apspjohnson(text)
+pgr_apspwarshall(text,boolean,boolean)
+pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision)
+_pgr_astar(text,bigint,bigint,boolean,integer,double precision,double precision,boolean)
+pgr_astar(text,integer,integer,boolean,boolean)
+pgr_bdastar(text,integer,integer,boolean,boolean)
+pgr_bddijkstra(text,integer,integer,boolean,boolean)
+_pgr_checkverttab(text,text[],integer,text)
+pgr_contractgraph(text,bigint[],integer,bigint[],boolean)
+_pgr_createindex(text,text,text,integer,text)
+_pgr_createindex(text,text,text,text,integer,text)
+pgr_createtopology(text,double precision,text,text,text,text,text,boolean)
+pgr_createverticestable(text,text,text,text,text)
+pgr_dijkstracostmatrix(text,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,anyarray,boolean)
+pgr_dijkstracost(text,anyarray,bigint,boolean)
+pgr_dijkstracost(text,bigint,anyarray,boolean)
+pgr_dijkstracost(text,bigint,bigint,boolean)
+pgr_dijkstra(text,anyarray,anyarray,boolean)
+_pgr_dijkstra(text,anyarray,anyarray,boolean,boolean)
+pgr_dijkstra(text,anyarray,bigint,boolean)
+_pgr_dijkstra(text,anyarray,bigint,boolean,boolean)
+pgr_dijkstra(text,bigint,anyarray,boolean)
+_pgr_dijkstra(text,bigint,anyarray,boolean,boolean)
+pgr_dijkstra(text,bigint,bigint)
+pgr_dijkstra(text,bigint,bigint,boolean)
+_pgr_dijkstra(text,bigint,bigint,boolean,boolean)
+pgr_dijkstra(text,integer,integer,boolean,boolean)
+pgr_dijkstravia(text,anyarray,boolean,boolean,boolean)
+_pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+pgr_drivingdistance(text,anyarray,double precision,boolean,boolean)
+_pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean)
+pgr_drivingdistance(text,bigint,double precision,boolean,boolean)
+pgr_edgedisjointpaths(text,anyarray,anyarray,boolean)
+pgr_edgedisjointpaths(text,anyarray,bigint,boolean)
+pgr_edgedisjointpaths(text,bigint,anyarray,boolean)
+pgr_edgedisjointpaths(text,bigint,bigint,boolean)
+_pgr_endpoint(geometry)
+pgr_endpoint(geometry)
+pgr_euclediantsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_fakecontraction(text,integer[])
+pgr_flipedges(geometry[])
+pgr_floydwarshall(text,boolean)
+pgr_getcolumnname(text,text)
+_pgr_getcolumnname(text,text,integer,text)
+_pgr_getcolumnname(text,text,text,integer,text)
+_pgr_getcolumntype(text,text,integer,text)
+_pgr_getcolumntype(text,text,text,integer,text)
+_pgr_get_statement(text)
+pgr_gettablename(text)
+_pgr_gettablename(text,integer,text)
+pgr_gsoc_vrppdtw(text,integer,integer)
+pgr_iscolumnindexed(text,text)
+_pgr_iscolumnindexed(text,text,integer,text)
+_pgr_iscolumnindexed(text,text,text,integer,text)
+_pgr_iscolumnintable(text,text)
+pgr_iscolumnintable(text,text)
+pgr_johnson(text,boolean)
+pgr_kdijkstracost(text,integer,integer[],boolean,boolean)
+pgr_kdijkstrapath(text,integer,integer[],boolean,boolean)
+_pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,bigint,bigint,integer,boolean,boolean)
+pgr_ksp(text,integer,integer,integer,boolean)
+pgr_labelgraph(text,text,text,text,text,text)
+_pgr_makedistancematrix(text)
+pgr_maxflowboykovkolmogorov(text,anyarray,anyarray)
+pgr_maxflowboykovkolmogorov(text,anyarray,bigint)
+pgr_maxflowboykovkolmogorov(text,bigint,anyarray)
+pgr_maxflowboykovkolmogorov(text,bigint,bigint)
+pgr_maxflowedmondskarp(text,anyarray,anyarray)
+pgr_maxflowedmondskarp(text,anyarray,bigint)
+pgr_maxflowedmondskarp(text,bigint,anyarray)
+pgr_maxflowedmondskarp(text,bigint,bigint)
+pgr_maxflowpushrelabel(text,anyarray,anyarray)
+pgr_maxflowpushrelabel(text,anyarray,bigint)
+pgr_maxflowpushrelabel(text,bigint,anyarray)
+pgr_maxflowpushrelabel(text,bigint,bigint)
+_pgr_maxflow(text,anyarray,anyarray,text)
+_pgr_maxflow(text,anyarray,bigint,text)
+_pgr_maxflow(text,bigint,anyarray,text)
+_pgr_maxflow(text,bigint,bigint,text)
+pgr_maximumcardinalitymatching(text,boolean)
+_pgr_msg(integer,text,text)
+pgr_nodenetwork(text,double precision,text,text,text,text,boolean)
+_pgr_onerror(boolean,integer,text,text,text,text)
+_pgr_parameter_check(text,text,boolean)
+_pgr_pickdeliver(text,integer,double precision,double precision,integer)
+pgr_pointsaspolygon(character varying,double precision)
+pgr_pointstodmatrix(geometry[],integer)
+pgr_pointstovids(geometry[],text,double precision)
+pgr_pointtoedgenode(text,geometry,double precision)
+_pgr_pointtoid(geometry,double precision,text,integer)
+_pgr_quote_ident(text)
+pgr_quote_ident(text)
+_pgr_startpoint(geometry)
+pgr_startpoint(geometry)
+pgr_texttopoints(text,integer)
+_pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+pgr_trsp(text,integer,double precision,integer,double precision,boolean,boolean,text)
+_pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trsp(text,integer,integer,boolean,boolean,text)
+pgr_trspviaedges(text,integer[],double precision[],boolean,boolean,text)
+pgr_trspviavertices(text,anyarray,boolean,boolean,text)
+_pgr_trspviavertices(text,integer[],boolean,boolean,text)
+pgr_tsp(double precision[],integer,integer)
+pgr_tsp(text,bigint,bigint,double precision,integer,integer,integer,double precision,double precision,double precision,boolean)
+pgr_tsp(text,integer,integer)
+pgr_version()
+_pgr_versionless(text,text)
+pgr_versionless(text,text)
+pgr_vidstodmatrix(integer[],geometry[],text,double precision)
+pgr_vidstodmatrix(text,integer[],boolean,boolean,boolean)
+pgr_vrponedepot(text,text,text,integer)
+pgr_withpointscostmatrix(text,text,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,anyarray,boolean,character)
+pgr_withpointscost(text,text,anyarray,bigint,boolean,character)
+pgr_withpointscost(text,text,bigint,anyarray,boolean,character)
+pgr_withpointscost(text,text,bigint,bigint,boolean,character)
+pgr_withpointsdd(text,text,anyarray,double precision,boolean,character,boolean,boolean)
+pgr_withpointsdd(text,text,bigint,double precision,boolean,character,boolean)
+pgr_withpointsksp(text,text,bigint,bigint,integer,boolean,boolean,character,boolean)
+pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,anyarray,bigint,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,anyarray,boolean,character,boolean,boolean)
+pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean)
+_pgr_withpoints(text,text,bigint,bigint,boolean,character,boolean,boolean)
+_pgr_withpointsvia(text,bigint[],double precision[],boolean)
diff --git a/tools/template/create.sh b/tools/template/create.sh
index c8207c1..faa6863 100644
--- a/tools/template/create.sh
+++ b/tools/template/create.sh
@@ -5,28 +5,26 @@
MY_FUNCTION_NAME="funnyDijkstra"
DEVELOPER_NAME="Celia Virginia Vergara Castillo"
DEVELOPER_EMAIL="vicky_vergara at hotmail.com"
-YEAR="2015"
+YEAR="2016"
-# Notice the "\n " (change line and four spaces) after each comma
+# Note: the "\n " (change line and four spaces) after each comma
# first line are the inputs
# second line are the outputs
-MY_QUERY_LINE1="edges_sql TEXT,\n start_pid BIGINT,\n end_pids ANYARRAY,\n directed BOOLEAN DEFAULT true,"
-MY_QUERY_LINE2="OUT seq INTEGER,\n OUT path_seq INTEGER,\n OUT start_vid BIGINT,\n OUT end_vid BIGINT,\n OUT node BIGINT,\n OUT edge BIGINT,\n OUT cost FLOAT,\n OUT agg_cost FLOAT"
+MY_QUERY_LINE1="edges_sql TEXT,\n start_vid BIGINT,\n end_vid BIGINT,\n directed BOOLEAN DEFAULT true,\n only_cost BOOLEAN DEFAULT false,"
+MY_QUERY_LINE2=" OUT seq INTEGER,\n OUT path_seq INTEGER,\n OUT node BIGINT,\n OUT edge BIGINT,\n OUT cost FLOAT,\n OUT agg_cost FLOAT"
MY_RETURN_VALUE_TYPE="General_path_element_t"
MY_FUNCTION_NAME_UPPER=$(echo $MY_FUNCTION_NAME | tr 'a-z' 'A-Z')
+MY_FUNCTION_NAME_LOWER=$(echo $MY_FUNCTION_NAME | tr 'A-Z' 'a-z')
# Available types to store the edge information:
-# pgr_edge_t http://docs.pgrouting.org/doxy/2.3-dev-develop/structpgr__edge__t.html
-# Pgr_edge_xy_t http://docs.pgrouting.org/doxy/2.3-dev-develop/structPgr__edge__xy__t.html
+# http://docs.pgrouting.org/doxy/dev/structpgr__edge__t.html
+# http://docs.pgrouting.org/doxy/dev/structPgr__edge__xy__t.html
MY_EDGE_TYPE="pgr_edge_t"
# Available functions that read the edge information:
-# pgr_get_edges http://docs.pgrouting.org/doxy/2.3-dev-develop/edges__input_8h.html#a5598918a215c72c9bda7a7f016401b73
-# pgr_get_edges_xy http://docs.pgrouting.org/doxy/2.3-dev-develop/edges__input_8h.html#a5483d52e67b7996d80cd0cf3583d1720
-# pgr_get_edges_xy_reversed http://docs.pgrouting.org/doxy/2.3-dev-develop/edges__input_8h.html#adce525c316ba6244510553a5cee8451f
-# pgr_get_edges_no_id http://docs.pgrouting.org/doxy/2.3-dev-develop/edges__input_8h.html#a747dea3b61ecc407746f9d83d923fa64
+# http://docs.pgrouting.org/doxy/dev/edges__input_8h.html#
MY_EDGE_FUNCTION="pgr_get_edges"
@@ -69,7 +67,7 @@ sed -i "s/MY_QUERY_LINE1/$MY_QUERY_LINE1/" "$MY_FUNCTION_NAME"/sql/function1.sql
sed -i "s/MY_QUERY_LINE2/$MY_QUERY_LINE2/" "$MY_FUNCTION_NAME"/sql/function1.sql
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/sql/function1.sql
sed -i "s/DEVELOPER_NAME/$DEVELOPER_NAME/" "$MY_FUNCTION_NAME"/sql/function1.sql
-sed -i "s/DEVELOPER_EMAIL/$MY_DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/sql/function1.sql
+sed -i "s/DEVELOPER_EMAIL/$DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/sql/function1.sql
sed -i "s/YEAR/$YEAR/" "$MY_FUNCTION_NAME"/sql/function1.sql
mv "$MY_FUNCTION_NAME"/sql/function1.sql "$MY_FUNCTION_NAME"/sql/"$MY_FUNCTION_NAME".sql
@@ -81,7 +79,7 @@ sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/src/CMakeList
echo "updating the function1.c file in src"
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/src/function1.c
sed -i "s/DEVELOPER_NAME/$DEVELOPER_NAME/" "$MY_FUNCTION_NAME"/src/function1.c
-sed -i "s/DEVELOPER_EMAIL/$MY_DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1.c
+sed -i "s/DEVELOPER_EMAIL/$DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1.c
sed -i "s/YEAR/$YEAR/" "$MY_FUNCTION_NAME"/src/function1.c
sed -i "s/MY_EDGE_TYPE/$MY_EDGE_TYPE/" "$MY_FUNCTION_NAME"/src/function1.c
sed -i "s/MY_EDGE_FUNCTION/$MY_EDGE_FUNCTION/" "$MY_FUNCTION_NAME"/src/function1.c
@@ -94,7 +92,7 @@ echo "updating the src/function1_driver.h"
sed -i "s/MY_FUNCTION_NAME_UPPER/$MY_FUNCTION_NAME_UPPER/g" "$MY_FUNCTION_NAME"/src/function1_driver.h
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/src/function1_driver.h
sed -i "s/DEVELOPER_NAME/$DEVELOPER_NAME/" "$MY_FUNCTION_NAME"/src/function1_driver.h
-sed -i "s/DEVELOPER_EMAIL/$MY_DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1_driver.h
+sed -i "s/DEVELOPER_EMAIL/$DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1_driver.h
sed -i "s/YEAR/$YEAR/" "$MY_FUNCTION_NAME"/src/function1_driver.h
sed -i "s/MY_EDGE_TYPE/$MY_EDGE_TYPE/" "$MY_FUNCTION_NAME"/src/function1_driver.h
sed -i "s/MY_QUERY_LINE1/$MY_QUERY_LINE1/" "$MY_FUNCTION_NAME"/src/function1_driver.h
@@ -105,7 +103,7 @@ mv "$MY_FUNCTION_NAME"/src/function1_driver.h "$MY_FUNCTION_NAME"/src/"$MY_FUNCT
echo "updating the src/function1_driver.cpp"
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
sed -i "s/DEVELOPER_NAME/$DEVELOPER_NAME/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
-sed -i "s/DEVELOPER_EMAIL/$MY_DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
+sed -i "s/DEVELOPER_EMAIL/$DEVELOPER_EMAIL/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
sed -i "s/YEAR/$YEAR/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
sed -i "s/MY_EDGE_TYPE/$MY_EDGE_TYPE/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
sed -i "s/MY_QUERY_LINE1/$MY_QUERY_LINE1/" "$MY_FUNCTION_NAME"/src/function1_driver.cpp
@@ -122,21 +120,31 @@ sed -i "s/MY_QUERY_LINE1/$MY_QUERY_LINE1/" "$MY_FUNCTION_NAME"/doc/pgr_function1
sed -i "s/MY_QUERY_LINE2/$MY_QUERY_LINE2/" "$MY_FUNCTION_NAME"/doc/pgr_function1.rst
mv "$MY_FUNCTION_NAME"/doc/pgr_function1.rst "$MY_FUNCTION_NAME"/doc/pgr_"$MY_FUNCTION_NAME".rst
-##### DOC #########
+echo "updating the doc/doc-pgr_function1.queries"
+sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/doc/doc-pgr_function1.queries
+mv "$MY_FUNCTION_NAME"/doc/doc-pgr_function1.queries "$MY_FUNCTION_NAME"/doc/doc-pgr_"$MY_FUNCTION_NAME".queries
+
+##### TEST #########
echo "updating test/test.conf"
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/test/test.conf
-echo "updating test/test.conf"
+echo "updating test/doc-function1.test.sql"
sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/test/doc-function1.test.sql
-sed -i "s/MY_QUERY_LINE1/$MY_QUERY_LINE1/" "$MY_FUNCTION_NAME"/test/doc-function1.test.sql
-sed -i "s/MY_QUERY_LINE2/$MY_QUERY_LINE2/" "$MY_FUNCTION_NAME"/test/doc-function1.test.sql
echo "updating the test/pgtap/types-check.sql"
-sed -i "s/MY_FUNCTION_NAME/$MY_FUNCTION_NAME/" "$MY_FUNCTION_NAME"/test/pgtap/types-check.sql
+sed -i "s/MY_FUNCTION_NAME_LOWER/$MY_FUNCTION_NAME_LOWER/g" "$MY_FUNCTION_NAME"/test/pgtap/types-check.sql
+
+echo "updating the test/pgtap/function1-compare-dijkstra.sql"
+sed -i "s/MY_FUNCTION_NAME_LOWER/$MY_FUNCTION_NAME_LOWER/g" "$MY_FUNCTION_NAME"/test/pgtap/function1-compare-dijkstra.sql
+
+echo "updating the test/pgtap/function1-innerQuery.sql"
+sed -i "s/MY_FUNCTION_NAME_LOWER/$MY_FUNCTION_NAME_LOWER/g" "$MY_FUNCTION_NAME"/test/pgtap/function1-innerQuery.sql
mv "$MY_FUNCTION_NAME"/test/doc-function1.test.sql "$MY_FUNCTION_NAME"/test/doc-"$MY_FUNCTION_NAME".test.sql
mv "$MY_FUNCTION_NAME"/test/doc-function1.result "$MY_FUNCTION_NAME"/test/doc-"$MY_FUNCTION_NAME".result
+mv "$MY_FUNCTION_NAME"/test/pgtap/function1-compare-dijkstra.sql "$MY_FUNCTION_NAME"/test//pgtap/"$MY_FUNCTION_NAME"-compare-dijkstra.sql
+mv "$MY_FUNCTION_NAME"/test/pgtap/function1-innerQuery.sql "$MY_FUNCTION_NAME"/test//pgtap/"$MY_FUNCTION_NAME"-innerQuery.sql
#move the whole structure to its place
mv "$MY_FUNCTION_NAME" ../../src/"$MY_FUNCTION_NAME"
diff --git a/tools/template/doc/CMakeLists.txt b/tools/template/doc/CMakeLists.txt
deleted file mode 100644
index e69de29..0000000
diff --git a/tools/template/doc/doc-pgr_function1.queries b/tools/template/doc/doc-pgr_function1.queries
new file mode 100644
index 0000000..f7141d3
--- /dev/null
+++ b/tools/template/doc/doc-pgr_function1.queries
@@ -0,0 +1,32 @@
+BEGIN;
+BEGIN
+-- q1
+SELECT * FROM pgr_MY_FUNCTION_NAME(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3
+);
+ seq | path_seq | node | edge | cost | agg_cost
+-----+----------+------+------+------+----------
+ 1 | 1 | 2 | 4 | 1 | 0
+ 2 | 2 | 5 | 8 | 1 | 1
+ 3 | 3 | 6 | 9 | 1 | 2
+ 4 | 4 | 9 | 16 | 1 | 3
+ 5 | 5 | 4 | 3 | 1 | 4
+ 6 | 6 | 3 | -1 | 0 | 5
+(6 rows)
+
+-- q2
+SELECT * FROM pgr_MY_FUNCTION_NAME(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3,
+ FALSE
+);
+ seq | path_seq | node | edge | cost | agg_cost
+-----+----------+------+------+------+----------
+ 1 | 1 | 2 | 2 | 1 | 0
+ 2 | 2 | 3 | -1 | 0 | 1
+(2 rows)
+
+-- q3
+ROLLBACK;
+ROLLBACK
diff --git a/tools/template/doc/pgr_function1.rst b/tools/template/doc/pgr_function1.rst
index 5758515..27a373f 100644
--- a/tools/template/doc/pgr_function1.rst
+++ b/tools/template/doc/pgr_function1.rst
@@ -7,34 +7,16 @@
Alike 3.0 License: http://creativecommons.org/licenses/by-sa/3.0/
****************************************************************************
- INSTRUCTIONS
- - if section consists of only one value then use this file as index.rst
- - change [...] (including the square braquets) to appropiate values
- - one file / function, may signatures of the same function go in the same file
-
.. _pgr_MY_FUNCTION_NAME:
pgr_MY_FUNCTION_NAME
===============================================================================
-
-Name
--------------------------------------------------------------------------------
-
-``pgr_MY_FUNCTION_NAME`` — [medium description of
-function1 it can span many
-lines]
-
-.. warning:: This is a proposed function.
-
- - Is not officially in the current release
-
-
-..
- keep if uses boost (this is a comment)
+``pgr_MY_FUNCTION_NAME`` — Returns the shortest path(s) using Dijkstra algorithm.
+In particular, the Dijkstra algorithm implemented by Boost.Graph.
.. figure:: ../../../doc/src/introduction/images/boost-inside.jpeg
- :target: http://www.boost.org/libs/graph
+ :target: http://www.boost.org/libs/graph/doc/dijkstra_shortest_paths.html
Boost Graph Inside
@@ -42,18 +24,14 @@ lines]
Synopsis
-------------------------------------------------------------------------------
-Very long description of function
+Dijkstra's algorithm, conceived by Dutch computer scientist Edsger Dijkstra in 1956.
+It is a graph search algorithm that solves the shortest path problem for
+a graph with non-negative edge path costs, producing a shortest path from
+a starting vertex (``start_vid``) to an ending vertex (``end_vid``).
+This implementation can be used with a directed graph and an undirected graph.
-..
- SPHINX manual
- http://www.sphinx-doc.org/en/stable/rest.html
-
-
-Characteristics:
-----------------
-
-..
- Here is a sample of the kind of information in this section:
+Characteristics
+-------------------------------------------------------------------------------
The main Characteristics are:
- Process is done only on edges with positive costs.
@@ -74,208 +52,102 @@ The main Characteristics are:
- `start_vid` ascending
- `end_vid` ascending
- - Runing time: :math:`O(| start\_vids | * (V \log V + E))`
+ - Running time: :math:`O(| start\_vids | * (V \log V + E))`
+
Signature Summary
-----------------
-..
- If the function has more than one signature
- Remove the unneseary parts of the signature, just leving the name of the parameters
- Like in these examples
-
.. code-block:: none
- pgr_MY_FUNCTION_NAME(edges_sql, start_vid, end_vids)
- pgr_MY_FUNCTION_NAME(edges_sql, start_vids, end_vids, directed:=true)
- RETURNS SET OF (seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)
- OR EMPTY SET
+ pgr_dijkstra(edges_sql, start_vid, end_vid)
-
-..
- This is a reminder of how your query looks like
- pgr_MY_FUNCTION_NAME(
- MY_QUERY_LINE1
- MY_QUERY_LINE2)
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
+ OR EMPTY SET
Signatures
-===============================================================================
+-------------------------------------------------------------------------------
-.. index::
- single: pgr_MY_FUNCTION_NAME(edges_sql, start_vid, end_vids) - proposed
+.. index::
+ single: MY_FUNCTION_NAME(Minimal Use)
Minimal signature
------------------
-
-
-..
- Small description, example:
-
-The minimal signature is for a **directed** graph from one ``start_vid`` to many ``end_vids``:
+.......................................
.. code-block:: none
- pgr_MY_FUNCTION_NAME(edges_sql, start_vid, end_vids)
- RETURNS SET OF (seq, path_seq [, start_vid] [, end_vid], node, edge, cost, agg_cost)
- OR EMPTY SET
-
-:Example:
+ pgr_MY_FUNCTION_NAME(edges_sql, start_vid, end_vid)
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost) or EMPTY SET
-.. literalinclude:: doc-MY_FUNCTION_NAME.queries
- :start-after: --q1
- :end-before: --q2
+The minimal signature is for a **directed** graph from one ``start_vid`` to one ``end_vid``:
+:Example:
-Complete signature
-------------------
+.. literalinclude:: doc-pgr_MY_FUNCTION_NAME.queries
+ :start-after: -- q1
+ :end-before: -- q2
-This signature performs a .....
- - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
- - on an **undirected** graph when ``directed`` flag is set to ``false``.
+.. index::
+ single: MY_FUNCTION_NAME(Complete signature)
-.. index::
- single: pgr_MY_FUNCTION_NAME(edges_sql, start_vids, end_vids, directed:=true) - proposed
+Complete Signature
+.......................................
.. code-block:: none
- pgr_MY_FUNCTION_NAME( [parameters],
- boolean directed:=true);
- RETURNS SET OF ( [output] ) or EMPTY SET
+ pgr_MY_FUNCTION_NAME(edges_sql, start_vid, end_vid, directed);
+ RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost) or EMPTY SET
+This signature finds the shortest path from one ``start_vid`` to one ``end_vid``:
+ - on a **directed** graph when ``directed`` flag is missing or is set to ``true``.
+ - on an **undirected** graph when ``directed`` flag is set to ``false``.
:Example:
-.. literalinclude:: doc-MY_FUNCTION_NAME.queries
- :start-after: --q2
- :end-before: --q3
+.. literalinclude:: doc-pgr_MY_FUNCTION_NAME.queries
+ :start-after: -- q2
+ :end-before: -- q3
-Description of the Signatures
-=============================
-..
- DELETE / ADD DEPENDING ON YOUR REQUIREMENTS
-Description of the SQL query
--------------------------------------------------------------------------------
-
-:edges_sql: an SQL query, which should return a set of rows with the following columns:
-
-================ =================== =================================================
-Column Type Description
-================ =================== =================================================
-**id** ``ANY-INTEGER`` Identifier of the edge.
-**source** ``ANY-INTEGER`` Identifier of the first end point vertex of the edge.
-**target** ``ANY-INTEGER`` Identifier of the second end point vertex of the edge.
-**cost** ``ANY-NUMERICAL`` Weight of the edge `(source, target)`, If negative: edge `(source, target)` does not exist, therefore it's not part of the graph.
-**reverse_cost** ``ANY-NUMERICAL`` (optional) Weight of the edge `(target, source)`, If negative: edge `(target, source)` does not exist, therefore it's not part of the graph.
-================ =================== =================================================
-
-Description of the Points SQL query
--------------------------------------------------------------------------------
-
-:points_sql: an SQL query, which should return a set of rows with the following columns:
-
-============ ================= =================================================
-Column Type Description
-============ ================= =================================================
-**pid** ``ANY-INTEGER`` (optional) Identifier of the point. Can not be NULL. If column not present, a sequential identifier will be given automatically.
-**eid** ``ANY-INTEGER`` Identifier of the "closest" edge to the point.
-**fraction** ``ANY-NUMERICAL`` Value in [0,1] that indicates the relative postition from the first end point of the edge.
-**side** ``CHAR`` (optional) Value in ['b', 'r', 'l', NULL] indicating if the point is:
- - In the right, left of the edge or
- - If it doesn't matter with 'b' or NULL.
- - If column not present 'b' is considered.
-
- Can be in upper or lower case.
-============ ================= =================================================
-
-
-Where:
-
-:ANY-INTEGER: SMALLINT, INTEGER, BIGINT
-:ANY-NUMERICAL: SMALLINT, INTEGER, BIGINT, REAL, FLOAT
-
-
-Description of the parameters of the signatures
+Description of the Signatures
-------------------------------------------------------------------------------
-============== ====================== =================================================
-Column Type Description
-============== ====================== =================================================
-**edges_sql** ``TEXT`` SQL query as decribed above.
-**points_sql** ``TEXT`` Points SQL query as decribed above.
-**start_vid** ``BIGINT`` Identifier of the starting vertex of the path.
-**start_vids** ``ARRAY[ANY-INTEGER]`` Array of identifiers of starting vertices.
-**end_vid** ``BIGINT`` Identifier of the ending vertex of the path.
-**end_vids** ``ARRAY[ANY-INTEGER]`` Array of identifiers of ending vertices.
-**directed** ``BOOLEAN`` (optional). When ``false`` the graph is considered as Undirected. Default is ``true`` which considers the graph as Directed.
-============== ====================== =================================================
-
-
-Examples
-========
-
-The examples of this section are based on the :ref:`sampledata` network.
-
-
-
-[put as many examples as needed and use the documentation data for the examples]
-
-:Example:
-
-.. literalinclude:: doc-MY_FUNCTION_NAME.queries
- :start-after: --q2
- :end-before: --q3
-
-..
- If needed here are some subtitles
-
-Examples for queries marked as ``directed`` with ``cost`` and ``reverse_cost`` columns
---------------------------------------------------------------------------------------
-
-The examples in this section use the following :ref:`fig1`
-
-:Example: This example is in a subtitle
-
-.. literalinclude:: doc-MY_FUNCTION_NAME.queries
- :start-after: --q2
- :end-before: --q3
-
-
-Examples for queries marked as ``undirected`` with ``cost`` and ``reverse_cost`` columns
-----------------------------------------------------------------------------------------
-
-The examples in this section use the following :ref:`fig2`
-
-
-
-Examples for queries marked as ``directed`` with ``cost`` column
-----------------------------------------------------------------------------------------
-
-The examples in this section use the following :ref:`fig3`
-
+.. include:: ../../common/src/edges_input.h
+ :start-after: basic_edges_sql_start
+ :end-before: basic_edges_sql_end
-Examples for queries marked as ``undirected`` with ``cost`` column
-----------------------------------------------------------------------------------------
+.. include:: ../../dijkstra/sql/dijkstra.sql
+ :start-after: pgr_dijkstra_parameters_start
+ :end-before: pgr_dijkstra_parameters_end
-The examples in this section use the following :ref:`fig4`
+Description of the return values
+...............................................................................
+Returns set of ``(seq, path_seq, node, edge, cost, agg_cost)``
-The queries use the :ref:`sampledata` network.
+============== ========== =================================================
+Column Type Description
+============== ========== =================================================
+**seq** ``INT`` Sequential value starting from **1**.
+**path_seq** ``INT`` Relative position in the path. Has value **1** for the beginning of a path.
+**node** ``BIGINT`` Identifier of the node in the path from ``start_vid`` to ``end_vid``.
+**edge** ``BIGINT`` Identifier of the edge used to go from ``node`` to the next node in the path sequence. ``-1`` for the last node of the path.
+**cost** ``FLOAT`` Cost to traverse from ``node`` using ``edge`` to the next node in the path sequence.
+**agg_cost** ``FLOAT`` Aggregate cost from ``start_v`` to ``node``.
+============== ========== =================================================
-.. rubric:: History
-* Official in version X.X
-* Proposed in version Y.Y
See Also
-------------------------------------------------------------------------------
* http://en.wikipedia.org/wiki/Dijkstra%27s_algorithm
+* The queries use the :ref:`sampledata` network.
.. rubric:: Indices and tables
diff --git a/tools/template/sql/function1.sql b/tools/template/sql/function1.sql
index 49e58e6..d5991a3 100644
--- a/tools/template/sql/function1.sql
+++ b/tools/template/sql/function1.sql
@@ -2,7 +2,7 @@
File: MY_FUNCTION_NAME.sql
Generated with Template by:
-Copyright (c) 2015 pgRouting developers
+Copyright (c) 2016 pgRouting developers
Mail: project at pgrouting.org
Function's developer:
@@ -31,7 +31,7 @@ CREATE OR REPLACE FUNCTION pgr_MY_FUNCTION_NAME(
MY_QUERY_LINE1
MY_QUERY_LINE2)
- RETURNS SETOF RECORD AS
- '$libdir/${PGROUTING_LIBRARY_NAME}', 'MY_FUNCTION_NAME'
- LANGUAGE c IMMUTABLE STRICT;
+RETURNS SETOF RECORD AS
+'$libdir/${PGROUTING_LIBRARY_NAME}', 'MY_FUNCTION_NAME'
+LANGUAGE c IMMUTABLE STRICT;
diff --git a/tools/template/src/CMakeLists.txt b/tools/template/src/CMakeLists.txt
index be950a2..ff3d4b4 100644
--- a/tools/template/src/CMakeLists.txt
+++ b/tools/template/src/CMakeLists.txt
@@ -1,3 +1,4 @@
-ADD_LIBRARY(MY_FUNCTION_NAME OBJECT
- MY_FUNCTION_NAME.c
- MY_FUNCTION_NAME_driver.cpp)
+ADD_LIBRARY(MY_FUNCTION_NAME OBJECT
+ MY_FUNCTION_NAME.c
+ MY_FUNCTION_NAME_driver.cpp
+ )
diff --git a/tools/template/src/function1.c b/tools/template/src/function1.c
index f74a560..b6508f6 100644
--- a/tools/template/src/function1.c
+++ b/tools/template/src/function1.c
@@ -5,10 +5,11 @@ Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
-Function's developer:
+Function's developer:
Copyright (c) YEAR DEVELOPER_NAME
Mail: DEVELOPER_EMAIL
+
------
This program is free software; you can redistribute it and/or modify
@@ -27,117 +28,179 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-#include "postgres.h"
-#include "executor/spi.h"
+/** @file MY_FUNCTION_NAME.c
+ * @brief Conecting code with postgres.
+ *
+ * This file is fully documented for understanding
+ * how the postgres connectinon works
+ *
+ * TODO Remove unnecessary comments before submiting the function.
+ * some comments are in form of PGR_DBG message
+ */
+
+/**
+ * postgres_connection.h
+ *
+ * - should allways be first in the C code
+ */
+#include "./../../common/src/postgres_connection.h"
+
+/**
+ * funcapi.h
+ *
+ * - While developing to not show postgres header files warnings:
+ * - wrap the file(s) with the appropiate dignostic to be ignored
+ */
+#ifdef __GNUC__
+#pragma GCC diagnostic ignored "-Wunused-parameter"
+#endif
+
#include "funcapi.h"
-#include "utils/array.h"
-#include "catalog/pg_type.h"
+
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
#if PGSQL_VERSION > 92
#include "access/htup_details.h"
#endif
-
-/*
- Uncomment when needed
-*/
-// #define DEBUG
-
#include "fmgr.h"
-#include "./../../common/src/debug_macro.h"
-#include "./../../common/src/time_msg.h"
-#include "./../../common/src/pgr_types.h"
-#include "./../../common/src/postgres_connection.h"
-#include "./../../common/src/edges_input.h"
-#include "./../../common/src/arrays_input.h"
-#include "./MY_FUNCTION_NAME_driver.h"
+#include "./../../common/src/debug_macro.h" // for macro PGR_DBG
+#include "./../../common/src/e_report.h" // for pgr_global_report
+#include "./../../common/src/time_msg.h" // for time_msg & clock
+#include "./../../common/src/pgr_types.h" // for the current accepted types
+#include "./../../common/src/edges_input.h" // for functions to get edges informtion
+
+#include "./MY_FUNCTION_NAME_driver.h" // the C++ code of the function
PG_FUNCTION_INFO_V1(MY_FUNCTION_NAME);
-#ifndef _MSC_VER
-Datum
-#else // _MSC_VER
-PGDLLEXPORT Datum
-#endif
-MY_FUNCTION_NAME(PG_FUNCTION_ARGS);
+PGDLLEXPORT Datum MY_FUNCTION_NAME(PG_FUNCTION_ARGS);
-/*******************************************************************************/
-/* MODIFY AS NEEDED */
+/******************************************************************************/
+/* MODIFY AS NEEDED */
static
void
-process( char* edges_sql,
+process(
+ char* edges_sql,
int64_t start_vid,
- int64_t *end_vidsArr,
- size_t size_end_vidsArr,
+ int64_t end_vid,
+#if 0
+ /*
+ * handling arrays example
+ */
+ ArrayType *starts,
+ ArrayType *ends,
+#endif
bool directed,
+ bool only_cost,
MY_RETURN_VALUE_TYPE **result_tuples,
size_t *result_count) {
+
+ /* https://www.postgresql.org/docs/current/static/spi-spi-connect.html */
pgr_SPI_connect();
+
+#if 0
+ /*
+ * handling arrays example
+ */
+
+ PGR_DBG("Initializing arrays");
+ int64_t* start_vidsArr = NULL;
+ size_t size_start_vidsArr = 0;
+ start_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_start_vidsArr, starts);
+ PGR_DBG("start_vidsArr size %ld ", size_start_vidsArr);
+
+ int64_t* end_vidsArr = NULL;
+ size_t size_end_vidsArr = 0;
+ end_vidsArr = (int64_t*)
+ pgr_get_bigIntArray(&size_end_vidsArr, ends);
+ PGR_DBG("end_vidsArr size %ld ", size_end_vidsArr);
+#endif
+
+ (*result_tuples) = NULL;
+ (*result_count) = 0;
+
PGR_DBG("Load data");
MY_EDGE_TYPE *edges = NULL;
size_t total_edges = 0;
+ if (start_vid == end_vid) {
+ /* https://www.postgresql.org/docs/current/static/spi-spi-finish.html */
+ pgr_SPI_finish();
+ return;
+ }
+
MY_EDGE_FUNCTION(edges_sql, &edges, &total_edges);
PGR_DBG("Total %ld edges in query:", total_edges);
if (total_edges == 0) {
PGR_DBG("No edges found");
- (*result_count) = 0;
- (*result_tuples) = NULL;
pgr_SPI_finish();
return;
}
PGR_DBG("Starting processing");
- char *err_msg = NULL;
- char *log_msg = NULL;
-
- // Code standard:
- // Pass the arrays and the sizes on the same line
clock_t start_t = clock();
+ char *log_msg = NULL;
+ char *notice_msg = NULL;
+ char *err_msg = NULL;
do_pgr_MY_FUNCTION_NAME(
- edges, total_edges,
+ edges,
+ total_edges,
start_vid,
+ end_vid,
+#if 0
+ /*
+ * handling arrays example
+ */
+
+ start_vidsArr, size_start_vidsArr,
end_vidsArr, size_end_vidsArr,
+#endif
+
directed,
+ only_cost,
result_tuples,
result_count,
&log_msg,
+ ¬ice_msg,
&err_msg);
- time_msg(" processing pgr_funnyDijkstra", start_t, clock());
- PGR_DBG("Returning %ld tuples\n", *result_count);
- PGR_DBG("LOG: %s\n", log_msg);
- if (log_msg) free(log_msg);
+ time_msg(" processing pgr_MY_FUNCTION_NAME", start_t, clock());
+ PGR_DBG("Returning %ld tuples", *result_count);
if (err_msg) {
if (*result_tuples) free(*result_tuples);
- if (end_vidsArr) free(end_vidsArr);
- elog(ERROR, "%s", err_msg);
- free(err_msg);
}
+ pgr_global_report(&log_msg, ¬ice_msg, &err_msg);
+
+ if (edges) pfree(edges);
+#if 0
+ /*
+ * handling arrays example
+ */
+
+ if (end_vidsArr) pfree(end_vidsArr);
+ if (start_vidsArr) pfree(start_vidsArr);
+#endif
- pfree(edges);
pgr_SPI_finish();
}
/* */
/******************************************************************************/
-#ifndef _MSC_VER
-Datum
-#else // _MSC_VER
-PGDLLEXPORT Datum
-#endif
-MY_FUNCTION_NAME(PG_FUNCTION_ARGS) {
+PGDLLEXPORT Datum MY_FUNCTION_NAME(PG_FUNCTION_ARGS) {
FuncCallContext *funcctx;
- uint32_t call_cntr;
- uint32_t max_calls;
TupleDesc tuple_desc;
/**************************************************************************/
/* MODIFY AS NEEDED */
/* */
- MY_RETURN_VALUE_TYPE *result_tuples = 0;
+ MY_RETURN_VALUE_TYPE *result_tuples = NULL;
size_t result_count = 0;
/* */
/**************************************************************************/
@@ -154,90 +217,92 @@ MY_FUNCTION_NAME(PG_FUNCTION_ARGS) {
MY_QUERY_LINE1
**********************************************************************/
- PGR_DBG("Initializing arrays");
- int64_t* end_vidsArr;
- size_t size_end_vidsArr;
- end_vidsArr = (int64_t*) pgr_get_bigIntArray(&size_end_vidsArr, PG_GETARG_ARRAYTYPE_P(2));
- PGR_DBG("targetsArr size %ld ", size_end_vidsArr);
PGR_DBG("Calling process");
- // Code standard:
- // Use same order as in the query
- // Pass the array and it's size on the same line
process(
- pgr_text2char(PG_GETARG_TEXT_P(0)),
+ text_to_cstring(PG_GETARG_TEXT_P(0)),
PG_GETARG_INT64(1),
- end_vidsArr, size_end_vidsArr,
+ PG_GETARG_INT64(2),
+#if 0
+ /*
+ * handling arrays example
+ */
+
+ PG_GETARG_ARRAYTYPE_P(1),
+ PG_GETARG_ARRAYTYPE_P(2),
+#endif
PG_GETARG_BOOL(3),
+ PG_GETARG_BOOL(4),
&result_tuples,
&result_count);
- // while developing leave the message as a reminder
- PGR_DBG("Cleaning arrays using free(<array-name>)");
- free(end_vidsArr);
- /* */
- /*******************************************************************************/
- funcctx->max_calls = (uint32_t) result_count;
+ /* */
+ /**********************************************************************/
+
+#if PGSQL_VERSION > 94
+ funcctx->max_calls = result_count;
+#else
+ funcctx->max_calls = (uint32_t)result_count;
+#endif
funcctx->user_fctx = result_tuples;
- if (get_call_result_type(fcinfo, NULL, &tuple_desc) != TYPEFUNC_COMPOSITE)
+ if (get_call_result_type(fcinfo, NULL, &tuple_desc)
+ != TYPEFUNC_COMPOSITE) {
ereport(ERROR,
(errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
errmsg("function returning record called in context "
"that cannot accept type record")));
+ }
funcctx->tuple_desc = tuple_desc;
MemoryContextSwitchTo(oldcontext);
}
funcctx = SRF_PERCALL_SETUP();
- call_cntr = funcctx->call_cntr;
- max_calls = funcctx->max_calls;
tuple_desc = funcctx->tuple_desc;
result_tuples = (MY_RETURN_VALUE_TYPE*) funcctx->user_fctx;
- if (call_cntr < max_calls) {
+ if (funcctx->call_cntr < funcctx->max_calls) {
HeapTuple tuple;
Datum result;
Datum *values;
bool* nulls;
- /*******************************************************************************/
- /* MODIFY!!!!! */
- /* This has to match you ouput otherwise the server crashes */
+ /**********************************************************************/
+ /* MODIFY AS NEEDED */
/*
MY_QUERY_LINE2
- ********************************************************************************/
+ ***********************************************************************/
+ values = palloc(6 * sizeof(Datum));
+ nulls = palloc(6 * sizeof(bool));
- values = palloc(8 * sizeof(Datum));
- nulls = palloc(8 * sizeof(bool));
size_t i;
- for(i = 0; i < 8; ++i) {
+ for (i = 0; i < 6; ++i) {
nulls[i] = false;
}
-
// postgres starts counting from 1
- values[0] = Int32GetDatum(call_cntr + 1);
- values[1] = Int32GetDatum(result_tuples[call_cntr].seq);
- values[2] = Int64GetDatum(result_tuples[call_cntr].start_id);
- values[3] = Int64GetDatum(result_tuples[call_cntr].end_id);
- values[4] = Int64GetDatum(result_tuples[call_cntr].node);
- values[5] = Int64GetDatum(result_tuples[call_cntr].edge);
- values[6] = Float8GetDatum(result_tuples[call_cntr].cost);
- values[7] = Float8GetDatum(result_tuples[call_cntr].agg_cost);
- /*******************************************************************************/
+ values[0] = Int32GetDatum(funcctx->call_cntr + 1);
+ values[1] = Int32GetDatum(result_tuples[funcctx->call_cntr].seq);
+ values[2] = Int64GetDatum(result_tuples[funcctx->call_cntr].node);
+ values[3] = Int64GetDatum(result_tuples[funcctx->call_cntr].edge);
+ values[4] = Float8GetDatum(result_tuples[funcctx->call_cntr].cost);
+ values[5] = Float8GetDatum(result_tuples[funcctx->call_cntr].agg_cost);
+ /**********************************************************************/
tuple = heap_form_tuple(tuple_desc, values, nulls);
result = HeapTupleGetDatum(tuple);
SRF_RETURN_NEXT(funcctx, result);
} else {
- // cleanup
- if (result_tuples) free(result_tuples);
+ /**********************************************************************/
+ /* MODIFY AS NEEDED */
+
+ PGR_DBG("Clean up code");
+
+ /**********************************************************************/
SRF_RETURN_DONE(funcctx);
}
}
-
diff --git a/tools/template/src/function1_driver.cpp b/tools/template/src/function1_driver.cpp
index 9656245..d9035c5 100644
--- a/tools/template/src/function1_driver.cpp
+++ b/tools/template/src/function1_driver.cpp
@@ -27,134 +27,131 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
********************************************************************PGR-GNU*/
-
-#ifdef __MINGW32__
+#if defined(__MINGW32__) || defined(_MSC_VER)
#include <winsock2.h>
#include <windows.h>
-#ifdef open
-#undef open
-#endif
#endif
-
#include <sstream>
#include <deque>
-#include <algorithm>
#include <vector>
-#include "./pgr_dijkstra.hpp"
+
#include "./MY_FUNCTION_NAME_driver.h"
-#include "./../../common/src/pgr_types.h"
+
+#include "../../common/src/pgr_alloc.hpp"
#include "./../../common/src/pgr_assert.h"
-#include "./../../common/src/pgr_alloc.hpp"
+#include "./../../common/src/pgr_types.h"
+
+#include "./../../dijkstra/src/pgr_dijkstra.hpp"
+
+
+
/************************************************************
MY_QUERY_LINE1
***********************************************************/
+
+template < class G >
+static
+Path
+pgr_MY_FUNCTION_NAME(
+ G &graph,
+ int64_t source,
+ int64_t target,
+ bool only_cost = false) {
+ Path path;
+ Pgr_dijkstra< G > fn_dijkstra;
+ return fn_dijkstra.dijkstra(graph, source, target, only_cost);
+}
+
+
void
do_pgr_MY_FUNCTION_NAME(
- MY_EDGE_TYPE *data_edges, size_t total_edges,
+ MY_EDGE_TYPE *data_edges,
+ size_t total_edges,
int64_t start_vid,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
+ int64_t end_vid,
bool directed,
+ bool only_cost,
MY_RETURN_VALUE_TYPE **return_tuples,
size_t *return_count,
char ** log_msg,
- char ** err_msg){
- std::ostringstream err;
+ char ** notice_msg,
+ char ** err_msg) {
std::ostringstream log;
+ std::ostringstream err;
+ std::ostringstream notice;
try {
-
pgassert(!(*log_msg));
+ pgassert(!(*notice_msg));
pgassert(!(*err_msg));
pgassert(!(*return_tuples));
pgassert(*return_count == 0);
pgassert(total_edges != 0);
- /* depending on the functionality some tests can be done here
- * For example */
- if (total_edges <= 1) {
- err << "Required: more than one edges\n";
- (*return_tuples) = NULL;
- (*return_count) = 0;
- *err_msg = strdup(err.str().c_str());
- return;
- }
-
graphType gType = directed? DIRECTED: UNDIRECTED;
- std::deque< Path >paths;
- // samll logs
- log << "Inserting vertices into a c++ vector structure\n";
- std::vector< int64_t > end_vertices(end_vidsArr, end_vidsArr + size_end_vidsArr);
- std::sort(end_vertices.begin(),end_vertices.end());
-#ifndef NDEBUG
- // big logs with cycles wrap them so on release they wont consume time
- log << "end vids: ";
- for (const auto &vid : end_vertices) log << vid << ",";
- log << "\nstart vid:" << start_vid << "\n";
-#endif
+ Path path;
if (directed) {
- // very detailed logging
log << "Working with directed Graph\n";
- pgRouting::DirectedGraph digraph(gType);
- log << "Working with directed Graph 1 \n";
- digraph.graph_insert_data(data_edges, total_edges);
-
-#ifndef NDEBUG
- // a graph log is a big log
- log << digraph;
-#endif
-
- log << "Working with directed Graph 2\n";
- pgr_dijkstra(digraph, paths, start_vid, end_vertices, false);
- log << "Working with directed Graph 3\n";
+ pgrouting::DirectedGraph digraph(gType);
+ digraph.insert_edges(data_edges, total_edges);
+ path = pgr_MY_FUNCTION_NAME(digraph,
+ start_vid,
+ end_vid,
+ only_cost);
} else {
- // maybe the code is working so cleaner logging
log << "Working with Undirected Graph\n";
- pgRouting::UndirectedGraph undigraph(gType);
- undigraph.graph_insert_data(data_edges, total_edges);
- pgr_dijkstra(undigraph, paths, start_vid, end_vertices, false);
+ pgrouting::UndirectedGraph undigraph(gType);
+ undigraph.insert_edges(data_edges, total_edges);
+ path = pgr_MY_FUNCTION_NAME(
+ undigraph,
+ start_vid,
+ end_vid,
+ only_cost);
}
- // use auto when possible
- auto count(count_tuples(paths));
+ auto count = path.size();
if (count == 0) {
(*return_tuples) = NULL;
(*return_count) = 0;
- log <<
- "No paths found between Starting and any of the Ending vertices\n";
- *log_msg = strdup(log.str().c_str());
+ notice <<
+ "No paths found between start_vid and end_vid vertices";
return;
}
- // get the space required to store all the paths
(*return_tuples) = pgr_alloc(count, (*return_tuples));
- log << "Converting a set of paths into the tuples\n";
- (*return_count) = (collapse_paths(return_tuples, paths));
-
- *err_msg = NULL;
- *log_msg = strdup(log.str().c_str());
-
- } catch (AssertFailedException &exept) {
+ size_t sequence = 0;
+ path.generate_postgres_data(return_tuples, sequence);
+ (*return_count) = sequence;
+
+ pgassert(*err_msg == NULL);
+ *log_msg = log.str().empty()?
+ nullptr :
+ strdup(log.str().c_str());
+ *notice_msg = notice.str().empty()?
+ nullptr :
+ strdup(notice.str().c_str());
+ } catch (AssertFailedException &except) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << exept.what() << "\n";
- *err_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
- } catch (std::exception& exept) {
+ } catch (std::exception &except) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << exept.what() << "\n";
- *err_msg = strdup(log.str().c_str());
+ err << except.what();
+ *err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
} catch(...) {
if (*return_tuples) free(*return_tuples);
(*return_count) = 0;
- err << "Caught unknown exception!\n";
- *err_msg = strdup(log.str().c_str());
+ err << "Caught unknown exception!";
+ *err_msg = strdup(err.str().c_str());
*log_msg = strdup(log.str().c_str());
}
}
diff --git a/tools/template/src/function1_driver.h b/tools/template/src/function1_driver.h
index 4c4c5a0..69fc890 100644
--- a/tools/template/src/function1_driver.h
+++ b/tools/template/src/function1_driver.h
@@ -1,12 +1,13 @@
/*PGR-GNU*****************************************************************
File: MY_FUNCTION_NAME_driver.h
+Generated with Template by:
Copyright (c) 2015 pgRouting developers
Mail: project at pgrouting.org
Function's developer:
-Copyright (c) YEAR DEVELOPER_NAME
-Mail: DEVELOPER_EMAIL
+Copyright (c) 2015 Celia Virginia Vergara Castillo
+Mail: vicky_vergara at hotmail.com
------
@@ -28,6 +29,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#ifndef SRC_MY_FUNCTION_NAME_UPPER_SRC_MY_FUNCTION_NAME_UPPER_DRIVER_H_
#define SRC_MY_FUNCTION_NAME_UPPER_SRC_MY_FUNCTION_NAME_UPPER_DRIVER_H_
+#pragma once
#include "./../../common/src/pgr_types.h"
@@ -39,16 +41,20 @@ extern "C" {
MY_QUERY_LINE1
********************************************************/
- // Code standard:
- // Pass the arrays and the sizes on the same line
- void do_pgr_MY_FUNCTION_NAME(
- MY_EDGE_TYPE *data_edges, size_t total_edges,
- int64_t start_vid,
- int64_t *end_vidsArr, size_t size_end_vidsArr,
- bool directed,
- MY_RETURN_VALUE_TYPE **return_tuples, size_t *return_count,
- char ** log_msg,
- char ** err_msg);
+
+ void
+ do_pgr_MY_FUNCTION_NAME(
+ MY_EDGE_TYPE *data_edges,
+ size_t total_edges,
+ int64_t start_vid,
+ int64_t end_vid,
+ bool directed,
+ bool only_cost,
+ MY_RETURN_VALUE_TYPE **return_tuples,
+ size_t *return_count,
+ char ** log_msg,
+ char ** notice_msg,
+ char ** err_msg);
#ifdef __cplusplus
diff --git a/tools/template/test/doc-function1.result b/tools/template/test/doc-function1.result
index 798ae10..3a16953 100644
--- a/tools/template/test/doc-function1.result
+++ b/tools/template/test/doc-function1.result
@@ -1,19 +1,11 @@
---q1
-1|1|2|3|2|4|1|0
-2|2|2|3|5|8|1|1
-3|3|2|3|6|9|1|2
-4|4|2|3|9|16|1|3
-5|5|2|3|4|3|1|4
-6|6|2|3|3|-1|0|5
-7|1|2|5|2|4|1|0
-8|2|2|5|5|-1|0|1
---q2
-1|1|2|3|2|4|1|0
-2|2|2|3|5|8|1|1
-3|3|2|3|6|9|1|2
-4|4|2|3|9|16|1|3
-5|5|2|3|4|3|1|4
-6|6|2|3|3|-1|0|5
-7|1|2|5|2|4|1|0
-8|2|2|5|5|-1|0|1
---q3
+-- q1
+1|1|2|4|1|0
+2|2|5|8|1|1
+3|3|6|9|1|2
+4|4|9|16|1|3
+5|5|4|3|1|4
+6|6|3|-1|0|5
+-- q2
+1|1|2|2|1|0
+2|2|3|-1|0|1
+-- q3
diff --git a/tools/template/test/doc-function1.test.sql b/tools/template/test/doc-function1.test.sql
index ba89b4c..e4dda96 100644
--- a/tools/template/test/doc-function1.test.sql
+++ b/tools/template/test/doc-function1.test.sql
@@ -1,13 +1,17 @@
+BEGIN;
-
-\echo --q1
+\echo -- q1
SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5, 3]);
-\echo --q2
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3
+);
+\echo -- q2
SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5, 3]);
-\echo --q3
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3,
+ FALSE
+);
+\echo -- q3
+ROLLBACK;
diff --git a/tools/template/test/pgtap/function1-compare-dijkstra.sql b/tools/template/test/pgtap/function1-compare-dijkstra.sql
new file mode 100644
index 0000000..361e6d5
--- /dev/null
+++ b/tools/template/test/pgtap/function1-compare-dijkstra.sql
@@ -0,0 +1,73 @@
+\i setup.sql
+
+SELECT plan(1156);
+
+SET client_min_messages TO ERROR;
+
+UPDATE edge_table SET cost = cost + 0.001 * id * id, reverse_cost = reverse_cost + 0.001 * id * id;
+
+CREATE or REPLACE FUNCTION MY_FUNCTION_NAME_LOWER_compare_dijkstra(cant INTEGER default 17)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+inner_sql TEXT;
+dijkstra_sql TEXT;
+MY_FUNCTION_NAME_LOWER_sql TEXT;
+BEGIN
+
+ FOR i IN 1.. cant LOOP
+ FOR j IN 1.. cant LOOP
+
+ -- DIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+
+ MY_FUNCTION_NAME_LOWER_sql := 'SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+ RETURN query SELECT set_eq(MY_FUNCTION_NAME_LOWER_sql, dijkstra_sql, MY_FUNCTION_NAME_LOWER_sql);
+
+
+ inner_sql := 'SELECT id, source, target, cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+
+ MY_FUNCTION_NAME_LOWER_sql := 'SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', true)';
+ RETURN query SELECT set_eq(MY_FUNCTION_NAME_LOWER_sql, dijkstra_sql, MY_FUNCTION_NAME_LOWER_sql);
+
+
+
+ -- UNDIRECTED
+ inner_sql := 'SELECT id, source, target, cost, reverse_cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+
+ MY_FUNCTION_NAME_LOWER_sql := 'SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+ RETURN query SELECT set_eq(MY_FUNCTION_NAME_LOWER_sql, dijkstra_sql, MY_FUNCTION_NAME_LOWER_sql);
+
+
+ inner_sql := 'SELECT id, source, target, cost FROM edge_table';
+ dijkstra_sql := 'SELECT * FROM pgr_dijkstra($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+
+ MY_FUNCTION_NAME_LOWER_sql := 'SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER($$' || inner_sql || '$$, ' || i || ', ' || j
+ || ', false)';
+ RETURN query SELECT set_eq(MY_FUNCTION_NAME_LOWER_sql, dijkstra_sql, MY_FUNCTION_NAME_LOWER_sql);
+
+
+ END LOOP;
+ END LOOP;
+
+ RETURN;
+END
+$BODY$
+language plpgsql;
+
+SELECT * from MY_FUNCTION_NAME_LOWER_compare_dijkstra();
+
+
+SELECT * FROM finish();
+ROLLBACK;
+
diff --git a/tools/template/test/pgtap/function1-innerQuery.sql b/tools/template/test/pgtap/function1-innerQuery.sql
new file mode 100644
index 0000000..dd9a023
--- /dev/null
+++ b/tools/template/test/pgtap/function1-innerQuery.sql
@@ -0,0 +1,116 @@
+\i setup.sql
+
+SELECT plan(47);
+SET client_min_messages TO ERROR;
+
+
+SELECT has_function('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['text', 'bigint', 'bigint', 'boolean','boolean']);
+
+SELECT function_returns('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['text', 'bigint', 'bigint', 'boolean','boolean'],
+ 'setof record');
+
+CREATE OR REPLACE FUNCTION test_anyInteger(fn TEXT, params TEXT[], parameter TEXT)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+start_sql TEXT;
+end_sql TEXT;
+query TEXT;
+p TEXT;
+BEGIN
+ start_sql = 'select * from ' || fn || '($$ SELECT ';
+ FOREACH p IN ARRAY params LOOP
+ IF p = parameter THEN CONTINUE;
+ END IF;
+ start_sql = start_sql || p || ', ';
+ END LOOP;
+ end_sql = ' FROM edge_table $$, 2, 3, true)';
+
+ query := start_sql || parameter || '::SMALLINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::INTEGER ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::BIGINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::REAL ' || end_sql;
+ RETURN query SELECT throws_ok(query);
+
+ query := start_sql || parameter || '::FLOAT8 ' || end_sql;
+ RETURN query SELECT throws_ok(query);
+END;
+$BODY$ LANGUAGE plpgsql;
+
+CREATE OR REPLACE FUNCTION test_anyNumerical(fn TEXT, params TEXT[], parameter TEXT)
+RETURNS SETOF TEXT AS
+$BODY$
+DECLARE
+start_sql TEXT;
+end_sql TEXT;
+query TEXT;
+p TEXT;
+BEGIN
+ start_sql = 'select * from ' || fn || '($$ SELECT ';
+ FOREACH p IN ARRAY params LOOP
+ IF p = parameter THEN CONTINUE;
+ END IF;
+ start_sql = start_sql || p || ', ';
+ END LOOP;
+ end_sql = ' FROM edge_table $$, 2, 3, true)';
+
+ query := start_sql || parameter || '::SMALLINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::INTEGER ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::BIGINT ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::REAL ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+
+ query := start_sql || parameter || '::FLOAT8 ' || end_sql;
+ RETURN query SELECT lives_ok(query);
+END;
+$BODY$ LANGUAGE plpgsql;
+
+--with reverse cost
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'id');
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'source');
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'target');
+SELECT test_anyNumerical('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'cost');
+SELECT test_anyNumerical('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost', 'reverse_cost'],
+ 'reverse_cost');
+
+
+--without reverse cost
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'id');
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'source');
+SELECT test_anyInteger('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'target');
+SELECT test_anyNumerical('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['id', 'source', 'target', 'cost'],
+ 'cost');
+
+
+SELECT finish();
+ROLLBACK;
diff --git a/tools/template/test/pgtap/types-check.sql b/tools/template/test/pgtap/types-check.sql
index c94d656..c745e56 100644
--- a/tools/template/test/pgtap/types-check.sql
+++ b/tools/template/test/pgtap/types-check.sql
@@ -1,144 +1,53 @@
-
\i setup.sql
-SELECT plan(19);
-SELECT has_function('pgr_MY_FUNCTION_NAME', ARRAY['text','bigint','anyarray','boolean']);
-SELECT function_returns('pgr_MY_FUNCTION_NAME', ARRAY['text','bigint','anyarray','boolean'],'setof record');
+SELECT plan(6);
+
+SELECT can(ARRAY['pgr_MY_FUNCTION_NAME_LOWER']);
-PREPARE v21q01 AS
-SELECT 'integer'::text AS t1,'integer'::text AS t2,
-'bigint'::text AS t5, 'bigint'::text AS t6,
-'double precision'::text AS t7, 'double precision'::text AS t8;
-PREPARE v21q10 AS
+--V2.4+
+SELECT has_function('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['text','bigint','bigint','boolean','boolean']);
+SELECT function_returns('pgr_MY_FUNCTION_NAME_LOWER',
+ ARRAY['text','bigint','bigint','boolean','boolean'],
+ 'setof record');
+
+-- testing for the signature that they return the correct names & columns
+
+PREPARE v21q00 AS
SELECT pg_typeof(seq)::text AS t1, pg_typeof(path_seq)::text AS t2,
-pg_typeof(end_vid)::text AS t4,
-pg_typeof(node)::text AS t5, pg_typeof(edge)::text AS t6,
-pg_typeof(cost)::text AS t7, pg_typeof(agg_cost)::TEXT AS t8
-FROM (
- SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id::INTEGER, source::INTEGER, target::INTEGER, cost::FLOAT, reverse_cost::FLOAT FROM edge_table',
- 2, ARRAY[3], true) ) AS a
-limit 1;
-
-SELECT set_eq('v21q01', 'v21q10','pgr_MY_FUNCTION_NAME 1 to many: SHOULD RETURN expected columns names & types');
-
-PREPARE q1 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id::BIGINT, source::SMALLINT, target::BIGINT, cost::INTEGER, reverse_cost::SMALLINT FROM edge_table',
- 2, ARRAY[5,3]);
-
-PREPARE q2 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2::BIGINT, ARRAY[5,3]);
+ pg_typeof(node)::text AS t5, pg_typeof(edge)::text AS t6,
+ pg_typeof(cost)::text AS t7, pg_typeof(agg_cost)::TEXT AS t8
+ FROM (
+ SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3, true) ) AS a
+ limit 1
+;
-PREPARE q3 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2::SMALLINT, ARRAY[5,3]);
+PREPARE v21q01 AS
+SELECT 'integer'::text AS t1,'integer'::text AS t2,
+ 'bigint'::text AS t5, 'bigint'::text AS t6,
+ 'double precision'::text AS t7, 'double precision'::text AS t8;
-PREPARE q4 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]::INTEGER[]);
+SELECT set_eq('v21q00', 'v21q01','Expected columns names & types in version 2.4');
-PREPARE q5 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]::SMALLINT[]);
-PREPARE q6 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]::BIGINT[]);
-
-SELECT lives_ok('q1', 'SHOULD LIVE because edges query accepts ANY-INTEGER & ANY NUMERICAL');
-SELECT lives_ok('q2', 'SHOULD LIVE because start_vid accepts BIGINT');
-SELECT lives_ok('q3', 'SHOULD LIVE because start_vid accepts SMALLINT');
-SELECT lives_ok('q4', 'SHOULD LIVE because end_vids accepts array of INTEGER');
-SELECT lives_ok('q5', 'SHOULD LIVE because end_vids accepts array of SMALLINT');
-SELECT lives_ok('q6', 'SHOULD LIVE because end_vids accepts array of BIGINT');
-
-
-PREPARE q10 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id::FLOAT, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-PREPARE q11 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id::REAL, source, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-SELECT throws_ok('q10', 'XX000', 'Unexpected Column ''id'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because id is FLOAT');
-SELECT throws_ok('q11', 'XX000', 'Unexpected Column ''id'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because id is REAL');
-
-PREPARE q12 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source::FLOAT, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-PREPARE q13 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source::REAL, target, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-SELECT throws_ok('q12', 'XX000', 'Unexpected Column ''source'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because source is FLOAT');
-SELECT throws_ok('q13', 'XX000', 'Unexpected Column ''source'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because source is REAL');
-
-PREPARE q14 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target::FLOAT, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-PREPARE q15 AS
-SELECT * FROM pgr_MY_FUNCTION_NAME(
- 'SELECT id, source, target::REAL, cost, reverse_cost FROM edge_table',
- 2, ARRAY[5,3]);
-
-SELECT throws_ok('q14', 'XX000', 'Unexpected Column ''target'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because source is FLOAT');
-SELECT throws_ok('q15', 'XX000', 'Unexpected Column ''target'' type. Expected ANY-INTEGER',
- 'SHOULD THROW because source is REAL');
-
-
-SELECT throws_ok('
- SELECT * FROM pgr_MY_FUNCTION_NAME(
- ''SELECT id, source, target, cost, reverse_cost FROM edge_table'',
- 2::FLOAT, ARRAY[5,3]);',
- '42883', 'function pgr_MY_FUNCTION_NAME(unknown, double precision, integer[]) does not exist',
- 'SHOULD THROW because start_vid is FLOAT');
-
-SELECT throws_ok('
- SELECT * FROM pgr_MY_FUNCTION_NAME(
- ''SELECT id, source, target, cost, reverse_cost FROM edge_table'',
- 2::REAL, ARRAY[5,3]);',
- '42883', 'function pgr_MY_FUNCTION_NAME(unknown, real, integer[]) does not exist',
- 'SHOULD THROW because start_vid is REAL');
-
-
-SELECT throws_ok('
- SELECT * FROM pgr_MY_FUNCTION_NAME(
- ''SELECT id, source, target, cost, reverse_cost FROM edge_table'',
- 2, ARRAY[5,3]::FLOAT[]);',
- 'XX000','Expected array of ANY-INTEGER',
- 'SHOULD THROW because end_vids array is of FLOAT');
-
-SELECT throws_ok('
- SELECT * FROM pgr_MY_FUNCTION_NAME(
- ''SELECT id, source, target, cost, reverse_cost FROM edge_table'',
- 2, ARRAY[5,3]::REAL[]);',
- 'XX000','Expected array of ANY-INTEGER',
- 'SHOULD THROW because end_vids array is of REAL');
+-- CHECKING WORKS WITH & WITOUT REVERSE COST
+PREPARE v20q1 AS
+SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER(
+ 'SELECT id, source, target, cost, reverse_cost FROM edge_table',
+ 2, 3, true);
+PREPARE v20q3 AS
+SELECT * FROM pgr_MY_FUNCTION_NAME_LOWER(
+ 'SELECT id, source, target, cost FROM edge_table',
+ 2, 3, false);
+SELECT lives_ok('v20q1','with reverse cost');
+SELECT lives_ok('v20q3','with NO reverse cost');
SELECT finish();
diff --git a/tools/template/test/test.conf b/tools/template/test/test.conf
index 60c3bb7..7d492ca 100644
--- a/tools/template/test/test.conf
+++ b/tools/template/test/test.conf
@@ -2,24 +2,16 @@
%main::tests = (
'any' => {
- 'comment' => 'Function test for any versions.',
- 'data' => [],
+ 'comment' => 'Dijkstra test for any versions.',
+ 'data' => [ ],
'tests' => [qw(
doc-MY_FUNCTION_NAME
)],
'documentation' => [qw(
doc-MY_FUNCTION_NAME
- )],
-
-#put here the ones that you are not testing (just a place holder)
- 'nottesting' => [qw(
)]
},
-# I dont know what this are for or how to use them.
-# TODO ask Steve
-# 'vpg-vpgis' => {}, # for version specific tests
-# '8-1' => {}, # for pg 8.x and postgis 1.x
-# '9.2-2.1' => {}, # for pg 9.2 and postgis 2.1
+
);
1;
diff --git a/tools/testers/algorithm-tester.pl b/tools/testers/algorithm-tester.pl
index 0fec965..f392018 100755
--- a/tools/testers/algorithm-tester.pl
+++ b/tools/testers/algorithm-tester.pl
@@ -278,7 +278,11 @@ sub process_single_test{
next;
};
- #reason of opening conection is because the set client_min_messages to warning;
+ my $level = "NOTICE";
+ $level = "WARNING" if $ignore;
+ $level = "DEBUG1" if $DEBUG1;
+
+
if ($DOCUMENTATION) {
mysystem("mkdir -p '$dir/../doc' "); # make sure the directory exists
open(PSQL, "|$psql $connopts --set='VERBOSITY terse' -e $database > $dir/../doc/$x.queries 2>\&1 ") || do {
@@ -286,11 +290,9 @@ sub process_single_test{
$stats{z_fail}++;
next;
};
- print PSQL "set client_min_messages to WARNING;\n" if $ignore;
- print PSQL "set client_min_messages to DEBUG1;\n" if $DEBUG1;
}
else {
- open(PSQL, "|$psql $connopts --set='VERBOSITY terse' -A -t -q $database > $TMP 2>\&1 ") || do {
+ open(PSQL, "|$psql $connopts --set='VERBOSITY terse' -A -t -q $database > $TMP 2>\&1 ") || do {
$res->{"$dir/$x.test.sql"} = "FAILED: could not open connection to db : $!";
if (!$INTERNAL_TESTS) {
$stats{z_fail}++;
@@ -298,13 +300,21 @@ sub process_single_test{
next;
};
}
- print PSQL "set client_min_messages to WARNING;\n" if $ignore;
- print PSQL "set client_min_messages to DEBUG1;\n" if $DEBUG1;
+
+
my @d = ();
@d = <TIN>; #reads the whole file into the array @d
- print PSQL @d; #prints the whole fle stored in @d
- close(PSQL); #executes everything
- close(TIN); #closes the input file /TIN = test input
+
+ print PSQL "BEGIN;\n";
+ print PSQL "SET client_min_messages TO $level;\n";
+ #prints the whole fle stored in @d
+ print PSQL @d;
+ print PSQL "\nROLLBACK;";
+
+ # executes everything
+ close(PSQL);
+ #closes the input file /TIN = test input
+ close(TIN);
return if $DOCUMENTATION;
@@ -394,7 +404,6 @@ sub createTestDB {
}
#
# else {
-# if ($vpgis && dbExists("template_postgis_$vpgis")) {
# $template = "template_postgis_$vpgis";
# }
# elsif (dbExists('template_postgis')) {
diff --git a/tools/testers/pg_prove_tests.sh b/tools/testers/pg_prove_tests.sh
index e2c79c6..599784f 100755
--- a/tools/testers/pg_prove_tests.sh
+++ b/tools/testers/pg_prove_tests.sh
@@ -41,11 +41,17 @@ then
echo "MADE TEST **********************"
fi
+pg_prove ../../src/trsp/test/pgtap/* -d $PGDATABASE -U $PGUSER
+pg_prove ../../src/dijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
+pg_prove ../../src/bdDijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
+pg_prove ../../src/bd_dijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
+
pg_prove ../../src/max_flow/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/pickDeliver/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/astar/test/pgtap/* -d $PGDATABASE -U $PGUSER
+pg_prove ../../src/withPoints/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/allpairs/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/alpha_shape/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/apsp_johnson/test/pgtap/* -d $PGDATABASE -U $PGUSER
@@ -53,15 +59,12 @@ pg_prove ../../src/apsp_warshall/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/ksp/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/topology/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/common/test/pgtap/* -d $PGDATABASE -U $PGUSER
-pg_prove ../../src/dijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/driving_distance/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/kdijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
-pg_prove ../../src/withPoints/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/trsp/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/tsp/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/bd_astar/test/pgtap/* -d $PGDATABASE -U $PGUSER
-pg_prove ../../src/bd_dijkstra/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/convenience/test/pgtap/* -d $PGDATABASE -U $PGUSER
pg_prove ../../src/tsp/test/performance/* -d $PGDATABASE -U $PGUSER
diff --git a/tools/testers/setup.sql b/tools/testers/setup.sql
index 386a686..dd144a0 100644
--- a/tools/testers/setup.sql
+++ b/tools/testers/setup.sql
@@ -13,5 +13,7 @@
\set ON_ERROR_ROLLBACK 1
\set ON_ERROR_STOP true
+SET client_min_messages TO WARNING;
+
BEGIN;
diff --git a/tools/testers/update-tester.pl b/tools/testers/update-tester.pl
deleted file mode 100755
index 52b8cca..0000000
--- a/tools/testers/update-tester.pl
+++ /dev/null
@@ -1,12 +0,0 @@
-#!/bin/sh
-dropdb -U postgres -h localhost test_update -p 5432
-createdb -U postgres -h localhost test_update -p 5432
-psql -U postgres -h localhost test_update -p 5432 <<EOF
-create extension postgis;
-create extension pgrouting with version '2.0.0';
-select pgr_version();
-alter extension pgrouting update to '2.1.0';
-select pgr_version();
-
-EOF
-
diff --git a/tools/testers/update-tester.sh b/tools/testers/update-tester.sh
index 4b36712..f42d7a2 100755
--- a/tools/testers/update-tester.sh
+++ b/tools/testers/update-tester.sh
@@ -39,7 +39,7 @@ echo -
# bash tools/testers/update-tester.sh
#
-CURRENT=2.3.2
+CURRENT=2.4.0
function update_test {
set -e
@@ -72,9 +72,10 @@ dropdb ___test_update
}
#------------------------------------
-### updates from 2.3.x
+### updates from 2.3.0
#------------------------------------
+update_test 2.3.2 $CURRENT
update_test 2.3.1 $CURRENT
update_test 2.3.0 $CURRENT
@@ -82,7 +83,7 @@ update_test 2.3.0 $CURRENT
### updates from 2.2.x
#------------------------------------
-update_test 2.2.4 $CURRENT
+#update_test 2.2.4 $CURRENT
update_test 2.2.3 $CURRENT
update_test 2.2.2 $CURRENT
update_test 2.2.1 $CURRENT
@@ -104,4 +105,4 @@ update_test 2.0.0 $CURRENT
echo Reached end of test, all tests passed
# CAN NOT BE Update test from 2.0.1 to $CURRENT;
-
+exit 0
diff --git a/tools/travis/before_script.sh b/tools/travis/before_script.sh
deleted file mode 100755
index 85c197b..0000000
--- a/tools/travis/before_script.sh
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Build pgRouting
-# ------------------------------------------------------------------------------
-
-# exit script on error
-set -e
-
-psql --version
-psql -U postgres -c "SELECT version();"
-
diff --git a/tools/travis/install-doxygen.sh b/tools/travis/install-doxygen.sh
index b57be1a..46f7ce9 100755
--- a/tools/travis/install-doxygen.sh
+++ b/tools/travis/install-doxygen.sh
@@ -8,11 +8,11 @@
set -e
-OS="$(lsb_release -c -s)"
+#OS="$(lsb_release -c -s)"
-if [[ "$OS" != "trusty" ]] ; then
- exit 0
-fi
+#if [[ "$OS" != "trusty" ]] ; then
+# exit 0
+#fi
#install doxygen only on trusty
diff --git a/tools/travis/install-postgres9.5.sh b/tools/travis/install-postgres9.5.sh
deleted file mode 100755
index dede90e..0000000
--- a/tools/travis/install-postgres9.5.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Install pgRouting prerequesits
-# ------------------------------------------------------------------------------
-
-set -e
-
-POSTGRESQL_VERSION="$1"
-PGUSER="$2"
-
-echo "Postgres $POSTGRESQL_VERSION"
-echo "User $PGUSER"
-
-if test "$POSTGRESQL_VERSION" = "9.5" ; then
-
- echo "Installing postgresql 9.5 & postgis for 9.5 pgtap & pg_prove"
- sudo apt-get install -y postgresql-9.5 postgresql-9.5-postgis
- #sudo apt-get install -y pgtap libtap-parser-sourcehandler-pgtap-perl
- sudo cp /usr/lib/postgresql/$POSTGRESQL_VERSION/bin/pg_config /usr/bin/pg_config
- sudo /etc/init.d/postgresql stop
- sudo /etc/init.d/postgresql stop
- ps -fea | grep postgres
- echo "making grep before change"
- grep port /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "finished grep"
- sudo sed -i -e 's/port = 5433/port = 5432/g' /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "making grep after change"
- grep port /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "finished grep"
- sudo cp $TRAVIS_BUILD_DIR/tools/travis/pg_hba.conf /etc/postgresql/$POSTGRESQL_VERSION/main/pg_hba.conf
- sudo /etc/init.d/postgresql start $POSTGRESQL_VERSION
- #sudo service postgres-$POSTGRESQL_VERSION start
- ps -fea | grep postgres
- #sudo -u $DBUSER psql -c "ALTER ROLE postgres WITH PASSWORD '';"
-
-fi
diff --git a/tools/travis/install-postgres9.6.sh b/tools/travis/install-postgres9.6.sh
deleted file mode 100755
index df6c7da..0000000
--- a/tools/travis/install-postgres9.6.sh
+++ /dev/null
@@ -1,39 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Install pgRouting prerequesits
-# ------------------------------------------------------------------------------
-
-set -e
-
-POSTGRESQL_VERSION="$1"
-PGUSER="$2"
-
-echo "Postgres $POSTGRESQL_VERSION"
-echo "User $PGUSER"
-
-if test "$POSTGRESQL_VERSION" = "9.6" ; then
-
- echo "Installing postgresql 9.6 & postgis for 9.6 pgtap & pg_prove"
- sudo apt-get install -y postgresql-9.6 postgresql-9.6-postgis-2.2
- #sudo apt-get install -y pgtap libtap-parser-sourcehandler-pgtap-perl
- sudo cp /usr/lib/postgresql/$POSTGRESQL_VERSION/bin/pg_config /usr/bin/pg_config
- sudo /etc/init.d/postgresql stop
- sudo /etc/init.d/postgresql stop
- ps -fea | grep postgres
- echo "making grep before change"
- grep port /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "finished grep"
- sudo sed -i -e 's/port = 5433/port = 5432/g' /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "making grep after change"
- grep port /etc/postgresql/$POSTGRESQL_VERSION/main/postgresql.conf
- echo "finished grep"
- sudo cp $TRAVIS_BUILD_DIR/tools/travis/pg_hba.conf /etc/postgresql/$POSTGRESQL_VERSION/main/pg_hba.conf
- sudo /etc/init.d/postgresql start $POSTGRESQL_VERSION
- #sudo service postgres-$POSTGRESQL_VERSION start
- ps -fea | grep postgres
- #sudo -u $DBUSER psql -c "ALTER ROLE postgres WITH PASSWORD '';"
-
-fi
diff --git a/tools/travis/install_pgtap.sh b/tools/travis/install_pgtap.sh
deleted file mode 100755
index 12b725d..0000000
--- a/tools/travis/install_pgtap.sh
+++ /dev/null
@@ -1,26 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Install Pgtap
-# ------------------------------------------------------------------------------
-
-POSTGRESQL_VERSION="$1"
-
-# exit script on error
-set -e
-
-echo "Installing pgtap ... this may take some time."
-PGUSER="postgres"
-
-sudo cp /usr/lib/postgresql/$1/bin/pg_config /usr/bin/pg_config
-
-wget https://github.com/theory/pgtap/archive/master.zip
-unzip master.zip
-cd pgtap-master
-make
-#make installcheck
-sudo make install
-
-#sh test_pgtap.sh
diff --git a/tools/travis/pgrouting_build.sh b/tools/travis/pgrouting_build.sh
index ef834a5..cd6b3c7 100755
--- a/tools/travis/pgrouting_build.sh
+++ b/tools/travis/pgrouting_build.sh
@@ -10,7 +10,10 @@
set -e
# build pgRouting
-cmake -DPOSTGRESQL_VERSION=$POSTGRESQL_VERSION -DWITH_DOC=1 -DBUILD_DOXY=1
+mkdir build
+cd build
+cmake -DPOSTGRESQL_VERSION=$POSTGRESQL_VERSION -DWITH_DOC=ON -DBUILD_DOXY=ON -DCMAKE_BUILD_TYPE=Debug ..
make
sudo make install
-
+make doc
+make doxy
diff --git a/tools/travis/pgrouting_install.sh b/tools/travis/pgrouting_install.sh
deleted file mode 100755
index 95ac449..0000000
--- a/tools/travis/pgrouting_install.sh
+++ /dev/null
@@ -1,85 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Install pgRouting prerequesits
-# ------------------------------------------------------------------------------
-
-POSTGRESQL_VERSION="$1"
-POSTGIS_VERSION="$2"
-
-# exit script on error
-set -e
-ERROR=0
-
-# ------------------------------------------------------------------------------
-# Remove PostgreSQL and all its files
-# ------------------------------------------------------------------------------
-sudo service postgresql stop
-sudo apt-get remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common -qq --purge -y
-sudo rm -rf /var/lib/postgresql
-
-# Add PPA's'
-# ------------------------------------------------------------------------------
-sudo apt-add-repository -y ppa:georepublic/pgrouting-travis
-
-if [ "$POSTGIS_VERSION" == "2.0" ] || [ "$POSTGIS_VERSION" == "2.1" ]; then
- sudo apt-add-repository -y ppa:ubuntugis/ppa
-fi
-
-# Add PostgreSQL Apt repository
-# UPDATE: seems to be already available in Travis
-# ------------------------------------------------------------------------------
-# echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > pgdg.list
-# sudo mv pgdg.list /etc/apt/sources.list.d/
-# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
-sudo apt-get update -qq
-
-# ------------------------------------------------------------------------------
-# Install PostgreSQL (always install from PostgreSQL Apt repository)
-# ------------------------------------------------------------------------------
-sudo apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install -y -qq postgresql-$POSTGRESQL_VERSION postgresql-contrib-$POSTGRESQL_VERSION postgresql-server-dev-$POSTGRESQL_VERSION
-
-# Install packages
-# ------------------------------------------------------------------------------
-echo "Installing packages ... this may take some time."
-sudo apt-get install -y -qq packaging-dev cmake checkinstall libcgal-dev libboost-graph-dev libboost-thread-dev libxml2-dev libproj-dev libjson0-dev xsltproc docbook-xsl docbook-mathml libgeos-dev libgdal1-dev
-
-if [ "$POSTGIS_VERSION" == "1.5" ]; then
- RELEASE="1.5.8"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.0" ]; then
- RELEASE="2.0.7"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.1" ]; then
- sudo apt-get install -y -qq libpoppler-dev libarmadillo-dev libepsilon-dev liblzma-dev libxml2-dev
- RELEASE="2.1.7"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-# Build and compile
-cd postgis-*
-./autogen.sh
-./configure
-make
-sudo make install
-sudo ldconfig
-
-# Build extension for PostGIS > 2.0
-if [ "$POSTGIS_VERSION" != "1.5" ]; then
- cd extensions && make && sudo make install
-fi
-
-# ------------------------------------------------------------------------------
-# Restart once
-# ------------------------------------------------------------------------------
-sudo /etc/init.d/postgresql restart
-
-# Return success or failure
-# ------------------------------------------------------------------------------
-exit $ERROR
diff --git a/tools/travis/pgrouting_prepare.sh b/tools/travis/pgrouting_prepare.sh
deleted file mode 100755
index 75a3c0c..0000000
--- a/tools/travis/pgrouting_prepare.sh
+++ /dev/null
@@ -1,47 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Prepare pgRouting
-# ------------------------------------------------------------------------------
-
-DBUSER="postgres"
-DBNAME="pgrouting"
-
-POSTGRESQL_VERSION="$1"
-POSTGIS_VERSION="$2"
-
-POSTGRESQL_DIRECTORY="/usr/share/postgresql/$POSTGRESQL_VERSION"
-
-echo "POSTGRESQL_VERSION=$POSTGRESQL_VERSION"
-echo "POSTGIS_VERSION=$POSTGIS_VERSION"
-echo "POSTGRESQL_DIRECTORY=/usr/share/postgresql/$POSTGRESQL_VERSION"
-ls $POSTGRESQL_DIRECTORY/extension/postgis--*
-ls /usr/lib/postgresql/$POSTGRESQL_VERSION/lib/postgis-*.so
-
-# exit script on error
-set -e
-ERROR=0
-
-# Define alias function for psql command
-run_psql () {
- PGOPTIONS='--client-min-messages=warning' psql -X -q -v ON_ERROR_STOP=1 --pset pager=off "$@"
- if [ "$?" -ne 0 ]
- then
- echo "Test query failed: $@"
- ERROR=1
- fi
-}
-
-# ------------------------------------------------------------------------------
-# Set PostgreSQL users and permissions
-# ------------------------------------------------------------------------------
-sudo cp $TRAVIS_BUILD_DIR/tools/travis/pg_hba.conf `find /etc/postgresql/*/*/pg_hba.conf`
-sudo /etc/init.d/postgresql restart
-
-# Disable password (better: create new user)
-sudo -u $DBUSER psql -c "ALTER ROLE postgres WITH PASSWORD '';"
-
-exit $ERROR
-
diff --git a/tools/travis/postGIS_install.sh b/tools/travis/postGIS_install.sh
deleted file mode 100755
index 750fe09..0000000
--- a/tools/travis/postGIS_install.sh
+++ /dev/null
@@ -1,93 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Travis CI scripts
-# Copyright(c) pgRouting Contributors
-#
-# Install pgRouting prerequesits
-# ------------------------------------------------------------------------------
-
-#POSTGRESQL_VERSION="$1"
-POSTGIS_VERSION="$1"
-
-# exit script on error
-set -e
-ERROR=0
-
-# ------------------------------------------------------------------------------
-# Remove PostgreSQL and all its files
-# ------------------------------------------------------------------------------
-#sudo service postgresql stop
-#sudo apt-get remove postgresql libpq-dev libpq5 postgresql-client-common postgresql-common -qq --purge -y
-#sudo rm -rf /var/lib/postgresql
-
-# Add PPA's'
-# ------------------------------------------------------------------------------
-#sudo apt-add-repository -y ppa:georepublic/pgrouting-travis
-
-#if [ "$POSTGIS_VERSION" == "2.0" ] || [ "$POSTGIS_VERSION" == "2.1" ]; then
-
-# add postGIS PPA
- sudo apt-add-repository -y ppa:ubuntugis/ppa
-#fi
-
-# Add PostgreSQL Apt repository
-# UPDATE: seems to be already available in Travis
-# ------------------------------------------------------------------------------
-# echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > pgdg.list
-# sudo mv pgdg.list /etc/apt/sources.list.d/
-# wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
-sudo apt-get update -qq
-
-# ------------------------------------------------------------------------------
-# Install PostgreSQL (always install from PostgreSQL Apt repository)
-# ------------------------------------------------------------------------------
-#sudo apt-get -o Dpkg::Options::="--force-confdef" -o Dpkg::Options::="--force-confnew" install -y -qq postgresql-$POSTGRESQL_VERSION postgresql-contrib-$POSTGRESQL_VERSION postgresql-server-dev-$POSTGRESQL_VERSION
-
-# Install packages
-# ------------------------------------------------------------------------------
-echo "Installing packages ... this may take some time."
-sudo apt-get install -y -qq packaging-dev cmake checkinstall libcgal-dev libboost-graph-dev libboost-thread-dev libxml2-dev libproj-dev libjson0-dev xsltproc docbook-xsl docbook-mathml libgeos-dev libgdal1-dev
-
-#if [ "$POSTGIS_VERSION" == "1.5" ]; then
-# RELEASE="1.5.8"
-# wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-#fi
-
-if [ "$POSTGIS_VERSION" == "2.0" ]; then
- RELEASE="2.0.7"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.1" ]; then
- sudo apt-get install -y -qq libpoppler-dev libarmadillo-dev libepsilon-dev liblzma-dev libxml2-dev
- RELEASE="2.1.7"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.2" ]; then
- sudo apt-get install -y -qq libpoppler-dev libarmadillo-dev libepsilon-dev liblzma-dev libxml2-dev
- RELEASE="2.2.1"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-# Build and compile
-cd postgis-*
-./autogen.sh
-./configure
-make
-sudo make install
-sudo ldconfig
-
-# Build extension for PostGIS > 2.0
-#if [ "$POSTGIS_VERSION" != "1.5" ]; then
-# cd extensions && make && sudo make install
-#fi
-
-# ------------------------------------------------------------------------------
-# Restart once
-# ------------------------------------------------------------------------------
-sudo /etc/init.d/postgresql restart
-
-# Return success or failure
-# ------------------------------------------------------------------------------
-exit $ERROR
diff --git a/tools/travis/test-documentation.sh b/tools/travis/test-documentation.sh
index 22ca023..c4d48b8 100755
--- a/tools/travis/test-documentation.sh
+++ b/tools/travis/test-documentation.sh
@@ -8,15 +8,10 @@
set -e
-OS="$(lsb_release -c -s)"
-
-if [[ "$OS" != "trusty" ]] ; then
- exit 0
-fi
-
-
#testing doxygen only on trusty
+echo "generating users documentation"
make doc
+echo "generating developers documentation"
make doxy
diff --git a/tools/vagrant/Readme.md b/tools/vagrant/Readme.md
deleted file mode 100644
index 2363ee2..0000000
--- a/tools/vagrant/Readme.md
+++ /dev/null
@@ -1,54 +0,0 @@
-
-Vagrant - Virtualized Development for pgRouting
-
-
-1. Install
-
-Just download and install a binary package from the [Vagrant website](http://docs.vagrantup.com/v2/installation/)
-
-For example on Debian squeeze 32bit system:
-
-```
-mkdir work
-cd work
-wget -N http://files.vagrantup.com/packages/7e400d00a3c5a0fdf2809c8b5001a035415a607b/vagrant_1.2.2_i686.deb
-sudo dpkg -i vagrant_1.2.2_i686.deb
-sudo apt-get install virtualbox
-vagrant box add precise32 http://files.vagrantup.com/precise32.box
-cd /path/to/pgrouting
-```
-
-2. Run
-
-Start the virtual machine:
-
-```
-vagrant up
-```
-
-or if you are using precise32
-
-```
-BOX=precise32 vagrant up
-```
-
-Then login with (Using ssh agent forwarding):
-
-```
-vagrant ssh
-```
-
-Move to shared directory:
-
-```
-cd /vagrant
-```
-
-
-23 Build pgRouting
-
-```
-tools/vagrant/build.sh
-```
-
-Read more about Vagrant in their [official documentation](http://docs.vagrantup.com).
diff --git a/tools/vagrant/bootstrap.sh b/tools/vagrant/bootstrap.sh
deleted file mode 100755
index 2d24dd2..0000000
--- a/tools/vagrant/bootstrap.sh
+++ /dev/null
@@ -1,95 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Vagrant - Virtualized Development
-# Copyright(c) pgRouting Contributors
-#
-# Virtual environment bootstrap script
-# ------------------------------------------------------------------------------
-
-# set -e # Exit script immediately on first error.
-# set -x # Print commands and their arguments as they are executed.
-
-# Abort provisioning if pgRouting development environment already setup.
-# ------------------------------------------------------------------------------
-which cmake >/dev/null &&
-{ echo "pgRouting development environment already setup."; exit 0; }
-
-# Run provisioning
-# ------------------------------------------------------------------------------
-POSTGRESQL_VERSION="$1"
-POSTGIS_VERSION="$2"
-
-echo "PostgreSQL version: $POSTGRESQL_VERSION"
-echo "PostGIS version: $POSTGIS_VERSION"
-
-# Enable PPA support
-# ------------------------------------------------------------------------------
-apt-get update -qq
-apt-get install -y -qq python-software-properties vim
-
-# Add PPA's'
-# ------------------------------------------------------------------------------
-apt-add-repository -y ppa:georepublic/pgrouting-travis
-
-if [ "$POSTGIS_VERSION" == "2.0" ] || [ "$POSTGIS_VERSION" == "2.1" ]; then
- apt-add-repository -y ppa:ubuntugis/ppa
-fi
-
-# Add PostgreSQL Apt repository
-# ------------------------------------------------------------------------------
-echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release -cs)-pgdg main" > pgdg.list
-sudo mv pgdg.list /etc/apt/sources.list.d/
-wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
-sudo apt-get update -qq
-
-# Install packages
-# ------------------------------------------------------------------------------
-echo "Installing packages ... this may take some time."
-apt-get install -y -qq packaging-dev checkinstall libcgal-dev libboost-graph-dev libboost-thread-dev postgresql-$POSTGRESQL_VERSION postgresql-contrib-$POSTGRESQL_VERSION postgresql-server-dev-$POSTGRESQL_VERSION libxml2-dev libproj-dev libjson0-dev xsltproc docbook-xsl docbook-mathml libgeos-dev libgdal1-dev texlive texlive-latex-extra
-
-# ------------------------------------------------------------------------------
-# Manage localization with Transifex
-# https://www.transifex.com/projects/p/pgrouting/
-# http://sphinx.readthedocs.org/en/latest/intl.html
-# ------------------------------------------------------------------------------
-apt-get install python-pip python-dev
-pip install sphinx transifex-client sphinx-intl
-
-# ------------------------------------------------------------------------------
-# Install PostGIS (always build from source)
-# ------------------------------------------------------------------------------
-
-if [ "$POSTGIS_VERSION" == "1.5" ]; then
- RELEASE="1.5.8"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.0" ]; then
- RELEASE="2.0.4"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-if [ "$POSTGIS_VERSION" == "2.1" ]; then
- sudo apt-get install -y -qq libpoppler-dev libarmadillo-dev libepsilon-dev liblzma-dev libxml2-dev
- RELEASE="2.1.1"
- wget --quiet -O - http://download.osgeo.org/postgis/source/postgis-${RELEASE}.tar.gz | tar xzf -
-fi
-
-# Build and compile
-cd postgis-*
-./autogen.sh
-./configure && make && make install
-ldconfig
-
-# Build extension for PostGIS > 2.0
-if [ "$POSTGIS_VERSION" != "1.5" ]; then
- cd extensions
- make
- make install
- ldconfig
-fi
-
-# ------------------------------------------------------------------------------
-# Restart once
-# ------------------------------------------------------------------------------
-/etc/init.d/postgresql restart
diff --git a/tools/vagrant/build.sh b/tools/vagrant/build.sh
deleted file mode 100755
index 7a4ac6f..0000000
--- a/tools/vagrant/build.sh
+++ /dev/null
@@ -1,18 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Vagrant - Virtualized Development
-# Copyright(c) pgRouting Contributors
-#
-# Build pgRouting
-# ------------------------------------------------------------------------------
-
-set -e # Exit script immediately on first error.
-#set -x # Print commands and their arguments as they are executed.
-
-cd /vagrant
-rm -Rf build
-cmake -H. -Bbuild -DWITH_DD=ON
-cd build
-make
-cd ..
-
diff --git a/tools/vagrant/install.sh b/tools/vagrant/install.sh
deleted file mode 100755
index cfe421a..0000000
--- a/tools/vagrant/install.sh
+++ /dev/null
@@ -1,16 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Vagrant - Virtualized Development
-# Copyright(c) pgRouting Contributors
-#
-# Install pgRouting
-# ------------------------------------------------------------------------------
-
-set -e # Exit script immediately on first error.
-#set -x # Print commands and their arguments as they are executed.
-
-sudo dpkg -r pgrouting
-cd build
-sudo checkinstall -y --nodoc --pkgversion=2.0.0 --pkgname=pgrouting
-cd ..
-
diff --git a/tools/vagrant/packaging.sh b/tools/vagrant/packaging.sh
deleted file mode 100755
index 419de7c..0000000
--- a/tools/vagrant/packaging.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Vagrant - Virtualized Development
-# Copyright(c) pgRouting Contributors
-#
-# Prepare packaging (sample)
-# ------------------------------------------------------------------------------
-
-echo "DEBEMAIL=daniel at georepublic.de" > ~/.bash_aliases
-echo "DEBFULLNAME='Daniel Kastl (Georepublic)'" >> ~/.bash_aliases
-
-git config --global user.name "Daniel Kastl"
-git config --global user.email "daniel at georepublic.de"
-git config --global core.editor vim
-git config --global color.ui true
diff --git a/tools/vagrant/packaging.sh.sample b/tools/vagrant/packaging.sh.sample
deleted file mode 100755
index 0ebdf38..0000000
--- a/tools/vagrant/packaging.sh.sample
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-# ------------------------------------------------------------------------------
-# Vagrant - Virtualized Development
-# Copyright(c) pgRouting Contributors
-#
-# Prepare packaging (sample)
-# ------------------------------------------------------------------------------
-
-echo "DEBEMAIL=mail at example.com" > ~/.bash_aliases
-echo "DEBFULLNAME='First Last'" >> ~/.bash_aliases
-
-git config --global user.name "First Last"
-git config --global user.email "mail at example.com"
-git config --global core.editor vim
-git config --global color.ui true
diff --git a/tools/winnie/build_pgrouting.sh b/tools/winnie/build_pgrouting.sh
index b74a9a1..837c269 100644
--- a/tools/winnie/build_pgrouting.sh
+++ b/tools/winnie/build_pgrouting.sh
@@ -107,12 +107,23 @@ rm -rf build${PGROUTING_VER}w${OS_BUILD}${GCC_TYPE}
mkdir build${PGROUTING_VER}w${OS_BUILD}${GCC_TYPE}
cd build${PGROUTING_VER}w${OS_BUILD}${GCC_TYPE}
-cmake -G "MSYS Makefiles" -DCMAKE_VERBOSE_MAKEFILE=ON -DBOOST_ROOT:PATH=${BOOSTROOT_PATH} -DCGAL_ROOT:PATH=${CGAL_PATH} -DGMP_ROOT:PATH=${PROJECTS}/CGAL/rel-gmp-${GMP_VER}w${OS_BUILD}${GCC_TYPE} -DBoost_USE_STATIC_LIBS=ON -DBoost_USE_MULTITHREADED=ON -DCMAKE_CXX_FLAGS="-I${PROJECTS}/CGAL/rel-gmp-${GMP_VER}w${OS_BUILD}${GCC_TYPE}/include -I${PROJECTS}/CGAL/rel-mpfr-${MPFR_VER}w${OS_BUILD}${GCC_TYPE}/include" ../branches/${PGROUTING_VER}
+cmake -G "MSYS Makefiles" -DCMAKE_VERBOSE_MAKEFILE=ON \
+ -DBOOST_ROOT:PATH=${BOOSTROOT_PATH} \
+ -DCGAL_ROOT:PATH=${CGAL_PATH} \
+ -DGMP_ROOT:PATH=${PROJECTS}/CGAL/rel-gmp-${GMP_VER}w${OS_BUILD}${GCC_TYPE} \
+ -DBoost_USE_STATIC_LIBS=ON \
+ -DBoost_USE_MULTITHREADED=ON \
+ -DCMAKE_CXX_FLAGS="-I${PROJECTS}/CGAL/rel-gmp-${GMP_VER}w${OS_BUILD}${GCC_TYPE}/include \
+ -I${PROJECTS}/CGAL/rel-mpfr-${MPFR_VER}w${OS_BUILD}${GCC_TYPE}/include" \
+ -DCMAKE_BUILD_TYPE=Release \
+ ../branches/${PGROUTING_VER}
#first delete old pgrouting files from installed folder before we reinstall
+echo "Current contents of PGPATH ${PGPATH}"
ls ${PGPATH}/lib/libpgrouting*
ls ${PGPATH}/share/extension/pgrouting*
+echo "Current contents of PGPATHEDB ${PGPATHEDB}"
ls ${PGPATHEDB}/lib/libpgrouting*
ls ${PGPATHEDB}/share/extension/pgrouting*
@@ -121,8 +132,10 @@ rm ${PGPATH}/share/extension/pgrouting*
rm ${PGPATHEDB}/lib/libpgrouting*
rm ${PGPATHEDB}/share/extension/pgrouting*
+echo "After removing in PGPATH ${PGPATH}"
ls ${PGPATH}/lib/libpgrouting*
ls ${PGPATH}/share/extension/pgrouting*
+echo "After removing in PGPATHEDB ${PGPATHEDB}"
ls ${PGPATHEDB}/lib/libpgrouting*
ls ${PGPATHEDB}/share/extension/pgrouting*
@@ -130,12 +143,15 @@ make
make install
#we need uninstall and reinstall copy to VC++ EDB instance if we want to test on standard Windows installed versions
+#cp *.dll ${PGPATHEDB}/lib/ #TODO remove this once we fix so the .dlls are created in lib folder
cp lib/*.dll ${PGPATHEDB}/lib/
cp lib/*.sql ${PGPATHEDB}/share/extension/
cp lib/*.control ${PGPATHEDB}/share/extension/
+echo "After copy in PGPATH ${PGPATH}"
ls ${PGPATH}/lib/libpgrouting*
ls ${PGPATH}/share/extension/pgrouting*
+echo "After copyin PGPATHEDB ${PGPATHEDB}"
ls ${PGPATHEDB}/lib/libpgrouting*
ls ${PGPATHEDB}/share/extension/pgrouting*
--
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-grass/pgrouting.git
More information about the Pkg-grass-devel
mailing list