| 2338 | } |
| 2339 | |
| 2340 | void TF_SessionPRun(TF_Session* session, const char* handle, |
| 2341 | const TF_Output* inputs, TF_Tensor* const* input_values, |
| 2342 | int ninputs, const TF_Output* outputs, |
| 2343 | TF_Tensor** output_values, int noutputs, |
| 2344 | const TF_Operation* const* target_opers, int ntargets, |
| 2345 | TF_Status* status) { |
| 2346 | // TODO(josh11b,mrry): Change Session to be able to use a Graph* |
| 2347 | // directly, instead of requiring us to serialize to a GraphDef and |
| 2348 | // call Session::Extend(). |
| 2349 | if (session->extend_before_run && |
| 2350 | !ExtendSessionGraphHelper(session, status)) { |
| 2351 | return; |
| 2352 | } |
| 2353 | |
| 2354 | TF_Run_Setup(noutputs, output_values, status); |
| 2355 | |
| 2356 | // Convert from TF_Output and TF_Tensor to a string and Tensor. |
| 2357 | std::vector<std::pair<string, Tensor>> input_pairs(ninputs); |
| 2358 | if (!TF_Run_Inputs(input_values, &input_pairs, status)) return; |
| 2359 | for (int i = 0; i < ninputs; ++i) { |
| 2360 | input_pairs[i].first = OutputName(inputs[i]); |
| 2361 | } |
| 2362 | |
| 2363 | // Convert from TF_Output to string names. |
| 2364 | std::vector<string> output_names(noutputs); |
| 2365 | for (int i = 0; i < noutputs; ++i) { |
| 2366 | output_names[i] = OutputName(outputs[i]); |
| 2367 | } |
| 2368 | |
| 2369 | // Convert from TF_Operation* to string names. |
| 2370 | std::vector<string> target_names(ntargets); |
| 2371 | for (int i = 0; i < ntargets; ++i) { |
| 2372 | target_names[i] = target_opers[i]->node.name(); |
| 2373 | } |
| 2374 | |
| 2375 | TF_Run_Helper(session->session, handle, nullptr, input_pairs, output_names, |
| 2376 | output_values, target_names, nullptr, status); |
| 2377 | } |
| 2378 | |
| 2379 | unsigned char TF_TryEvaluateConstant(TF_Graph* graph, TF_Output output, |
| 2380 | TF_Tensor** result, TF_Status* status) { |