Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

2019-06-24 Thread Serguei Sokol

On 22/06/2019 00:58, jing hua zhao wrote:

Hi Peter, Rui, Chrstophe and Gabriel,

Thanks for your inputs --  the use of qnorm(., log=TRUE) is a good point
Another approach could be simply to note that a function defined as 
f(p)=exp(-z(p)^2/2) is regular around p=0 with f(0)=0.
It has roughly the shape of p*(2-p) for p \in [0; 1]. So we can 
calculate let say f(10^-10) with sufficient precision using Rmpfr and 
then use a linear approximation for p from [0, 10^-10]. After that a 
simple inverse gives us e^(z*z/2).


Serguei.


  in line with pnorm with which we devised log(p)  as

log(2) + pnorm(-abs(z), lower.tail = TRUE, log.p = TRUE)

that could do really really well for large z compared to Rmpfr. Maybe I am 
asking too much since

z <-2

Rmpfr::format(2*pnorm(mpfr(-abs(z),100),lower.tail=TRUE,log.p=FALSE))

[1] "1.660579603192917090365313727164e-86858901"

already gives a rarely seen small p value. I gather I also need a multiple 
precision exp() and their sum since exp(z^2/2) is also a Bayes Factor so I  get 
log(x_i )/sum_i log(x_i) instead. To this point, I am obliged to clarify, see 
https://statgen.github.io/gwas-credible-sets/method/locuszoom-credible-sets.pdf.

I agree many feel geneticists go to far with small p values which I would have 
difficulty to argue againston the other hand it is also expected to see these 
in a non-genetic context. For instance the Framingham study was established in 
1948 just got $34m for six years on phenotypewide association which we would be 
interesting to see.

Best wishes,


Jing Hua



From: peter dalgaard 
Sent: 21 June 2019 16:24
To: jing hua zhao
Cc: Rui Barradas; r-devel@r-project.org
Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

You may want to look into using the log option to qnorm

e.g., in round figures:


log(1e-300)

[1] -690.7755

qnorm(-691, log=TRUE)

[1] -37.05315

exp(37^2/2)

[1] 1.881797e+297

exp(-37^2/2)

[1] 5.314068e-298

Notice that floating point representation cuts out at 1e+/-308 or so. If you 
want to go outside that range, you may need explicit manipulation of the log 
values. qnorm() itself seems quite happy with much smaller values:


qnorm(-5000, log=TRUE)

[1] -99.94475

-pd


On 21 Jun 2019, at 17:11 , jing hua zhao  wrote:

Dear Rui,

Thanks for your quick reply -- this allows me to see the bottom of this. I was 
hoping we could have a handle of those p in genmoics such as 1e-300 or smaller.

Best wishes,


Jing Hua


From: Rui Barradas 
Sent: 21 June 2019 15:03
To: jing hua zhao; r-devel@r-project.org
Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

Hello,

Well, try it:

p <- .Machine$double.eps^seq(0.5, 1, by = 0.05)
z <- qnorm(p/2)

pnorm(z)
# [1] 7.450581e-09 1.22e-09 2.026908e-10 3.343152e-11 5.514145e-12
# [6] 9.094947e-13 1.500107e-13 2.474254e-14 4.080996e-15 6.731134e-16
#[11] 1.110223e-16
p/2
# [1] 7.450581e-09 1.22e-09 2.026908e-10 3.343152e-11 5.514145e-12
# [6] 9.094947e-13 1.500107e-13 2.474254e-14 4.080996e-15 6.731134e-16
#[11] 1.110223e-16

exp(z*z/2)
# [1] 9.184907e+06 5.301421e+07 3.073154e+08 1.787931e+09 1.043417e+10
# [6] 6.105491e+10 3.580873e+11 2.104460e+12 1.239008e+13 7.306423e+13
#[11] 4.314798e+14


p is the smallest possible such that 1 + p != 1 and I couldn't find
anything to worry about.


R version 3.6.0 (2019-04-26)
Platform: x86_64-pc-linux-gnu (64-bit)
Running under: Ubuntu 19.04

Matrix products: default
BLAS:   /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.8.0
LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.8.0

locale:
  [1] LC_CTYPE=pt_PT.UTF-8   LC_NUMERIC=C
  [3] LC_TIME=pt_PT.UTF-8LC_COLLATE=pt_PT.UTF-8
  [5] LC_MONETARY=pt_PT.UTF-8LC_MESSAGES=pt_PT.UTF-8
  [7] LC_PAPER=pt_PT.UTF-8   LC_NAME=C
  [9] LC_ADDRESS=C   LC_TELEPHONE=C
