Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

matrix multiply has dimension error before attempting to coerce to greta array #464

Closed
goldingn opened this issue Nov 24, 2021 · 3 comments
Assignees
Milestone

Comments

@goldingn
Copy link
Member

When performing a matrix multiply between a greta array matrix and an R vector, I would expect (and think it was the previous behaviour) that the check on dimensions would happen only after attempting to coerce to greta arrays.

But it appears to do the dimension check on the vector before coercing to a greta array, so matrix-multiplying a greta array matrix by an R vector (of the correct dimensions) errors incorrectly and needs to be explicitly coerced toa. greta array by the user:

x <- matrix(1, 2, 3)
y <- rep(1, 3)

# these three work
x %*% y
x %*% as_data(y)
as_data(x) %*% as_data(y)

# this errors
as_data(x) %*% y
Error: only two-dimensional <greta_array>s can be matrix-multiplied
dimensions recorded were 2 and 3 

I'm guessing that this might happen in other places too, if there was a fundamental change to how this checking is done

@njtierney
Copy link
Collaborator

Hmmm, looking at the blame for the relevant section:

https://github.com/greta-dev/greta/blame/master/R/operators.R#L157

It looks like that code hasn't changed for the past 3 years?

I confirm that I get the same error (on branch #463), I've also included the relevant checking part of the code at the bottom, does that return what you would expect?

library(greta)
#> 
#> Attaching package: 'greta'
#> The following objects are masked from 'package:stats':
#> 
#>     binomial, cov2cor, poisson
#> The following objects are masked from 'package:base':
#> 
#>     %*%, apply, backsolve, beta, chol2inv, colMeans, colSums, diag,
#>     eigen, forwardsolve, gamma, identity, rowMeans, rowSums, sweep,
#>     tapply
x <- matrix(1, 2, 3)
y <- rep(1, 3)

# these three work
x %*% y
#>      [,1]
#> [1,]    3
#> [2,]    3
x %*% as_data(y)
#> ℹ Initialising python and checking dependencies, this may take a moment.
#> Loaded Tensorflow version 1.14.0
#> ✓ Initialising python and checking dependencies ... done!
#> 
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
as_data(x) %*% as_data(y)
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?

# this errors
as_data(x) %*% y
#> Error: only two-dimensional <greta_array>s can be matrix-multiplied
#> dimensions recorded were 2 and 3

dim(as_data(x))
#> [1] 2 3
length(dim(as_data(x)))
#> [1] 2

dim(y)
#> NULL
length(dim(y))
#> [1] 0

# code that does the checking is:
# if (length(dim(x)) != 2 | length(dim(y)) != 2) {

Created on 2021-11-25 by the reprex package (v2.0.1)

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value                       
#>  version  R version 4.1.1 (2021-08-10)
#>  os       macOS Big Sur 10.16         
#>  system   x86_64, darwin17.0          
#>  ui       X11                         
#>  language (EN)                        
#>  collate  en_AU.UTF-8                 
#>  ctype    en_AU.UTF-8                 
#>  tz       Australia/Perth             
#>  date     2021-11-25                  
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version    date       lib source        
#>  backports     1.3.0      2021-10-27 [1] CRAN (R 4.1.1)
#>  base64enc     0.1-3      2015-07-28 [1] CRAN (R 4.1.0)
#>  callr         3.7.0      2021-04-20 [1] CRAN (R 4.1.0)
#>  cli           3.1.0      2021-10-27 [1] CRAN (R 4.1.1)
#>  coda          0.19-4     2020-09-30 [1] CRAN (R 4.1.0)
#>  codetools     0.2-18     2020-11-04 [1] CRAN (R 4.1.1)
#>  crayon        1.4.1      2021-02-08 [1] CRAN (R 4.1.0)
#>  digest        0.6.28     2021-09-23 [1] CRAN (R 4.1.0)
#>  ellipsis      0.3.2      2021-04-29 [1] CRAN (R 4.1.0)
#>  evaluate      0.14       2019-05-28 [1] CRAN (R 4.1.0)
#>  fansi         0.5.0      2021-05-25 [1] CRAN (R 4.1.0)
#>  fastmap       1.1.0      2021-01-25 [1] CRAN (R 4.1.0)
#>  fs            1.5.0      2020-07-31 [1] CRAN (R 4.1.0)
#>  future        1.23.0     2021-10-31 [1] CRAN (R 4.1.0)
#>  globals       0.14.0     2020-11-22 [1] CRAN (R 4.1.0)
#>  glue          1.5.0      2021-11-07 [1] CRAN (R 4.1.1)
#>  greta       * 0.3.1.9012 2021-11-18 [1] local         
#>  here          1.0.1      2020-12-13 [1] CRAN (R 4.1.0)
#>  highr         0.9        2021-04-16 [1] CRAN (R 4.1.0)
#>  hms           1.1.1      2021-09-26 [1] CRAN (R 4.1.0)
#>  htmltools     0.5.2      2021-08-25 [1] CRAN (R 4.1.0)
#>  jsonlite      1.7.2      2020-12-09 [1] CRAN (R 4.1.0)
#>  knitr         1.36       2021-09-29 [1] CRAN (R 4.1.0)
#>  lattice       0.20-44    2021-05-02 [1] CRAN (R 4.1.1)
#>  lifecycle     1.0.1      2021-09-24 [1] CRAN (R 4.1.0)
#>  listenv       0.8.0      2019-12-05 [1] CRAN (R 4.1.0)
#>  magrittr      2.0.1      2020-11-17 [1] CRAN (R 4.1.0)
#>  Matrix        1.3-4      2021-06-01 [1] CRAN (R 4.1.1)
#>  parallelly    1.29.0     2021-11-21 [1] CRAN (R 4.1.0)
#>  pillar        1.6.4      2021-10-18 [1] CRAN (R 4.1.0)
#>  pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.1.0)
#>  png           0.1-7      2013-12-03 [1] CRAN (R 4.1.0)
#>  prettyunits   1.1.1      2020-01-24 [1] CRAN (R 4.1.0)
#>  processx      3.5.2      2021-04-30 [1] CRAN (R 4.1.0)
#>  progress      1.2.2      2019-05-16 [1] CRAN (R 4.1.0)
#>  ps            1.6.0      2021-02-28 [1] CRAN (R 4.1.0)
#>  purrr         0.3.4      2020-04-17 [1] CRAN (R 4.1.0)
#>  R.cache       0.15.0     2021-04-30 [1] CRAN (R 4.1.0)
#>  R.methodsS3   1.8.1      2020-08-26 [1] CRAN (R 4.1.0)
#>  R.oo          1.24.0     2020-08-26 [1] CRAN (R 4.1.0)
#>  R.utils       2.11.0     2021-09-26 [1] CRAN (R 4.1.0)
#>  R6            2.5.1      2021-08-19 [1] CRAN (R 4.1.0)
#>  Rcpp          1.0.7      2021-07-07 [1] CRAN (R 4.1.0)
#>  reprex        2.0.1      2021-08-05 [1] CRAN (R 4.1.0)
#>  reticulate    1.22       2021-09-17 [1] CRAN (R 4.1.0)
#>  rlang         0.4.12     2021-10-18 [1] CRAN (R 4.1.0)
#>  rmarkdown     2.11       2021-09-14 [1] CRAN (R 4.1.0)
#>  rprojroot     2.0.2      2020-11-15 [1] CRAN (R 4.1.0)
#>  rstudioapi    0.13       2020-11-12 [1] CRAN (R 4.1.0)
#>  sessioninfo   1.1.1      2018-11-05 [1] CRAN (R 4.1.0)
#>  stringi       1.7.5      2021-10-04 [1] CRAN (R 4.1.0)
#>  stringr       1.4.0      2019-02-10 [1] CRAN (R 4.1.0)
#>  styler        1.6.2      2021-09-23 [1] CRAN (R 4.1.0)
#>  tensorflow    2.7.0      2021-11-09 [1] CRAN (R 4.1.0)
#>  tfruns        1.5.0      2021-02-26 [1] CRAN (R 4.1.0)
#>  tibble        3.1.5      2021-09-30 [1] CRAN (R 4.1.0)
#>  utf8          1.2.2      2021-07-24 [1] CRAN (R 4.1.0)
#>  vctrs         0.3.8      2021-04-29 [1] CRAN (R 4.1.0)
#>  whisker       0.4        2019-08-28 [1] CRAN (R 4.1.0)
#>  withr         2.4.2      2021-04-18 [1] CRAN (R 4.1.0)
#>  xfun          0.26       2021-09-14 [1] CRAN (R 4.1.0)
#>  yaml          2.2.1      2020-02-01 [1] CRAN (R 4.1.0)
#> 
#> [1] /Library/Frameworks/R.framework/Versions/4.1/Resources/library

@njtierney njtierney added this to the 0.4.2 milestone Feb 8, 2022
@njtierney njtierney added Up Next and removed Up Next labels Mar 28, 2022
@njtierney
Copy link
Collaborator

%*% is written as:

`%*%` <- function(x, y) { # nolint

  # if y is a greta array, coerce x before dispatch
  if (inherits(y, "greta_array") & !inherits(x, "greta_array")) {
    as_data(x) %*% y
  } else {
    UseMethod("%*%", x)
  }
}

Which gives us

library(greta)
#> 
#> Attaching package: 'greta'
#> The following objects are masked from 'package:stats':
#> 
#>     binomial, cov2cor, poisson
#> The following objects are masked from 'package:base':
#> 
#>     %*%, apply, backsolve, beta, chol2inv, colMeans, colSums, diag,
#>     eigen, forwardsolve, gamma, identity, rowMeans, rowSums, sweep,
#>     tapply
x <- matrix(1, 2, 3)
y <- rep(1, 3)

# these three work
x %*% y
#>      [,1]
#> [1,]    3
#> [2,]    3
res_1 <- x %*% as_data(y)
#> ℹ Initialising python and checking dependencies, this may take a moment.
#> ✔ Initialising python and checking dependencies ... done!
#> 
res_2 <- as_data(x) %*% as_data(y)
res_3 <- as_data(x) %*% y
#> Error: only two-dimensional <greta_array>s can be matrix-multiplied
#> dimensions recorded were 2 and 3

res_1
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
calculate(res_1, nsim = 1)
#> $res_1
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    3    3

res_2
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
calculate(res_2, nsim = 1)
#> $res_2
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    3    3

res_3
#> Error in eval(expr, envir, enclos): object 'res_3' not found
calculate(res_3, nsim = 1)
#> Error in eval(expr, envir, enclos): object 'res_3' not found

Created on 2024-05-13 with reprex v2.1.0

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.3.3 (2024-02-29)
#>  os       macOS Sonoma 14.3.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Australia/Brisbane
#>  date     2024-05-13
#>  pandoc   3.1.13 @ /opt/homebrew/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version    date (UTC) lib source
#>  backports     1.4.1      2021-12-13 [1] CRAN (R 4.3.0)
#>  base64enc     0.1-3      2015-07-28 [1] CRAN (R 4.3.0)
#>  callr         3.7.6      2024-03-25 [1] CRAN (R 4.3.1)
#>  cli           3.6.2      2023-12-11 [1] CRAN (R 4.3.1)
#>  coda          0.19-4.1   2024-01-31 [2] CRAN (R 4.3.1)
#>  codetools     0.2-20     2024-03-31 [2] CRAN (R 4.3.1)
#>  crayon        1.5.2      2022-09-29 [1] CRAN (R 4.3.0)
#>  digest        0.6.35     2024-03-11 [1] CRAN (R 4.3.1)
#>  evaluate      0.23       2023-11-01 [1] CRAN (R 4.3.1)
#>  fastmap       1.1.1      2023-02-24 [1] CRAN (R 4.3.0)
#>  fs            1.6.3      2023-07-20 [1] CRAN (R 4.3.0)
#>  future        1.33.2     2024-03-26 [1] CRAN (R 4.3.1)
#>  globals       0.16.3     2024-03-08 [1] CRAN (R 4.3.1)
#>  glue          1.7.0      2024-01-09 [1] CRAN (R 4.3.1)
#>  greta       * 0.4.5.9000 2024-05-13 [1] local
#>  hms           1.1.3      2023-03-21 [1] CRAN (R 4.3.0)
#>  htmltools     0.5.8.1    2024-04-04 [1] CRAN (R 4.3.1)
#>  jsonlite      1.8.8      2023-12-04 [1] CRAN (R 4.3.1)
#>  knitr         1.45       2023-10-30 [1] CRAN (R 4.3.1)
#>  lattice       0.22-6     2024-03-20 [1] CRAN (R 4.3.1)
#>  lifecycle     1.0.4      2023-11-07 [1] CRAN (R 4.3.1)
#>  listenv       0.9.1      2024-01-29 [2] CRAN (R 4.3.1)
#>  magrittr      2.0.3      2022-03-30 [1] CRAN (R 4.3.0)
#>  Matrix        1.6-5      2024-01-11 [1] CRAN (R 4.3.1)
#>  parallelly    1.37.1     2024-02-29 [1] CRAN (R 4.3.1)
#>  pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.3.0)
#>  png           0.1-8      2022-11-29 [1] CRAN (R 4.3.0)
#>  prettyunits   1.2.0      2023-09-24 [1] CRAN (R 4.3.1)
#>  processx      3.8.4      2024-03-16 [1] CRAN (R 4.3.1)
#>  progress      1.2.3      2023-12-06 [1] CRAN (R 4.3.1)
#>  ps            1.7.6      2024-01-18 [1] CRAN (R 4.3.1)
#>  purrr         1.0.2      2023-08-10 [1] CRAN (R 4.3.0)
#>  R.cache       0.16.0     2022-07-21 [2] CRAN (R 4.3.0)
#>  R.methodsS3   1.8.2      2022-06-13 [2] CRAN (R 4.3.0)
#>  R.oo          1.26.0     2024-01-24 [2] CRAN (R 4.3.1)
#>  R.utils       2.12.3     2023-11-18 [2] CRAN (R 4.3.1)
#>  R6            2.5.1      2021-08-19 [1] CRAN (R 4.3.0)
#>  Rcpp          1.0.12     2024-01-09 [1] CRAN (R 4.3.1)
#>  reprex        2.1.0      2024-01-11 [2] CRAN (R 4.3.1)
#>  reticulate    1.36.1     2024-04-22 [1] CRAN (R 4.3.1)
#>  rlang         1.1.3      2024-01-10 [1] CRAN (R 4.3.1)
#>  rmarkdown     2.26       2024-03-05 [1] CRAN (R 4.3.1)
#>  rstudioapi    0.16.0     2024-03-24 [1] CRAN (R 4.3.1)
#>  sessioninfo   1.2.2      2021-12-06 [2] CRAN (R 4.3.0)
#>  styler        1.10.3     2024-04-07 [2] CRAN (R 4.3.1)
#>  tensorflow    2.16.0     2024-04-15 [2] CRAN (R 4.3.1)
#>  tfautograph   0.3.2      2021-09-17 [2] CRAN (R 4.3.0)
#>  tfruns        1.5.3      2024-04-19 [1] CRAN (R 4.3.1)
#>  vctrs         0.6.5      2023-12-01 [1] CRAN (R 4.3.1)
#>  whisker       0.4.1      2022-12-05 [1] CRAN (R 4.3.0)
#>  withr         3.0.0      2024-01-16 [1] CRAN (R 4.3.1)
#>  xfun          0.43       2024-03-25 [1] CRAN (R 4.3.1)
#>  yaml          2.3.8      2023-12-11 [1] CRAN (R 4.3.1)
#> 
#>  [1] /Users/nick/Library/R/arm64/4.3/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library
#> 
#> ─ Python configuration ───────────────────────────────────────────────────────
#>  python:         /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/bin/python
#>  libpython:      /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/libpython3.11.dylib
#>  pythonhome:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2:/Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2
#>  version:        3.11.9 | packaged by conda-forge | (main, Apr 19 2024, 18:34:54) [Clang 16.0.6 ]
#>  numpy:          /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.11/site-packages/numpy
#>  numpy_version:  1.26.4
#>  tensorflow:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.11/site-packages/tensorflow
#>  
#>  NOTE: Python version was forced by use_python() function
#> 
#> ──────────────────────────────────────────────────────────────────────────────

However I think this won't coerce y to be a greta array, and that won't happen on dispact since `%*%`.greta_array can only dispatch on the first argument, which would be x, and we want to control for cases where y is a greta array but not x, I think?

So I think it needs to be:

#' @rdname overloaded
#' @export
`%*%` <- function(x, y) { # nolint

  # if y is a greta array, coerce x before dispatch
  if (inherits(y, "greta_array") & !inherits(x, "greta_array")) {
    as_data(x) %*% y
  # if y is not a greta array and x is, coerce y before dispatch
  } else if (!inherits(y, "greta_array") & inherits(x, "greta_array")){
    x %*% as_data(y)
  } else {
    UseMethod("%*%", x)
  }
}

Doing this we get:

library(greta)
#> 
#> Attaching package: 'greta'
#> The following objects are masked from 'package:stats':
#> 
#>     binomial, cov2cor, poisson
#> The following objects are masked from 'package:base':
#> 
#>     %*%, apply, backsolve, beta, chol2inv, colMeans, colSums, diag,
#>     eigen, forwardsolve, gamma, identity, rowMeans, rowSums, sweep,
#>     tapply
x <- matrix(1, 2, 3)
y <- rep(1, 3)

# these three work
x %*% y
#>      [,1]
#> [1,]    3
#> [2,]    3
res_1 <- x %*% as_data(y)
#> ℹ Initialising python and checking dependencies, this may take a moment.
#> ✔ Initialising python and checking dependencies ... done!
#> 
res_2 <- as_data(x) %*% as_data(y)
res_3 <- as_data(x) %*% y

res_1
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
calculate(res_1, nsim = 1)
#> $res_1
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    3    3

res_2
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
calculate(res_2, nsim = 1)
#> $res_2
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    3    3

res_3
#> greta array (operation)
#> 
#>      [,1]
#> [1,]  ?  
#> [2,]  ?
calculate(res_3, nsim = 1)
#> $res_3
#> , , 1
#> 
#>      [,1] [,2]
#> [1,]    3    3

Created on 2024-05-13 with reprex v2.1.0

Session info
sessioninfo::session_info()
#> ─ Session info ───────────────────────────────────────────────────────────────
#>  setting  value
#>  version  R version 4.3.3 (2024-02-29)
#>  os       macOS Sonoma 14.3.1
#>  system   aarch64, darwin20
#>  ui       X11
#>  language (EN)
#>  collate  en_US.UTF-8
#>  ctype    en_US.UTF-8
#>  tz       Australia/Brisbane
#>  date     2024-05-13
#>  pandoc   3.1.13 @ /opt/homebrew/bin/ (via rmarkdown)
#> 
#> ─ Packages ───────────────────────────────────────────────────────────────────
#>  package     * version    date (UTC) lib source
#>  backports     1.4.1      2021-12-13 [1] CRAN (R 4.3.0)
#>  base64enc     0.1-3      2015-07-28 [1] CRAN (R 4.3.0)
#>  callr         3.7.6      2024-03-25 [1] CRAN (R 4.3.1)
#>  cli           3.6.2      2023-12-11 [1] CRAN (R 4.3.1)
#>  coda          0.19-4.1   2024-01-31 [2] CRAN (R 4.3.1)
#>  codetools     0.2-20     2024-03-31 [2] CRAN (R 4.3.1)
#>  crayon        1.5.2      2022-09-29 [1] CRAN (R 4.3.0)
#>  digest        0.6.35     2024-03-11 [1] CRAN (R 4.3.1)
#>  evaluate      0.23       2023-11-01 [1] CRAN (R 4.3.1)
#>  fastmap       1.1.1      2023-02-24 [1] CRAN (R 4.3.0)
#>  fs            1.6.3      2023-07-20 [1] CRAN (R 4.3.0)
#>  future        1.33.2     2024-03-26 [1] CRAN (R 4.3.1)
#>  globals       0.16.3     2024-03-08 [1] CRAN (R 4.3.1)
#>  glue          1.7.0      2024-01-09 [1] CRAN (R 4.3.1)
#>  greta       * 0.4.5.9000 2024-05-13 [1] local
#>  hms           1.1.3      2023-03-21 [1] CRAN (R 4.3.0)
#>  htmltools     0.5.8.1    2024-04-04 [1] CRAN (R 4.3.1)
#>  jsonlite      1.8.8      2023-12-04 [1] CRAN (R 4.3.1)
#>  knitr         1.45       2023-10-30 [1] CRAN (R 4.3.1)
#>  lattice       0.22-6     2024-03-20 [1] CRAN (R 4.3.1)
#>  lifecycle     1.0.4      2023-11-07 [1] CRAN (R 4.3.1)
#>  listenv       0.9.1      2024-01-29 [2] CRAN (R 4.3.1)
#>  magrittr      2.0.3      2022-03-30 [1] CRAN (R 4.3.0)
#>  Matrix        1.6-5      2024-01-11 [1] CRAN (R 4.3.1)
#>  parallelly    1.37.1     2024-02-29 [1] CRAN (R 4.3.1)
#>  pkgconfig     2.0.3      2019-09-22 [1] CRAN (R 4.3.0)
#>  png           0.1-8      2022-11-29 [1] CRAN (R 4.3.0)
#>  prettyunits   1.2.0      2023-09-24 [1] CRAN (R 4.3.1)
#>  processx      3.8.4      2024-03-16 [1] CRAN (R 4.3.1)
#>  progress      1.2.3      2023-12-06 [1] CRAN (R 4.3.1)
#>  ps            1.7.6      2024-01-18 [1] CRAN (R 4.3.1)
#>  purrr         1.0.2      2023-08-10 [1] CRAN (R 4.3.0)
#>  R.cache       0.16.0     2022-07-21 [2] CRAN (R 4.3.0)
#>  R.methodsS3   1.8.2      2022-06-13 [2] CRAN (R 4.3.0)
#>  R.oo          1.26.0     2024-01-24 [2] CRAN (R 4.3.1)
#>  R.utils       2.12.3     2023-11-18 [2] CRAN (R 4.3.1)
#>  R6            2.5.1      2021-08-19 [1] CRAN (R 4.3.0)
#>  Rcpp          1.0.12     2024-01-09 [1] CRAN (R 4.3.1)
#>  reprex        2.1.0      2024-01-11 [2] CRAN (R 4.3.1)
#>  reticulate    1.36.1     2024-04-22 [1] CRAN (R 4.3.1)
#>  rlang         1.1.3      2024-01-10 [1] CRAN (R 4.3.1)
#>  rmarkdown     2.26       2024-03-05 [1] CRAN (R 4.3.1)
#>  rstudioapi    0.16.0     2024-03-24 [1] CRAN (R 4.3.1)
#>  sessioninfo   1.2.2      2021-12-06 [2] CRAN (R 4.3.0)
#>  styler        1.10.3     2024-04-07 [2] CRAN (R 4.3.1)
#>  tensorflow    2.16.0     2024-04-15 [2] CRAN (R 4.3.1)
#>  tfautograph   0.3.2      2021-09-17 [2] CRAN (R 4.3.0)
#>  tfruns        1.5.3      2024-04-19 [1] CRAN (R 4.3.1)
#>  vctrs         0.6.5      2023-12-01 [1] CRAN (R 4.3.1)
#>  whisker       0.4.1      2022-12-05 [1] CRAN (R 4.3.0)
#>  withr         3.0.0      2024-01-16 [1] CRAN (R 4.3.1)
#>  xfun          0.43       2024-03-25 [1] CRAN (R 4.3.1)
#>  yaml          2.3.8      2023-12-11 [1] CRAN (R 4.3.1)
#> 
#>  [1] /Users/nick/Library/R/arm64/4.3/library
#>  [2] /Library/Frameworks/R.framework/Versions/4.3-arm64/Resources/library
#> 
#> ─ Python configuration ───────────────────────────────────────────────────────
#>  python:         /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/bin/python
#>  libpython:      /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/libpython3.11.dylib
#>  pythonhome:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2:/Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2
#>  version:        3.11.9 | packaged by conda-forge | (main, Apr 19 2024, 18:34:54) [Clang 16.0.6 ]
#>  numpy:          /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.11/site-packages/numpy
#>  numpy_version:  1.26.4
#>  tensorflow:     /Users/nick/Library/r-miniconda-arm64/envs/greta-env-tf2/lib/python3.11/site-packages/tensorflow
#>  
#>  NOTE: Python version was forced by use_python() function
#> 
#> ──────────────────────────────────────────────────────────────────────────────

To check this works properly, I have added a test like so:

test_that("%*% works when one is a non-greta array", {
  x <- matrix(1, 2, 3)
  y <- rep(1, 3)

  expect_snapshot(x %*% y)
  expect_snapshot(x %*% as_data(y))
  expect_snapshot(as_data(x) %*% y)
  expect_snapshot(as_data(x) %*% as_data(y))
  
  res_1 <- x %*% as_data(y)
  res_2 <- as_data(x) %*% y
  res_3 <- as_data(x) %*% as_data(y)
  
  expect_snapshot(calculate(res_1, nsim = 1))
  expect_snapshot(calculate(res_2, nsim = 1))
  expect_snapshot(calculate(res_3, nsim = 1))
})

Which should first capture that this doesn't error and gives the appropriate greta array (except in the first instance of x %*% y), and then check that the calculated result is correct.

@njtierney
Copy link
Collaborator

Let me know if this sounds right, @goldingn

njtierney added a commit to njtierney/greta that referenced this issue May 21, 2024
* Add check for if y isn't greta array, coerce
* Add tests to check for different variations on multiplying as_data(x) and/or as_data(y)
@njtierney njtierney moved this from Backlog to Done in {greta} CRAN 0.5.0 release Jul 29, 2024
@njtierney njtierney closed this as completed by moving to Done in {greta} CRAN 0.5.0 release Jul 29, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
No open projects
Development

No branches or pull requests

2 participants