 <img style="width:100%" src="https://www.tensorflow.org/images/ScatterAdd.png" alt>
 </div>
 
-_inputArg
- ref:: .T  indices:: .Tindices  updates:: .T 
-_outputArg
-
-_outputArg
- output_ref::T 
-
-*/
-
-
-
-// TODO - in the return parameters use an index Output(0) // output(1) etc
-// TODO - work out a way to skip extroneous , eg. param,param, )
-// TODO - Not all return types are output eg.
-// func ResourceSparseApplyRMSProp(scope *Scope, var_ tf.Output, ms tf.Output, mom tf.Output, lr tf.Output, rho tf.Output, momentum tf.Output, epsilon tf.Output, grad tf.Output, indices tf.Output, optional ...ResourceSparseApplyRMSPropAttr) (o *tf.Operation)
-
-
-
-
-
-
-func scatterAdd(scope:Scope,ref: tf.Output, indices: tf.Output, updates: tf.Output)  -> (output_ref: tf.Output){
-    if scope.error() != nil {
-        return
-    }
-
-
+*/
+
+
+
+
+
+func scatterAdd(scope:Scope,ref: tf.Output, indices: tf.Output, updates: tf.OutputT :type, Tindices :type, use_locking :bool)  ->(outputRef: tf.Output){
+    if scope.error() != nil {
+        return
+    }
     let opspec = tf.OpSpec(
         Type: "ScatterAdd",
-        Input: [  ref,  indices,  updates, )]
-        Attrs: attrs
-    )
-
-
-
-        let op = scope.AddOperation(opspec)
-        return (op.Output(1))
-
+        Input: [ ref, indices, updates]
+        Attrs: attrs
+    )
+    let op = scope.AddOperation(opspec)
+    return (op.Output(1 -1))
 }
 
 /*

optionally cropped according to `crops` to produce the output.  This is the
reverse of SpaceToBatch.  See below for a precise description.

_inputArg
 input:: .T  block_shape:: .Tblock_shape  crops:: .Tcrops 
_outputArg

_outputArg
 output::T 

*/



// TODO - in the return parameters use an index Output(0) // output(1) etc
// TODO - work out a way to skip extroneous , eg. param,param, )
// TODO - Not all return types are output eg.
// func ResourceSparseApplyRMSProp(scope *Scope, var_ tf.Output, ms tf.Output, mom tf.Output, lr tf.Output, rho tf.Output, momentum tf.Output, epsilon tf.Output, grad tf.Output, indices tf.Output, optional ...ResourceSparseApplyRMSPropAttr) (o *tf.Operation)






func batchToSpaceND(scope:Scope,input: tf.Output, block_shape: tf.Output, crops: tf.Output)  -> (output: tf.Output){
    if scope.error() != nil {
        return
    }


    let opspec = tf.OpSpec(
        Type: "BatchToSpaceND",
        Input: [  input,  block_shape,  crops, )]
        Attrs: attrs
    )



        let op = scope.AddOperation(opspec)
        return (op.Output(1))

}

/*

'num_bits' is the bitwidth of the quantization; between 2 and 8, inclusive.
Quantization is called fake since the output is still in floating point.

*/





func fakeQuantWithMinMaxArgs(scope:Scope,inputs: tf.Outputmin :float, max :float, num_bits :int)  ->(outputs: tf.Output){
    if scope.error() != nil {
        return
    }
    let opspec = tf.OpSpec(
        Type: "FakeQuantWithMinMaxArgs",
        Input: [ inputs]
        Attrs: attrs
    )
    let op = scope.AddOperation(opspec)
    return (op.Output(1 -1))
}

/*
Compute gradients for a FakeQuantWithMinMaxArgs operation.


*/





func fakeQuantWithMinMaxArgsGradient(scope:Scope,gradients: tf.Output, inputs: tf.Outputmin :float, max :float, num_bits :int)  ->(backprops: tf.Output){
    if scope.error() != nil {
        return
    }
    let opspec = tf.OpSpec(
        Type: "FakeQuantWithMinMaxArgsGradient",
        Input: [ gradients, inputs]
        Attrs: attrs
    )
    let op = scope.AddOperation(opspec)
    return (op.Output(1 -1))
}

/*
