aboutsummaryrefslogtreecommitdiffhomepage
path: root/tensorflow/c/c_api_experimental.cc
diff options
context:
space:
mode:
Diffstat (limited to 'tensorflow/c/c_api_experimental.cc')
-rw-r--r--tensorflow/c/c_api_experimental.cc50
1 files changed, 50 insertions, 0 deletions
diff --git a/tensorflow/c/c_api_experimental.cc b/tensorflow/c/c_api_experimental.cc
index c195c9e01c..3bcc62cf2d 100644
--- a/tensorflow/c/c_api_experimental.cc
+++ b/tensorflow/c/c_api_experimental.cc
@@ -8705,3 +8705,53 @@ TFE_TensorHandle* TFE_DequeueVariantTensor(TF_Session* session, int tensor_id,
return createTFEDequeue(ctx, TF_VARIANT, queue, status);
}
+
+static void CheckOk(TF_Status* status) {
+ CHECK_EQ(TF_GetCode(status), TF_OK) << TF_Message(status);
+}
+
+void TFE_TensorHandlePrintDebugString(TFE_TensorHandle* handle) {
+ auto* status = TF_NewStatus();
+ TF_Tensor* t = TFE_TensorHandleResolve(handle, status);
+ CHECK_EQ(TF_OK, TF_GetCode(status)) << TF_Message(status);
+
+ tensorflow::Tensor dst;
+ TF_CHECK_OK(TF_TensorToTensor(t, &dst));
+ LOG(INFO) << dst.DebugString();
+
+ TF_DeleteTensor(t);
+ TF_DeleteStatus(status);
+}
+
+TFE_TensorHandle* TFE_RunConstOp(TFE_Context* ctx) {
+ // Intentionally LOG into INFO below for ease of debugging.
+ VLOG(1) << "TFE_RunConstOp called";
+
+ auto* status = TF_NewStatus();
+ auto* op = TFE_NewOp(ctx, "Const", status);
+ CheckOk(status);
+ TFE_OpSetAttrType(op, "dtype", TF_FLOAT);
+
+ auto* tensor =
+ TF_AllocateTensor(TF_FLOAT, /*shape.data()*/ nullptr, /*shape.size()*/ 0,
+ TF_DataTypeSize(TF_FLOAT) * 1);
+ auto* ptr = reinterpret_cast<char*>(TF_TensorData(tensor));
+ *reinterpret_cast<float*>(ptr) = 17.0;
+
+ TFE_OpSetAttrTensor(op, "value", tensor, status);
+ CheckOk(status);
+ TF_DeleteTensor(tensor);
+ VLOG(1) << "New op created";
+
+ TFE_TensorHandle* retval;
+ int num_retvals = 1;
+ TFE_Execute(op, &retval, &num_retvals, status);
+ CheckOk(status);
+ CHECK_EQ(num_retvals, 1);
+ VLOG(1) << "Op executed";
+
+ TFE_DeleteOp(op);
+ TF_DeleteStatus(status);
+
+ return retval;
+}