[11] LC_MEASUREMENT=pt_PT.UTF-8 LC_IDENTIFICATION=C

attached base packages:
[1] stats graphics  grDevices utils datasets  methods
[7] base

other attached packages:

[many packages loaded]


Hope this helps,

Rui Barradas

�s 15:24 de 21/06/19, jing hua zhao escreveu:

Dear R-developers,

I am keen to calculate exp(z*z/2) with z=qnorm(p/2) and p is very small. I 
wonder if anyone has experience with this?

Thanks very much in advance,


Jing Hua

   [[alternative HTML version deleted]]

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


[[alternative HTML version deleted]]

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel

--
Peter Dalgaard, Professor,
Center for Statistics, Copenhagen Business School
Solbjerg Plads 3, 2000 Frederiksberg, Denmark
Phone: (+45)38153501
Office: A 4.23
Email: pd@cbs.dk  Priv: pda...@gmail.com










[[alternative HTML version deleted]]

__
R-de

Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

2019-06-24 Thread Martin Maechler
> William Dunlap via R-devel 
> on Sun, 23 Jun 2019 10:34:47 -0700 writes:
> William Dunlap via R-devel 
> on Sun, 23 Jun 2019 10:34:47 -0700 writes:

> include/Rmath.h declares a set of 'logspace' functions for use at the C
> level.  I don't think there are core R functions that call them.

> /* Compute the log of a sum or difference from logs of terms, i.e.,
> *
> * log (exp (logx) + exp (logy))
> * or  log (exp (logx) - exp (logy))
> *
> * without causing overflows or throwing away too much accuracy:
> */
> double  Rf_logspace_add(double logx, double logy);
> double  Rf_logspace_sub(double logx, double logy);
> double  Rf_logspace_sum(const double *logx, int nx);

> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com

Yes, indeed, thank you, Bill!

But they *have* been in use by core R functions for a long time
in pgamma, pbeta and related functions.

[and I have had changes in *hyper.c where logspace_add() is used too, 
 for several years now (since 2015) but I no longer know which
 concrete accuracy problem that addresses, so have not yet committed it]


Martin Maechler
ETH Zurich and R Core Team



> On Sun, Jun 23, 2019 at 1:40 AM Ben Bolker  wrote:

>> 
>> I agree with many the sentiments about the wisdom of computing very
>> small p-values (although the example below may win some kind of a prize:
>> I've seen people talking about p-values of the order of 10^(-2000), but
>> never 10^(-(10^8)) !).  That said, there are a several tricks for
>> getting more reasonable sums of very small probabilities.  The first is
>> to scale the p-values by dividing the *largest* of the probabilities,
>> then do the (p/sum(p)) computation, then multiply the result (I'm sure
>> this is described/documented somewhere).  More generally, there are
>> methods for computing sums on the log scale, e.g.
>> 
>> 
>> 
https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.logsumexp.html
>> 
>> I don't know where this has been implemented in the R ecosystem, but
>> this sort of computation is the basis of the "Brobdingnag" package for
>> operating on very large ("Brobdingnagian") and very small
>> ("Lilliputian") numbers.
>> 
>> 
>> On 2019-06-21 6:58 p.m., jing hua zhao wrote:
>> > Hi Peter, Rui, Chrstophe and Gabriel,
>> >
>> > Thanks for your inputs --  the use of qnorm(., log=TRUE) is a good 
point
>> in line with pnorm with which we devised log(p)  as
>> >
>> > log(2) + pnorm(-abs(z), lower.tail = TRUE, log.p = TRUE)
>> >
>> > that could do really really well for large z compared to Rmpfr. Maybe I
>> am asking too much since
>> >
>> > z <-2
>> >> Rmpfr::format(2*pnorm(mpfr(-abs(z),100),lower.tail=TRUE,log.p=FALSE))
>> > [1] "1.660579603192917090365313727164e-86858901"
>> >
>> > already gives a rarely seen small p value. I gather I also need a
>> multiple precision exp() and their sum since exp(z^2/2) is also a Bayes
>> Factor so I  get log(x_i )/sum_i log(x_i) instead. To this point, I am
>> obliged to clarify, see
>> 
https://statgen.github.io/gwas-credible-sets/method/locuszoom-credible-sets.pdf
>> .
>> >
>> > I agree many feel geneticists go to far with small p values which I
>> would have difficulty to argue againston the other hand it is also 
expected
>> to see these in a non-genetic context. For instance the Framingham study
>> was established in 1948 just got $34m for six years on phenotypewide
>> association which we would be interesting to see.
>> >
>> > Best wishes,
>> >
>> >
>> > Jing Hua
>> >
>> >
>> > 
>> > From: peter dalgaard 
>> > Sent: 21 June 2019 16:24
>> > To: jing hua zhao
>> > Cc: Rui Barradas; r-devel@r-project.org
>> > Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z
>> >
>> > You may want to look into using the log option to qnorm
>> >
>> > e.g., in round figures:
>> >
>> >> log(1e-300)
>> > [1] -690.7755
>> >> qnorm(-691, log=TRUE)
>> > [1] -37.05315
>> >> exp(37^2/2)
>> > [1] 1.881797e+297
>> >> exp(-37^2/2)
>> > [1] 5.314068e-298
>> >
>> > Notice that floating point representation cuts out at 1e+/-308 or so. 
If
>> you want to go outside that range, you may need explicit manipulation of
>> the log values. qnorm() itself seems quite happy with much smaller 
values:
>> >
>> >> qnorm(-5000, log=TRUE)
>> > [1] -99.94475
>> >
>> > -pd
>> >
>> >> On 21 Jun 2019, at 17:11 , jing hua zhao 
>> wrote:
>> >>
>> >> Dear Rui,
>> >>
>> >> Thanks for your quick reply -- this allows me to see the bottom of
>> this. I was hoping we could have a handle of those p in genmoics such as
>> 1e-300 or smal

Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

