1c8b59c046895fa5b6d79f73e0b5817330fcfbfc1A. Unique TensorFlower/* Copyright 2016 The TensorFlow Authors. All Rights Reserved.
200986d48bb646daab659503ad3a713919865f32dDerek Murray
300986d48bb646daab659503ad3a713919865f32dDerek MurrayLicensed under the Apache License, Version 2.0 (the "License");
400986d48bb646daab659503ad3a713919865f32dDerek Murrayyou may not use this file except in compliance with the License.
500986d48bb646daab659503ad3a713919865f32dDerek MurrayYou may obtain a copy of the License at
600986d48bb646daab659503ad3a713919865f32dDerek Murray
700986d48bb646daab659503ad3a713919865f32dDerek Murray    http://www.apache.org/licenses/LICENSE-2.0
800986d48bb646daab659503ad3a713919865f32dDerek Murray
900986d48bb646daab659503ad3a713919865f32dDerek MurrayUnless required by applicable law or agreed to in writing, software
1000986d48bb646daab659503ad3a713919865f32dDerek Murraydistributed under the License is distributed on an "AS IS" BASIS,
1100986d48bb646daab659503ad3a713919865f32dDerek MurrayWITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1200986d48bb646daab659503ad3a713919865f32dDerek MurraySee the License for the specific language governing permissions and
1300986d48bb646daab659503ad3a713919865f32dDerek Murraylimitations under the License.
1400986d48bb646daab659503ad3a713919865f32dDerek Murray==============================================================================*/
1500986d48bb646daab659503ad3a713919865f32dDerek Murray
1600986d48bb646daab659503ad3a713919865f32dDerek Murray#ifndef TENSORFLOW_CORE_DISTRIBUTED_RUNTIME_MASTER_INTERFACE_H_
1700986d48bb646daab659503ad3a713919865f32dDerek Murray#define TENSORFLOW_CORE_DISTRIBUTED_RUNTIME_MASTER_INTERFACE_H_
1800986d48bb646daab659503ad3a713919865f32dDerek Murray
19fa07bfda6896748b747334e750763f6feea91129Sherry Moore#include "tensorflow/core/distributed_runtime/call_options.h"
20bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray#include "tensorflow/core/distributed_runtime/message_wrappers.h"
2182a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar#include "tensorflow/core/lib/core/errors.h"
2200986d48bb646daab659503ad3a713919865f32dDerek Murray#include "tensorflow/core/lib/core/status.h"
2300986d48bb646daab659503ad3a713919865f32dDerek Murray#include "tensorflow/core/protobuf/master.pb.h"
2400986d48bb646daab659503ad3a713919865f32dDerek Murray
2500986d48bb646daab659503ad3a713919865f32dDerek Murraynamespace tensorflow {
2600986d48bb646daab659503ad3a713919865f32dDerek Murray
273699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray// Abstract interface for communicating with the TensorFlow Master service.
2800986d48bb646daab659503ad3a713919865f32dDerek Murray//
293699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray// This interface supports both RPC-based master implementations, and
303699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray// in-process master implementations that do not require an RPC
313699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray// roundtrip.
3200986d48bb646daab659503ad3a713919865f32dDerek Murrayclass MasterInterface {
3300986d48bb646daab659503ad3a713919865f32dDerek Murray public:
3400986d48bb646daab659503ad3a713919865f32dDerek Murray  virtual ~MasterInterface() {}
35fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status CreateSession(CallOptions* call_options,
36fa07bfda6896748b747334e750763f6feea91129Sherry Moore                               const CreateSessionRequest* request,
3700986d48bb646daab659503ad3a713919865f32dDerek Murray                               CreateSessionResponse* response) = 0;
3800986d48bb646daab659503ad3a713919865f32dDerek Murray
39fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status ExtendSession(CallOptions* call_options,
40fa07bfda6896748b747334e750763f6feea91129Sherry Moore                               const ExtendSessionRequest* request,
4100986d48bb646daab659503ad3a713919865f32dDerek Murray                               ExtendSessionResponse* response) = 0;
4200986d48bb646daab659503ad3a713919865f32dDerek Murray
4382a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar  virtual Status PartialRunSetup(CallOptions* call_options,
4482a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar                                 const PartialRunSetupRequest* request,
4582a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar                                 PartialRunSetupResponse* response) {
4682a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar    return errors::Unimplemented("Partial run not implemented for this master");
4782a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar  }
4882a6bbc5d0af60f04958a4e10674cdddf028d7d7Suharsh Sivakumar
49fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status RunStep(CallOptions* call_options,
50bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray                         RunStepRequestWrapper* request,
513699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray                         MutableRunStepResponseWrapper* response) = 0;
5200986d48bb646daab659503ad3a713919865f32dDerek Murray
53bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray  virtual Status RunStep(CallOptions* call_options,
54bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray                         const RunStepRequest* request,
55bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray                         RunStepResponse* response) {
56bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray    std::unique_ptr<RunStepRequestWrapper> wrapped_request(
57bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray        new ProtoRunStepRequest(request));
583699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray    std::unique_ptr<MutableRunStepResponseWrapper> wrapped_response(
593699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray        new NonOwnedProtoRunStepResponse(response));
603699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray    return RunStep(call_options, wrapped_request.get(), wrapped_response.get());
61bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray  }
62bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray
633699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // Returns a request object for use in calls to
643699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // `RunStep()`. Ownership is transferred to the caller.
653699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  //
663699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // The message returned from this method must only be used in a
673699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // `RunStep()` call on the same `MasterInterface` instance.
68bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray  virtual MutableRunStepRequestWrapper* CreateRunStepRequest() {
69bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray    return new MutableProtoRunStepRequest;
70bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray  }
71bf00bcc5fc75d9bd1d61c67cc6c2fc55708a26eaDerek Murray
723699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // Returns a response object for use in calls to
733699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // `RunStep()`. Ownership is transferred to the caller.
743699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  //
753699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // The message returned from this method must only be used in a
763699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // `RunStep()` call on the same `MasterInterface` instance.
773699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  virtual MutableRunStepResponseWrapper* CreateRunStepResponse() {
783699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray    return new OwnedProtoRunStepResponse;
793699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  }
803699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray
81fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status CloseSession(CallOptions* call_options,
82fa07bfda6896748b747334e750763f6feea91129Sherry Moore                              const CloseSessionRequest* request,
8300986d48bb646daab659503ad3a713919865f32dDerek Murray                              CloseSessionResponse* response) = 0;
8400986d48bb646daab659503ad3a713919865f32dDerek Murray
85fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status ListDevices(CallOptions* call_options,
86fa07bfda6896748b747334e750763f6feea91129Sherry Moore                             const ListDevicesRequest* request,
8700986d48bb646daab659503ad3a713919865f32dDerek Murray                             ListDevicesResponse* response) = 0;
8800986d48bb646daab659503ad3a713919865f32dDerek Murray
89fa07bfda6896748b747334e750763f6feea91129Sherry Moore  virtual Status Reset(CallOptions* call_options, const ResetRequest* request,
9000986d48bb646daab659503ad3a713919865f32dDerek Murray                       ResetResponse* response) = 0;
913699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray
923699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray protected:
933699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // NOTE: This should only be called by implementations of this
943699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // interface whose CreateRunStepResponse() method returns a
953699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  // proto-based wrappers for the RunStepResponse message.
963699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  RunStepResponse* get_proto_from_wrapper(
973699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray      MutableRunStepResponseWrapper* wrapper) {
983699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray    return wrapper->get_proto();
993699dfecc5942cab5f3c488442c07bccfd64261dDerek Murray  }
10000986d48bb646daab659503ad3a713919865f32dDerek Murray};
10100986d48bb646daab659503ad3a713919865f32dDerek Murray
10200986d48bb646daab659503ad3a713919865f32dDerek Murray}  // namespace tensorflow
10300986d48bb646daab659503ad3a713919865f32dDerek Murray
10400986d48bb646daab659503ad3a713919865f32dDerek Murray#endif  // TENSORFLOW_CORE_DISTRIBUTED_RUNTIME_MASTER_INTERFACE_H_
105