aboutsummaryrefslogtreecommitdiff
path: root/src/armnn/JsonPrinter.hpp
blob: 9e8ecb48e5c129f48f898fff22c9bb296442a290 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//
// Copyright © 2017 Arm Ltd. All rights reserved.
// SPDX-License-Identifier: MIT
//

#pragma once

#include <string>
#include <map>
#include <set>
#include <sstream>

#include <ProfilingGuid.hpp>
#include "Instrument.hpp"
#include "JsonUtils.hpp"

namespace armnn
{

enum class JsonObjectType
{
    Measurement,
    Event,
    ExecObjectDesc
};

struct JsonChildObject
{
    // Object type changes according to the JsonObjectType specified in enum
    JsonChildObject(const std::string& label)
        : m_Label(label),
          m_Unit(Measurement::Unit::TIME_MS),
          m_Type(JsonObjectType::Event),
          m_Guid(armnn::EmptyOptional())
    {}
    JsonChildObject(const JsonChildObject&) = default;

    void AddMeasurement(const double measurement)
    {
        m_Measurements.push_back(measurement);
    }

    void SetAndParseDetails(std::string layerDetailsStr)
    {
        std::stringstream layerDetails(layerDetailsStr);
        std::string stringLine;
        while (std::getline(layerDetails, stringLine, '\n'))
        {
            m_LayerDetailsList.push_back(stringLine);
        }
    }

    void SetGuid(profiling::ProfilingGuid guid)
    {
        m_Guid = Optional<profiling::ProfilingGuid>(guid);
    }

    void AddChild(const JsonChildObject& childObject)
    {
        m_Children.push_back(childObject);
    }

    JsonChildObject& GetChild(const unsigned int index)
    {
        return m_Children[index];
    }

    void SetUnit(const Measurement::Unit unit)
    {
        m_Unit = unit;
    }

    size_t NumChildren() const
    {
        return m_Children.size();
    }

    void SetType(JsonObjectType type)
    {
        m_Type = type;
    }

    JsonObjectType GetType() const
    {
        return m_Type;
    }

    ~JsonChildObject() = default;

    std::string m_Label;
    Measurement::Unit m_Unit;
    JsonObjectType m_Type;
    Optional<profiling::ProfilingGuid> m_Guid;
    std::vector<double> m_Measurements;
    std::vector<std::string> m_LayerDetailsList;
    std::vector<JsonChildObject> m_Children;

private:
    JsonChildObject() = delete;
};

class JsonPrinter : public JsonUtils
{
public:
    void PrintJsonChildObject(const JsonChildObject& object, size_t& id);
    void PrintLabel(const std::string& label, size_t id);
    void PrintUnit(armnn::Measurement::Unit unit);
    void PrintType(armnn::JsonObjectType type);
    void PrintGuid(armnn::profiling::ProfilingGuid guid);
    void PrintMeasurementsList(const std::vector<double>& measurementsVector);

public:
    JsonPrinter(std::ostream& outputStream)
        : JsonUtils(outputStream), m_OutputStream(outputStream)
    {}

private:
    std::string MakeKey(const std::string& label, size_t id);

    std::ostream& m_OutputStream;
};

} // namespace armnn