File: reg-BLAS.R

package info (click to toggle)
r-base 4.5.2-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 112,924 kB
  • sloc: ansic: 291,338; fortran: 111,889; javascript: 14,798; yacc: 6,154; sh: 5,689; makefile: 5,239; tcl: 4,562; perl: 963; objc: 791; f90: 758; asm: 258; java: 31; sed: 1
file content (135 lines) | stat: -rw-r--r-- 4,990 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135

## PR#4582 %*% with NAs
stopifnot(is.na(NA %*% 0), is.na(0 %*% NA))
## depended on the BLAS in use.


## found from fallback test in slam 0.1-15
## most likely indicates an inaedquate BLAS.
x <- matrix(c(1, 0, NA, 1), 2, 2)
y <- matrix(c(1, 0, 0, 2, 1, 0), 3, 2)
(z <- tcrossprod(x, y))
stopifnot(identical(z, x %*% t(y)))
stopifnot(is.nan(log(0) %*% 0))
## depended on the BLAS in use: some (including the reference BLAS)
## had z[1,3] == 0 and log(0) %*% 0 as as.matrix(0).

## matrix products
for(mopt in c("default","internal","default.simd")) {

  # matprod="blas" is excluded because some tests fail due to issues
  # in NaN/Inf propagation even in Rblas
  options(matprod=mopt)

  m <- matrix(c(1,2,3,4), ncol=2)
  v <- c(11,12)
  rv <- v; dim(rv) <- c(1,2)
  cv <- v; dim(cv) <- c(2,1)

  Cm <- m+0*1i;  # cast to complex keeping dimensions
  Cv <- v+0*1i;
  Ccv <- cv+0*1i;
  Crv <- rv+0*1i;

  cprod <- function(rres, cres, expected) {
    stopifnot(identical(rres, expected))
    stopifnot(identical(Re(cres), expected))
  }

  cprod(m %*% m, Cm %*% Cm, matrix(c(7,10,15,22), 2, 2) )
  cprod(m %*% cv, Cm %*% Ccv, matrix(c(47,70), 2, 1) )
  cprod(m %*% v, Cm %*% Cv, matrix(c(47,70), 2, 1) )
  cprod(rv %*% m, Crv %*% Cm, matrix(c(35,81), 1, 2) )
  cprod(v %*% m, Cv %*% Cm, matrix(c(35,81), 1, 2) )
  cprod(rv %*% cv, Crv %*% Ccv, matrix(265,1,1) )
  cprod(cv %*% rv, Ccv %*% Crv, matrix(c(121,132,132,144), 2, 2) )
  cprod(v %*% v, Cv %*% Cv, matrix(265,1,1) )

  cprod(crossprod(m, m), crossprod(Cm, Cm), matrix(c(5,11,11,25), 2, 2) )
  cprod(crossprod(m), crossprod(Cm), matrix(c(5,11,11,25), 2, 2) )
  cprod(crossprod(m, cv), crossprod(Cm, Ccv), matrix(c(35,81), 2, 1) )
  cprod(crossprod(m, v), crossprod(Cm, Cv), matrix(c(35,81), 2, 1) )
  cprod(crossprod(cv, m), crossprod(Ccv, Cm), matrix(c(35,81), 1, 2) )
  cprod(crossprod(v, m), crossprod(Cv, Cm), matrix(c(35,81), 1, 2) )
  cprod(crossprod(cv, cv), crossprod(Ccv, Ccv), matrix(265,1,1) )
  cprod(crossprod(v, v), crossprod(Cv, Cv), matrix(265,1,1) )
  cprod(crossprod(rv, rv), crossprod(Crv, Crv), matrix(c(121,132,132,144), 2, 2) )

  cprod(tcrossprod(m, m), tcrossprod(Cm, Cm), matrix(c(10,14,14,20), 2, 2) )
  cprod(tcrossprod(m), tcrossprod(Cm), matrix(c(10,14,14,20), 2, 2) )
  cprod(tcrossprod(m, rv), tcrossprod(Cm, Crv), matrix(c(47,70), 2, 1) )
  cprod(tcrossprod(rv, m), tcrossprod(Crv, Cm), matrix(c(47,70), 1, 2) )
  cprod(tcrossprod(v, m), tcrossprod(Cv, Cm), matrix(c(47,70), 1, 2) )
  cprod(tcrossprod(rv, rv), tcrossprod(Crv, Crv), matrix(265,1,1) )
  cprod(tcrossprod(cv, cv), tcrossprod(Ccv, Ccv), matrix(c(121,132,132,144), 2, 2) )
  cprod(tcrossprod(v, v), tcrossprod(Cv, Cv), matrix(c(121,132,132,144), 2, 2) )

  ## non-square matrix, with Inf

  m1 <- matrix(c(1,2,Inf,4,5,6), ncol=2)
  m2 <- matrix(c(1,2,3,4), ncol=2)

  v <- c(11,12)
  rv <- v; dim(rv) <- c(1,2)
  cv <- v; dim(cv) <- c(2,1)

  v1 <- c(11,12,13)
  rv1 <- v1; dim(rv1) <- c(1,3)
  cv1 <- v1; dim(cv1) <- c(3,1)

  Cm1 <- m1+0*1i
  Cm2 <- m2+0*1i
  Cv <- v+0*1i
  Crv <- rv+0*1i
  Ccv <- cv+0*1i
  Cv1 <- v1+0*1i
  Crv1 <- rv1+0*1i
  Ccv1 <- cv1+0*1i

  cprod(m1 %*% m2, Cm1 %*% Cm2, matrix(c(9,12,Inf,19,26,Inf), 3, 2) )
  cprod(m1 %*% cv, Cm1 %*% Ccv, matrix(c(59,82,Inf), 3, 1) )

    # the following 7 lines fail with Rblas and matprod = "blas"
  cprod(rv1 %*% m1, Crv1 %*% Cm1, matrix(c(Inf,182), 1, 2) )

  cprod(crossprod(m1, m1), crossprod(Cm1, Cm1), matrix(c(Inf,Inf,Inf,77), 2, 2) )
  cprod(crossprod(m1, cv1), crossprod(Cm1, Ccv1), matrix(c(Inf,182), 2, 1) )
  cprod(crossprod(cv1, m1), crossprod(Ccv1, Cm1), matrix(c(Inf,182), 1, 2) )

  cprod(tcrossprod(m1, m1), tcrossprod(Cm1, Cm1), matrix(c(17,22,Inf,22,29,Inf,Inf,Inf,Inf), 3,3) )
  cprod(tcrossprod(m2, m1), tcrossprod(Cm2, Cm1), matrix(c(13,18,17,24,Inf,Inf), 2, 3) )
  cprod(tcrossprod(rv, m1), tcrossprod(Crv, Cm1), matrix(c(59,82,Inf), 1, 3) )
    # the previous 7 lines fail with Rblas and matprod = "blas"

  cprod(tcrossprod(m1, rv), tcrossprod(Cm1, Crv), matrix(c(59,82,Inf), 3, 1) )

  ## complex

  m1 <- matrix(c(1+1i,2+2i,3+3i,4+4i,5+5i,6+6i), ncol=2)
  m2 <- matrix(c(1+1i,2+2i,3+3i,4+4i), ncol=2)

  stopifnot(identical(m1 %*% m2, matrix(c(18i,24i,30i,38i,52i,66i), 3, 2) ))
  stopifnot(identical(crossprod(m1, m1), t(m1) %*% m1))
  stopifnot(identical(tcrossprod(m1, m1), m1 %*% t(m1)))
}

## check that propagation of NaN/Inf values in multiplication of complex
## numbers is the same as in multiplication of complex matrices

for(mopt in c("default","internal","default.simd")) {
  # matprod="blas" is excluded because some tests fail due to issues
  # in NaN/Inf propagation even in Rblas
  options(matprod=mopt)

  vals <- c(0, 1, NaN, Inf)
  for(ar in vals)
  for(ai in vals)
  for(br in vals)
  for(bi in vals) {
    a = ar + 1i * ai
    b = br + 1i * bi
    stopifnot(identical(a * b, as.complex(a %*% b)))
    stopifnot(identical(a * b, as.complex(crossprod(a,b))))
    stopifnot(identical(a * b, as.complex(tcrossprod(a,b))))
  }
}