15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var count = output.length; 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var itemTotals = {}; 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)itemTotals.length = count; 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var total = 0; 325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryTotals = {}; 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testTotalsByCategory = {}; 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var mean = 0; 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryMeans = {}; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testMeansByCategory = {}; 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var stdDev = 0; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryStdDevs = {}; 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testStdDevsByCategory = {}; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var stdErr = 0; 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var categoryStdErrs = {}; 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var testStdErrsByCategory = {}; 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function initialize() 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals = {total: []}; 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < categories.length; i++) { 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var category = categories[i]; 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[category] = []; 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryTotals[category] = 0; 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testTotalsByCategory[category] = {}; 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryMeans[category] = 0; 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testMeansByCategory[category] = {}; 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryStdDevs[category] = 0; 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdDevsByCategory[category] = {}; 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryStdErrs[category] = 0; 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdErrsByCategory[category] = {}; 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < tests.length; i++) { 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var test = tests[i]; 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[test] = []; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var category = test.replace(/-.*/, ""); 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testTotalsByCategory[category][test] = 0; 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testMeansByCategory[category][test] = 0; 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdDevsByCategory[category][test] = 0; 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdErrsByCategory[category][test] = 0; 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < count; i++) { 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals["total"][i] = 0; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryTotals) { 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[category][i] = 0; 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testTotalsByCategory[category]) { 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[test][i] = 0; 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeItemTotals() 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < output.length; i++) { 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = output[i]; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in result) { 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var time = result[test]; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var category = test.replace(/-.*/, ""); 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals["total"][i] += time; 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[category][i] += time; 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) itemTotals[test][i] += time; 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeTotals() 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < output.length; i++) { 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = output[i]; 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in result) { 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var time = result[test]; 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var category = test.replace(/-.*/, ""); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) total += time; 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryTotals[category] += time; 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testTotalsByCategory[category][test] += time; 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeMeans() 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) mean = total / count; 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryTotals) { 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryMeans[category] = categoryTotals[category] / count; 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testTotalsByCategory[category]) { 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testMeansByCategory[category][test] = testTotalsByCategory[category][test] / count; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function standardDeviation(mean, items) 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var deltaSquaredSum = 0; 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < items.length; i++) { 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var delta = items[i] - mean; 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) deltaSquaredSum += delta * delta; 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) variance = deltaSquaredSum / (items.length - 1); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return Math.sqrt(variance); 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeStdDevs() 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stdDev = standardDeviation(mean, itemTotals["total"]); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryStdDevs) { 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryStdDevs[category] = standardDeviation(categoryMeans[category], itemTotals[category]); 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryStdDevs) { 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testStdDevsByCategory[category]) { 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdDevsByCategory[category][test] = standardDeviation(testMeansByCategory[category][test], itemTotals[test]); 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeStdErrors() 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var sqrtCount = Math.sqrt(count); 1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) stdErr = stdDev / sqrtCount; 1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryStdErrs) { 1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) categoryStdErrs[category] = categoryStdDevs[category] / sqrtCount; 1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryStdDevs) { 1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testStdErrsByCategory[category]) { 1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) testStdErrsByCategory[category][test] = testStdDevsByCategory[category][test] / sqrtCount; 1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tDistribution = [NaN, NaN, 12.71, 4.30, 3.18, 2.78, 2.57, 2.45, 2.36, 2.31, 2.26, 2.23, 2.20, 2.18, 2.16, 2.14, 2.13, 2.12, 2.11, 2.10, 2.09, 2.09, 2.08, 2.07, 2.07, 2.06, 2.06, 2.06, 2.05, 2.05, 2.05, 2.04, 2.04, 2.04, 2.03, 2.03, 2.03, 2.03, 2.03, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.02, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.01, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 2.00, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.99, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.98, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.97, 1.96]; 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tMax = tDistribution.length; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)var tLimit = 1.96; 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function tDist(n) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n > tMax) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tLimit; 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return tDistribution[n]; 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function formatResult(meanWidth, mean, stdErr, n) 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var meanString = mean.toFixed(1).toString(); 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) while (meanString.length < meanWidth) { 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) meanString = " " + meanString; 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (n == 1) 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return meanString + "ms"; 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return meanString + "ms +/- " + ((tDist(n) * stdErr / mean) * 100).toFixed(1) + "%"; 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeLabelWidth() 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var width = "Total".length; 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryMeans) { 1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (category.length + 2 > width) 1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = category.length + 2; 1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var i = 0; i < tests.length; i++) { 1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var shortName = tests[i].replace(/^[^-]*-/, ""); 1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (shortName.length + 4 > width) 1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = shortName.length + 4; 2005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return width; 2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function computeMeanWidth() 2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var width = mean.toFixed(1).toString().length; 2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryMeans) { 2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var candidate = categoryMeans[category].toFixed(2).toString().length; 2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (candidate > width) 2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = candidate; 2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testMeansByCategory[category]) { 2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var candidate = testMeansByCategory[category][test].toFixed(2).toString().length; 2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (candidate > width) 2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) width = candidate; 2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return width; 2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function resultLine(labelWidth, indent, label, meanWidth, mean, stdErr) 2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var result = ""; 2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (i = 0; i < indent; i++) { 2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += " "; 2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += label + ": "; 2305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (i = 0; i < (labelWidth - (label.length + indent)); i++) { 2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result += " "; 2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result + formatResult(meanWidth, mean, stdErr, count); 2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)function printOutput() 2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var labelWidth = computeLabelWidth(); 2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var meanWidth = computeMeanWidth(); 2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("\n"); 2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("============================================"); 2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (count == 1) 2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("RESULTS"); 2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) else 2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("RESULTS (means and 95% confidence intervals)"); 2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("--------------------------------------------"); 2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print(resultLine(labelWidth, 0, "Total", meanWidth, mean, stdErr)); 2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print("--------------------------------------------"); 2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var category in categoryMeans) { 2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print(""); 2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print(resultLine(labelWidth, 2, category, meanWidth, categoryMeans[category], categoryStdErrs[category])); 2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (var test in testMeansByCategory[category]) { 2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) var shortName = test.replace(/^[^-]*-/, ""); 2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) print(resultLine(labelWidth, 4, shortName, meanWidth, testMeansByCategory[category][test], testStdErrsByCategory[category][test])); 2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)initialize(); 2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeItemTotals(); 2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeTotals(); 2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeMeans(); 2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeStdDevs(); 2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)computeStdErrors(); 2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)printOutput(); 269