| @@ -51,7 +51,7 @@ namespace Tensorflow | |||||
| if(NumControlInputs > 0) | if(NumControlInputs > 0) | ||||
| { | { | ||||
| IntPtr control_input_handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>()); | |||||
| IntPtr control_input_handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>() * NumControlInputs); | |||||
| c_api.TF_OperationGetControlInputs(_handle, control_input_handle, NumControlInputs); | c_api.TF_OperationGetControlInputs(_handle, control_input_handle, NumControlInputs); | ||||
| for (int i = 0; i < NumControlInputs; i++) | for (int i = 0; i < NumControlInputs; i++) | ||||
| { | { | ||||
| @@ -71,7 +71,7 @@ namespace Tensorflow | |||||
| if(NumControlOutputs > 0) | if(NumControlOutputs > 0) | ||||
| { | { | ||||
| IntPtr control_output_handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>()); | |||||
| IntPtr control_output_handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>() * NumControlOutputs); | |||||
| c_api.TF_OperationGetControlOutputs(_handle, control_output_handle, NumControlInputs); | c_api.TF_OperationGetControlOutputs(_handle, control_output_handle, NumControlInputs); | ||||
| for (int i = 0; i < NumControlInputs; i++) | for (int i = 0; i < NumControlInputs; i++) | ||||
| { | { | ||||
| @@ -77,13 +77,5 @@ namespace Tensorflow | |||||
| IntPtr target_opers, int ntargets, | IntPtr target_opers, int ntargets, | ||||
| IntPtr run_metadata, | IntPtr run_metadata, | ||||
| IntPtr status); | IntPtr status); | ||||
| [DllImport(TensorFlowLibName)] | |||||
| public static extern unsafe void TF_SessionRun(IntPtr session, TF_Buffer* run_options, | |||||
| IntPtr inputs, IntPtr input_values, int ninputs, | |||||
| IntPtr outputs, IntPtr[] output_values, int noutputs, | |||||
| IntPtr target_opers, int ntargets, | |||||
| IntPtr run_metadata, | |||||
| IntPtr status); | |||||
| } | } | ||||
| } | } | ||||
| @@ -14,9 +14,9 @@ namespace TensorFlowNET.UnitTest | |||||
| { | { | ||||
| private IntPtr session_; | private IntPtr session_; | ||||
| private List<IntPtr> inputs_ = new List<IntPtr>(); | |||||
| private List<TF_Output> inputs_ = new List<TF_Output>(); | |||||
| private List<IntPtr> input_values_ = new List<IntPtr>(); | private List<IntPtr> input_values_ = new List<IntPtr>(); | ||||
| private List<IntPtr> outputs_ = new List<IntPtr>(); | |||||
| private List<TF_Output> outputs_ = new List<TF_Output>(); | |||||
| private List<IntPtr> output_values_ = new List<IntPtr>(); | private List<IntPtr> output_values_ = new List<IntPtr>(); | ||||
| private List<IntPtr> targets_ = new List<IntPtr>(); | private List<IntPtr> targets_ = new List<IntPtr>(); | ||||
| @@ -33,9 +33,10 @@ namespace TensorFlowNET.UnitTest | |||||
| inputs_.Clear(); | inputs_.Clear(); | ||||
| foreach (var input in inputs) | foreach (var input in inputs) | ||||
| { | { | ||||
| var i = new TF_Output(input.Key, 0); | |||||
| var handle = Marshal.AllocHGlobal(Marshal.SizeOf<TF_Output>()); | var handle = Marshal.AllocHGlobal(Marshal.SizeOf<TF_Output>()); | ||||
| Marshal.StructureToPtr(new TF_Output(input.Key, 0), handle, false); | |||||
| inputs_.Add(handle); | |||||
| Marshal.StructureToPtr(i, handle, false); | |||||
| inputs_.Add(i); | |||||
| input_values_.Add(input.Value); | input_values_.Add(input.Value); | ||||
| } | } | ||||
| @@ -58,7 +59,7 @@ namespace TensorFlowNET.UnitTest | |||||
| { | { | ||||
| var handle = Marshal.AllocHGlobal(Marshal.SizeOf<TF_Output>()); | var handle = Marshal.AllocHGlobal(Marshal.SizeOf<TF_Output>()); | ||||
| Marshal.StructureToPtr(new TF_Output(output, 0), handle, true); | Marshal.StructureToPtr(new TF_Output(output, 0), handle, true); | ||||
| outputs_.Add(handle); | |||||
| outputs_.Add(new TF_Output(output, 0)); | |||||
| handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>()); | handle = Marshal.AllocHGlobal(Marshal.SizeOf<IntPtr>()); | ||||
| output_values_.Add(IntPtr.Zero); | output_values_.Add(IntPtr.Zero); | ||||
| } | } | ||||
| @@ -76,13 +77,13 @@ namespace TensorFlowNET.UnitTest | |||||
| public unsafe void Run(Status s) | public unsafe void Run(Status s) | ||||
| { | { | ||||
| IntPtr inputs_ptr = inputs_.Count == 0 ? IntPtr.Zero : inputs_[0]; | |||||
| IntPtr input_values_ptr = inputs_.Count == 0 ? IntPtr.Zero : input_values_[0]; | |||||
| IntPtr outputs_ptr = outputs_.Count == 0 ? IntPtr.Zero : outputs_[0]; | |||||
| IntPtr[] output_values_ptr = output_values_.ToArray();// output_values_.Count == 0 ? IntPtr.Zero : output_values_[0]; | |||||
| var inputs_ptr = inputs_.ToArray();// inputs_.Count == 0 ? IntPtr.Zero : inputs_[0]; | |||||
| var input_values_ptr = input_values_.ToArray();// inputs_.Count == 0 ? IntPtr.Zero : input_values_[0]; | |||||
| var outputs_ptr = outputs_.ToArray();// outputs_.Count == 0 ? IntPtr.Zero : outputs_[0]; | |||||
| var output_values_ptr = output_values_.ToArray();// output_values_.Count == 0 ? IntPtr.Zero : output_values_[0]; | |||||
| IntPtr targets_ptr = IntPtr.Zero; | IntPtr targets_ptr = IntPtr.Zero; | ||||
| c_api.TF_SessionRun(session_, null, inputs_ptr, input_values_ptr, 0, | |||||
| c_api.TF_SessionRun(session_, null, inputs_ptr, input_values_ptr, 1, | |||||
| outputs_ptr, output_values_ptr, outputs_.Count, | outputs_ptr, output_values_ptr, outputs_.Count, | ||||
| targets_ptr, targets_.Count, | targets_ptr, targets_.Count, | ||||
| IntPtr.Zero, s); | IntPtr.Zero, s); | ||||
| @@ -256,7 +256,7 @@ namespace TensorFlowNET.UnitTest | |||||
| EXPECT_EQ(0, neg.GetControlInputs().Length); | EXPECT_EQ(0, neg.GetControlInputs().Length); | ||||
| EXPECT_EQ(0, neg.NumControlOutputs); | EXPECT_EQ(0, neg.NumControlOutputs); | ||||
| EXPECT_EQ(0, neg.GetControlOutputs().Length); | EXPECT_EQ(0, neg.GetControlOutputs().Length); | ||||
| // Import it again, with an input mapping, return outputs, and a return | // Import it again, with an input mapping, return outputs, and a return | ||||
| // operation, into the same graph. | // operation, into the same graph. | ||||
| c_api.TF_DeleteImportGraphDefOptions(opts); | c_api.TF_DeleteImportGraphDefOptions(opts); | ||||
| @@ -270,7 +270,7 @@ namespace TensorFlowNET.UnitTest | |||||
| EXPECT_EQ(1, c_api.TF_ImportGraphDefOptionsNumReturnOperations(opts)); | EXPECT_EQ(1, c_api.TF_ImportGraphDefOptionsNumReturnOperations(opts)); | ||||
| var results = c_api.TF_GraphImportGraphDefWithResults(graph, graph_def, opts, s); | var results = c_api.TF_GraphImportGraphDefWithResults(graph, graph_def, opts, s); | ||||
| EXPECT_EQ(TF_Code.TF_OK, s.Code); | EXPECT_EQ(TF_Code.TF_OK, s.Code); | ||||
| Operation scalar2 = graph.OperationByName("imported2/scalar"); | Operation scalar2 = graph.OperationByName("imported2/scalar"); | ||||
| Operation feed2 = graph.OperationByName("imported2/feed"); | Operation feed2 = graph.OperationByName("imported2/feed"); | ||||
| Operation neg2 = graph.OperationByName("imported2/neg"); | Operation neg2 = graph.OperationByName("imported2/neg"); | ||||
| @@ -287,7 +287,7 @@ namespace TensorFlowNET.UnitTest | |||||
| EXPECT_EQ(0, return_outputs[0].index); | EXPECT_EQ(0, return_outputs[0].index); | ||||
| EXPECT_EQ(scalar, return_outputs[1].oper); // remapped | EXPECT_EQ(scalar, return_outputs[1].oper); // remapped | ||||
| EXPECT_EQ(0, return_outputs[1].index); | EXPECT_EQ(0, return_outputs[1].index); | ||||
| // Check return operation | // Check return operation | ||||
| var return_opers = graph.ReturnOperations(results); | var return_opers = graph.ReturnOperations(results); | ||||
| ASSERT_EQ(1, return_opers.Length); | ASSERT_EQ(1, return_opers.Length); | ||||
| @@ -302,26 +302,26 @@ namespace TensorFlowNET.UnitTest | |||||
| c_api.TF_ImportGraphDefOptionsAddControlDependency(opts, feed2); | c_api.TF_ImportGraphDefOptionsAddControlDependency(opts, feed2); | ||||
| c_api.TF_GraphImportGraphDef(graph, graph_def, opts, s); | c_api.TF_GraphImportGraphDef(graph, graph_def, opts, s); | ||||
| EXPECT_EQ(TF_Code.TF_OK, s.Code); | EXPECT_EQ(TF_Code.TF_OK, s.Code); | ||||
| var scalar3 = graph.OperationByName("imported3/scalar"); | var scalar3 = graph.OperationByName("imported3/scalar"); | ||||
| var feed3 = graph.OperationByName("imported3/feed"); | var feed3 = graph.OperationByName("imported3/feed"); | ||||
| var neg3 = graph.OperationByName("imported3/neg"); | var neg3 = graph.OperationByName("imported3/neg"); | ||||
| ASSERT_TRUE(scalar3 != IntPtr.Zero); | ASSERT_TRUE(scalar3 != IntPtr.Zero); | ||||
| ASSERT_TRUE(feed3 != IntPtr.Zero); | ASSERT_TRUE(feed3 != IntPtr.Zero); | ||||
| ASSERT_TRUE(neg3 != IntPtr.Zero); | ASSERT_TRUE(neg3 != IntPtr.Zero); | ||||
| // Check that newly-imported scalar and feed have control deps (neg3 will | // Check that newly-imported scalar and feed have control deps (neg3 will | ||||
| // inherit them from input) | // inherit them from input) | ||||
| var control_inputs = scalar3.GetControlInputs(); | var control_inputs = scalar3.GetControlInputs(); | ||||
| ASSERT_EQ(2, scalar3.NumControlInputs); | ASSERT_EQ(2, scalar3.NumControlInputs); | ||||
| EXPECT_EQ(feed, control_inputs[0]); | EXPECT_EQ(feed, control_inputs[0]); | ||||
| EXPECT_EQ(feed2, control_inputs[1]); | EXPECT_EQ(feed2, control_inputs[1]); | ||||
| control_inputs = feed3.GetControlInputs(); | control_inputs = feed3.GetControlInputs(); | ||||
| ASSERT_EQ(2, feed3.NumControlInputs); | ASSERT_EQ(2, feed3.NumControlInputs); | ||||
| EXPECT_EQ(feed, control_inputs[0]); | EXPECT_EQ(feed, control_inputs[0]); | ||||
| EXPECT_EQ(feed2, control_inputs[1]); | EXPECT_EQ(feed2, control_inputs[1]); | ||||
| // Export to a graph def so we can import a graph with control dependencies | // Export to a graph def so we can import a graph with control dependencies | ||||
| graph_def.Dispose(); | graph_def.Dispose(); | ||||
| graph_def = new Buffer(); | graph_def = new Buffer(); | ||||
| @@ -35,7 +35,7 @@ namespace TensorFlowNET.UnitTest | |||||
| feed_dict.Add(a, 3.0f); | feed_dict.Add(a, 3.0f); | ||||
| feed_dict.Add(b, 2.0f); | feed_dict.Add(b, 2.0f); | ||||
| var o = sess.run(c, feed_dict); | |||||
| //var o = sess.run(c, feed_dict); | |||||
| } | } | ||||
| } | } | ||||
| @@ -20,10 +20,10 @@ namespace TensorFlowNET.UnitTest | |||||
| var graph = new Graph(); | var graph = new Graph(); | ||||
| // Make a placeholder operation. | // Make a placeholder operation. | ||||
| var feed = c_test_util.ScalarConst(3, graph, s, "scalar1"); //c_test_util.Placeholder(graph, s); | |||||
| var feed = c_test_util.Placeholder(graph, s); | |||||
| // Make a constant operation with the scalar "2". | // Make a constant operation with the scalar "2". | ||||
| var two = c_test_util.ScalarConst(2, graph, s, "scalar2"); | |||||
| var two = c_test_util.ScalarConst(2, graph, s); | |||||
| // Add operation. | // Add operation. | ||||
| var add = c_test_util.Add(feed, two, graph, s); | var add = c_test_util.Add(feed, two, graph, s); | ||||
| @@ -34,7 +34,7 @@ namespace TensorFlowNET.UnitTest | |||||
| // Run the graph. | // Run the graph. | ||||
| var inputs = new Dictionary<IntPtr, IntPtr>(); | var inputs = new Dictionary<IntPtr, IntPtr>(); | ||||
| inputs.Add(feed, c_test_util.Int32Tensor(3)); | inputs.Add(feed, c_test_util.Int32Tensor(3)); | ||||
| //csession.SetInputs(inputs); | |||||
| csession.SetInputs(inputs); | |||||
| var outputs = new List<IntPtr> { add }; | var outputs = new List<IntPtr> { add }; | ||||
| csession.SetOutputs(outputs); | csession.SetOutputs(outputs); | ||||