2019-06-24 Thread jing hua zhao
Hi All,

Thanks for all your comments which allows me to appreciate more of these in 
Python and R.

I just came across the matrixStats package,


## EXAMPLE #1
lx <- c(1000.01, 1000.02)
y0 <- log(sum(exp(lx)))
print(y0) ## Inf

y1 <- logSumExp(lx)
print(y1) ## 1000.708

and

> ly <- lx*10
> ly
[1] 11000 12000
> y1 <- logSumExp(ly)
> print(y1)
[1] 12000
> logSumExp
function (lx, idxs = NULL, na.rm = FALSE, ...)
{
has_na <- TRUE
.Call(C_logSumExp, as.numeric(lx), idxs, as.logical(na.rm),
has_na)
}



Maybe this is rather close?

Best wishes,


Jing Hua


From: R-devel  on behalf of Martin Maechler 

Sent: 24 June 2019 08:37
To: William Dunlap
Cc: r-devel@r-project.org
Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

> William Dunlap via R-devel
> on Sun, 23 Jun 2019 10:34:47 -0700 writes:
> William Dunlap via R-devel
> on Sun, 23 Jun 2019 10:34:47 -0700 writes:

> include/Rmath.h declares a set of 'logspace' functions for use at the C
> level.  I don't think there are core R functions that call them.

> /* Compute the log of a sum or difference from logs of terms, i.e.,
> *
> * log (exp (logx) + exp (logy))
> * or  log (exp (logx) - exp (logy))
> *
> * without causing overflows or throwing away too much accuracy:
> */
> double  Rf_logspace_add(double logx, double logy);
> double  Rf_logspace_sub(double logx, double logy);
> double  Rf_logspace_sum(const double *logx, int nx);

> Bill Dunlap
> TIBCO Software
> wdunlap tibco.com

Yes, indeed, thank you, Bill!

But they *have* been in use by core R functions for a long time
in pgamma, pbeta and related functions.

[and I have had changes in *hyper.c where logspace_add() is used too,
 for several years now (since 2015) but I no longer know which
 concrete accuracy problem that addresses, so have not yet committed it]


Martin Maechler
ETH Zurich and R Core Team



> On Sun, Jun 23, 2019 at 1:40 AM Ben Bolker  wrote:

