Gavin Simpson
2006-Jul-04 15:26 UTC
[Rd] problem getting R 2.3.1 svn r38481 to pass make check-all
Hi, I noticed this problem on my home desktop running FC4 and again on my laptop running FC5. Both have previously compiled and passed make check-all on 2.3.1 svn revisions from 10 days ago or so. On both these machines, make check-all is consistently failing (4 out of 4 attempts on the FC 4 desktop and 3 out of 3 on the FC 5 laptop) in the p-r-random-tests tests. This is with both default compiler flags and extra flags set in config.site. R is failing make check-all with the following set of messages: ... make[3]: Entering directory `/home/gavin/R/2.3-patches/build/tests' running code in '../../tests/p-r-random-tests.R' ... OK comparing 'p-r-random-tests.Rout' to '../../tests/p-r-random-tests.Rout.save' ...1a2,16> R version 2.4.0 Under development (unstable) (2006-06-30 r38463) > Copyright (C) 2006 The R Foundation for Statistical Computing > ISBN 3-900051-07-0 > > R is free software and comes with ABSOLUTELY NO WARRANTY. > You are welcome to redistribute it under certain conditions. > Type 'license()' or 'licence()' for distribution details. > > R is a collaborative project with many contributors. > Type 'contributors()' for more information and > 'citation()' on how to cite R or R packages in publications. > > Type 'demo()' for some demos, 'help()' for on-line help, or > 'help.start()' for an HTML browser interface to help. > Type 'q()' to quit R.254a270,274> > ## regression test for non-central t bug > > dkwtest("t", df=20, ncp=3) > t(df = 20, ncp = 3) PASSED > [1] TRUE > >make[3]: *** [p-r-random-tests.Rout] Error 1 make[3]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' make[2]: *** [test-Random] Error 2 make[2]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' make[1]: *** [test-all-devel] Error 1 make[1]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' make: *** [check-all] Error 2 I looked in ./tests/p-r-random-tests.Rout.fail and couldn't see anything that indicated a failure - everything had PASSED or TRUE as results of the tests. I append the contents of this file below. Anyone see what is wrong? Thanks in advance, Gavin ## Contents of p-r-random-tests.Rout.fail ## R : Copyright 2006, The R Foundation for Statistical Computing Version 2.3.1 Patched (2006-07-03 r38481) ISBN 3-900051-07-0 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R.> ## > ## RNG tests using DKW inequality for rate of convergence > ## > ## P(sup | F_n - F | > t) < 2 exp(-2nt^2) > ## > ## The 2 in front of exp() was derived by Massart. It is the bestpossible> ## constant valid uniformly in t,n,F. For large n*t^2 this agrees withthe> ## large-sample approximation to the Kolmogorov-Smirnov statistic. > ## > > > superror <- function(rfoo,pfoo,sample.size,...) {+ x <- rfoo(sample.size,...) + tx <- table(x) + xi <- as.numeric(names(tx)) + f <- pfoo(xi,...) + fhat <- cumsum(tx)/sample.size + max(abs(fhat-f)) + }> > pdkwbound <- function(n,t) 2*exp(-2*n*t*t) > > qdkwbound <- function(n,p) sqrt(log(p/2)/(-2*n)) > > dkwtest <- function(stub = "norm", ...,+ sample.size = 10000, pthreshold = 0.001, + print.result = TRUE, print.detail = FALSE, + stop.on.failure = TRUE) + { + rfoo <- eval(as.name(paste("r", stub, sep=""))) + pfoo <- eval(as.name(paste("p", stub, sep=""))) + s <- superror(rfoo, pfoo, sample.size, ...) + if (print.result || print.detail) { + printargs <- substitute(list(...)) + printargs[[1]] <- as.name(stub) + cat(deparse(printargs)) + if (print.detail) + cat("\nsupremum error = ",signif(s,2), + " with p-value=",min(1,round(pdkwbound(sample.size,s),4)),"\n") + } + rval <- (s < qdkwbound(sample.size,pthreshold)) + if (print.result) + cat(c(" FAILED\n"," PASSED\n",)[rval+1]) + if (stop.on.failure && !rval) + stop("dkwtest failed") + rval + }> > .proctime00 <- proc.time() # start timing > > > dkwtest("binom",size = 1,prob = 0.2)binom(size = 1, prob = 0.2) PASSED [1] TRUE> dkwtest("binom",size = 2,prob = 0.2)binom(size = 2, prob = 0.2) PASSED [1] TRUE> dkwtest("binom",size = 100,prob = 0.2)binom(size = 100, prob = 0.2) PASSED [1] TRUE> dkwtest("binom",size = 1e4,prob = 0.2)binom(size = 10000, prob = 0.2) PASSED [1] TRUE> dkwtest("binom",size = 1,prob = 0.8)binom(size = 1, prob = 0.8) PASSED [1] TRUE> dkwtest("binom",size = 100,prob = 0.8)binom(size = 100, prob = 0.8) PASSED [1] TRUE> dkwtest("binom",size = 100,prob = 0.999)binom(size = 100, prob = 0.999) PASSED [1] TRUE> > dkwtest("pois",lambda = 0.095)pois(lambda = 0.095) PASSED [1] TRUE> dkwtest("pois",lambda = 0.95)pois(lambda = 0.95) PASSED [1] TRUE> dkwtest("pois",lambda = 9.5)pois(lambda = 9.5) PASSED [1] TRUE> dkwtest("pois",lambda = 95)pois(lambda = 95) PASSED [1] TRUE> > dkwtest("nbinom",size = 1,prob = 0.2)nbinom(size = 1, prob = 0.2) PASSED [1] TRUE> dkwtest("nbinom",size = 2,prob = 0.2)nbinom(size = 2, prob = 0.2) PASSED [1] TRUE> dkwtest("nbinom",size = 100,prob = 0.2)nbinom(size = 100, prob = 0.2) PASSED [1] TRUE> dkwtest("nbinom",size = 1e4,prob = 0.2)nbinom(size = 10000, prob = 0.2) PASSED [1] TRUE> dkwtest("nbinom",size = 1,prob = 0.8)nbinom(size = 1, prob = 0.8) PASSED [1] TRUE> dkwtest("nbinom",size = 100,prob = 0.8)nbinom(size = 100, prob = 0.8) PASSED [1] TRUE> dkwtest("nbinom",size = 100,prob = 0.999)nbinom(size = 100, prob = 0.999) PASSED [1] TRUE> > dkwtest("norm")norm() PASSED [1] TRUE> dkwtest("norm",mean = 5,sd = 3)norm(mean = 5, sd = 3) PASSED [1] TRUE> > dkwtest("gamma",shape = 0.1)gamma(shape = 0.1) PASSED [1] TRUE> dkwtest("gamma",shape = 0.2)gamma(shape = 0.2) PASSED [1] TRUE> dkwtest("gamma",shape = 10)gamma(shape = 10) PASSED [1] TRUE> dkwtest("gamma",shape = 20)gamma(shape = 20) PASSED [1] TRUE> > dkwtest("hyper",m = 40,n = 30,k = 20)hyper(m = 40, n = 30, k = 20) PASSED [1] TRUE> dkwtest("hyper",m = 40,n = 3,k = 20)hyper(m = 40, n = 3, k = 20) PASSED [1] TRUE> dkwtest("hyper",m = 6,n = 3,k = 2)hyper(m = 6, n = 3, k = 2) PASSED [1] TRUE> dkwtest("hyper",m = 5,n = 3,k = 2)hyper(m = 5, n = 3, k = 2) PASSED [1] TRUE> dkwtest("hyper",m = 4,n = 3,k = 2)hyper(m = 4, n = 3, k = 2) PASSED [1] TRUE> > > dkwtest("signrank",n = 1)signrank(n = 1) PASSED [1] TRUE> dkwtest("signrank",n = 2)signrank(n = 2) PASSED [1] TRUE> dkwtest("signrank",n = 10)signrank(n = 10) PASSED [1] TRUE> dkwtest("signrank",n = 30)signrank(n = 30) PASSED [1] TRUE> > dkwtest("wilcox",m = 40,n = 30)wilcox(m = 40, n = 30) PASSED [1] TRUE> dkwtest("wilcox",m = 40,n = 10)wilcox(m = 40, n = 10) PASSED [1] TRUE> dkwtest("wilcox",m = 6,n = 3)wilcox(m = 6, n = 3) PASSED [1] TRUE> dkwtest("wilcox",m = 5,n = 3)wilcox(m = 5, n = 3) PASSED [1] TRUE> dkwtest("wilcox",m = 4,n = 3)wilcox(m = 4, n = 3) PASSED [1] TRUE> > dkwtest("chisq",df = 1)chisq(df = 1) PASSED [1] TRUE> dkwtest("chisq",df = 10)chisq(df = 10) PASSED [1] TRUE> > dkwtest("logis")logis() PASSED [1] TRUE> dkwtest("logis",location = 4,scale = 2)logis(location = 4, scale = 2) PASSED [1] TRUE> > dkwtest("t",df = 1)t(df = 1) PASSED [1] TRUE> dkwtest("t",df = 10)t(df = 10) PASSED [1] TRUE> dkwtest("t",df = 40)t(df = 40) PASSED [1] TRUE> > dkwtest("beta",shape1 = 1, shape2 = 1)beta(shape1 = 1, shape2 = 1) PASSED [1] TRUE> dkwtest("beta",shape1 = 2, shape2 = 1)beta(shape1 = 2, shape2 = 1) PASSED [1] TRUE> dkwtest("beta",shape1 = 1, shape2 = 2)beta(shape1 = 1, shape2 = 2) PASSED [1] TRUE> dkwtest("beta",shape1 = 2, shape2 = 2)beta(shape1 = 2, shape2 = 2) PASSED [1] TRUE> dkwtest("beta",shape1 = .2,shape2 = .2)beta(shape1 = 0.2, shape2 = 0.2) PASSED [1] TRUE> > dkwtest("cauchy")cauchy() PASSED [1] TRUE> dkwtest("cauchy",location = 4,scale = 2)cauchy(location = 4, scale = 2) PASSED [1] TRUE> > dkwtest("f",df1 = 1,df2 = 1)f(df1 = 1, df2 = 1) PASSED [1] TRUE> dkwtest("f",df1 = 1,df2 = 10)f(df1 = 1, df2 = 10) PASSED [1] TRUE> dkwtest("f",df1 = 10,df2 = 10)f(df1 = 10, df2 = 10) PASSED [1] TRUE> dkwtest("f",df1 = 30,df2 = 3)f(df1 = 30, df2 = 3) PASSED [1] TRUE> > dkwtest("weibull",shape = 1)weibull(shape = 1) PASSED [1] TRUE> dkwtest("weibull",shape = 4,scale = 4)weibull(shape = 4, scale = 4) PASSED [1] TRUE> > ## regression test for PR#7314 > dkwtest("hyper", m=60, n=100, k=50)hyper(m = 60, n = 100, k = 50) PASSED [1] TRUE> dkwtest("hyper", m=6, n=10, k=5)hyper(m = 6, n = 10, k = 5) PASSED [1] TRUE> dkwtest("hyper", m=600, n=1000, k=500)hyper(m = 600, n = 1000, k = 500) PASSED [1] TRUE> > cat('Time elapsed: ', proc.time() - .proctime00,'\n')Time elapsed: 2.404 0.004 2.408 0 0>
Prof Brian Ripley
2006-Jul-05 08:49 UTC
[Rd] problem getting R 2.3.1 svn r38481 to pass make check-all
By `R 2.3.1 svn r38481' do you mean R-patched? (R 2.3.1 is released.) Looks like r38469 ported the revised test results but not the test: I have now done so. On Tue, 4 Jul 2006, Gavin Simpson wrote:> Hi, > > I noticed this problem on my home desktop running FC4 and again on my > laptop running FC5. Both have previously compiled and passed make > check-all on 2.3.1 svn revisions from 10 days ago or so. On both these > machines, make check-all is consistently failing (4 out of 4 attempts on > the FC 4 desktop and 3 out of 3 on the FC 5 laptop) in the > p-r-random-tests tests. This is with both default compiler flags and > extra flags set in config.site. > > R is failing make check-all with the following set of messages: > > ... > make[3]: Entering directory `/home/gavin/R/2.3-patches/build/tests' > running code in '../../tests/p-r-random-tests.R' ... OK > comparing 'p-r-random-tests.Rout' to > '../../tests/p-r-random-tests.Rout.save' ...1a2,16 >> R version 2.4.0 Under development (unstable) (2006-06-30 r38463) >> Copyright (C) 2006 The R Foundation for Statistical Computing >> ISBN 3-900051-07-0 >> >> R is free software and comes with ABSOLUTELY NO WARRANTY. >> You are welcome to redistribute it under certain conditions. >> Type 'license()' or 'licence()' for distribution details. >> >> R is a collaborative project with many contributors. >> Type 'contributors()' for more information and >> 'citation()' on how to cite R or R packages in publications. >> >> Type 'demo()' for some demos, 'help()' for on-line help, or >> 'help.start()' for an HTML browser interface to help. >> Type 'q()' to quit R. > 254a270,274 >>> ## regression test for non-central t bug >>> dkwtest("t", df=20, ncp=3) >> t(df = 20, ncp = 3) PASSED >> [1] TRUE >>> > make[3]: *** [p-r-random-tests.Rout] Error 1 > make[3]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' > make[2]: *** [test-Random] Error 2 > make[2]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' > make[1]: *** [test-all-devel] Error 1 > make[1]: Leaving directory `/home/gavin/R/2.3-patches/build/tests' > make: *** [check-all] Error 2 > > I looked in ./tests/p-r-random-tests.Rout.fail and couldn't see anything > that indicated a failure - everything had PASSED or TRUE as results of > the tests. I append the contents of this file below. > > Anyone see what is wrong? > > Thanks in advance, > > Gavin > > ## Contents of p-r-random-tests.Rout.fail ## > > R : Copyright 2006, The R Foundation for Statistical Computing > Version 2.3.1 Patched (2006-07-03 r38481) > ISBN 3-900051-07-0 > > R is free software and comes with ABSOLUTELY NO WARRANTY. > You are welcome to redistribute it under certain conditions. > Type 'license()' or 'licence()' for distribution details. > > R is a collaborative project with many contributors. > Type 'contributors()' for more information and > 'citation()' on how to cite R or R packages in publications. > > Type 'demo()' for some demos, 'help()' for on-line help, or > 'help.start()' for an HTML browser interface to help. > Type 'q()' to quit R. > >> ## >> ## RNG tests using DKW inequality for rate of convergence >> ## >> ## P(sup | F_n - F | > t) < 2 exp(-2nt^2) >> ## >> ## The 2 in front of exp() was derived by Massart. It is the best > possible >> ## constant valid uniformly in t,n,F. For large n*t^2 this agrees with > the >> ## large-sample approximation to the Kolmogorov-Smirnov statistic. >> ## >> >> >> superror <- function(rfoo,pfoo,sample.size,...) { > + x <- rfoo(sample.size,...) > + tx <- table(x) > + xi <- as.numeric(names(tx)) > + f <- pfoo(xi,...) > + fhat <- cumsum(tx)/sample.size > + max(abs(fhat-f)) > + } >> >> pdkwbound <- function(n,t) 2*exp(-2*n*t*t) >> >> qdkwbound <- function(n,p) sqrt(log(p/2)/(-2*n)) >> >> dkwtest <- function(stub = "norm", ..., > + sample.size = 10000, pthreshold = 0.001, > + print.result = TRUE, print.detail = FALSE, > + stop.on.failure = TRUE) > + { > + rfoo <- eval(as.name(paste("r", stub, sep=""))) > + pfoo <- eval(as.name(paste("p", stub, sep=""))) > + s <- superror(rfoo, pfoo, sample.size, ...) > + if (print.result || print.detail) { > + printargs <- substitute(list(...)) > + printargs[[1]] <- as.name(stub) > + cat(deparse(printargs)) > + if (print.detail) > + cat("\nsupremum error = ",signif(s,2), > + " with > p-value=",min(1,round(pdkwbound(sample.size,s),4)),"\n") > + } > + rval <- (s < qdkwbound(sample.size,pthreshold)) > + if (print.result) > + cat(c(" FAILED\n"," PASSED\n",)[rval+1]) > + if (stop.on.failure && !rval) > + stop("dkwtest failed") > + rval > + } >> >> .proctime00 <- proc.time() # start timing >> >> >> dkwtest("binom",size = 1,prob = 0.2) > binom(size = 1, prob = 0.2) PASSED > [1] TRUE >> dkwtest("binom",size = 2,prob = 0.2) > binom(size = 2, prob = 0.2) PASSED > [1] TRUE >> dkwtest("binom",size = 100,prob = 0.2) > binom(size = 100, prob = 0.2) PASSED > [1] TRUE >> dkwtest("binom",size = 1e4,prob = 0.2) > binom(size = 10000, prob = 0.2) PASSED > [1] TRUE >> dkwtest("binom",size = 1,prob = 0.8) > binom(size = 1, prob = 0.8) PASSED > [1] TRUE >> dkwtest("binom",size = 100,prob = 0.8) > binom(size = 100, prob = 0.8) PASSED > [1] TRUE >> dkwtest("binom",size = 100,prob = 0.999) > binom(size = 100, prob = 0.999) PASSED > [1] TRUE >> >> dkwtest("pois",lambda = 0.095) > pois(lambda = 0.095) PASSED > [1] TRUE >> dkwtest("pois",lambda = 0.95) > pois(lambda = 0.95) PASSED > [1] TRUE >> dkwtest("pois",lambda = 9.5) > pois(lambda = 9.5) PASSED > [1] TRUE >> dkwtest("pois",lambda = 95) > pois(lambda = 95) PASSED > [1] TRUE >> >> dkwtest("nbinom",size = 1,prob = 0.2) > nbinom(size = 1, prob = 0.2) PASSED > [1] TRUE >> dkwtest("nbinom",size = 2,prob = 0.2) > nbinom(size = 2, prob = 0.2) PASSED > [1] TRUE >> dkwtest("nbinom",size = 100,prob = 0.2) > nbinom(size = 100, prob = 0.2) PASSED > [1] TRUE >> dkwtest("nbinom",size = 1e4,prob = 0.2) > nbinom(size = 10000, prob = 0.2) PASSED > [1] TRUE >> dkwtest("nbinom",size = 1,prob = 0.8) > nbinom(size = 1, prob = 0.8) PASSED > [1] TRUE >> dkwtest("nbinom",size = 100,prob = 0.8) > nbinom(size = 100, prob = 0.8) PASSED > [1] TRUE >> dkwtest("nbinom",size = 100,prob = 0.999) > nbinom(size = 100, prob = 0.999) PASSED > [1] TRUE >> >> dkwtest("norm") > norm() PASSED > [1] TRUE >> dkwtest("norm",mean = 5,sd = 3) > norm(mean = 5, sd = 3) PASSED > [1] TRUE >> >> dkwtest("gamma",shape = 0.1) > gamma(shape = 0.1) PASSED > [1] TRUE >> dkwtest("gamma",shape = 0.2) > gamma(shape = 0.2) PASSED > [1] TRUE >> dkwtest("gamma",shape = 10) > gamma(shape = 10) PASSED > [1] TRUE >> dkwtest("gamma",shape = 20) > gamma(shape = 20) PASSED > [1] TRUE >> >> dkwtest("hyper",m = 40,n = 30,k = 20) > hyper(m = 40, n = 30, k = 20) PASSED > [1] TRUE >> dkwtest("hyper",m = 40,n = 3,k = 20) > hyper(m = 40, n = 3, k = 20) PASSED > [1] TRUE >> dkwtest("hyper",m = 6,n = 3,k = 2) > hyper(m = 6, n = 3, k = 2) PASSED > [1] TRUE >> dkwtest("hyper",m = 5,n = 3,k = 2) > hyper(m = 5, n = 3, k = 2) PASSED > [1] TRUE >> dkwtest("hyper",m = 4,n = 3,k = 2) > hyper(m = 4, n = 3, k = 2) PASSED > [1] TRUE >> >> >> dkwtest("signrank",n = 1) > signrank(n = 1) PASSED > [1] TRUE >> dkwtest("signrank",n = 2) > signrank(n = 2) PASSED > [1] TRUE >> dkwtest("signrank",n = 10) > signrank(n = 10) PASSED > [1] TRUE >> dkwtest("signrank",n = 30) > signrank(n = 30) PASSED > [1] TRUE >> >> dkwtest("wilcox",m = 40,n = 30) > wilcox(m = 40, n = 30) PASSED > [1] TRUE >> dkwtest("wilcox",m = 40,n = 10) > wilcox(m = 40, n = 10) PASSED > [1] TRUE >> dkwtest("wilcox",m = 6,n = 3) > wilcox(m = 6, n = 3) PASSED > [1] TRUE >> dkwtest("wilcox",m = 5,n = 3) > wilcox(m = 5, n = 3) PASSED > [1] TRUE >> dkwtest("wilcox",m = 4,n = 3) > wilcox(m = 4, n = 3) PASSED > [1] TRUE >> >> dkwtest("chisq",df = 1) > chisq(df = 1) PASSED > [1] TRUE >> dkwtest("chisq",df = 10) > chisq(df = 10) PASSED > [1] TRUE >> >> dkwtest("logis") > logis() PASSED > [1] TRUE >> dkwtest("logis",location = 4,scale = 2) > logis(location = 4, scale = 2) PASSED > [1] TRUE >> >> dkwtest("t",df = 1) > t(df = 1) PASSED > [1] TRUE >> dkwtest("t",df = 10) > t(df = 10) PASSED > [1] TRUE >> dkwtest("t",df = 40) > t(df = 40) PASSED > [1] TRUE >> >> dkwtest("beta",shape1 = 1, shape2 = 1) > beta(shape1 = 1, shape2 = 1) PASSED > [1] TRUE >> dkwtest("beta",shape1 = 2, shape2 = 1) > beta(shape1 = 2, shape2 = 1) PASSED > [1] TRUE >> dkwtest("beta",shape1 = 1, shape2 = 2) > beta(shape1 = 1, shape2 = 2) PASSED > [1] TRUE >> dkwtest("beta",shape1 = 2, shape2 = 2) > beta(shape1 = 2, shape2 = 2) PASSED > [1] TRUE >> dkwtest("beta",shape1 = .2,shape2 = .2) > beta(shape1 = 0.2, shape2 = 0.2) PASSED > [1] TRUE >> >> dkwtest("cauchy") > cauchy() PASSED > [1] TRUE >> dkwtest("cauchy",location = 4,scale = 2) > cauchy(location = 4, scale = 2) PASSED > [1] TRUE >> >> dkwtest("f",df1 = 1,df2 = 1) > f(df1 = 1, df2 = 1) PASSED > [1] TRUE >> dkwtest("f",df1 = 1,df2 = 10) > f(df1 = 1, df2 = 10) PASSED > [1] TRUE >> dkwtest("f",df1 = 10,df2 = 10) > f(df1 = 10, df2 = 10) PASSED > [1] TRUE >> dkwtest("f",df1 = 30,df2 = 3) > f(df1 = 30, df2 = 3) PASSED > [1] TRUE >> >> dkwtest("weibull",shape = 1) > weibull(shape = 1) PASSED > [1] TRUE >> dkwtest("weibull",shape = 4,scale = 4) > weibull(shape = 4, scale = 4) PASSED > [1] TRUE >> >> ## regression test for PR#7314 >> dkwtest("hyper", m=60, n=100, k=50) > hyper(m = 60, n = 100, k = 50) PASSED > [1] TRUE >> dkwtest("hyper", m=6, n=10, k=5) > hyper(m = 6, n = 10, k = 5) PASSED > [1] TRUE >> dkwtest("hyper", m=600, n=1000, k=500) > hyper(m = 600, n = 1000, k = 500) PASSED > [1] TRUE >> >> cat('Time elapsed: ', proc.time() - .proctime00,'\n') > Time elapsed: 2.404 0.004 2.408 0 0 >> > > ______________________________________________ > R-devel at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-devel > >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595