| @@ -11,7 +11,7 @@ namespace Tensorflow.Eager | |||
| { | |||
| public EagerTensor() : base(IntPtr.Zero) | |||
| { | |||
| EagerTensorHandle = c_api.TFE_NewEagerTensor(); | |||
| } | |||
| public EagerTensor(IntPtr handle) : base(IntPtr.Zero) | |||
| @@ -22,41 +22,28 @@ namespace Tensorflow.Eager | |||
| public EagerTensor(string value, string device_name) : base(value) | |||
| { | |||
| EagerTensorHandle = c_api.TFE_NewEagerTensor(); | |||
| tfe_tensor_handle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| c_api.TFE_SetEagerTensorHandle(EagerTensorHandle, tfe_tensor_handle); | |||
| EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| Resolve(); | |||
| } | |||
| public EagerTensor(NDArray value, string device_name) : base(value) | |||
| { | |||
| EagerTensorHandle = c_api.TFE_NewEagerTensor(); | |||
| tfe_tensor_handle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| c_api.TFE_SetEagerTensorHandle(EagerTensorHandle, tfe_tensor_handle); | |||
| EagerTensorHandle = c_api.TFE_NewTensorHandle(_handle, status); | |||
| Resolve(); | |||
| } | |||
| public EagerTensor Resolve() | |||
| { | |||
| _id = c_api.TFE_EagerTensorId(EagerTensorHandle); | |||
| if (tfe_tensor_handle == IntPtr.Zero) | |||
| tfe_tensor_handle = c_api.TFE_EagerTensorHandle(EagerTensorHandle); | |||
| _id = get_uid(); | |||
| if (_handle == IntPtr.Zero) | |||
| _handle = c_api.TFE_TensorHandleResolve(tfe_tensor_handle, status); | |||
| /*print($"new Tensor {Id} {_handle.ToString("x16")}"); | |||
| print($"new TensorHandle {Id} {tfe_tensor_handle.ToString("x16")}"); | |||
| print($"new EagerTensor {Id} {EagerTensorHandle.ToString("x16")}");*/ | |||
| _handle = c_api.TFE_TensorHandleResolve(EagerTensorHandle, status); | |||
| if (tfe_tensor_handle == IntPtr.Zero && _id == 0) | |||
| { | |||
| } | |||
| //print($"new Tensor {Id} {_handle.ToString("x16")}"); | |||
| //print($"new TensorHandle {Id} {EagerTensorHandle.ToString("x16")}"); | |||
| GarbageCollector.Increase(_handle, GCItemType.TensorHandle); | |||
| GarbageCollector.Increase(tfe_tensor_handle, GCItemType.LocalTensorHandle); | |||
| GarbageCollector.Increase(EagerTensorHandle, GCItemType.EagerTensorHandle); | |||
| /*GarbageCollector.Increase(_handle, GCItemType.TensorHandle); | |||
| GarbageCollector.Increase(tfe_tensor_handle, GCItemType.LocalTensorHandle);*/ | |||
| return this; | |||
| } | |||
| @@ -66,16 +53,17 @@ namespace Tensorflow.Eager | |||
| protected override void DisposeUnmanagedResources(IntPtr handle) | |||
| { | |||
| GarbageCollector.Decrease(_handle); | |||
| /*GarbageCollector.Decrease(_handle); | |||
| GarbageCollector.Decrease(tfe_tensor_handle); | |||
| GarbageCollector.Decrease(EagerTensorHandle); | |||
| GarbageCollector.Decrease(EagerTensorHandle);*/ | |||
| /*print($"deleting DeleteTensorHandle {Id} {_handle.ToString("x16")}"); | |||
| //print($"deleting DeleteTensorHandle {Id} {_handle.ToString("x16")}"); | |||
| c_api.TF_DeleteTensor(_handle); | |||
| print($"deleting DeleteTensorHandle {Id} {tfe_tensor_handle.ToString("x16")}"); | |||
| c_api.TFE_DeleteTensorHandle(tfe_tensor_handle); | |||
| print($"deleting DeleteEagerTensor {Id} {EagerTensorHandle.ToString("x16")}"); | |||
| c_api.TFE_DeleteEagerTensor(EagerTensorHandle);*/ | |||
| //print($"deleting DeleteTensorHandle {Id} {EagerTensorHandle.ToString("x16")}"); | |||
| c_api.TFE_DeleteTensorHandle(EagerTensorHandle); | |||
| } | |||
| static long _uid = 0; | |||
| long get_uid() => _uid++; | |||
| } | |||
| } | |||
| @@ -9,11 +9,10 @@ namespace Tensorflow.Eager | |||
| public partial class EagerTensor : Tensor | |||
| { | |||
| Status status = new Status(); | |||
| IntPtr tfe_tensor_handle; | |||
| public IntPtr EagerTensorHandle { get; set; } | |||
| public override string Device => c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(tfe_tensor_handle, status)); | |||
| public IntPtr EagerTensorHandle; | |||
| public override string Device => c_api.StringPiece(c_api.TFE_TensorHandleDeviceName(EagerTensorHandle, status)); | |||
| public override int rank => c_api.TFE_TensorHandleNumDims(tfe_tensor_handle, status); | |||
| public override int rank => c_api.TFE_TensorHandleNumDims(EagerTensorHandle, status); | |||
| public static int GetRank(IntPtr handle) | |||
| { | |||
| @@ -33,17 +33,16 @@ namespace Tensorflow.Eager | |||
| { | |||
| ctx.ensure_initialized(); | |||
| var results = Enumerable.Range(0, num_outputs).Select(x => new EagerTensor()).ToArray(); | |||
| Status status = c_api.TFE_QuickExecute(ctx, | |||
| using var status = new Status(); | |||
| var results = wrap_tfe_src.TFE_Execute(ctx, | |||
| ctx.device_name, | |||
| op_name, | |||
| inputs.Select(x => x.EagerTensorHandle).ToArray(), | |||
| inputs.Length, | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| inputs, | |||
| attrs, | |||
| num_outputs, | |||
| status); | |||
| return results.Select(x => x.Resolve()).ToArray(); | |||
| return results; | |||
| } | |||
| public (TF_DataType, EagerTensor[]) args_to_matching_eager(Context ctx, TF_DataType default_dtype = TF_DataType.DtInvalid, object[] args = null) | |||
| @@ -0,0 +1,62 @@ | |||
| using System.Collections.Generic; | |||
| using System.Linq; | |||
| using System; | |||
| using static Tensorflow.OpDef.Types; | |||
| namespace Tensorflow.Eager | |||
| { | |||
| /// <summary> | |||
| /// python\eager\pywrap_tfe_src.cc | |||
| /// </summary> | |||
| public partial class wrap_tfe_src | |||
| { | |||
| public static EagerTensor[] TFE_Execute(Context ctx, | |||
| string device_name, | |||
| string op_name, | |||
| Tensor[] inputs, | |||
| object[] attrs, | |||
| int num_outputs, | |||
| Status status) | |||
| => TFE_ExecuteCancelable(ctx, device_name, op_name, inputs, attrs, num_outputs, status); | |||
| public static EagerTensor[] TFE_ExecuteCancelable(Context ctx, | |||
| string device_name, | |||
| string op_name, | |||
| Tensor[] inputs, | |||
| object[] attrs, | |||
| int num_outputs, | |||
| Status status) | |||
| { | |||
| var op = GetOp(ctx, op_name, status); | |||
| status.Check(true); | |||
| c_api.TFE_OpSetDevice(op, device_name, status); | |||
| if (status.ok()) | |||
| { | |||
| for (int i = 0; i < inputs.Length; ++i) | |||
| { | |||
| IntPtr tensor_handle; | |||
| switch (inputs[i]) | |||
| { | |||
| case EagerTensor et: | |||
| tensor_handle = et.EagerTensorHandle; | |||
| break; | |||
| default: | |||
| tensor_handle = c_api.TFE_NewTensorHandle(inputs[i], status); | |||
| break; | |||
| } | |||
| c_api.TFE_OpAddInput(op, tensor_handle, status); | |||
| } | |||
| } | |||
| if (status.ok()) | |||
| SetOpAttrs(op, attrs, status); | |||
| var outputs = new IntPtr[num_outputs]; | |||
| if (status.ok()) | |||
| { | |||
| c_api.TFE_Execute(op, outputs, ref num_outputs, status); | |||
| status.Check(true); | |||
| } | |||
| return outputs.Select(x => new EagerTensor(x)).ToArray(); | |||
| } | |||
| } | |||
| } | |||
| @@ -11,6 +11,167 @@ namespace Tensorflow.Eager | |||
| /// </summary> | |||
| public partial class wrap_tfe_src | |||
| { | |||
| static int kFastPathExecuteInputStartIndex = 0; | |||
| public static EagerTensor[] TFE_FastPathExecute(Context ctx, | |||
| string device_name, | |||
| string opName, | |||
| string name, | |||
| Action callbacks, | |||
| params object[] args) | |||
| { | |||
| int args_size = args.Length; | |||
| var attr_list_sizes = new Dictionary<string, long>(); | |||
| using var status = new Status(); | |||
| var op = GetOp(ctx, opName, status); | |||
| var op_def = Graph.TFE_GetOpDef(opName); | |||
| // Set non-inferred attrs, including setting defaults if the attr is passed in | |||
| // as None. | |||
| for (int i = kFastPathExecuteInputStartIndex + op_def.InputArg.Count; i < args_size; i += 2) | |||
| { | |||
| var attr_name = args[i].ToString(); | |||
| var attr_value = args[i + 1]; | |||
| foreach (var attr in op_def.Attr) | |||
| { | |||
| if (attr_name == attr.Name) | |||
| { | |||
| SetOpAttrWithDefaults(ctx, op, attr, attr_name, attr_value, attr_list_sizes, status); | |||
| status.Check(true); | |||
| break; | |||
| } | |||
| } | |||
| } | |||
| c_api.TFE_OpSetDevice(op, device_name, status); | |||
| status.Check(true); | |||
| // Add inferred attrs and inputs. | |||
| for (int i = 0; i < op_def.InputArg.Count; i++) | |||
| { | |||
| var input_arg = op_def.InputArg[i]; | |||
| if (!string.IsNullOrEmpty(input_arg.NumberAttr)) | |||
| { | |||
| int len = (args[kFastPathExecuteInputStartIndex + i] as object[]).Length; | |||
| c_api.TFE_OpSetAttrInt(op, input_arg.NumberAttr, len); | |||
| attr_list_sizes[input_arg.NumberAttr] = len; | |||
| if (len > 0) | |||
| { | |||
| var fast_input_array = (object[])args[i]; | |||
| // First item adds the type attr. | |||
| if (!AddInputToOp(fast_input_array[i], true, input_arg, op, status)) | |||
| return null; | |||
| for (var j = 1; j < len; j++) | |||
| { | |||
| // Since the list is homogeneous, we don't need to re-add the attr. | |||
| if (!AddInputToOp(fast_input_array[j], false, input_arg, op, status)) | |||
| return null; | |||
| } | |||
| } | |||
| } | |||
| else if (!string.IsNullOrEmpty(input_arg.TypeListAttr)) | |||
| { | |||
| } | |||
| else | |||
| { | |||
| // The item is a single item. | |||
| AddInputToOp(args[i], true, input_arg, op, status); | |||
| } | |||
| } | |||
| int num_retvals = 0; | |||
| for (int i = 0; i < op_def.OutputArg.Count; i++) | |||
| { | |||
| var output_arg = op_def.OutputArg[i]; | |||
| var delta = 1L; | |||
| if (!string.IsNullOrEmpty(output_arg.NumberAttr)) | |||
| delta = attr_list_sizes[output_arg.NumberAttr]; | |||
| else if (!string.IsNullOrEmpty(output_arg.TypeListAttr)) | |||
| delta = attr_list_sizes[output_arg.TypeListAttr]; | |||
| if (delta < 0) | |||
| throw new RuntimeError("Attributes suggest that the size of an output list is less than 0"); | |||
| num_retvals += (int)delta; | |||
| } | |||
| var retVals = new IntPtr[num_retvals]; | |||
| c_api.TFE_Execute(op, retVals, ref num_retvals, status); | |||
| status.Check(true); | |||
| return retVals.Select(x => new EagerTensor(x)).ToArray(); | |||
| } | |||
| private static TFE_Op GetOp(Context ctx, string op_or_function_name, Status status) | |||
| { | |||
| var maybe_op = ReleaseThreadLocalOp(); | |||
| if (maybe_op != IntPtr.Zero) | |||
| { | |||
| c_api.TFE_OpReset(maybe_op, op_or_function_name, ctx.device_name, status); | |||
| } | |||
| else | |||
| { | |||
| maybe_op = c_api.TFE_NewOp(ctx, op_or_function_name, status); | |||
| op = maybe_op; | |||
| } | |||
| status.Check(true); | |||
| return maybe_op; | |||
| } | |||
| static TFE_Op op; | |||
| private static TFE_Op ReleaseThreadLocalOp() | |||
| { | |||
| return op; | |||
| } | |||
| /// <summary> | |||
| /// Adds input and type attr to the op, and to the list of flattened | |||
| /// inputs/attrs. | |||
| /// </summary> | |||
| /// <param name="inputs"></param> | |||
| /// <param name="add_type_attr"></param> | |||
| /// <param name="input_arg"></param> | |||
| /// <param name="op"></param> | |||
| /// <param name="status"></param> | |||
| /// <returns></returns> | |||
| private static bool AddInputToOp(object inputs, | |||
| bool add_type_attr, | |||
| ArgDef input_arg, | |||
| IntPtr op, | |||
| Status status) | |||
| { | |||
| IntPtr input_handle; | |||
| // ConvertToTensor(); | |||
| switch (inputs) | |||
| { | |||
| case EagerTensor input: | |||
| input_handle = input.EagerTensorHandle; | |||
| break; | |||
| case EagerTensor[] input_list: | |||
| input_handle = input_list[0].EagerTensorHandle; | |||
| break; | |||
| default: | |||
| throw new NotImplementedException(""); | |||
| } | |||
| if (add_type_attr && !string.IsNullOrEmpty(input_arg.TypeAttr)) | |||
| { | |||
| var dtype = c_api.TFE_TensorHandleDataType(input_handle); | |||
| c_api.TFE_OpSetAttrType(op, input_arg.TypeAttr, dtype); | |||
| } | |||
| c_api.TFE_OpAddInput(op, input_handle, status); | |||
| status.Check(true); | |||
| return true; | |||
| } | |||
| public static void SetOpAttrs(TFE_Op op, params object[] attrs) | |||
| { | |||
| using var status = new Status(); | |||
| @@ -38,12 +38,11 @@ namespace Tensorflow | |||
| public static OpDef TFE_GetOpDef(string type) | |||
| { | |||
| IntPtr handle = tf.get_default_graph(); | |||
| using (var buffer = new Buffer()) | |||
| using (var status = new Status()) | |||
| { | |||
| c_api.TF_GraphGetOpDef(handle, type, buffer, status); | |||
| return OpDef.Parser.ParseFrom(buffer.MemoryBlock.Stream()); | |||
| } | |||
| using var buffer = new Buffer(); | |||
| using var status = new Status(); | |||
| c_api.TF_GraphGetOpDef(handle, type, buffer, status); | |||
| using var stream = buffer.MemoryBlock.Stream(); | |||
| return OpDef.Parser.ParseFrom(stream); | |||
| } | |||
| public OperationDescription NewOperation(string opType, string opName) | |||
| @@ -164,15 +164,12 @@ namespace Tensorflow | |||
| { | |||
| if(tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Pack", name, | |||
| values.Select(x => (x as EagerTensor).EagerTensorHandle).ToArray(), values.Length, | |||
| wrap_tfe_src.SetOpAttrs2("axis", axis), | |||
| op => wrap_tfe_src.SetOpAttrs(op, "axis", axis), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| values, | |||
| "axis", axis); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Pack", name: name, args: new { values, axis }); | |||
| @@ -259,17 +259,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Add", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| y as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Add", name, null, | |||
| x as EagerTensor, | |||
| y as EagerTensor); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Add", name, args: new { x, y }); | |||
| @@ -304,17 +298,11 @@ namespace Tensorflow | |||
| // forward_compatible(2019, 6, 25): | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "AddV2", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| y as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "AddV2", name, | |||
| null, | |||
| x, y); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("AddV2", name, args: new { x, y }); | |||
| @@ -784,22 +772,13 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| var attrs = new object[] | |||
| { | |||
| "DstT", DstT, | |||
| "Truncate", Truncate | |||
| }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Cast", name, | |||
| new IntPtr[] { x as EagerTensor }, 1, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| null, | |||
| x, | |||
| "DstT", DstT, "Truncate", Truncate); | |||
| return results[0].Resolve(); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Cast", name, args: new { x, DstT, Truncate }); | |||
| @@ -854,17 +833,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Sub", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| y as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Sub", name, | |||
| null, | |||
| x, y); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Sub", name, args: new { x, y }); | |||
| @@ -978,17 +951,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Mul", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| y as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Mul", name, | |||
| null, | |||
| x, y); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Mul", name, args: new { x, y }); | |||
| @@ -1029,17 +996,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "RealDiv", name, new IntPtr[] | |||
| { | |||
| x as EagerTensor, | |||
| y as EagerTensor | |||
| }, 2, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "RealDiv", name, | |||
| null, | |||
| x, y); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("RealDiv", name, args: new { x, y }); | |||
| @@ -1126,21 +1087,12 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = EagerTensorPass.Create(); | |||
| var inputs = EagerTensorPass.From(a, b); | |||
| var attrs = new object[] | |||
| { | |||
| "transpose_a", transpose_a, | |||
| "transpose_b", transpose_b | |||
| }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "MatMul", name, | |||
| inputs.Points, inputs.Length, | |||
| wrap_tfe_src.SetOpAttrs2(attrs), | |||
| op => wrap_tfe_src.SetOpAttrs(op, attrs), | |||
| results.Points, results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| null, | |||
| a, b, | |||
| "transpose_a", transpose_a, "transpose_b", transpose_b); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("MatMul", name, args: new { a, b, transpose_a, transpose_b }); | |||
| @@ -1343,18 +1295,11 @@ namespace Tensorflow | |||
| { | |||
| if (tf.context.executing_eagerly()) | |||
| { | |||
| var results = new[] { new EagerTensor() }; | |||
| Status status = c_api.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Range", name, new IntPtr[] | |||
| { | |||
| start as EagerTensor, | |||
| limit as EagerTensor, | |||
| delta as EagerTensor | |||
| }, 3, | |||
| null, null, | |||
| results.Select(x => x.EagerTensorHandle).ToArray(), results.Length); | |||
| status.Check(true); | |||
| return results[0].Resolve(); | |||
| var results = wrap_tfe_src.TFE_FastPathExecute(tf.context, tf.context.device_name, | |||
| "Range", name, | |||
| null, | |||
| start, limit, delta); | |||
| return results[0]; | |||
| } | |||
| var _op = _op_def_lib._apply_op_helper("Range", name, new { start, limit, delta }); | |||
| @@ -16,15 +16,14 @@ namespace Tensorflow | |||
| static object locker = new object(); | |||
| public static void Init() | |||
| { | |||
| Task.Run(() => | |||
| /*Task.Run(() => | |||
| { | |||
| while (true) | |||
| { | |||
| Thread.Sleep(100); | |||
| Recycle(); | |||
| } | |||
| }); | |||
| });*/ | |||
| } | |||
| public static void Increase(IntPtr handle, GCItemType type) | |||
| @@ -41,12 +41,12 @@ namespace Tensorflow | |||
| ICanBeFlattened, | |||
| IPointerInputs | |||
| { | |||
| protected int _id; | |||
| protected long _id; | |||
| private readonly Operation _op; | |||
| private readonly int _value_index; | |||
| private TF_Output? _tf_output; | |||
| private readonly TF_DataType _override_dtype; | |||
| public int Id => _id; | |||
| public long Id => _id; | |||
| /// <summary> | |||
| /// The Graph that contains this tensor. | |||
| @@ -29,7 +29,7 @@ namespace Tensorflow | |||
| { | |||
| public partial class ops | |||
| { | |||
| public static int tensor_id(Tensor tensor) | |||
| public static long tensor_id(Tensor tensor) | |||
| { | |||
| return tensor.Id; | |||
| } | |||
| @@ -52,7 +52,7 @@ namespace Tensorflow | |||
| { | |||
| GarbageCollector.Init(); | |||
| var vspace = c_api.VSpace_Handle((shape, dims, dtype) => | |||
| /*var vspace = c_api.VSpace_Handle((shape, dims, dtype) => | |||
| { | |||
| var ones = constant_op.constant(1.0f, dtype: dtype) as EagerTensor; | |||
| return ones.EagerTensorHandle; | |||
| @@ -60,16 +60,13 @@ namespace Tensorflow | |||
| { | |||
| var add_n = gen_math_ops.add_n(gradients.Data); | |||
| return add_n; | |||
| }); | |||
| });*/ | |||
| ops.RegisterFromAssembly(); | |||
| // ops.RegisterFromAssemblyEager(); | |||
| c_api.TFE_RegisterGradientFunction((op_name, op_inputs, op_outputs, attrs_string, output_grads, skip_input_indices) => | |||
| /*c_api.TFE_RegisterGradientFunction((op_name, op_inputs, op_outputs, attrs_string, output_grads, skip_input_indices) => | |||
| { | |||
| /*var input_tensors = new BindingArray(op_inputs); | |||
| var output_tensors = new BindingArray(op_outputs); | |||
| var output_grad_tensors = new BindingArray(output_grads);*/ | |||
| var input_tensors = new BindingTensorArray(op_inputs) | |||
| .Data.Select(x => tf.tensorMgr.GetTensor(x)).ToArray(); | |||
| var output_tensors = new BindingTensorArray(op_outputs) | |||
| @@ -98,7 +95,7 @@ namespace Tensorflow | |||
| }, (op_name, op_inputs, op_outputs) => | |||
| { | |||
| }); | |||
| });*/ | |||
| } | |||
| public ResourceVariable Variable<T>(T data, | |||