44 lines
1.8 KiB
Markdown
44 lines
1.8 KiB
Markdown
|
# Auto initialization for in-place operations
|
||
|
|
||
|
## Status
|
||
|
|
||
|
REJECTED
|
||
|
|
||
|
Discussed by: Paul Dubs, Alex Black, raver119 on 25. November 2019
|
||
|
|
||
|
|
||
|
## Context
|
||
|
|
||
|
Some operations work in-place on the inputs that they are given in ND4J, but in SameDiff the same operations will
|
||
|
generate an array from a given shape. Examples for this include `BernoulliDistribution`, and other random ops, that
|
||
|
effectively initialize the array that they are given.
|
||
|
|
||
|
From a consistency point of view, it would be nice if both API's would support both ways of using those ops.
|
||
|
|
||
|
|
||
|
## Decision
|
||
|
|
||
|
We introduce an option to mark inputs as `inPlace = true` to make it clear that this input is going to be changed
|
||
|
in-place. In addition we introduce an option `supportsInPlaceInit = true` to mark an input as initialize-able. If the
|
||
|
`supportsInPlaceInit` option is enabled, two signatures for the Op will be created, one that takes an input, and one
|
||
|
that takes the appropriate shape and data type information in its stead.
|
||
|
|
||
|
|
||
|
## Consequences
|
||
|
|
||
|
### Advantages
|
||
|
* We get support for both in-place and initialization use-cases
|
||
|
* Support for this use-case is explicitly defined in the DSL instead of implicit support by the code generator
|
||
|
|
||
|
### Disadvantages
|
||
|
* Codegen becomes more complex, as it requires us to generate more signatures
|
||
|
|
||
|
|
||
|
## Reasons for Rejection
|
||
|
This feature would only come in handy on legacy ops. However, those ops will not be exposed to frontend languages
|
||
|
anymore starting from the next release.
|
||
|
|
||
|
For the ops that replace them ("Custom Ops"), it is *always* possible to pass an output array, when used in NDArray
|
||
|
programming mode. Thereby making the in-place initialization support a side-effect of that general design.
|
||
|
|
||
|
For support of both `op(out)` and `op(dataType, shape)` see ADR 0005 "Optional parameters and signatures".
|