35#include <unordered_map>
42#include <disciplines.grpc.pb.h>
48 class ExplicitDiscipline;
93 grpc::ServerReaderWriter<::
philote::Array,
94 ::
philote::Array> *stream) override;
104 grpc::ServerReaderWriter<::
philote::Array,
105 ::
philote::Array> *stream) override;
108 template<typename StreamType>
111 template<typename StreamType>
116 grpc::ServerReaderWriterInterface<::
philote::Array,
122 grpc::ServerReaderWriterInterface<::philote::Array,
123 ::philote::Array> *stream) {
129 std::shared_ptr<philote::ExplicitDiscipline> implementation_;
431 void ConnectChannel(std::shared_ptr<grpc::ChannelInterface> channel);
457 void SetStub(std::unique_ptr<ExplicitService::StubInterface> stub)
459 stub_ = std::move(stub);
464 std::unique_ptr<ExplicitService::StubInterface>
stub_;
472template<
typename StreamType>
475 if (!implementation_)
477 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
"Discipline implementation not linked");
482 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Stream is null");
486 if (context && context->IsCancelled())
488 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before start");
491 philote::Array array;
498 return grpc::Status(grpc::StatusCode::INTERNAL,
"Failed to cast implementation to Discipline");
501 for (
const auto &var : discipline->var_meta())
503 std::string name = var.name();
504 if (var.type() == kInput)
509 std::unordered_map<std::string, const VariableMetaData*> var_lookup;
510 for (
const auto &var : discipline->var_meta())
512 var_lookup[var.name()] = &var;
515 while (stream->Read(&array))
518 const std::string &name = array.name();
521 auto var_it = var_lookup.find(name);
522 if (var_it == var_lookup.end())
524 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Variable not found: " + name);
526 const VariableMetaData* var = var_it->second;
529 if (var->type() == VariableType::kInput)
534 inputs[name].AssignChunk(array);
536 catch (
const std::exception &e)
538 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
539 "Failed to assign chunk for variable " + name +
": " + e.what());
544 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Invalid variable type for input: " + name);
550 for (
const VariableMetaData &var : discipline->var_meta())
552 if (var.type() == kOutput)
553 outputs[var.name()] =
Variable(var);
557 if (context && context->IsCancelled())
559 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before computation");
563 discipline->SetContext(context);
568 implementation_->Compute(inputs, outputs);
570 catch (
const std::exception &e)
572 discipline->ClearContext();
573 return grpc::Status(grpc::StatusCode::INTERNAL,
574 "Failed to compute outputs: " + std::string(e.what()));
578 discipline->ClearContext();
581 if (context && context->IsCancelled())
583 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before sending results");
587 for (
const auto &out : outputs)
589 const std::string &name = out.first;
592 out.second.Send(name,
"", stream, discipline->stream_opts().num_double(), context);
594 catch (
const std::exception &e)
596 return grpc::Status(grpc::StatusCode::INTERNAL,
597 "Failed to send output " + name +
": " + e.what());
601 return grpc::Status::OK;
604template<
typename StreamType>
607 if (!implementation_)
609 return grpc::Status(grpc::StatusCode::FAILED_PRECONDITION,
"Discipline implementation not linked");
614 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Stream is null");
618 if (context && context->IsCancelled())
620 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before start");
623 philote::Array array;
630 return grpc::Status(grpc::StatusCode::INTERNAL,
"Failed to cast implementation to Discipline");
633 for (
const auto &var : discipline->var_meta())
635 std::string name = var.name();
636 if (var.type() == kInput)
641 std::unordered_map<std::string, const VariableMetaData*> var_lookup;
642 for (
const auto &var : discipline->var_meta())
644 var_lookup[var.name()] = &var;
647 while (stream->Read(&array))
650 const std::string &name = array.name();
653 auto var_it = var_lookup.find(name);
654 if (var_it == var_lookup.end())
656 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Variable not found: " + name);
658 const VariableMetaData* var = var_it->second;
661 if (var->type() == VariableType::kInput)
666 inputs[name].AssignChunk(array);
668 catch (
const std::exception &e)
670 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
671 "Failed to assign chunk for variable " + name +
": " + e.what());
676 return grpc::Status(grpc::StatusCode::INVALID_ARGUMENT,
"Invalid variable type for input: " + name);
682 for (
const PartialsMetaData &par : discipline->partials_meta())
684 std::vector<size_t> shape;
685 for (
const int64_t &dim : par.shape())
686 shape.push_back(dim);
688 partials[std::make_pair(par.name(), par.subname())] =
Variable(kOutput, shape);
692 if (context && context->IsCancelled())
694 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before computation");
698 discipline->SetContext(context);
703 implementation_->ComputePartials(inputs, partials);
705 catch (
const std::exception &e)
707 discipline->ClearContext();
708 return grpc::Status(grpc::StatusCode::INTERNAL,
709 "Failed to compute partials: " + std::string(e.what()));
713 discipline->ClearContext();
716 if (context && context->IsCancelled())
718 return grpc::Status(grpc::StatusCode::CANCELLED,
"Request cancelled before sending results");
722 for (
const auto &par : partials)
724 const std::string &name = par.first.first;
725 const std::string &subname = par.first.second;
728 par.second.Send(name, subname, stream, discipline->stream_opts().num_double(), context);
730 catch (
const std::exception &e)
732 return grpc::Status(grpc::StatusCode::INTERNAL,
733 "Failed to send partial " + name +
"/" + subname +
": " + e.what());
737 return grpc::Status::OK;
Client class for interacting with a discipline server.
Definition discipline_client.h:55
Base class for all analysis discipline servers.
Definition discipline_server.h:57
Definition of the discipline base class.
Definition discipline.h:62
Client class for calling a remote explicit discipline.
Definition explicit.h:418
std::unique_ptr< ExplicitService::StubInterface > stub_
explicit service stub
Definition explicit.h:464
ExplicitClient()=default
Constructor.
~ExplicitClient() noexcept=default
Destructor.
Explicit discipline class.
Definition explicit.h:263
virtual void Compute(const philote::Variables &inputs, philote::Variables &outputs)
Function evaluation for the discipline.
virtual void ComputePartials(const philote::Variables &inputs, Partials &partials)
Gradient evaluation for the discipline.
~ExplicitDiscipline() noexcept
Destroy the Explicit Discipline object.
void RegisterServices(grpc::ServerBuilder &builder)
Registers all services with a gRPC channel.
ExplicitDiscipline()
Construct a new Explicit Discipline object.
Server base class for an explicit discipline.
Definition explicit.h:63
grpc::Status ComputeFunctionImpl(grpc::ServerContext *context, StreamType *stream)
Definition explicit.h:473
void LinkPointers(std::shared_ptr< philote::ExplicitDiscipline > implementation)
Links the explicit server to the discipline server and explicit discipline via pointers.
grpc::Status ComputeGradient(grpc::ServerContext *context, grpc::ServerReaderWriter<::philote::Array, ::philote::Array > *stream) override
RPC that computes initiates gradient evaluation.
grpc::Status ComputeFunction(grpc::ServerContext *context, grpc::ServerReaderWriter<::philote::Array, ::philote::Array > *stream) override
RPC that computes initiates function evaluation.
ExplicitServer()=default
Constructor.
~ExplicitServer() noexcept
Destructor.
grpc::Status ComputeGradientImpl(grpc::ServerContext *context, StreamType *stream)
Definition explicit.h:605
void UnlinkPointers()
Dereferences all pointers.
grpc::Status ComputeGradientForTesting(grpc::ServerContext *context, grpc::ServerReaderWriterInterface<::philote::Array, ::philote::Array > *stream)
Definition explicit.h:121
grpc::Status ComputeFunctionForTesting(grpc::ServerContext *context, grpc::ServerReaderWriterInterface<::philote::Array, ::philote::Array > *stream)
Definition explicit.h:115
A class for storing continuous and discrete variables.
Definition variable.h:85
Definition discipline.h:43
std::map< std::string, philote::Variable > Variables
Definition variable.h:404
std::map< std::pair< std::string, std::string >, philote::Variable > Partials
Definition variable.h:405