View Javadoc
1   package org.opentrafficsim.kpi.sampling.indicator;
2   
3   import org.djunits.unit.Unit;
4   import org.djunits.value.vdouble.scalar.AbstractDoubleScalarRel;
5   import org.djunits.value.vdouble.scalar.DoubleScalarInterface;
6   
7   import nl.tudelft.simulation.language.Throw;
8   
9   /**
10   * <p>
11   * Copyright (c) 2013-2016 Delft University of Technology, PO Box 5, 2600 AA, Delft, the Netherlands. All rights reserved. <br>
12   * BSD-style license. See <a href="http://opentrafficsim.org/node/13">OpenTrafficSim License</a>.
13   * <p>
14   * @version $Revision$, $LastChangedDate$, by $Author$, initial version 17 okt. 2016 <br>
15   * @author <a href="http://www.tbm.tudelft.nl/averbraeck">Alexander Verbraeck</a>
16   * @author <a href="http://www.tudelft.nl/pknoppers">Peter Knoppers</a>
17   * @author <a href="http://www.transport.citg.tudelft.nl">Wouter Schakel</a>
18   * @param <U> unit of the value
19   * @param <T> class of the value
20   * @param <W> weight class
21   */
22  public final class Persistent<U extends Unit<U>, T extends AbstractDoubleScalarRel<U, T>, W extends Number>
23          implements DoubleScalarInterface
24  {
25  
26      /** Unit. */
27      private final U unit;
28  
29      /** Sum of values. */
30      private T sum = null;
31  
32      /** Min value. */
33      private T min = null;
34  
35      /** Max value. */
36      private T max = null;
37  
38      /** Mean value. */
39      private double mean = Double.NaN;
40  
41      /** Variance sum. */
42      private double varianceSum = Double.NaN;
43  
44      /** Sum of weights. */
45      private double weightSum = 0.0;
46  
47      /** Number of measurements. */
48      private long n = 0;
49  
50      /** Semaphore. */
51      private Object semaphore = new Object();
52  
53      /**
54       * Constructor.
55       * @param unit unit, does't matter which one, so long it belongs to the right quantity
56       */
57      public Persistent(final U unit)
58      {
59          this.unit = unit;
60      }
61  
62      /**
63       * Creates a copy.
64       * @return a copy
65       */
66      public Persistent<U, T, W> copy()
67      {
68          Persistent<U, T, W> persistent = new Persistent<>(this.unit);
69          persistent.sum = this.sum;
70          persistent.min = this.min;
71          persistent.max = this.max;
72          persistent.mean = this.mean;
73          persistent.varianceSum = this.varianceSum;
74          persistent.weightSum = this.weightSum;
75          persistent.n = this.n;
76          return persistent;
77      }
78      
79      /**
80       * Adds a value with given weight to the persistent.
81       * @param value
82       * @param weight
83       */
84      public void addValue(T value, W weight)
85      {
86          Throw.whenNull(value, "Value may not be null.");
87          Throw.whenNull(weight, "Weight may not be null.");
88          Throw.when(weight.doubleValue() < 0.0, IllegalArgumentException.class, "Weight may not be negative.");
89          synchronized (this.semaphore)
90          {
91              this.n++;
92              this.min = this.min == null || value.lt(this.min) ? value : this.min;
93              this.max = this.max == null || value.gt(this.max) ? value : this.max;
94              this.sum = this.sum != null ? this.sum.plus(value) : value;
95  
96              // see Knuth's The Art Of Computer Programming Volume II: Seminumerical Algorithms
97              double w = weight.doubleValue();
98              if (this.n == 1)
99              {
100                 this.mean = value.si;
101                 this.weightSum = w;
102                 this.varianceSum = 0.0;
103             }
104             else
105             {
106                 if (w > 0.0)
107                 {
108                     double newWeightSum = this.weightSum + w;
109                     double newMean = ((this.mean * this.weightSum) + (value.si * w)) / newWeightSum;
110                     this.varianceSum += (value.si - this.mean) * (value.si - newMean) * w;
111                     this.mean = newMean;
112                     this.weightSum = newWeightSum;
113                 }
114             }
115         }
116     }
117 
118     /**
119      * @param alpha confidence level
120      * @return both-side confidence interval
121      */
122     public ConfidenceInterval<T> getConfidenceInterval(final double alpha)
123     {
124         return getConfidenceInterval(alpha, IntervalSide.BOTH);
125     }
126 
127     /**
128      * @param alpha confidence level
129      * @param side side of confidence interval
130      * @return confidence interval
131      */
132     public ConfidenceInterval<T> getConfidenceInterval(final double alpha, final IntervalSide side)
133     {
134         Throw.whenNull(side, "Interval side may not be null.");
135         if (alpha < 0 || alpha > 1)
136         {
137             throw new IllegalArgumentException("1 >= confidenceLevel >= 0");
138         }
139         synchronized (this.semaphore)
140         {
141             if (Double.isNaN(this.mean) || Double.isNaN(this.getStDev().si))
142             {
143                 return null;
144             }
145             double level = 1 - alpha;
146             if (side == IntervalSide.BOTH)
147             {
148                 level = 1 - alpha / 2.0;
149             }
150             double z = getInverseCumulativeProbability(level);
151             double confidence = z * Math.sqrt(this.getVariance() / this.n);
152             double[] result = { this.mean - confidence, this.mean + confidence };
153             if (side == IntervalSide.LEFT)
154             {
155                 result[1] = this.mean;
156             }
157             if (side == IntervalSide.RIGHT)
158             {
159                 result[0] = this.mean;
160             }
161             result[0] = Math.max(result[0], this.min.si);
162             result[1] = Math.min(result[1], this.max.si);
163             return new ConfidenceInterval<>(instantiate(result[0]), instantiate(result[1]));
164         }
165     }
166 
167     /**
168      * @return min value
169      */
170     public T getMin()
171     {
172         return this.min;
173     }
174 
175     /**
176      * @return max value
177      */
178     public T getMax()
179     {
180         return this.max;
181     }
182 
183     /**
184      * @return number of measurments
185      */
186     public long getN()
187     {
188         return this.n;
189     }
190 
191     /**
192      * @return mean value
193      */
194     public T getMean()
195     {
196         return instantiate(this.mean);
197     }
198 
199     /** {@inheritDoc} */
200     @Override
201     public double getSI()
202     {
203         return this.mean;
204     }
205 
206     /** {@inheritDoc} */
207     @Override
208     public double getInUnit()
209     {
210         return this.mean;
211     }
212 
213     /**
214      * @return variance in si
215      */
216     public double getVariance()
217     {
218         synchronized (this.semaphore)
219         {
220             if (this.n > 1)
221             {
222                 return this.n * this.varianceSum / (this.weightSum * (this.n - 1));
223             }
224             return Double.NaN;
225         }
226     }
227 
228     /**
229      * @return standard deviation
230      */
231     public T getStDev()
232     {
233         synchronized (this.semaphore)
234         {
235             if (this.n > 1)
236             {
237                 return instantiate(Math.sqrt(this.n * this.varianceSum / (this.weightSum * (this.n - 1))));
238             }
239             return instantiate(Double.NaN);
240         }
241     }
242 
243     /**
244      * @param valueSI si value
245      * @return instantiate typed value from si value
246      */
247     private final T instantiate(double valueSI)
248     {
249         return this.min.instantiateRel(valueSI, this.unit.getStandardUnit());
250     }
251 
252     /**
253      * @return sum
254      */
255     public T getSum()
256     {
257         return this.sum;
258     }
259 
260     /**
261      * returns the x-value of the given cumulativePropability.
262      * @param cumulativeProbability reflects cum prob
263      * @return double the inverse cumulative probability
264      */
265     private double getInverseCumulativeProbability(final double cumulativeProbability)
266     {
267         if (cumulativeProbability < 0 || cumulativeProbability > 1)
268         {
269             throw new IllegalArgumentException("1<cumulativeProbability<0 ?");
270         }
271         boolean located = false;
272         double prob = cumulativeProbability;
273         if (cumulativeProbability < 0.5)
274         {
275             prob = 1 - cumulativeProbability;
276         }
277         int i = 0;
278         while (!located)
279         {
280             if (CUMULATIVE_NORMAL_PROPABILITIES[i] < prob && CUMULATIVE_NORMAL_PROPABILITIES[i + 1] > prob)
281             {
282                 located = true;
283             }
284             i++;
285         }
286         return (0 + i / 100.0);
287     }
288 
289     /**
290      * CUMULATIVE_NORMAL_PROPABILITIES represents the NORMAL DISTRIBUTION FUNCTION TABLE. In order to keep this table as fast as
291      * possible no x values are stored. The range of the table is {0.00,0.01,0.02,...,10.00}
292      */
293     private static final double[] CUMULATIVE_NORMAL_PROPABILITIES = { 0.5000000000000000, 0.5039873616189113,
294             0.5079763193203305, 0.5119644795160448, 0.5159514436524734, 0.5199368135347197, 0.5239201914458871,
295             0.5279011802661332, 0.5318793835914418, 0.5358544058520341, 0.5398258524303582, 0.5437933297786074,
296             0.5477564455357087, 0.5517148086437129, 0.5556680294635363, 0.5596157198900099, 0.5635574934661438,
297             0.567492965496589, 0.5714217531602216, 0.5753434756217956, 0.5792577541426178, 0.5831642121901748,
298             0.5870624755466856, 0.5909521724164968, 0.5948329335322977, 0.5987043922600851, 0.6025661847028365,
299             0.6064179498028396, 0.6102593294426336, 0.6140899685445192, 0.6179095151685767, 0.6217176206091617,
300             0.6255139394898266, 0.6292981298566381, 0.6330698532698229, 0.6368287748937326, 0.6405745635850643,
301             0.644306891979308, 0.6480254365753887, 0.6517298778184553, 0.6554199001807951, 0.6590951922408244,
302             0.6627554467601383, 0.6664003607585898, 0.6700296355873492, 0.6736429769999337, 0.6772400952211824,
303             0.6808207050141283, 0.684384525744776, 0.6879312814447339, 0.6914607008716991, 0.6949725175677556,
304             0.6984664699154933, 0.7019423011919023, 0.7053997596200493, 0.7088385984185037, 0.7122585758485337,
305             0.7156594552589977, 0.719041005128991, 0.722402999108207, 0.7257452160549791, 0.7290674400720636,
306             0.7323694605400943, 0.7356510721487322, 0.73891207492553, 0.7421522742624731, 0.7453714809402076,
307             0.7485695111499924, 0.7517461865133215, 0.754901334099275, 0.7580347864395746, 0.761146381541351, 0.764235962897659,
308             0.7673033794957203, 0.7703484858229172, 0.7733711418705582, 0.7763712131354236, 0.779348570619097,
309             0.7823030908251122, 0.7852346557539338, 0.7881431528957866, 0.79102847522134, 0.7938905211703059,
310             0.7967291946379159, 0.7995444049593787, 0.8023360668922485, 0.8051041005968205, 0.8078484316145099,
311             0.810568990844285, 0.8132657145171739, 0.8159385441688476, 0.8185874266103501, 0.8212123138969823,
312             0.8238131632953734, 0.8263899372487721, 0.8289426033406134, 0.831471134256341, 0.8339755077435994,
313             0.8364557065707554, 0.8389117184838284, 0.8413435361618438, 0.8437511571706939, 0.8461345839154543,
314             0.8484938235912971, 0.8508288881329673, 0.8531397941628848, 0.8554265629379223, 0.8576892202948876,
315             0.8599277965947512, 0.8621423266656558, 0.8643328497447642, 0.866499409418988, 0.8686420535645871,
316             0.8707608342857796, 0.872855807852312, 0.8749270346360735, 0.8769745790467864, 0.8789985094668413,
317             0.8809988981852741, 0.8829758213309686, 0.8849293588050865, 0.886859594212814, 0.8887666147944305,
318             0.8906505113557653, 0.8925113781980463, 0.8943493130472426, 0.8961644169828942, 0.8979567943664809,
319             0.8997265527693831, 0.9014738029004713, 0.9031986585333613, 0.9049012364333603, 0.9065816562841962,
320             0.9082400406144879, 0.9098765147240866, 0.9114912066102397, 0.9130842468937037, 0.9146557687447538,
321             0.9162059078092082, 0.9177348021344403, 0.9192425920954638, 0.9207294203210978, 0.9221954316202577,
322             0.9236407729084056, 0.9250655931341809, 0.9264700432062887, 0.9278542759206125, 0.9292184458876369,
323             0.9305627094602053, 0.9318872246616042, 0.9331921511140636, 0.9344776499676445, 0.9357438838296055,
324             0.9369910166942079, 0.9382192138730403, 0.9394286419258764, 0.940619468592069, 0.941791862722541,
325             0.9429459942123697, 0.944082033934012, 0.9452001536711674, 0.9463005260533299, 0.9473833244910284,
326             0.9484487231117875, 0.94949689669682, 0.9505280206184922, 0.9515422707785594, 0.9525398235471815,
327             0.9535208557027719, 0.9544855443726583, 0.9554340669746081, 0.9563666011591815, 0.9572833247529947,
328             0.9581844157028426, 0.9590700520207252, 0.9599404117298032, 0.9607956728112474, 0.9616360131520566,
329             0.9624616104937792, 0.9632726423822178, 0.9640692861180821, 0.9648517187086078, 0.9656201168201517,
330             0.9663746567317699, 0.9671155142897785, 0.9678428648633103, 0.9685568833008597, 0.9692577438878406,
331             0.9699456203051116, 0.9706206855885555, 0.971283112089614, 0.9719330714368619, 0.9725707344985791,
332             0.9731962713463076, 0.973809851219447, 0.9744116424908279, 0.9750018126333039, 0.9755805281873245,
333             0.9761479547295168, 0.9767042568422514, 0.9772495980842009, 0.9777841409618732, 0.9783080469021415,
334             0.9788214762257182, 0.979324588121612, 0.9798175406225412, 0.9803004905813041, 0.9807735936480722,
335             0.981237004248657, 0.9816908755636616, 0.9821353595085873, 0.9825706067148376, 0.9829967665116119,
336             0.9834139869087157, 0.9838224145802272, 0.9842221948490532, 0.9846134716723274, 0.9849963876276845,
337             0.9853710839003452, 0.985737700271045, 0.9860963751047681, 0.9864472453402844, 0.9867904464804915,
338             0.9871261125835228, 0.9874543762546124, 0.9877753686387415, 0.9880892194139929, 0.988396056785651,
339             0.9886960074810209, 0.9889891967449299, 0.9892757483359246, 0.989555784523144, 0.9898294260838525,
340             0.9900967923016145, 0.9903580009651043, 0.9906131683675308, 0.9908624093066779, 0.9911058370855164,
341             0.9913435635134026, 0.991575698907852, 0.9918023520968361, 0.9920236304216317, 0.9922396397401824,
342             0.9924504844309792, 0.9926562673974049, 0.992857090072596, 0.9930530524247368, 0.9932442529628207,
343             0.9934307887428471, 0.9936127553744406, 0.993790247027868, 0.9939633564414762, 0.9941321749294971,
344             0.9942967923902228, 0.9944572973145361, 0.9946137767947988, 0.9947663165340496, 0.9949150008555357,
345             0.9950599127125389, 0.9952011336985047, 0.9953387440574476, 0.9954728226946147, 0.9956034471874149,
346             0.9957306937965966, 0.9958546374776436, 0.9959753518924065, 0.9960929094209239, 0.9962073811734615,
347             0.9963188370027265, 0.9964273455162624, 0.9965329740889989, 0.9966357888759699, 0.9967358548251734,
348             0.9968332356905508, 0.9969279940451093, 0.9970201912941401, 0.9971098876885598, 0.9971971423383441,
349             0.9972820132260181, 0.9973645572202651, 0.9974448300895796, 0.9975228865159886, 0.9975987801088081,
350             0.9976725634184758, 0.9977442879503817, 0.9978140041787443, 0.9978817615605097, 0.9979476085492539,
351             0.9980115926090906, 0.9980737602285842, 0.9981341569346482, 0.9981928273064313, 0.9982498149891729,
352             0.998305162708049, 0.9983589122819604, 0.9984111046372987, 0.9984617798216666, 0.9985109770175317,
353             0.9985587345558365, 0.9986050899295523, 0.9986500798071501, 0.9986937400460181, 0.9987361057057903,
354             0.9987772110616016, 0.9988170896172607, 0.9988557741183267, 0.9988932965651068, 0.9989296882255506,
355             0.9989649796480435, 0.9989992006741035, 0.9990323804509681, 0.9990645474440748, 0.999095729449436,
356             0.999125953605889, 0.9991552464072354, 0.9991836337142654, 0.9992111407666507, 0.9992377921947238,
357             0.9992636120311323, 0.9992886237223589, 0.9993128501401143, 0.9993363135925993, 0.9993590358356453,
358             0.999381038083711, 0.9994023410207445, 0.9994229648109153, 0.9994429291092068, 0.9994622530718738,
359             0.9994809553667513, 0.9994990541834521, 0.9995165672433891, 0.9995335118096818, 0.9995499046969138,
360             0.999565762280761, 0.9995811005074615, 0.9995959349031589, 0.9996102805830935, 0.9996241522606701,
361             0.9996375642563711, 0.9996505305065254, 0.9996630645719558, 0.9996751796464766, 0.9996868885652497,
362             0.9996982038129988, 0.9997091375321072, 0.999719701530551, 0.9997299072897112, 0.9997397659720517,
363             0.9997492884286557, 0.9997584852066235, 0.9997673665563579, 0.9997759424386968, 0.9997842225319191,
364             0.9997922162386252, 0.9997999326924907, 0.999807380764881, 0.999814569071358, 0.9998215059780381,
365             0.9998281996078514, 0.9998346578466425, 0.9998408883492018, 0.9998468985451213, 0.9998526956445724,
366             0.999858286643944, 0.9998636783313704, 0.9998688772921471, 0.9998738899140359, 0.9998787223924446,
367             0.9998833807355126, 0.9998878707690767, 0.9998921981415287, 0.9998963683285831, 0.9999003866379228,
368             0.9999042582137387, 0.99990798804119, 0.999911580950741, 0.9999150416224173, 0.9999183745899578, 0.9999215842448586,
369             0.9999246748403525, 0.9999276504952729, 0.9999305151978185, 0.9999332728092672, 0.9999359270675735,
370             0.9999384815908634, 0.9999409398808894, 0.9999433053263691, 0.9999455812062524, 0.9999477706929066,
371             0.999949876855225, 0.9999519026616563, 0.9999538509831598, 0.9999557245960793, 0.9999575261849584,
372             0.9999592583452697, 0.9999609235860767, 0.9999625243326383, 0.9999640629289291, 0.9999655416401065,
373             0.9999669626549059, 0.9999683280879766, 0.9999696399821539, 0.9999709003106689, 0.9999721109793053,
374             0.9999732738284871, 0.9999743906353185, 0.9999754631155693, 0.9999764929255975, 0.9999774816642223,
375             0.9999784308745513, 0.9999793420457469, 0.9999802166147403, 0.9999810559679307, 0.9999818614427762,
376             0.9999826343293992, 0.9999833758721115, 0.9999840872709006, 0.999984769682885, 0.9999854242237042,
377             0.9999860519689024, 0.9999866539552403, 0.9999872311819792, 0.9999877846121323, 0.9999883151736708,
378             0.9999888237607027, 0.9999893112346047, 0.999989778425137, 0.9999902261314975, 0.9999906551233723,
379             0.9999910661419341, 0.9999914599008299, 0.9999918370871163, 0.999992198362175, 0.9999925443626037,
380             0.9999928757010765, 0.999993192967172, 0.9999934967281847, 0.9999937875299059, 0.9999940658973759,
381             0.9999943323356203, 0.9999945873303567, 0.9999948313486832, 0.9999950648397335, 0.9999952882353275,
382             0.9999955019505884, 0.9999957063845496, 0.9999959019207282, 0.9999960889276895, 0.9999962677595902,
383             0.9999964387567071, 0.9999966022459394, 0.9999967585412978, 0.9999969079443901, 0.9999970507448684,
384             0.9999971872208745, 0.9999973176394685, 0.9999974422570479, 0.9999975613197305, 0.9999976750637555,
385             0.9999977837158475, 0.9999978874935767, 0.9999979866057059, 0.9999980812525245, 0.9999981716261707,
386             0.9999982579109443, 0.9999983402836066, 0.9999984189136624, 0.999998493963655, 0.9999985655894209,
387             0.9999986339403611, 0.9999986991596813, 0.9999987613846415, 0.9999988207467845, 0.9999988773721528,
388             0.9999989313815221, 0.999998982890599, 0.9999990320102132, 0.9999990788465284, 0.9999991235012167,
389             0.9999991660716405, 0.9999992066510266, 0.99999924532863, 0.9999992821898891, 0.9999993173165908,
390             0.9999993507870083, 0.999999382676051, 0.9999994130553951, 0.9999994419936197, 0.9999994695563318,
391             0.999999495806289, 0.9999995208035128, 0.9999995446054075, 0.9999995672668669, 0.9999995888403767,
392             0.9999996093761104, 0.9999996289220386, 0.9999996475240089, 0.999999665225837, 0.9999996820693978,
393             0.9999996980947014, 0.9999997133399728, 0.9999997278417341, 0.9999997416348584, 0.9999997547526686,
394             0.9999997672269785, 0.999999779088168, 0.9999997903652507, 0.9999998010859101, 0.9999998112765858,
395             0.9999998209625084, 0.9999998301677586, 0.999999838915313, 0.9999998472271051, 0.9999998551240461,
396             0.9999998626260925, 0.9999998697522797, 0.9999998765207626, 0.999999882948852, 0.9999998890530569,
397             0.9999998948491172, 0.9999999003520337, 0.9999999055761172, 0.9999999105349969, 0.9999999152416649,
398             0.9999999197085024, 0.9999999239473055, 0.9999999279693159, 0.9999999317852374, 0.9999999354052702,
399             0.9999999388391236, 0.9999999420960494, 0.9999999451848542, 0.9999999481139239, 0.9999999508912378,
400             0.999999953524401, 0.999999956020643, 0.999999958386847, 0.9999999606295614, 0.9999999627550202, 0.999999964769152,
401             0.9999999666775974, 0.9999999684857224, 0.9999999701986259, 0.9999999718211613, 0.9999999733579436,
402             0.9999999748133596, 0.9999999761915778, 0.9999999774965675, 0.9999999787320892, 0.9999999799017258,
403             0.9999999810088808, 0.9999999820567871, 0.9999999830485156, 0.9999999839869854, 0.9999999848749658,
404             0.9999999857150916, 0.999999986509861, 0.9999999872616481, 0.9999999879727063, 0.9999999886451735,
405             0.9999999892810812, 0.9999999898823579, 0.9999999904508311, 0.9999999909882377, 0.9999999914962242,
406             0.9999999919763545, 0.9999999924301094, 0.9999999928588945, 0.9999999932640453, 0.9999999936468255,
407             0.9999999940084324, 0.9999999943500043, 0.9999999946726192, 0.9999999949772991, 0.9999999952650122,
408             0.999999995536675, 0.9999999957931576, 0.9999999960352846, 0.999999996263837, 0.9999999964795528,
409             0.9999999966831338, 0.9999999968752427, 0.9999999970565085, 0.9999999972275259, 0.9999999973888581,
410             0.9999999975410393, 0.9999999976845725, 0.9999999978199366, 0.9999999979475838, 0.9999999980679412,
411             0.9999999981814149, 0.999999998288388, 0.9999999983892215, 0.9999999984842588, 0.9999999985738248,
412             0.9999999986582248, 0.9999999987377505, 0.9999999988126743, 0.9999999988832565, 0.9999999989497415,
413             0.9999999990123608, 0.9999999990713334, 0.9999999991268663, 0.9999999991791552, 0.9999999992283836,
414             0.9999999992747264, 0.9999999993183496, 0.9999999993594075, 0.9999999993980476, 0.9999999994344076,
415             0.9999999994686192, 0.9999999995008081, 0.9999999995310868, 0.9999999995595689, 0.999999999586359,
416             0.9999999996115511, 0.9999999996352417, 0.9999999996575185, 0.9999999996784616, 0.9999999996981475,
417             0.9999999997166537, 0.9999999997340464, 0.9999999997503924, 0.9999999997657535, 0.9999999997801852,
418             0.9999999997937458, 0.9999999998064829, 0.9999999998184489, 0.9999999998296857, 0.9999999998402402,
419             0.9999999998501493, 0.9999999998594546, 0.9999999998681913, 0.9999999998763954, 0.9999999998840915,
420             0.9999999998913157, 0.9999999998980964, 0.9999999999044622, 0.9999999999104311, 0.9999999999160324,
421             0.9999999999212845, 0.9999999999262145, 0.9999999999308378, 0.9999999999351717, 0.999999999939236,
422             0.9999999999430531, 0.9999999999466233, 0.9999999999499747, 0.9999999999531113, 0.9999999999560638,
423             0.9999999999588188, 0.9999999999613983, 0.9999999999638182, 0.9999999999660865, 0.9999999999682123,
424             0.9999999999702063, 0.99999999997208, 0.9999999999738262, 0.9999999999754482, 0.9999999999769803,
425             0.9999999999784355, 0.999999999979752, 0.9999999999810224, 0.9999999999821866, 0.9999999999832953,
426             0.9999999999843139, 0.9999999999852993, 0.9999999999861725, 0.9999999999870456, 0.9999999999878133,
427             0.9999999999885409, 0.9999999999892686, 0.9999999999898902, 0.9999999999904723, 0.9999999999910544,
428             0.9999999999916365, 0.9999999999920739, 0.9999999999925104, 0.999999999992947, 0.9999999999933835,
429             0.9999999999938161, 0.999999999994107, 0.9999999999943981, 0.9999999999946891, 0.9999999999949801,
430             0.9999999999952712, 0.9999999999955622, 0.9999999999958533, 0.9999999999960634, 0.9999999999962089,
431             0.9999999999963545, 0.9999999999965, 0.9999999999966455, 0.999999999996791, 0.9999999999969366, 0.999999999997082,
432             0.9999999999972276, 0.9999999999973731, 0.9999999999975187, 0.9999999999976641, 0.9999999999978096,
433             0.9999999999979552, 0.9999999999981006, 0.9999999999982462, 0.9999999999982816, 0.9999999999982816,
434             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
435             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
436             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
437             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
438             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
439             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
440             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
441             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
442             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
443             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
444             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
445             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
446             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
447             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
448             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
449             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
450             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
451             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
452             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
453             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
454             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
455             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
456             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
457             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
458             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
459             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
460             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
461             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
462             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
463             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
464             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
465             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
466             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
467             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
468             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
469             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
470             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
471             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
472             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
473             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
474             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
475             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
476             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
477             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
478             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
479             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
480             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
481             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
482             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
483             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
484             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
485             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
486             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
487             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
488             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
489             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
490             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
491             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816,
492             0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 0.9999999999982816, 1.0000000000000000 };
493 
494 }