Set the default data types (see default_dtypes()) for a scope:
local_default_dtypes() until the calling frame exits,
with_default_dtypes() for the duration of code. Both write the
anvl.default_dtypes option for one backend, and change only the
categories they name.
Usage
local_default_dtypes(dtypes, backend = NULL, envir = parent.frame())
with_default_dtypes(dtypes, code, backend = NULL)Arguments
- dtypes
(named
character()| namedlist())
A mapping of the data type categories (floatandint) to data types, e.g.c(float = "f64", int = "i32"). Each may be a string or aDataType. Can also be a partial override, such asc(float = "f64"), in which case the category it does not name is left as it is.- backend
(
NULL|character(1))
The backend whose defaults to set. Usesactive_backend()by default.- envir
(
environment)
The environment to scope the change to.- code
An expression to evaluate with the given defaults.
Value
local_default_dtypes() returns the previous values of the options
it set, invisibly. with_default_dtypes() returns the result of
evaluating code.
Details
Inside a jit()ted body the defaults the program was keyed on are the
baseline and an override applies to its scope, so one program can use
different precisions in different parts of itself.
Examples
with_default_dtypes(c(float = "f64"), dtype(nv_array(1.5)))
#> <f64>
# A value that meets a typed array still takes that array's data type
with_default_dtypes(c(float = "f64"), dtype(nv_array(1, dtype = "f32") + 1.5))
#> <f32>
# untyped values in one program can materialize at different precisions: one at
# whatever the default is, one at the `f64` the override asks for
jit(function() {
list(
at_default = nv_fill(0, 2),
forced_f64 = with_default_dtypes(c(float = "f64"), nv_fill(0, 2))
)
})()
#> $at_default
#> AnvlArray
#> 0
#> 0
#> [ CPUf32{2} ]
#>
#> $forced_f64
#> AnvlArray
#> 0
#> 0
#> [ CPUf64{2} ]
#>