116 lines
4.8 KiB
Python
116 lines
4.8 KiB
Python
#!/usr/bin/env python3
|
|
|
|
"""
|
|
Compute a statistics table for earth-generation with multiple frequencies.
|
|
|
|
.. _script-earth_graph_frequency_statistics-example:
|
|
|
|
Examples:
|
|
.. code-block:: bash
|
|
|
|
./scripts/earth_graph_frequency_statistics.py 300 --step 10
|
|
Frequency Great Circle Distance (km) # nodes # edges Computation time (sec)
|
|
10 705.365422 1002 3000 0.229929
|
|
20 352.682711 4002 12000 0.531473
|
|
30 235.121807 9002 27000 0.582267
|
|
40 176.341356 16002 48000 0.998187
|
|
50 141.073084 25002 75000 1.559254
|
|
60 117.560904 36002 108000 2.264499
|
|
70 100.766489 49002 147000 3.095882
|
|
80 88.170678 64002 192000 6.268704
|
|
90 78.373936 81002 243000 5.790993
|
|
100 70.536542 100002 300000 6.933162
|
|
110 64.124129 121002 363000 9.229682
|
|
120 58.780452 144002 432000 10.617164
|
|
130 54.258879 169002 507000 16.519117
|
|
140 50.383244 196002 588000 15.838989
|
|
150 47.024361 225002 675000 21.517596
|
|
160 44.085339 256002 768000 24.864843
|
|
170 41.492084 289002 867000 30.145898
|
|
180 39.186968 324002 972000 28.684602
|
|
190 37.124496 361002 1083000 27.561629
|
|
200 35.268271 400002 1200000 33.667006
|
|
210 33.58883 441002 1323000 34.471024
|
|
220 32.062065 484002 1452000 37.554208
|
|
230 30.668062 529002 1587000 43.1782
|
|
240 29.390226 576002 1728000 46.112764
|
|
250 28.214617 625002 1875000 44.472765
|
|
260 27.129439 676002 2028000 53.084822
|
|
270 26.124645 729002 2187000 60.2798
|
|
280 25.191622 784002 2352000 63.117184
|
|
290 24.322946 841002 2523000 64.914421
|
|
300 23.512181 900002 2700000 68.890113
|
|
|
|
"""
|
|
|
|
# Standard library
|
|
from argparse import ArgumentDefaultsHelpFormatter
|
|
from argparse import ArgumentParser
|
|
from time import perf_counter
|
|
|
|
# Typing
|
|
from typing import List
|
|
from typing import Tuple
|
|
|
|
# Scientific
|
|
import numpy
|
|
import pandas
|
|
|
|
# Earth graph calculation
|
|
from pyrate.plan.graph import create_earth_graph
|
|
from pyrate.plan.graph import great_circle_distance_distance_for
|
|
|
|
|
|
def _main() -> None:
|
|
"""The main function."""
|
|
parser = ArgumentParser(
|
|
description="Compute a statistics table for earth-generation with multiple frequencies.",
|
|
formatter_class=ArgumentDefaultsHelpFormatter,
|
|
)
|
|
parser.add_argument("max", type=int, help="the maximum frequency to test")
|
|
parser.add_argument(
|
|
"--step", type=int, default=10, help="how large the steps while increasing the frequencies should be"
|
|
)
|
|
args = parser.parse_args()
|
|
|
|
pandas.set_option("display.max_columns", None)
|
|
pandas.set_option("display.max_rows", None)
|
|
|
|
columns = [
|
|
("Frequency", numpy.uint),
|
|
("Great Circle Distance (km)", numpy.float64),
|
|
("# nodes", numpy.uint),
|
|
("# edges", numpy.uint),
|
|
("Computation time (sec)", numpy.float64),
|
|
]
|
|
|
|
records: List[Tuple] = []
|
|
for frequency in range(0, args.max + 1, args.step):
|
|
if frequency == 0:
|
|
continue # better steps when starting at zero
|
|
|
|
start = perf_counter()
|
|
graph = create_earth_graph(frequency)
|
|
end = perf_counter()
|
|
records.append(
|
|
(
|
|
frequency,
|
|
great_circle_distance_distance_for(frequency) / 1000,
|
|
len(graph),
|
|
graph.num_edges,
|
|
end - start,
|
|
)
|
|
)
|
|
|
|
# re-creating this is inefficient, but it does not matter for small sizes
|
|
data_frame = pandas.DataFrame.from_records(numpy.array(records, dtype=columns))
|
|
string = data_frame.iloc[[-1]].to_string(index=False, justify="right")
|
|
if len(data_frame) == 1: # only the first time
|
|
print(string)
|
|
else:
|
|
print(string.splitlines()[-1])
|
|
|
|
|
|
if __name__ == "__main__":
|
|
_main()
|