From d4aa028d4f3610d7b7bcabf2232b1ae7a33033ec Mon Sep 17 00:00:00 2001 From: Yentl Van Tendeloo Date: Thu, 6 Apr 2017 12:02:58 +0200 Subject: [PATCH] Add queueing example model --- examples/queueing/collector.py | 29 ++ examples/queueing/experiment.py | 45 +++ examples/queueing/generator.py | 50 ++++ examples/queueing/job.py | 5 + examples/queueing/output.csv | 500 ++++++++++++++++++++++++++++++++ examples/queueing/plot | 42 +++ examples/queueing/processor.py | 46 +++ examples/queueing/queue.py | 75 +++++ examples/queueing/system.py | 33 +++ 9 files changed, 825 insertions(+) create mode 100644 examples/queueing/collector.py create mode 100644 examples/queueing/experiment.py create mode 100644 examples/queueing/generator.py create mode 100644 examples/queueing/job.py create mode 100644 examples/queueing/output.csv create mode 100644 examples/queueing/plot create mode 100644 examples/queueing/processor.py create mode 100644 examples/queueing/queue.py create mode 100644 examples/queueing/system.py diff --git a/examples/queueing/collector.py b/examples/queueing/collector.py new file mode 100644 index 0000000..3f6cbc2 --- /dev/null +++ b/examples/queueing/collector.py @@ -0,0 +1,29 @@ +from pypdevs.DEVS import AtomicDEVS + +# Define the state of the collector as a structured object +class CollectorState(object): + def __init__(self): + # Contains received events and simulation time + self.events = [] + self.current_time = 0.0 + +class Collector(AtomicDEVS): + def __init__(self): + AtomicDEVS.__init__(self, "Collector") + self.state = CollectorState() + # Has only one input port + self.in_event = self.addInPort("in_event") + + def extTransition(self, inputs): + # Update simulation time + self.state.current_time += self.elapsed + # Calculate time in queue + evt = inputs[self.in_event] + time = self.state.current_time - evt.creation_time - evt.processing_time + inputs[self.in_event].queueing_time = max(0.0, time) + # Add incoming event to received events + self.state.events.append(inputs[self.in_event]) + return self.state + + # Don't define anything else, as we only store events. + # Collector has no behaviour of its own. diff --git a/examples/queueing/experiment.py b/examples/queueing/experiment.py new file mode 100644 index 0000000..0d47421 --- /dev/null +++ b/examples/queueing/experiment.py @@ -0,0 +1,45 @@ +from pypdevs.simulator import Simulator +import random + +# Import the model we experiment with +from system import QueueSystem + +# Configuration: +# 1) number of customers to simulate +num = 500 +# 2) average time between two customers +time = 30.0 +# 3) average size of customer +size = 20.0 +# 4) efficiency of processors (products/second) +speed = 0.5 +# 5) maximum number of processors used +max_processors = 10 +# End of configuration + +# Store all results for output to file +values = [] +# Loop over different configurations +for i in range(1, max_processors): + # Make sure each of them simulates exactly the same workload + random.seed(1) + # Set up the system + procs = [speed] * i + m = QueueSystem(mu=1.0/time, size=size, num=num, procs=procs) + + # PythonPDEVS specific setup and configuration + sim = Simulator(m) + sim.setClassicDEVS() + sim.simulate() + + # Gather information for output + evt_list = m.collector.state.events + values.append([e.queueing_time for e in evt_list]) + +# Write data to file +with open('output.csv', 'w') as f: + for i in range(num): + f.write("%s" % i) + for j in range(len(values)): + f.write(", %5f" % (values[j][i])) + f.write("\n") diff --git a/examples/queueing/generator.py b/examples/queueing/generator.py new file mode 100644 index 0000000..138153d --- /dev/null +++ b/examples/queueing/generator.py @@ -0,0 +1,50 @@ +from pypdevs.DEVS import AtomicDEVS +from job import Job +import random + +# Define the state of the generator as a structured object +class GeneratorState: + def __init__(self, gen_num): + # Current simulation time (statistics) + self.current_time = 0.0 + # Remaining time until generation of new event + self.remaining = 0.0 + # Counter on how many events to generate still + self.to_generate = gen_num + +class Generator(AtomicDEVS): + def __init__(self, gen_param, size_param, gen_num): + AtomicDEVS.__init__(self, "Generator") + # Output port for the event + self.out_event = self.addOutPort("out_event") + # Define the state + self.state = GeneratorState(gen_num) + + # Parameters defining the generator's behaviour + self.gen_param = gen_param + self.size_param = size_param + + def intTransition(self): + # Update simulation time + self.state.current_time += self.timeAdvance() + # Update number of generated events + self.state.to_generate -= 1 + if self.state.to_generate == 0: + # Already generated enough events, so stop + self.state.remaining = float('inf') + else: + # Still have to generate events, so sample for new duration + self.state.remaining = random.expovariate(self.gen_param) + return self.state + + def timeAdvance(self): + # Return remaining time; infinity when generated enough + return self.state.remaining + + def outputFnc(self): + # Determine size of the event to generate + size = max(1, int(random.gauss(self.size_param, 5))) + # Calculate current time (note the addition!) + creation = self.state.current_time + self.state.remaining + # Output the new event on the output port + return {self.out_event: Job(size, creation)} diff --git a/examples/queueing/job.py b/examples/queueing/job.py new file mode 100644 index 0000000..54a7314 --- /dev/null +++ b/examples/queueing/job.py @@ -0,0 +1,5 @@ +class Job: + def __init__(self, size, creation_time): + # Jobs have a size and creation_time parameter + self.size = size + self.creation_time = creation_time diff --git a/examples/queueing/output.csv b/examples/queueing/output.csv new file mode 100644 index 0000000..bd79b32 --- /dev/null +++ b/examples/queueing/output.csv @@ -0,0 +1,500 @@ +0, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +1, 30.710932, 1.000000, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +2, 96.877021, 21.877021, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +3, 114.245505, 35.534573, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +4, 128.607899, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +5, 135.414171, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +6, 179.404614, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +7, 222.720062, 27.305891, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +8, 243.365633, 5.961019, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +9, 236.856757, 1.067971, 1.067971, 1.067971, 1.067971, 1.067971, 1.067971, 1.067971, 1.067971 +10, 318.924728, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +11, 307.944837, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +12, 354.545437, 1.000000, 1.000000, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +13, 416.661313, 55.596900, 1.115876, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +14, 480.142337, 46.716476, 39.197500, 1.115876, 1.115876, 1.115876, 1.115876, 1.115876, 1.115876 +15, 521.180979, 96.635542, 47.635542, 31.236142, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +16, 578.306256, 94.361419, 48.760819, 34.163920, 23.361419, 1.000001, 1.000001, 1.000001, 1.000001 +17, 631.040773, 146.444217, 62.095936, 29.495336, 7.002271, 1.000001, 1.000001, 1.348282, 1.348282 +18, 701.389054, 143.495336, 70.002271, 37.843617, 23.898437, 13.095936, 12.444217, 1.000001, 1.000001 +19, 737.547708, 182.602871, 93.843617, 46.602871, 28.843617, 23.246718, 1.000001, 1.000001, 1.000001 +20, 780.377315, 177.432478, 108.966522, 58.966522, 10.196337, 6.330981, 1.000001, 1.000001, 1.000001 +21, 855.511959, 221.567122, 95.432478, 51.831271, 34.567122, 1.000000, 1.000000, 1.000000, 1.000000 +22, 902.376708, 240.431871, 107.831271, 49.234979, 33.831271, 1.000001, 1.000001, 1.000001, 1.000001 +23, 876.703303, 185.758466, 73.157866, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +24, 905.252307, 203.462508, 54.861908, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +25, 961.407345, 198.307470, 59.307470, 6.706870, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +26, 981.835910, 206.777941, 54.177341, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +27, 1035.722778, 223.891073, 64.290473, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +28, 1056.047752, 227.102915, 41.102915, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +29, 1075.151472, 203.206635, 26.606035, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +30, 1120.102328, 230.157491, 27.556891, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +31, 1148.677516, 211.732679, 7.732679, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +32, 1186.007038, 225.062201, 1.461601, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +33, 1217.702724, 227.757887, 1.157287, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +34, 1239.490515, 211.545678, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +35, 1270.308201, 229.363364, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +36, 1328.407567, 241.462730, 1.862130, 1.099368, 1.099368, 1.099368, 1.099368, 1.099368, 1.099368 +37, 1280.838201, 164.893364, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +38, 1318.856392, 166.911555, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +39, 1352.927362, 181.982525, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +40, 1295.277854, 80.333017, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +41, 1297.232309, 65.287472, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +42, 1336.306461, 74.361624, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003 +43, 1345.438546, 78.493709, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +44, 1384.001160, 65.056323, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +45, 1348.523269, 29.406667, 1.828237, 1.828237, 1.828237, 1.828237, 1.828237, 1.828237, 1.828237 +46, 1421.351504, 22.578432, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +47, 1419.157504, 27.212667, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +48, 1419.687152, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +49, 1459.965011, 3.020174, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +50, 1492.306495, 10.042602, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +51, 1545.987439, 24.619345, 1.334144, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +52, 1606.299153, 70.354316, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +53, 1642.060635, 58.373485, 24.352613, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +54, 1688.317622, 93.372785, 34.754142, 22.011129, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +55, 1706.880119, 76.192969, 6.892682, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +56, 1745.497315, 93.552478, 24.532306, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +57, 1806.645640, 108.958490, 28.339147, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +58, 1841.300286, 95.762235, 13.312849, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +59, 1864.449385, 128.355449, 11.484376, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +60, 1860.593404, 91.906254, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +61, 1886.049134, 67.104297, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +62, 1962.442039, 114.754889, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +63, 1981.175190, 101.230353, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +64, 2033.562354, 124.875204, 11.120317, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +65, 2091.895175, 140.950338, 13.846043, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +66, 2158.733683, 181.046533, 38.558494, 11.684551, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +67, 2220.210771, 202.265934, 65.600305, 33.035582, 6.161639, 1.000000, 1.000000, 1.000000, 1.000000 +68, 2281.649437, 232.962287, 61.768734, 42.087084, 23.474248, 1.000001, 1.000001, 1.000001, 1.000001 +69, 2326.991120, 252.046283, 78.815931, 41.095946, 30.428767, 11.815931, 1.000001, 1.000001, 1.000001 +70, 2356.730555, 259.043405, 76.292052, 32.681423, 6.446010, 11.168202, 1.000001, 1.000001, 1.000001 +71, 2409.341184, 265.396347, 91.681423, 47.165995, 21.835381, 5.446010, 1.000001, 1.000001, 1.000001 +72, 2464.092084, 305.404934, 85.916895, 26.789311, 9.084962, 1.000001, 1.000001, 1.000001, 1.000001 +73, 2519.684485, 298.739648, 109.598183, 45.529731, 14.042952, 1.000001, 1.000001, 1.000001, 1.000001 +74, 2585.647315, 353.960165, 109.635353, 50.598183, 5.509296, 1.368865, 1.368865, 1.368865, 1.368865 +75, 2630.016179, 364.071342, 133.840990, 72.840990, 32.121005, 1.000000, 1.000000, 1.000000, 1.000000 +76, 2678.475398, 397.788248, 153.426266, 52.604216, 38.580224, 27.913045, 1.828084, 1.828084, 1.828084 +77, 2742.236667, 407.291830, 140.478159, 91.580224, 19.604216, 1.000002, 12.506113, 1.000001, 1.000001 +78, 2778.653348, 424.966198, 169.187535, 87.674314, 21.001243, 3.006034, 1.000001, 1.000001, 1.000001 +79, 2826.176432, 436.231595, 173.127300, 72.001243, 47.674314, 25.341493, 1.000002, 1.000002, 1.000002 +80, 2763.788007, 366.266162, 79.161867, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +81, 2819.210999, 361.100857, 76.612818, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +82, 2836.844084, 383.899247, 71.794952, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +83, 2874.219197, 373.532047, 85.170065, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +84, 2913.314677, 391.369840, 59.139488, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +85, 2877.144605, 309.457455, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +86, 2877.632866, 292.688029, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +87, 2919.485141, 298.797991, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +88, 2914.436511, 250.491674, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +89, 2964.711576, 285.024426, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +90, 3013.456083, 300.511246, 1.744509, 1.744509, 1.744509, 1.744509, 1.744509, 1.744509, 1.744509 +91, 3025.109620, 282.422470, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +92, 2985.845341, 213.900504, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +93, 2980.146458, 182.459308, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +94, 2927.914924, 98.970087, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +95, 2970.671971, 115.984821, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +96, 3006.889802, 128.944965, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +97, 3054.870562, 135.183412, 13.955640, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +98, 3123.395999, 170.451162, 13.724029, 7.481077, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +99, 3183.863594, 193.176444, 31.973793, 3.191624, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +100, 3232.081181, 210.136344, 51.166259, 11.191380, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +101, 3214.099993, 172.412843, 10.662432, 1.452241, 1.452241, 1.452241, 1.452241, 1.452241, 1.452241 +102, 3292.552233, 191.607396, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +103, 3225.153101, 78.413921, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +104, 3248.358758, 120.465951, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +105, 3271.691114, 101.746277, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +106, 3282.141652, 55.454502, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +107, 3286.929399, 25.385124, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +108, 3309.072274, 47.984562, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +109, 3332.049988, 48.362838, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +110, 3356.269672, 23.324835, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +111, 3348.700222, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +112, 3404.515623, 8.570786, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +113, 3410.325138, 1.624917, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +114, 3443.554035, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +115, 3437.937003, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +116, 3477.148095, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +117, 3553.785320, 35.848318, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +118, 3584.751956, 53.603862, 11.814954, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +119, 3645.471644, 64.534642, 29.686325, 9.534642, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +120, 3646.136464, 52.693177, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +121, 3698.630179, 53.988370, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +122, 3710.980322, 65.043320, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +123, 3746.606645, 52.458551, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +124, 3790.009614, 29.433048, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +125, 3790.581142, 93.072612, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +126, 3828.646990, 58.972022, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +127, 3887.909024, 67.498896, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +128, 3896.513065, 67.576063, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +129, 3924.215741, 47.067647, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +130, 3980.330882, 92.393880, 1.000002, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +131, 4054.105486, 101.957392, 24.592423, 1.000002, 1.000002, 1.000001, 1.000001, 1.000001, 1.000001 +132, 4118.886850, 163.054800, 47.671111, 16.373787, 1.000001, 1.000002, 1.000002, 1.000002, 1.000002 +133, 4186.202894, 157.949848, 62.872014, 43.987155, 12.689831, 1.000001, 1.000001, 1.000001, 1.000001 +134, 4239.707432, 216.559338, 80.194369, 56.601947, 38.491693, 7.194369, 1.000001, 1.000001, 1.000001 +135, 4297.451996, 216.514994, 40.626853, 2.444670, 1.000001, 35.236257, 3.938933, 1.000001, 1.000001 +136, 4301.957733, 201.809639, 106.236257, 54.346511, 53.346511, 1.000001, 1.000001, 1.000001, 1.000001 +137, 4270.977343, 149.040341, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +138, 4339.532140, 160.384046, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +139, 4395.367019, 184.548013, 25.151280, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +140, 4434.696107, 214.430017, 25.163968, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +141, 4374.185772, 121.738638, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +142, 4424.675640, 124.037678, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +143, 4464.400744, 161.463742, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +144, 4515.449711, 161.301617, 38.263940, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +145, 4493.455782, 107.518780, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +146, 4536.913812, 135.765718, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +147, 4482.623710, 33.686708, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +148, 4532.137251, 57.989157, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +149, 4578.141130, 74.204128, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +150, 4601.740588, 80.592494, 18.116879, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +151, 4656.194473, 95.257471, 21.057223, 15.570764, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +152, 4713.306553, 125.158459, 12.169303, 11.169303, 5.682844, 1.000001, 1.000001, 1.000001, 1.000001 +153, 4752.639061, 120.702059, 31.015352, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +154, 4780.699284, 133.551190, 9.569612, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +155, 4838.706862, 137.769860, 15.562034, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +156, 4883.815800, 179.667706, 36.192091, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +157, 4869.627422, 115.690420, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +158, 4935.806532, 154.658438, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +159, 4962.853896, 155.916894, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +160, 5006.666466, 154.518372, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +161, 5059.284599, 191.347597, 5.657178, 3.404881, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +162, 5120.032302, 204.884208, 34.178407, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +163, 5174.689246, 249.752244, 49.022781, 31.835351, 1.061825, 1.000001, 1.000001, 1.000001, 1.000001 +164, 5203.422087, 229.273993, 33.794666, 18.755622, 1.568192, 1.000001, 1.000001, 1.000001, 1.000001 +165, 5238.029308, 204.324752, 38.175413, 7.401887, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +166, 5255.472846, 258.092306, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +167, 5274.932902, 223.784808, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +168, 5341.525643, 225.588641, 5.671748, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +169, 5361.614365, 245.466271, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003 +170, 5294.830750, 120.682656, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003 +171, 5354.439797, 175.291703, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +172, 5385.771275, 158.623181, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003, 1.000003 +173, 5385.509976, 139.361882, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +174, 5435.926605, 153.778511, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +175, 5487.529672, 178.381578, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +176, 5476.511026, 135.362932, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +177, 5488.398556, 112.250462, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +178, 5486.264081, 106.115987, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +179, 5526.261349, 93.113255, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +180, 5576.105762, 134.223571, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +181, 5624.371665, 140.957668, 27.107586, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +182, 5667.374193, 163.319500, 23.361833, 16.206247, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +183, 5720.467594, 177.226099, 40.112846, 25.110114, 1.203515, 1.000001, 1.000001, 1.000001, 1.000001 +184, 5752.081748, 191.822600, 22.817669, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +185, 5803.970694, 194.933654, 39.864933, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +186, 5842.565664, 230.417570, 42.304317, 20.304317, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +187, 5870.374699, 203.226605, 31.110620, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +188, 5917.203919, 242.055825, 31.098158, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +189, 5961.051400, 236.903306, 40.790053, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +190, 6015.586511, 281.438417, 60.322432, 14.325164, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +191, 6027.615269, 238.467175, 17.509508, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +192, 6077.400433, 278.252339, 27.139086, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +193, 6118.421655, 280.273561, 59.090736, 2.935150, 1.774842, 1.774842, 1.774842, 1.774842, 1.774842 +194, 6187.196497, 319.048403, 49.157576, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +195, 6204.801132, 317.653038, 36.539785, 10.400699, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +196, 6244.496605, 319.348511, 59.390844, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +197, 6289.327589, 349.179495, 61.063510, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +198, 6313.827391, 343.679297, 47.566044, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +199, 6350.883980, 357.735886, 67.778219, 5.483547, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +200, 6387.226771, 356.078677, 50.308589, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +201, 6456.569936, 384.421842, 44.962692, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +202, 6472.380980, 394.232886, 63.275219, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +203, 6513.876730, 378.728636, 44.615383, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +204, 6511.905990, 372.757896, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +205, 6516.536095, 312.388001, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +206, 6580.325733, 362.239604, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +207, 6619.387698, 366.177639, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +208, 6624.139973, 310.795826, 3.814239, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +209, 6624.943920, 366.991879, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +210, 6603.868143, 293.902460, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +211, 6671.050554, 289.720049, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +212, 6719.396266, 342.248172, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +213, 6739.862701, 305.714607, 7.029724, 5.205906, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +214, 6811.256461, 361.108367, 15.388317, 2.557847, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +215, 6851.425991, 364.277897, 6.812146, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +216, 6874.714347, 379.566253, 30.318080, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +217, 6942.467532, 386.319438, 32.599388, 22.416977, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +218, 6896.216958, 330.729031, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +219, 6951.877125, 328.068864, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +220, 6925.668952, 265.670075, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +221, 6945.818169, 304.520858, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +222, 6949.476487, 252.661603, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +223, 6982.809697, 269.328393, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +224, 6952.377291, 176.536548, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +225, 6972.684642, 222.229197, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +226, 7014.666911, 218.518817, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +227, 7075.615332, 221.467238, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +228, 7070.746426, 207.598332, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +229, 7108.206729, 189.058635, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +230, 7151.467912, 229.319818, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +231, 7209.908710, 223.760616, 14.162283, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +232, 7233.370619, 229.893626, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +233, 7283.041720, 246.222525, 0.999998, 1.362227, 1.362227, 1.362227, 1.362227, 1.362227, 1.362227 +234, 7343.403949, 290.255855, 19.657522, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +235, 7340.289166, 241.141072, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +236, 7384.346113, 280.198019, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +237, 7431.771934, 275.623840, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +238, 7478.334228, 301.186134, 9.045061, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +239, 7490.358573, 275.210479, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +240, 7515.748317, 263.600223, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +241, 7568.500338, 280.352244, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +242, 7567.424991, 258.276897, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +243, 7613.925935, 264.777841, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +244, 7650.901694, 294.753600, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +245, 7722.132364, 297.984270, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +246, 7751.869923, 324.721829, 33.707371, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +247, 7743.922928, 284.774834, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +248, 7687.982206, 207.834112, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +249, 7729.482682, 203.334588, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +250, 7787.296311, 238.148217, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +251, 7815.747971, 238.599877, 8.765763, 8.740411, 1.974646, 1.974646, 1.974646, 1.974646, 1.974646 +252, 7874.722619, 266.574525, 29.426306, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +253, 7912.815983, 286.667889, 25.333299, 18.519670, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +254, 7960.521062, 289.372968, 31.888863, 10.038378, 3.224749, 0.999998, 0.999998, 0.999998, 0.999998 +255, 8003.185176, 314.037082, 41.538854, 11.202968, 0.999997, 0.999997, 0.999997, 0.999997, 0.999997 +256, 8016.889715, 300.741621, 21.407031, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +257, 8071.773219, 327.625125, 43.034840, 11.534364, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +258, 8127.017048, 345.868954, 45.476906, 14.476906, 1.883502, 1.883502, 1.883502, 1.883502, 1.883502 +259, 8116.960302, 329.812208, 13.477618, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +260, 8144.500959, 314.352865, 11.518751, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +261, 8161.520486, 303.372392, 1.832023, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +262, 8204.744067, 315.595973, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +263, 8252.814231, 335.666137, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +264, 8278.213035, 358.064941, 27.230827, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +265, 8315.851502, 347.703408, 14.869294, 13.037269, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +266, 8366.745739, 395.597645, 30.001670, 14.225251, 12.931506, 1.894235, 1.894235, 1.894235, 1.894235 +267, 8402.157210, 383.009116, 0.999998, 14.413141, 0.999997, 0.999997, 0.999997, 0.999997, 0.999997 +268, 8409.905779, 371.757685, 49.175002, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +269, 8386.449007, 322.300913, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +270, 8396.007001, 306.858907, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +271, 8408.327832, 301.179738, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +272, 8437.940510, 287.792416, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +273, 8461.172718, 301.024624, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +274, 8484.040976, 280.892882, 0.999997, 0.999997, 0.999997, 0.999997, 0.999997, 0.999997, 0.999997 +275, 8504.864630, 267.716536, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +276, 8514.098705, 257.950611, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +277, 8566.200588, 264.052494, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +278, 8603.981049, 278.258843, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998, 0.999998 +279, 8635.406937, 300.832955, 15.206348, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +280, 8671.458222, 308.427336, 8.594379, 7.200868, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +281, 8717.575430, 314.310128, 15.359515, 1.000000, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +282, 8767.181919, 358.033825, 30.981330, 10.257633, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +283, 8793.705432, 342.557338, 41.724381, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +284, 8839.542035, 371.393941, 30.443328, 20.560984, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +285, 8877.314695, 367.166601, 23.114106, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +286, 8848.680866, 321.532772, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +287, 8870.650845, 303.502751, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +288, 8893.785222, 315.637128, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +289, 8889.631861, 261.483767, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +290, 8947.228766, 302.080672, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +291, 9002.009161, 296.861067, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +292, 9057.233302, 343.085208, 22.601442, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +293, 9094.695648, 346.547554, 36.466883, 17.063788, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +294, 9121.936941, 348.788847, 18.873594, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +295, 9167.505454, 364.357360, 18.927780, 4.708176, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +296, 9182.282853, 366.134759, 26.054088, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +297, 9237.607435, 373.459341, 27.975575, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +298, 9263.821181, 374.673087, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +299, 9321.278032, 392.129938, 27.049267, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +300, 9274.726745, 344.648340, 1.069689, 1.069689, 1.069689, 1.069689, 1.069689, 1.069689, 1.069689 +301, 9328.796434, 332.578651, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +302, 9300.900338, 316.752244, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +303, 9336.943698, 300.795604, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +304, 9346.930420, 281.286444, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +305, 9378.434538, 309.782326, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +306, 9426.002205, 262.548653, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +307, 9423.696747, 328.854111, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +308, 9443.610802, 282.462708, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +309, 9474.176851, 265.028757, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +310, 9524.700274, 308.552180, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +311, 9582.260535, 302.112441, 13.649733, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +312, 9613.506090, 324.357996, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +313, 9636.479864, 295.331770, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +314, 9700.543149, 336.395055, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +315, 9747.203578, 339.055484, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +316, 9811.043622, 379.895528, 41.563759, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +317, 9844.740805, 375.592711, 17.197658, 14.260942, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +318, 9841.827514, 347.679420, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +319, 9866.313382, 336.165288, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +320, 9878.705899, 321.557805, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +321, 9939.129176, 335.981082, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +322, 9941.548728, 327.400634, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +323, 10009.546465, 335.398371, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +324, 10065.236405, 380.088311, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +325, 10110.697165, 385.549071, 17.222561, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +326, 10163.789239, 417.641145, 46.460761, 14.220298, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +327, 10202.769025, 412.620931, 40.240512, 10.078385, 12.532621, 1.000000, 1.000000, 1.000000, 1.000000 +328, 10244.624849, 427.462862, 39.374552, 38.552835, 7.076122, 5.388445, 1.000000, 1.000000, 1.000000 +329, 10276.610956, 449.476755, 59.078385, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +330, 10255.543081, 361.493011, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +331, 10270.641105, 406.394987, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +332, 10271.170212, 362.022118, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +333, 10300.127064, 336.978970, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +334, 10293.786995, 315.638901, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +335, 10294.152901, 288.004807, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +336, 10362.196999, 311.048905, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +337, 10418.491130, 351.343036, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +338, 10444.699289, 334.551195, 23.031027, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +339, 10509.522156, 373.374062, 24.502291, 7.639307, 3.301078, 1.000001, 1.000001, 1.000001, 1.000001 +340, 10553.875626, 380.727532, 8.722726, 20.325158, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +341, 10623.792207, 416.644113, 66.301078, 4.384497, 5.755849, 1.417620, 1.000001, 1.000001, 1.000001 +342, 10662.908749, 448.760655, 67.711751, 37.166617, 1.678628, 1.000001, 1.000001, 1.000001, 1.000001 +343, 10714.319517, 446.171423, 67.166617, 44.209461, 32.797362, 1.000001, 1.000001, 1.000001, 1.000001 +344, 10767.571774, 496.423680, 92.080645, 48.374776, 30.049619, 26.779568, 1.000002, 1.000002, 1.000002 +345, 10798.128773, 468.980679, 49.026466, 28.637644, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +346, 10818.179366, 456.399661, 84.931775, 19.026466, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +347, 10838.547755, 486.031272, 49.056626, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +348, 10866.733521, 484.585427, 54.580621, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +349, 10878.950074, 460.801980, 26.753076, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +350, 10911.594678, 466.662362, 19.751844, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +351, 10965.810456, 488.446584, 38.103549, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +352, 11021.904744, 522.756650, 31.657556, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +353, 11048.749625, 507.601531, 46.596725, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +354, 11099.867672, 547.719578, 55.376543, 18.272996, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +355, 11146.197044, 552.048950, 57.044144, 19.292301, 11.602368, 1.000002, 1.000002, 1.000002, 1.000002 +356, 11151.562818, 530.414724, 27.409918, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +357, 11161.057452, 519.909358, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +358, 11187.264016, 499.115922, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +359, 11235.570259, 537.422165, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +360, 11166.170328, 435.022234, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +361, 11181.328768, 410.180674, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +362, 11202.979157, 392.831063, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +363, 11217.670804, 381.522710, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +364, 11259.671579, 388.523485, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +365, 11299.443234, 405.550802, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +366, 11357.698896, 422.295140, 18.027317, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +367, 11397.613755, 445.465661, 3.942952, 2.942176, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +368, 11421.719914, 428.571820, 7.276681, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +369, 11460.417659, 447.269565, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +370, 11516.575921, 464.427827, 2.905118, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +371, 11576.532173, 502.384079, 42.088940, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +372, 11616.985418, 509.837324, 44.136584, 21.265505, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +373, 11671.807387, 538.659293, 41.567760, 37.275215, 17.087474, 1.000001, 1.000001, 1.000001, 1.000001 +374, 11675.327565, 531.318314, 36.795605, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +375, 11731.466408, 517.179471, 30.884332, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +376, 11755.873701, 555.725607, 21.456043, 1.153788, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +377, 11804.854575, 544.706481, 31.709928, 1.322403, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +378, 11865.449807, 578.979492, 49.183772, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +379, 11904.127586, 592.301713, 46.006574, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +380, 11935.810098, 610.662004, 63.392440, 8.090185, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +381, 11856.048149, 494.900055, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +382, 11868.925374, 484.765781, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +383, 11912.913875, 492.777280, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +384, 11891.775935, 463.503057, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +385, 11951.651151, 463.627841, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +386, 11990.773327, 502.625233, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +387, 12033.062348, 496.914254, 27.411199, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +388, 12066.399023, 498.660366, 8.623089, 1.747874, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +389, 12111.808460, 519.250929, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +390, 12165.517425, 552.369331, 17.866276, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +391, 12210.713314, 541.565220, 1.493843, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +392, 12238.302301, 556.154207, 30.937380, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +393, 12280.470590, 564.322496, 16.819441, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +394, 12265.722180, 524.574086, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +395, 12318.582257, 547.434163, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +396, 12269.091460, 460.943366, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +397, 12229.317845, 419.169751, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +398, 12187.367947, 316.219853, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +399, 12179.725068, 300.576974, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +400, 12170.236074, 260.087980, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +401, 12213.523424, 265.375330, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +402, 12135.747743, 156.599649, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +403, 12157.558357, 146.410263, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +404, 12189.095694, 162.493824, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +405, 12246.641918, 164.947600, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +406, 12282.901276, 198.242797, 1.000001, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +407, 12350.390891, 198.753182, 29.477633, 1.000001, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +408, 12404.573326, 252.425232, 31.748974, 26.931409, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +409, 12388.381084, 190.232990, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +410, 12431.258776, 230.110682, 7.163083, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +411, 12476.716660, 231.568566, 7.074743, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +412, 12542.581754, 272.433660, 39.200672, 1.000001, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +413, 12592.188789, 294.040695, 46.093096, 30.827962, 1.000001, 1.000002, 1.000002, 1.000002, 1.000002 +414, 12640.086737, 312.938643, 60.444820, 35.807707, 26.705655, 1.000001, 1.000001, 1.000001, 1.000001 +415, 12688.634267, 339.486173, 77.253185, 39.052515, 28.375492, 24.253185, 1.000002, 1.000002, 1.000002 +416, 12737.366317, 359.218223, 101.012557, 49.649658, 38.465687, 31.072722, 20.395699, 1.000002, 1.000002 +417, 12800.654474, 382.506380, 89.270624, 71.395699, 36.784565, 26.107542, 21.985235, 16.273392, 1.000002 +418, 12790.275477, 363.127383, 60.894395, 13.894395, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +419, 12802.832224, 315.684130, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +420, 12826.667178, 338.519084, 34.190307, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +421, 12854.322261, 312.174167, 8.941179, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +422, 12875.138018, 305.989924, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +423, 12910.364648, 299.216554, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +424, 12939.775421, 289.808378, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +425, 12977.956472, 317.627327, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +426, 12980.490992, 292.342898, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +427, 13040.745505, 298.597411, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002, 1.000002 +428, 13058.540274, 296.363363, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +429, 13099.511457, 311.392180, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +430, 13132.998949, 310.495627, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +431, 13179.643721, 329.850855, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +432, 13227.415339, 358.267245, 6.903883, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +433, 13288.102577, 368.954483, 40.103629, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +434, 13328.429989, 408.281895, 31.786269, 29.431041, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +435, 13383.593466, 405.445372, 53.082010, 27.949746, 25.594518, 1.000000, 1.000000, 1.000000, 1.000000 +436, 13431.779274, 347.632083, 65.780326, 26.676698, 17.135554, 14.780326, 1.000000, 1.000000, 1.000000 +437, 13398.780177, 452.631180, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +438, 13424.286134, 373.138040, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +439, 13450.913280, 373.765186, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +440, 13482.484039, 389.593241, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +441, 13537.741335, 376.335945, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +442, 13544.916584, 396.768490, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +443, 13580.740713, 380.592619, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +444, 13621.264632, 406.116538, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +445, 13648.927727, 415.779633, 5.011142, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +446, 13669.554875, 403.406781, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +447, 13721.519876, 411.371782, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +448, 13766.736656, 441.588562, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +449, 13740.028245, 388.880151, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +450, 13779.797780, 381.649686, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +451, 13802.606696, 372.458602, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +452, 13835.099865, 389.951771, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +453, 13864.113157, 390.965063, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +454, 13885.600572, 377.452478, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +455, 13918.328212, 394.180118, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +456, 13975.611971, 406.463877, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +457, 14028.062054, 453.249016, 29.461482, 1.450083, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +458, 14091.397110, 450.913960, 47.785139, 23.796538, 1.450083, 1.450083, 1.450083, 1.450083, 1.450083 +459, 14123.680092, 477.377685, 25.351880, 15.197567, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +460, 14192.525779, 485.531998, 55.925207, 6.280471, 10.913808, 1.000000, 1.000000, 1.000000, 1.000000 +461, 14237.892442, 522.744348, 48.280471, 21.068121, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +462, 14256.535591, 492.387497, 32.207379, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +463, 14268.518396, 496.370302, 15.917824, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +464, 14299.564450, 484.416356, 1.952479, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +465, 14249.834508, 420.686414, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +466, 14261.052063, 396.903969, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +467, 14224.152514, 330.004420, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +468, 14279.341619, 352.193525, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +469, 14326.736108, 365.588014, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +470, 14296.533943, 308.385849, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +471, 14289.595331, 298.645530, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +472, 14355.793624, 281.447237, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +473, 14366.865316, 309.717222, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +474, 14382.926911, 300.778817, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +475, 14325.128282, 239.713525, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +476, 14400.861619, 220.980188, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +477, 14418.451714, 257.303620, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +478, 14471.662815, 259.514721, 14.801197, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +479, 14511.061578, 290.913484, 19.933296, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +480, 14532.769465, 251.621371, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +481, 14569.884312, 278.736218, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +482, 14614.147395, 285.999301, 5.019113, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +483, 14652.692663, 312.544569, 24.923198, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +484, 14700.425438, 303.277344, 13.541126, 3.655973, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +485, 14707.726312, 307.222448, 11.601077, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +486, 14761.370542, 302.578218, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +487, 14797.631200, 327.417580, 10.746888, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999, 0.999999 +488, 14850.565674, 343.483106, 25.796209, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +489, 14746.472666, 241.109273, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +490, 14807.257367, 223.324572, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +491, 14822.647100, 256.499006, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +492, 14876.399283, 253.251189, 9.141916, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +493, 14917.434818, 290.286724, 10.962152, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +494, 14968.176855, 294.028761, 34.529755, 10.704189, 1.742037, 1.742037, 1.742037, 1.742037, 1.742037 +495, 14965.141927, 262.993833, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +496, 14920.231915, 187.083821, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +497, 14961.823898, 200.675804, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001, 1.000001 +498, 14992.028499, 185.880405, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 +499, 15045.398999, 221.250905, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000, 1.000000 diff --git a/examples/queueing/plot b/examples/queueing/plot new file mode 100644 index 0000000..c7324ee --- /dev/null +++ b/examples/queueing/plot @@ -0,0 +1,42 @@ +set terminal svg +set out 'queueing_evolution.svg' + +set title "Queueing times" +set xlabel "Customer #" +set ylabel "Seconds" +unset xlabel +unset xtics +set key title "Processors" +set key bottom center out +set key horizontal + +set style line 1 lw 4 +set style line 2 lw 4 +set style line 3 lw 4 +set style line 4 lw 4 + +set yrange [0:450] +set xrange [0:500] +set style fill solid + +plot 'output.csv' using 1:3 title "2" w boxes ls 1, \ + '' using 1:4 title "3" w boxes ls 2, \ + '' using 1:5 title "4" w boxes ls 3, \ + '' using 1:6 title "5" w boxes ls 4 + +set out 'queueing_boxplot.svg' +set style fill solid 0.25 border -1 +set style boxplot outliers pointtype 7 +set style data boxplot +set key off + +set xlabel "Processors" +unset xrange +unset yrange + +set xtics ('2' 1, '3' 2, '4' 3, '5' 4) + +plot 'output.csv' using (1):3 title "2", \ + '' using (2):4 title "3", \ + '' using (3):5 title "4", \ + '' using (4):6 title "5" diff --git a/examples/queueing/processor.py b/examples/queueing/processor.py new file mode 100644 index 0000000..77bb054 --- /dev/null +++ b/examples/queueing/processor.py @@ -0,0 +1,46 @@ +from pypdevs.DEVS import AtomicDEVS + +# Define the state of the processor as a structured object +class ProcessorState(object): + def __init__(self): + # State only contains the current event + self.evt = None + +class Processor(AtomicDEVS): + def __init__(self, nr, proc_param): + AtomicDEVS.__init__(self, "Processor_%i" % nr) + + self.state = ProcessorState() + self.in_proc = self.addInPort("in_proc") + self.out_proc = self.addOutPort("out_proc") + self.out_finished = self.addOutPort("out_finished") + + # Define the parameters of the model + self.speed = proc_param + self.nr = nr + + def intTransition(self): + # Just clear processing event + self.state.evt = None + return self.state + + def extTransition(self, inputs): + # Received a new event, so start processing it + self.state.evt = inputs[self.in_proc] + # Calculate how long it will be processed + time = 20.0 + max(1.0, self.state.evt.size / self.speed) + self.state.evt.processing_time = time + return self.state + + def timeAdvance(self): + if self.state.evt: + # Currently processing, so wait for that + return self.state.evt.processing_time + else: + # Idle, so don't do anything + return float('inf') + + def outputFnc(self): + # Output the processed event and signal as finished + return {self.out_proc: self.state.evt, + self.out_finished: self.nr} diff --git a/examples/queueing/queue.py b/examples/queueing/queue.py new file mode 100644 index 0000000..ef139ee --- /dev/null +++ b/examples/queueing/queue.py @@ -0,0 +1,75 @@ +from pypdevs.DEVS import AtomicDEVS + +# Define the state of the queue as a structured object +class QueueState: + def __init__(self, outputs): + # Keep a list of all idle processors + self.idle_procs = range(outputs) + # Keep a list that is the actual queue data structure + self.queue = [] + # Keep the process that is currently being processed + self.processing = None + # Time remaining for this event + self.remaining_time = float("inf") + +class Queue(AtomicDEVS): + def __init__(self, outputs): + AtomicDEVS.__init__(self, "Queue") + # Fix the time needed to process a single event + self.processing_time = 1.0 + self.state = QueueState(outputs) + + # Create 'outputs' output ports + # 'outputs' is a structural parameter! + self.out_proc = [] + for i in range(outputs): + self.out_proc.append(self.addOutPort("proc_%i" % i)) + + # Add the other ports: incoming events and finished event + self.in_event = self.addInPort("in_event") + self.in_finish = self.addInPort("in_finish") + + def intTransition(self): + # Is only called when we are outputting an event + # Pop the first idle processor and clear processing event + self.state.idle_procs.pop(0) + if self.state.queue and self.state.idle_procs: + # There are still queued elements, so continue + self.state.processing = self.state.queue.pop(0) + self.state.remaining_time = self.processing_time + else: + # No events left to process, so become idle + self.state.processing = None + self.state.remaining_time = float("inf") + return self.state + + def extTransition(self, inputs): + # Update the remaining time of this job + self.state.remaining_time -= self.elapsed + # Several possibilities + if self.in_finish in inputs: + # Processing a "finished" event, so mark proc as idle + self.state.idle_procs.append(inputs[self.in_finish]) + if not self.state.processing and self.state.queue: + # Process first task in queue + self.state.processing = self.state.queue.pop(0) + self.state.remaining_time = self.processing_time + elif self.in_event in inputs: + # Processing an incoming event + if self.state.idle_procs and not self.state.processing: + # Process when idle processors + self.state.processing = inputs[self.in_event] + self.state.remaining_time = self.processing_time + else: + # No idle processors, so queue it + self.state.queue.append(inputs[self.in_event]) + return self.state + + def timeAdvance(self): + # Just return the remaining time for this event (or infinity else) + return self.state.remaining_time + + def outputFnc(self): + # Output the event to the processor + port = self.out_proc[self.state.idle_procs[0]] + return {port: self.state.processing} diff --git a/examples/queueing/system.py b/examples/queueing/system.py new file mode 100644 index 0000000..c0617d4 --- /dev/null +++ b/examples/queueing/system.py @@ -0,0 +1,33 @@ +from pypdevs.DEVS import CoupledDEVS + +# Import all models to couple +from generator import Generator +from queue import Queue +from processor import Processor +from collector import Collector + +class QueueSystem(CoupledDEVS): + def __init__(self, mu, size, num, procs): + CoupledDEVS.__init__(self, "QueueSystem") + + # Define all atomic submodels of which there are only one + generator = self.addSubModel(Generator(mu, size, num)) + queue = self.addSubModel(Queue(len(procs))) + collector = self.addSubModel(Collector()) + + self.connectPorts(generator.out_event, queue.in_event) + + # Instantiate desired number of processors and connect + processors = [] + for i, param in enumerate(procs): + processors.append(self.addSubModel( + Processor(i, param))) + self.connectPorts(queue.out_proc[i], + processors[i].in_proc) + self.connectPorts(processors[i].out_finished, + queue.in_finish) + self.connectPorts(processors[i].out_proc, + collector.in_event) + + # Make it accessible outside of our own scope + self.collector = collector