Преглед изворни кода

Add queueing example model

Yentl Van Tendeloo пре 8 година
родитељ
комит
d4aa028d4f

+ 29 - 0
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.

+ 45 - 0
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")

+ 50 - 0
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)}

+ 5 - 0
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

+ 500 - 0
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

+ 42 - 0
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"

+ 46 - 0
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}

+ 75 - 0
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}

+ 33 - 0
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