// // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. // SPDX-License-Identifier: MIT // #pragma once #include #include #include #include #include namespace armnn { namespace profiling { using LabelMap = std::map; using Attribute = std::pair; using Attributes = std::map; class Entity; class Connection { public: Connection(uint64_t guid, Entity* head, Entity* tail) : m_Guid(guid), m_HeadEntity(head), m_TailEntity(tail) { if (head == nullptr) { std::stringstream ss; ss << "connection [" << guid << "] head cannot be null"; throw armnnProfiling::ProfilingException(ss.str()); } if (tail == nullptr) { std::stringstream ss; ss << "connection [" << guid << "] tail cannot be null"; throw armnnProfiling::ProfilingException(ss.str()); } } uint64_t GetGuid() const {return m_Guid;} const Entity* GetHead() const {return m_HeadEntity;} const Entity* GetTail() const {return m_TailEntity;} private: uint64_t m_Guid; Entity* m_HeadEntity; Entity* m_TailEntity; }; class EventClassObj { public: EventClassObj(uint64_t guid, const std::string& name) : m_Guid(guid), m_Name(name) {} uint64_t GetGuid() const {return m_Guid;} const std::string& GetName() const {return m_Name;} private: uint64_t m_Guid; std::string m_Name; }; class EventObj { public: EventObj(uint64_t guid, uint64_t timestamp, uint64_t threadId) : m_Guid(guid), m_TimeStamp(timestamp), m_ThreadId(threadId) {} uint64_t GetGuid() const {return m_Guid;} uint64_t GetTimeStamp() const {return m_TimeStamp;} uint64_t GetThreadId() const {return m_ThreadId;} void SetEventClass(EventClassObj* evtClass) {m_EventClass = evtClass;} std::string GetEventClass() { if (m_EventClass == nullptr) { return ""; } else { return m_EventClass->GetName(); } } private: uint64_t m_Guid; uint64_t m_TimeStamp; uint64_t m_ThreadId; EventClassObj* m_EventClass; }; class Entity { public: Entity(uint64_t guid) : m_Guid(guid) {} uint64_t GetGuid() const {return m_Guid;} void AddChild(Entity* child) { if (child != nullptr) { m_Children.push_back(child); } } void AddAttribute(const std::string& type, const std::string& value) { Attribute attr(type, value); m_Attributes.emplace(type, attr); } void AddConnection(const Connection& connection) { m_Connections.push_back(connection); } void AddExecution(Entity* execution) { if (execution != nullptr) { m_Executions.push_back(execution); } } void AddEvent(EventObj* event) { if (event != nullptr) { m_Events.push_back(event); } } const Attributes& GetAttributes() const {return m_Attributes;} const std::vector& GetChildren() const {return m_Children;} const std::vector& GetConnections() const {return m_Connections;} const std::vector& GetExecutions() const {return m_Executions;} const std::vector& GetEvents() const {return m_Events;} private: uint64_t m_Guid; Attributes m_Attributes; std::vector m_Children; std::vector m_Connections; std::vector m_Executions; std::vector m_Events; }; using Entities = std::map; struct ModelRelationship { ModelRelationship(const ITimelineDecoder::Relationship& relationship) : m_Relationship(relationship) {} ITimelineDecoder::Relationship m_Relationship; std::vector m_RelatedEntities; }; using Relationships = std::map; using EventClasses = std::map; using Events = std::map; class TimelineModel { public: void AddLabel(const ITimelineDecoder::Label& label); std::string* FindLabel(uint64_t guid); void AddEntity(uint64_t guid); Entity* FindEntity(uint64_t id); void AddRelationship(const ITimelineDecoder::Relationship& relationship); ModelRelationship* FindRelationship(uint64_t id); const LabelMap& GetLabelMap() const {return m_LabelMap;} const Entities& GetEntities() const {return m_Entities;} const std::vector& GetErrors() const {return m_Errors;} bool IsInferenceGuid(uint64_t guid) const; void AddEventClass(const ITimelineDecoder::EventClass& eventClass); const EventClasses& GetEventClasses() const {return m_EventClasses;} EventClassObj* FindEventClass(uint64_t id); void AddEvent(const ITimelineDecoder::Event& event); EventObj* FindEvent(uint64_t id); private: LabelMap m_LabelMap; Entities m_Entities; Relationships m_Relationships; std::vector m_Errors; std::vector m_InferenceGuids; EventClasses m_EventClasses; Events m_Events; void HandleLabelLink(const ITimelineDecoder::Relationship& relationship); void HandleConnection(const ITimelineDecoder::Relationship& relationship); void HandleChild(const ITimelineDecoder::Relationship& relationship); void HandleExecutionOf(const ITimelineDecoder::Relationship& relationship); void HandleExecutionLink(const ITimelineDecoder::Relationship& relationship); }; std::vector GetModelDescription(const TimelineModel& model); std::string GetEntityDescription(const Entity& entity); std::string GetChildDescription(Entity* entity); std::string GetConnectionDescription(const Connection& connection); std::string GetExecutionDescription(Entity* execution); std::string GetEventDescription(EventObj* event); } // namespace profiling } // namespace armnn