@startuml set namespaceSeparator :: namespace dynasty { namespace inferencer { abstract class PianoInferencer { # {abstract} GraphBasedInference(unordered_map> const &preprocess_input) : unordered_map> } abstract class Builder { + {abstract} build() : unique_ptr, InferencerDeletor> } PianoInferencer +-- Builder namespace common { abstract class BaseInferencerImpl { # Initialize() : void # CleanUp() : void # GraphBasedInference(): void # {abstract} SetInitializeList() : void # {abstract} GetInitializeHeader() : AbstractHandler* # {abstract} SetCleanUpList() : void # {abstract} GetCleanUpList() : AbstractHandler* # {abstract} FillInputs() : void # {abstract} SetInferenceVisitor(): void # {abstract} GetInferenceVisitor(): AbstractInferenceVisitor* # {abstract} GetTensorCPUData(Node*) : vector } note right of BaseInferencerImpl void Initialize() { SetInitializeList(); SetInferenceVisitor(); if (GetInitializeHeader() != nullptr) { GetInitializeHeader()->Handle(); } } end note note right of BaseInferencerImpl void CleanUp() { SetCleanUpList(); if (GetCleanUpList() != nullptr) { GetCleanUpList()->Handle(); } } end note note left of BaseInferencerImpl std::unordered_map> GraphBasedInference(unordered_map> const &preprocess_input) override { FillInputs(preprocess_input); int index = 0; unordered_map> result; for (auto graph_iterator = PianoInferencer::GetImmutableGraph()->begin(); graph_iterator != PianoInferencer::GetImmutableGraph()->end(); ++graph_iterator, ++index) { graph_iterator->Accept(*GetInferenceVisitor()); } return result; } end note abstract class Builder { # {abstract} GetBaseInferencerImplPtr() : BaseInferencerImpl* + build() : unique_ptr, InferencerDeletor> } note right of Builder InferencerUniquePtr Build() { auto inferencer_ptr = GetBaseInferencerImplPtr(); inferencer_ptr->Initialize(); return InferencerUniquePtr(inferencer_ptr); } end note BaseInferencerImpl +-- Builder dynasty::inferencer::PianoInferencer <|-- BaseInferencerImpl dynasty::inferencer::Builder <|-- Builder abstract class AbstractHandler { + {abstract} SetNext(AbstractHandler* ) : AbstractHandler* + {abstract} GetNext() : AbstractHandler* + {abstract} Handle() : void } abstract class BaseHandler { - next_ : AbstractHandler* # {abstract} handle() : void + GetNext() : AbstractHandler* } note left of BaseHandler AbstractHandler* GetNext() override { return next_; } AbstractHandler* SetNext(AbstractHandler* handler) override { next_ = handler; return handler; } void Handle() override { handle(); if (next_ != nullptr) { next_->Handle(); } } end note AbstractHandler <|-- BaseHandler } /'namespace common'/ namespace cpu { class InferencerImpl { - inference_visitor_ : InferenceVisitorImpl * - initialization_head_ : AbstractHandler * - clean_up_head_ : AbstractHandler * # SetInitializeList() : void # GetInitializeHeader() : AbstractHandler* # SetCleanUpList() : void # GetCleanUpList() : AbstractHandler* # FillInputs() : void # SetInferenceVisitor(): void # GetInferenceVisitor(): AbstractInferenceVisitor* # GetTensorCPUData(Node*) : vector + {static} GetBuilder() : Builder* } note right of InferencerImpl void SetInitializeList() { initialization_head_ = new SetCPUTensorVector(node_ptr_to_tensor_cpu_vec_, BaseInferencerImpl::GetImmutableGraph()); } void SetInferenceVisitor() { inference_visitor_ = new InferenceVisitorImpl(node_ptr_to_tensor_cpu_vec_); } InferencerImpl(shared_ptr paino_graph) : BaseInferencerImpl(paino_graph) {} typename InferencerImpl::Builder *GetBuilder() { return new Builder(); } ~InferencerImpl() { delete clean_up_head_; delete initialization_head_; delete inference_visitor_; } std::vector GetTensorCPUData(Node *node) { return node_ptr_to_tensor_cpu_vec_.at(node); } void FillInputs(std::unordered_map> const &preprocess_input) { for (auto graph_iterator = BaseInferencerImpl::GetImmutableGraph()->begin(); graph_iterator != BaseInferencerImpl::GetImmutableGraph()->end(); ++graph_iterator) { if (preprocess_input.count(graph_iterator->name())) { node_ptr_to_tensor_cpu_vec_.at(*graph_iterator) = preprocess_input.at(graph_iterator->name()); } else { using std::fill; fill(node_ptr_to_tensor_cpu_vec_.at(*graph_iterator).begin(), node_ptr_to_tensor_cpu_vec_.at(*graph_iterator).end(), 0); } } } AbstractHandler *GetInitializeHeader() { return initialization_head_; } end note class Builder { + GetBaseInferencerImplPtr() : BaseInferencerImpl * } InferencerImpl +-- Builder dynasty::inferencer::common::BaseInferencerImpl <|-- InferencerImpl dynasty::inferencer::common::Builder <|-- Builder note left of Builder BaseInferencerImpl* GetBaseInferencerImplPtr() { return new InferencerImpl(BaseInferencerImpl::Builder::GetGraph()); } end note class SetCPUTensorVector { + handle() : void } dynasty::inferencer::common::BaseHandler <|-- SetCPUTensorVector class Inferencer { + {static} GetBuilder() : unique_ptr::Builder> } note right of Inferencer unique_ptr::Builder> Inferencer::GetBuilder() { return unique_ptr::Builder>(InferencerImpl::GetBuilder()); } end note dynasty::inferencer::PianoInferencer <|-- Inferencer } /'namespace cpu'/ } } @enduml