# 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".