>>
>> I agree with many the sentiments about the wisdom of computing very
>> small p-values (although the example below may win some kind of a prize:
>> I've seen people talking about p-values of the order of 10^(-2000), but
>> never 10^(-(10^8)) !).  That said, there are a several tricks for
>> getting more reasonable sums of very small probabilities.  The first is
>> to scale the p-values by dividing the *largest* of the probabilities,
>> then do the (p/sum(p)) computation, then multiply the result (I'm sure
>> this is described/documented somewhere).  More generally, there are
>> methods for computing sums on the log scale, e.g.
>>
>>
>> 
https://docs.scipy.org/doc/scipy-0.14.0/reference/generated/scipy.misc.logsumexp.html
>>
>> I don't know where this has been implemented in the R ecosystem, but
>> this sort of computation is the basis of the "Brobdingnag" package for
>> operating on very large ("Brobdingnagian") and very small
>> ("Lilliputian") numbers.
>>
>>
>> On 2019-06-21 6:58 p.m., jing hua zhao wrote:
>> > Hi Peter, Rui, Chrstophe and Gabriel,
>> >
>> > Thanks for your inputs --  the use of qnorm(., log=TRUE) is a good 
point
>> in line with pnorm with which we devised log(p)  as
>> >
>> > log(2) + pnorm(-abs(z), lower.tail = TRUE, log.p = TRUE)
>> >
>> > that could do really really well for large z compared to Rmpfr. Maybe I
>> am asking too much since
>> >
>> > z <-2
>> >> Rmpfr::format(2*pnorm(mpfr(-abs(z),100),lower.tail=TRUE,log.p=FALSE))
>> > [1] "1.660579603192917090365313727164e-86858901"
>> >
>> > already gives a rarely seen small p value. I gather I also need a
>> multiple precision exp() and their sum since exp(z^2/2) is also a Bayes
>> Factor so I  get log(x_i )/sum_i log(x_i) instead. To this point, I am
>> obliged to clarify, see
>> 
https://statgen.github.io/gwas-credible-sets/method/locuszoom-credible-sets.pdf
>> .
>> >
>> > I agree many feel geneticists go to far with small p values which I
>> would have difficulty to argue againston the other hand it is also 
expected
>> to see these in a non-genetic context. For instance the Framingham study
>> was established in 1948 just got $34m for six years on phenotypewide
>> association which we would be interesting to see.
>> >
>> > Best wishes,
>> >
>> >
>> > Jing Hua
>> >
>> >
>> > 
>> > From: peter dalgaard 
>> > Sent: 21 June 2019 16:24
>> > To: jing hua zhao
>> > Cc: Rui Barradas; r-devel@r-project.org
>> > Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z
>> >
>> > You may want to look into using the log option to qnorm
>> >
>> > e.g., in round figures:
>> >
>> >> log(1e-300)
>> > [1] -

Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

2019-06-24 Thread Martin Maechler
> jing hua zhao 
> on Mon, 24 Jun 2019 08:51:43 + writes:

> Hi All,
> Thanks for all your comments which allows me to appreciate more of these 
in Python and R.

> I just came across the matrixStats package,


> ## EXAMPLE #1
> lx <- c(1000.01, 1000.02)
> y0 <- log(sum(exp(lx)))
> print(y0) ## Inf

> y1 <- logSumExp(lx)
> print(y1) ## 1000.708

> and

>> ly <- lx*10
>> ly
> [1] 11000 12000
>> y1 <- logSumExp(ly)
>> print(y1)
> [1] 12000
>> logSumExp
> function (lx, idxs = NULL, na.rm = FALSE, ...)
> {
> has_na <- TRUE
> .Call(C_logSumExp, as.numeric(lx), idxs, as.logical(na.rm),
> has_na)
> }
> 
> 

> Maybe this is rather close?

Thank you  Jing Hua,

indeed the issue of sums of (very large or very small)
exponentials is a special case, that can well be treated
specially
 - as it is not so infrequent
 - via "obvious" simplifications can be implemented even more accurately

We (authors of the R package 'copula') have had a need for
these as well, in likelihood computation for Archimedean
copulas, and
have efficient R level implementations, both for your case  and
the -- even more delicate -- case of e.g., alternating signs of
exponential terms.

"Unfortunately", we had never exported the functions from the
package, so you'd need

 copula:::lsum()   # log  sum {of exponentials in log scale}
or
 copula:::lssum()  # log *s*igned sum {of exponentials in log scale}

for the 2nd case.

The advantage is it's simple R code implemented quite
efficiently for the vector and matrices cases,

Source code from source file copula/R/special-func.R

 (in svn at R-forge :
   -->
   
https://r-forge.r-project.org/scm/viewvc.php/pkg/copula/R/special-func.R?view=markup&root=copula
 )

{Yes, this GPL-2 licenced  {with Copyright, see file, please
keep this one line}
## Copyright (C) 2012 Marius Hofert, Ivan Kojadinovic, Martin Maechler, and Jun 
Y
}

--

