Constructs a rowwise Kronecker product mapping

## Usage

```
bru_mapper_multi(mappers)
# S3 method for bru_mapper_multi
ibm_n(mapper, inla_f = FALSE, multi = FALSE, ...)
# S3 method for bru_mapper_multi
ibm_n_output(mapper, input, ...)
# S3 method for bru_mapper_multi
ibm_values(mapper, inla_f = FALSE, multi = FALSE, ...)
# S3 method for bru_mapper_multi
ibm_is_linear(mapper, multi = FALSE, ...)
# S3 method for bru_mapper_multi
ibm_jacobian(
mapper,
input,
state = NULL,
inla_f = FALSE,
multi = FALSE,
...,
sub_A = NULL
)
# S3 method for bru_mapper_multi
ibm_linear(mapper, input, state, inla_f = FALSE, ...)
# S3 method for bru_mapper_multi
ibm_eval(
mapper,
input,
state = NULL,
inla_f = FALSE,
...,
jacobian = NULL,
pre_A = deprecated()
)
# S3 method for bru_mapper_multi
ibm_invalid_output(mapper, input, state, inla_f = FALSE, multi = FALSE, ...)
# S3 method for bru_mapper_multi
[(x, i, drop = TRUE)
# S3 method for bru_mapper_multi
ibm_names(mapper)
# S3 method for bru_mapper_multi
ibm_names(mapper) <- value
```

## Arguments

- mappers
A list of

`bru_mapper`

objects- mapper
A mapper S3 object, inheriting from

`bru_mapper`

.- inla_f
logical; when

`TRUE`

for`ibm_n()`

and`ibm_values()`

, the result must be compatible with the`INLA::f(...)`

and corresponding`INLA::inla.stack(...)`

constructions. For`ibm_{eval,jacobian,linear}`

, the`input`

interpretation may be different. Implementations do not normally need to do anything different, except for mappers of the type needed for hidden multicomponent models such as "bym2", which can be handled by`bru_mapper_collect`

.- multi
logical; If

`TRUE`

(or positive), recurse one level into sub-mappers- ...
Arguments passed on to other methods

- input
Data input for the mapper.

- state
A vector of latent state values for the mapping, of length

`ibm_n(mapper, inla_f = FALSE)`

- sub_A
Internal; precomputed Jacobian matrices.

- jacobian
For

`ibm_eval()`

methods, an optional pre-computed Jacobian, typically supplied by internal methods that already have the Jacobian.- pre_A
- x
object from which to extract element(s)

- i
indices specifying element(s) to extract

- drop
logical; For

`[.bru_mapper_multi`

, whether to extract an individual mapper when`i`

identifies a single element. If`FALSE`

, a list of sub-mappers is returned (suitable e.g. for creating a new`bru_mapper_multi`

object). Default:`TRUE`

- value
a character vector of up to the same length as the number of mappers in the multi-mapper x

## Value

`[`

-indexing a`bru_mapper_multi`

extracts a subset`bru_mapper_multi`

object (for drop`FALSE`

) or an individual sub-mapper (for drop`TRUE`

, and`i`

identifies a single element)

## Details

`ibm_jacobian`

for`bru_mapper_multi`

accepts a list with named entries, or a list with unnamed but ordered elements. The names must match the sub-mappers, see`ibm_names.bru_mapper_multi()`

. Each list element should take a format accepted by the corresponding sub-mapper. In case each element is a vector, the input can be given as a data.frame with named columns, a matrix with named columns, or a matrix with unnamed but ordered columns.

`ibm_invalid_output`

for`bru_mapper_multi`

accepts a list with named entries, or a list with unnamed but ordered elements. The names must match the sub-mappers, see`ibm_names.bru_mapper_multi()`

. Each list element should take a format accepted by the corresponding sub-mapper. In case each element is a vector, the input can be given as a data.frame with named columns, a matrix with named columns, or a matrix with unnamed but ordered columns.

## See also

bru_mapper, bru_mapper_generics

Other mappers:
`bru_get_mapper()`

,
`bru_mapper()`

,
`bru_mapper.fm_mesh_1d()`

,
`bru_mapper.fm_mesh_2d()`

,
`bru_mapper_aggregate()`

,
`bru_mapper_collect()`

,
`bru_mapper_const()`

,
`bru_mapper_factor()`

,
`bru_mapper_generics`

,
`bru_mapper_harmonics()`

,
`bru_mapper_index()`

,
`bru_mapper_linear()`

,
`bru_mapper_logsumexp()`

,
`bru_mapper_marginal()`

,
`bru_mapper_matrix()`

,
`bru_mapper_mesh_B()`

,
`bru_mapper_pipe()`

,
`bru_mapper_scale()`

,
`bru_mapper_shift()`

,
`bru_mapper_taylor()`

## Examples

```
(m <- bru_mapper_multi(list(
a = bru_mapper_index(2),
b = bru_mapper_index(3)
)))
#> multi(a = index, b = index)
ibm_eval2(m, list(a = c(1, 2, 1), b = c(1, 3, 2)), 1:6)
#> $offset
#> [1] 1 6 3
#>
#> $jacobian
#> 3 x 6 sparse Matrix of class "dgCMatrix"
#>
#> [1,] 1 . . . . .
#> [2,] . . . . . 1
#> [3,] . . 1 . . .
#>
```