using HilbertSchmidtIndependenceCriterion
using Test

# data
X = [-0.2433   -1.1410    0.7903   -0.5062    0.5668    0.6861    0.3256   -1.2743    0.3403   -0.4115;
   -0.7473    0.7157    0.0778    0.5060   -0.8018   -0.4555    1.2192   -0.9725   -0.3975   -0.4692;
   -1.8649   -1.0257   -0.8888    0.8538   -0.2300    1.3616   -1.2759    0.6357   -1.2806    0.8666;
   -0.9981    0.6345   -0.2449   -1.1629   -1.5696    1.2884   -2.4034   -0.9240    0.6828    1.0895;
    0.6304    0.0738    0.1950    0.5096   -0.5894   -0.6975   -0.7219   -0.4880   -1.7749    0.1688;
    0.9231    0.1652    0.7928   -1.5919    0.2999   -0.5722   -0.8011    0.3885    1.8926    1.5672;
    0.9512    0.5355    0.1816   -1.5473    1.6256   -0.6757    0.2539   -0.3323    0.6048   -0.6128;
   -0.9314   -1.5384    2.2852   -0.5943   -0.4123   -1.6746   -0.5080   -1.6629    0.3894   -0.4103;
   -1.0362    0.7568    0.3759    0.8777   -0.8261    0.0162   -1.6744   -1.8138   -0.1012   -0.6914;
   -1.3328    0.2287   -0.1785   -0.3840    1.0539   -1.2816    0.0528    0.5623    0.2620   -0.1908]

Y = [-0.3025    0.3002   -0.1137   -0.1182    0.0001    0.0003   -0.0349    0.0622    0.1032    0.2134;
    0.1211    0.2137   -0.0572    0.1728   -0.1178    0.0028    0.1929    0.0682   -0.2034   -0.4904;
   -0.0240    0.2245   -0.0098   -0.2657   -0.0709   -0.0686   -0.1034    0.1989    0.0252    0.0654;
   -0.1064   -0.2296   -0.1406   -0.0826   -0.2258    0.0583   -0.1604    0.1040   -0.2303   -0.2311;
    0.1787   -0.0681    0.0634    0.0154    0.0965   -0.2212   -0.5266    0.0783   -0.1328    0.0395;
    0.1153    0.2439   -0.0669    0.4550    0.0372   -0.2356    0.0208    0.0617   -0.0346    0.3055;
   -0.0782   -0.2572    0.2275    0.1107    0.1034    0.1801    0.4776   -0.0141    0.0969   -0.2561;
    0.0732   -0.0995    0.2098    0.0772    0.4193   -0.2355    0.0905    0.2314   -0.3197   -0.1537;
    0.2838   -0.0845    0.0613   -0.2866   -0.1755   -0.0226    0.3473    0.2075   -0.1599   -0.0624;
    0.1457   -0.1459    0.0878    0.0085   -0.1861   -0.1096    0.2240   -0.0176    0.0995   -0.0136]

# Common tests
println("# Run Common Function Tests")
@test estimateKernelSize(X) ≈ 2 atol=1

# rbf dot product truth
rbftruth = [1.0000    0.2920    0.0945    0.0811    0.1872    0.1310    0.2986    0.2776    0.1904    0.2337;
    0.2920    1.0000    0.0786    0.0543    0.3356    0.0464    0.1449    0.1207    0.2955    0.2940;
    0.0945    0.0786    1.0000    0.1136    0.1459    0.0164    0.0145    0.0165    0.1107    0.1081;
    0.0811    0.0543    0.1136    1.0000    0.0746    0.1040    0.0283    0.0300    0.2275    0.0472;
    0.1872    0.3356    0.1459    0.0746    1.0000    0.0651    0.1239    0.1046    0.2800    0.1773;
    0.1310    0.0464    0.0164    0.1040    0.0651    1.0000    0.2751    0.0660    0.0352    0.1519;
    0.2986    0.1449    0.0145    0.0283    0.1239    0.2751    1.0000    0.0746    0.0577    0.3403;
    0.2776    0.1207    0.0165    0.0300    0.1046    0.0660    0.0746    1.0000    0.1383    0.1189;
    0.1904    0.2955    0.1107    0.2275    0.2800    0.0352    0.0577    0.1383    1.0000    0.1272;
    0.2337    0.2940    0.1081    0.0472    0.1773    0.1519    0.3403    0.1189    0.1272    1.0000]

@test sum(rbfDotProduct(X, X, 2.0) - rbftruth) ≈ 0.0 atol=1e-4

# Gamma HSIC tests
println("# Run Gamma HSIC Test")

@test gammaHSIC(X, Y)[2] ≈ 0.4 atol=1e-1
@test gammaHSIC(X, Y)[1] < gammaHSIC(X, Y)[2]

println("# Finished Tests")