##' Properly compute log(x_1 + .. + x_n) for a given (n x d)-matrix of n row
##' vectors log(x_1),..,log(x_n) (each of dimension d)
##' Here, x_i > 0  for all i
##' @title Properly compute the logarithm of a sum
##' @param lx (n,d)-matrix containing the row vectors log(x_1),..,log(x_n)
##'each of dimension d
##' @param l.off the offset to subtract and re-add; ideally in the order of
##'the maximum of each column
##' @return log(x_1 + .. + x_n) [i.e., OF DIMENSION d!!!] computed via
##' log(sum(x)) = log(sum(exp(log(x
##' = log(exp(log(x_max))*sum(exp(log(x)-log(x_max
##' = log(x_max) + log(sum(exp(log(x)-log(x_max)
##' = lx.max + log(sum(exp(lx-lx.max)))
##' => VECTOR OF DIMENSION d
##' @author Marius Hofert, Martin Maechler
lsum <- function(lx, l.off) {
rx <- length(d <- dim(lx))
if(mis.off <- missing(l.off)) l.off <- {
if(rx <= 1L)
max(lx)
else if(rx == 2L)
apply(lx, 2L, max)
}
if(rx <= 1L) { ## vector
if(is.finite(l.off))
l.off + log(sum(exp(lx - l.off)))
else if(mis.off || is.na(l.off) || l.off == max(lx))
l.off # NA || NaN or all lx == -Inf, or max(.) == Inf
else
stop("'l.off  is infinite but not == max(.)")
} else if(rx == 2L) { ## matrix
if(any(x.off <- !is.finite(l.off))) {
if(mis.off || isTRUE(all.equal(l.off, apply(lx, 2L, max {
## we know l.off = colMax(.)
if(all(x.off)) return(l.off)
r <- l.off
iok <- which(!x.off)
l.of <- l.off[iok]
r[iok] <- l.of + log(colSums(exp(lx[,iok,drop=FALSE] -
 rep(l.of, each=d[1]
r
} else ## explicitly specified l.off differing from colMax(.)
stop("'l.off' has non-finite values but differs from default 
max(.)")
}
else
l.off + log(colSums(exp(lx - rep(l.off, each=d[1]
} else stop("not yet implemented for arrays of rank >= 3")
}

##' Properly compute log(x_1 + .. + x_n) for a given matrix of column vectors
##' log(|x_1|),.., log(|x_n|) and corresponding signs sign(x_1),.., sign(x_n)
##' Here, x_i is of arbitrary sign
##' @title compute logarithm of a sum with signed large coefficients
##' @param lxabs (d,n)-matrix containing the column vectors 
log(|x_1|),..,log(|x_n|)
##'each of dimension d
##' @param signs corresponding matrix of signs sign(x_1), .., sign(x_n)
##' @param l.off the offset to subtract and re-add; ideally in the order of 
max(.)
##' @param strict logical indicating if it should stop on some negative sums
##' @return log(x_1 + .. + x_n) [i.e., of dimension d] computed via
##' log(sum(x)) = log(sum(sign(x)*|x|)) = 
log(sum(sign(x)*

Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

2019-06-24 Thread jing hua zhao
Hi Martin,

Thanks for another tips -- it will be hard for me to comprehend fully your 
implementation of Rmpfr. I will look at these instead. I realised what I 
thought was a difficult problem turned to be a popular one. I managed to get a 
Python version here for information.

# http://bayesjumping.net/log-sum-exp-trick/
import numpy as np
def logSumExp(ns):
max = np.max(ns)
ds = ns - max
sumOfExp = np.exp(ds).sum()
return max + np.log(sumOfExp)

x = [11000, 12000]
logSumExp(x)

from scipy.misc import logsumexp
logsumexp(x)

import numpy as np;
prob1 = np.log(1e-50)
prob2 = np.log(2.5e-50)
prob12 = np.logaddexp(prob1, prob2)
prob12
np.exp(prob12)

As expected they are in good agreement with R.

Best regards,


Jing Hua


From: Martin Maechler 
Sent: 24 June 2019 09:29
To: jing hua zhao
Cc: William Dunlap; Martin Maechler; r-devel@r-project.org
Subject: Re: [Rd] Calculation of e^{z^2/2} for a normal deviate z

> jing hua zhao
> on Mon, 24 Jun 2019 08:51:43 + writes:

> Hi All,
> Thanks for all your comments which allows me to appreciate more of these 
in Python and R.

> I just came across the matrixStats package,


> ## EXAMPLE #1
> lx <- c(1000.01, 1000.02)
> y0 <- log(sum(exp(lx)))
> print(y0) ## Inf

> y1 <- logSumExp(lx)
> print(y1) ## 1000.708

> and

>> ly <- lx*10
>> ly
> [1] 11000 12000
>> y1 <- logSumExp(ly)
>> print(y1)
> [1] 12000
>> logSumExp
> function (lx, idxs = NULL, na.rm = FALSE, ...)
> {
> has_na <- TRUE
> .Call(C_logSumExp, as.numeric(lx), idxs, as.logical(na.rm),
> has_na)
> }
> 
> 

> Maybe this is rather close?

Thank you  Jing Hua,

indeed the issue of sums of (very large or very small)
exponentials is a special case, that can well be treated
specially
 - as it is not so infrequent
 - via "obvious" simplifications can be implemented even more accurately

We (authors of the R package 'copula') have had a need for
these as well, in likelihood computation for Archimedean
copulas, and
have efficient R level implementations, both for your case  and
the -- even more delicate -- case of e.g., alternating signs of
exponential terms.

"Unfortunately", we had never exported the functions from the
package, so you'd need

 copula:::lsum()   # log  sum {of exponentials in log scale}
or
 copula:::lssum()  # log *s*igned sum {of exponentials in log scale}

for the 2nd case.

The advantage is it's simple R code implemented quite
efficiently for the vector and matrices cases,

Source code from source file copula/R/special-func.R

 (in svn at R-forge :
   -->
   
https://r-forge.r-project.org/scm/viewvc.php/pkg/copula/R/special-func.R?view=markup&root=copula
 )

{Yes, this GPL-2 licenced  {with Copyright, see file, please
 keep this one line}
## Copyright (C) 2012 Marius Hofert, Ivan Kojadinovic, Martin Maechler, and Jun 
Y
}

--

##' Properly compute log(x_1 + .. + x_n) for a given (n x d)-matrix of n row
##' vectors log(x_1),..,log(x_n) (each of dimension d)
##' Here, x_i > 0  for all i
##' @title Properly compute the logarithm of a sum
##' @param lx (n,d)-matrix containing the row vectors log(x_1),..,log(x_n)
##'each of dimension d
##' @param l.off the offset to subtract and re-add; ideally in the order of
##'the maximum of each column
##' @return log(x_1 + .. + x_n) [i.e., OF DIMENSION d!!!] computed via
##' log(sum(x)) = log(sum(exp(log(x
##' = log(exp(log(x_max))*sum(exp(log(x)-log(x_max
##' = log(x_max) + log(sum(exp(log(x)-log(x_max)
##' = lx.max + log(sum(exp(lx-lx.max)))
##' => VECTOR OF DIMENSION d
##' @author Marius Hofert, Martin Maechler
lsum <- function(lx, l.off) {
rx <- length(d <- dim(lx))
if(mis.off <- missing(l.off)) l.off <- {
if(rx <= 1L)
max(lx)
else if(rx == 2L)
apply(lx, 2L, max)
}
if(rx <= 1L) { ## vector
if(is.finite(l.off))
l.off + log(sum(exp(lx - l.off)))
else if(mis.off || is.na(l.off) || l.off == max(lx))
l.off # NA || NaN or all lx == -Inf, or max(.) == Inf
else
stop("'l.off  is infinite but not == max(.)")
} else if(rx == 2L) { ## matrix
if(any(x.off <- !is.finite(l.off))) {
if(mis.off || isTRUE(all.equal(l.off, apply(lx, 2L, max {
## we know l.off = colMax(.)
if(all(x.off)) return(l.off)
r <- l.off
iok <- which(!x.off)
l.of <- l.off[iok]
r[iok] <- l.of + log(colSums(exp(lx[,iok,drop=FALSE] -
 rep(l.of, each=d[1]
r
} else ## explicitly specified l.off differing from colMax(.)
  

Re: [Rd] methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error

2019-06-24 Thread Martin Maechler
> Henrik Bengtsson via R-core 
> on Sun, 23 Jun 2019 11:29:58 -0700 writes:

> Thank you.
> To correct myself, I can indeed reproduce this with R --vanilla too.
> A reproducible example is:

> $ R --vanilla
> R version 3.6.0 Patched (2019-05-31 r76629) -- "Planting of a Tree"
> ...
>> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
>> loadNamespace("oligo")
> Error in omittedSig && (signature[omittedSig] != "missing") :
> 'length(x) = 4 > 1' in coercion to 'logical(1)'
> Error: unable to load R code in package ‘oligo’

> /Henrik

Thank you Henrik, for the report, etc, but
hmm... after loading the oligo package, almost 40 (non
base+Recommended) packages have been loaded as well, which hence
need to have been installed before, too .. 
which is not quite a "vanilla repr.ex." in my view

Worse, I cannot reproduce :

> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
> Sys.getenv("_R_CHECK_LENGTH_1_LOGIC2_")
[1] "true"
> debugonce(conformMethod)
> loadNamespace("oligo")

Warning messages:
1: multiple methods tables found for ‘rowSums’ 
2: multiple methods tables found for ‘colSums’ 
3: multiple methods tables found for ‘rowMeans’ 
4: multiple methods tables found for ‘colMeans’ 
> sessionInfo()
R Under development (unstable) (2019-06-20 r76729)

(similarly with other versions of R >= 3.6.0).

So, even though R core has fixed this now in the sources, it
would be nice to have an "as simple as possible"  repr.ex. for this.

Martin



> On Sun, Jun 23, 2019 at 1:54 AM peter dalgaard  wrote:
>> 
>> This looks obvious enough, so I just committed your fix to R-devel and 
R-patched.
>> 
>> I'm at the wrong machine for thorough testing, but at least it seems to 
build OK. However, I sense some risk that this could uncover sleeping bugs 
elsewhere, so watch out.
>> 
>> -pd
>> 
>> > On 22 Jun 2019, at 18:49 , Henrik Bengtsson 
 wrote:
>> >
>> > DISCLAIMER: I can not get this error with R --vanilla, so it only
>> > occurs when some other package is also loaded.  I don't have time to
>> > find to narrow that down for a reproducible example, but I believe the
>> > following error in R 3.6.0:
>> >
>> >> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
>> >> library(oligo)
>> > Error in omittedSig && (signature[omittedSig] != "missing") :
>> >  'length(x) = 4 > 1' in coercion to 'logical(1)'
>> > Error: unable to load R code in package 'oligo'
>> >
>> > is because of a '_R_CHECK_LENGTH_1_LOGIC2_=true' mistake in the
>> > 'methods' package.  Here's the patch:
>> >
>> > $ svn diff src/library/methods/R/RMethodUtils.R &
>> > [1] 1062
>> > Index: src/library/methods/R/RMethodUtils.R
>> > ===
>> > --- src/library/methods/R/RMethodUtils.R (revision 76731)
>> > +++ src/library/methods/R/RMethodUtils.R (working copy)
>> > @@ -343,7 +343,7 @@
>> >  call. = TRUE, domain = NA)
>> > }
>> > else if(!all(signature[omittedSig] == "missing")) {
>> > -omittedSig <- omittedSig && (signature[omittedSig] != 
"missing")
>> > +omittedSig <- omittedSig & (signature[omittedSig] != 
"missing")
>> > .message("Note: ", .renderSignature(f, sig0),
>> >  gettextf("expanding the signature to include omitted
>> > arguments in definition: %s",
>> >   paste(sigNames[omittedSig], "=
>> > \"missing\"",collapse = ", ")))
>> > [1]+  Donesvn diff 
src/library/methods/R/RMethodUtils.R
>> >
>> > Maybe still in time for R 3.6.1?
>> >
>> > /Henrik
>> >
>> > __
>> > R-devel@r-project.org mailing list
>> > https://stat.ethz.ch/mailman/listinfo/r-devel
>> 
>> --
>> Peter Dalgaard, Professor,
>> Center for Statistics, Copenhagen Business School
>> Solbjerg Plads 3, 2000 Frederiksberg, Denmark
>> Phone: (+45)38153501
>> Office: A 4.23
>> Email: pd@cbs.dk  Priv: pda...@gmail.com

__
R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel


Re: [Rd] methods package: A _R_CHECK_LENGTH_1_LOGIC2_=true error

2019-06-24 Thread Henrik Bengtsson
**Maybe this bug needs to be understood further before applying the
patch because patch is most likely also wrong**

Because, from just looking at the expressions, I think neither the R
3.6.0 version:

omittedSig <- omittedSig && (signature[omittedSig] != "missing")

nor the patched version (I proposed):

omittedSig <- omittedSig & (signature[omittedSig] != "missing")

can be correct.  For a starter, 'omittedSig' is a logical vector.  We
see that 'omittedSig' is used to subset 'signature'.  In other words,
the length of 'signature[omittedSig]' and hence the length of
'(signature[omittedSig] != "missing")' will equal sum(omittedSig),
i.e. the length will be in {0,1,...,length(omittedSig)}.

The R 3.6.0 version with '&&' is not correct because '&&' requires
length(omittedSig) == 1L and sum(omittedSig) == 1L, which is unlikely
to be the original intention.

The patched version with '&' is most likely not correct either because
'LHS & RHS' assume length(LHS) == length(RHS), unless it relies on the
auto-expansion of either vector.  So, for the '&' version to be
correct, it basically requires that length(omittedSig) = length(LHS) =
length(RHS) = sum(omittedSig), which also sounds unlikely to be the
original intention.

Disclaimer: Please note that I have not at all studied the rest of the
function, so the above is just based on that single line plus
debugging that 'omittedSig' is a logical vector.

Martin, I don't have the time to dive into this further.  Though I did
try to see if it happened when one of oligo's dependencies were
loaded, but that was not the case. It kicks in when oligo is loaded.
FYI, I can also replicate your non-replicatation on another R 3.6.0
version. I'll see if I can narrow down what's different, e.g.
comparing sessionInfo():s, etc.  However, I want to reply with
findings above asap due to the R 3.6.1 release and you might roll back
the patch (since it might introduce other bugs as Peter mentioned).

/Henrik


On Mon, Jun 24, 2019 at 3:05 AM Martin Maechler
 wrote:
>
> > Henrik Bengtsson via R-core
> > on Sun, 23 Jun 2019 11:29:58 -0700 writes:
>
> > Thank you.
> > To correct myself, I can indeed reproduce this with R --vanilla too.
> > A reproducible example is:
>
> > $ R --vanilla
> > R version 3.6.0 Patched (2019-05-31 r76629) -- "Planting of a Tree"
> > ...
> >> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
> >> loadNamespace("oligo")
> > Error in omittedSig && (signature[omittedSig] != "missing") :
> > 'length(x) = 4 > 1' in coercion to 'logical(1)'
> > Error: unable to load R code in package ‘oligo’
>
> > /Henrik
>
> Thank you Henrik, for the report, etc, but
> hmm... after loading the oligo package, almost 40 (non
> base+Recommended) packages have been loaded as well, which hence
> need to have been installed before, too ..
> which is not quite a "vanilla repr.ex." in my view
>
> Worse, I cannot reproduce :
>
> > Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
> > Sys.getenv("_R_CHECK_LENGTH_1_LOGIC2_")
> [1] "true"
> > debugonce(conformMethod)
> > loadNamespace("oligo")
> 
> Warning messages:
> 1: multiple methods tables found for ‘rowSums’
> 2: multiple methods tables found for ‘colSums’
> 3: multiple methods tables found for ‘rowMeans’
> 4: multiple methods tables found for ‘colMeans’
> > sessionInfo()
> R Under development (unstable) (2019-06-20 r76729)
>
> (similarly with other versions of R >= 3.6.0).
>
> So, even though R core has fixed this now in the sources, it
> would be nice to have an "as simple as possible"  repr.ex. for this.
>
> Martin
>
>
>
> > On Sun, Jun 23, 2019 at 1:54 AM peter dalgaard  wrote:
> >>
> >> This looks obvious enough, so I just committed your fix to R-devel and 
> R-patched.
> >>
> >> I'm at the wrong machine for thorough testing, but at least it seems 
> to build OK. However, I sense some risk that this could uncover sleeping bugs 
> elsewhere, so watch out.
> >>
> >> -pd
> >>
> >> > On 22 Jun 2019, at 18:49 , Henrik Bengtsson 
>  wrote:
> >> >
> >> > DISCLAIMER: I can not get this error with R --vanilla, so it only
> >> > occurs when some other package is also loaded.  I don't have time to
> >> > find to narrow that down for a reproducible example, but I believe 
> the
> >> > following error in R 3.6.0:
> >> >
> >> >> Sys.setenv("_R_CHECK_LENGTH_1_LOGIC2_" = "true")
> >> >> library(oligo)
> >> > Error in omittedSig && (signature[omittedSig] != "missing") :
> >> >  'length(x) = 4 > 1' in coercion to 'logical(1)'
> >> > Error: unable to load R code in package 'oligo'
> >> >
> >> > is because of a '_R_CHECK_LENGTH_1_LOGIC2_=true' mistake in the
> >> > 'methods' package.  Here's the patch:
> >> >
> >> > $ svn diff src/library/methods/R/RMethodUtils.R &
> >> > [1] 1062
> >> > Index: src/library/methods/R/RMethodUtils.R
> >> >