# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
#------------------------------------------------------------------------------
# R source file to validate covariance tests in
# org.apache.commons.math.stat.correlation.CovarianceTest
#
# To run the test, install R, put this file and testFunctions
# into the same directory, launch R from this directory and then enter
# source("<name-of-this-file>")
#
#------------------------------------------------------------------------------
tol <- 1E-9                       # error tolerance for tests
#------------------------------------------------------------------------------
# Function definitions

source("testFunctions")           # utility test functions
options(digits=16)	              # override number of digits displayed

# function to verify covariance computations
verifyCovariance <- function(matrix, expectedCovariance, name) {
    covariance <- cov(matrix)
    output <- c("Covariance test dataset = ", name)
    if (assertEquals(expectedCovariance,covariance,tol,"Covariances")) {
        displayPadded(output, SUCCEEDED, WIDTH)
    } else {
        displayPadded(output, FAILED, WIDTH)
    }  
}

#--------------------------------------------------------------------------
cat("Covariance test cases\n")

# Longley

longley <- matrix(c(60323,83.0,234289,2356,1590,107608,1947,
                    61122,88.5,259426,2325,1456,108632,1948,
                    60171,88.2,258054,3682,1616,109773,1949,
                    61187,89.5,284599,3351,1650,110929,1950,
                    63221,96.2,328975,2099,3099,112075,1951,
                    63639,98.1,346999,1932,3594,113270,1952,
                    64989,99.0,365385,1870,3547,115094,1953,
                    63761,100.0,363112,3578,3350,116219,1954,
                    66019,101.2,397469,2904,3048,117388,1955,
                    67857,104.6,419180,2822,2857,118734,1956,
                    68169,108.4,442769,2936,2798,120445,1957,
                    66513,110.8,444546,4681,2637,121950,1958,
                    68655,112.6,482704,3813,2552,123366,1959,
                    69564,114.2,502601,3931,2514,125368,1960,
                    69331,115.7,518173,4806,2572,127852,1961,
                    70551,116.9,554894,4007,2827,130081,1962),
                    nrow = 16, ncol = 7, byrow = TRUE)

expectedCovariance <- matrix(c(
         12333921.73333333246, 3.679666000000000e+04, 343330206.333333313,
         1649102.666666666744, 1117681.066666666651, 23461965.733333334, 16240.93333333333248,
         36796.66000000000, 1.164576250000000e+02, 1063604.115416667,
         6258.666250000000, 3490.253750000000, 73503.000000000, 50.92333333333334,
         343330206.33333331347, 1.063604115416667e+06, 9879353659.329166412,
         56124369.854166664183, 30880428.345833335072, 685240944.600000024, 470977.90000000002328,
         1649102.66666666674, 6.258666250000000e+03, 56124369.854166664,
         873223.429166666698, -115378.762499999997, 4462741.533333333, 2973.03333333333330,
         1117681.06666666665, 3.490253750000000e+03, 30880428.345833335,
         -115378.762499999997, 484304.095833333326, 1764098.133333333, 1382.43333333333339,
         23461965.73333333433, 7.350300000000000e+04, 685240944.600000024,
         4462741.533333333209, 1764098.133333333302, 48387348.933333330, 32917.40000000000146,
         16240.93333333333, 5.092333333333334e+01, 470977.900000000,
         2973.033333333333, 1382.433333333333, 32917.40000000, 22.66666666666667),
         nrow = 7, ncol = 7, byrow = TRUE)
         
 verifyCovariance(longley, expectedCovariance, "longley")
 
 # Swiss Fertility
 
 fertility <- matrix(c(80.2,17.0,15,12,9.96,
  83.1,45.1,6,9,84.84,
  92.5,39.7,5,5,93.40,
  85.8,36.5,12,7,33.77,
  76.9,43.5,17,15,5.16,
  76.1,35.3,9,7,90.57,
  83.8,70.2,16,7,92.85,
  92.4,67.8,14,8,97.16,
  82.4,53.3,12,7,97.67,
  82.9,45.2,16,13,91.38,
  87.1,64.5,14,6,98.61,
  64.1,62.0,21,12,8.52,
  66.9,67.5,14,7,2.27,
  68.9,60.7,19,12,4.43,
  61.7,69.3,22,5,2.82,
  68.3,72.6,18,2,24.20,
  71.7,34.0,17,8,3.30,
  55.7,19.4,26,28,12.11,
  54.3,15.2,31,20,2.15,
  65.1,73.0,19,9,2.84,
  65.5,59.8,22,10,5.23,
  65.0,55.1,14,3,4.52,
  56.6,50.9,22,12,15.14,
  57.4,54.1,20,6,4.20,
  72.5,71.2,12,1,2.40,
  74.2,58.1,14,8,5.23,
  72.0,63.5,6,3,2.56,
  60.5,60.8,16,10,7.72,
  58.3,26.8,25,19,18.46,
  65.4,49.5,15,8,6.10,
  75.5,85.9,3,2,99.71,
  69.3,84.9,7,6,99.68,
  77.3,89.7,5,2,100.00,
  70.5,78.2,12,6,98.96,
  79.4,64.9,7,3,98.22,
  65.0,75.9,9,9,99.06,
  92.2,84.6,3,3,99.46,
  79.3,63.1,13,13,96.83,
  70.4,38.4,26,12,5.62,
  65.7,7.7,29,11,13.79,
  72.7,16.7,22,13,11.22,
  64.4,17.6,35,32,16.92,
  77.6,37.6,15,7,4.97,
  67.6,18.7,25,7,8.65,
  35.0,1.2,37,53,42.34,
  44.7,46.6,16,29,50.43,
  42.8,27.7,22,29,58.33),
  nrow = 47, ncol = 5, byrow = TRUE)
   
 expectedCovariance <- matrix(c(
         156.0424976873265, 100.1691489361702, -64.36692876965772, -79.7295097132285, 241.5632030527289,
         100.169148936170251, 515.7994172062905, -124.39283071230344, -139.6574005550416, 379.9043755781684,
         -64.3669287696577, -124.3928307123034, 63.64662349676226, 53.5758556891767, -190.5606105457909,
         -79.7295097132285, -139.6574005550416, 53.57585568917669, 92.4560592044403, -61.6988297872340,
          241.5632030527289, 379.9043755781684, -190.56061054579092, -61.6988297872340, 1739.2945371877890),
          nrow = 5, ncol = 5, byrow = TRUE)
      
 verifyCovariance(fertility, expectedCovariance, "swiss fertility")
 
 displayDashes(WIDTH)