114209Sandreas.sandberg@arm.com/*
214209Sandreas.sandberg@arm.com * Copyright (c) 2016-2019 Arm Limited
314209Sandreas.sandberg@arm.com * All rights reserved
414209Sandreas.sandberg@arm.com *
514209Sandreas.sandberg@arm.com * The license below extends only to copyright in the software and shall
614209Sandreas.sandberg@arm.com * not be construed as granting a license to any other intellectual
714209Sandreas.sandberg@arm.com * property including but not limited to intellectual property relating
814209Sandreas.sandberg@arm.com * to a hardware implementation of the functionality of the software
914209Sandreas.sandberg@arm.com * licensed hereunder.  You may use the software subject to the license
1014209Sandreas.sandberg@arm.com * terms below provided that you ensure that this notice is replicated
1114209Sandreas.sandberg@arm.com * unmodified and in its entirety in all distributions of the software,
1214209Sandreas.sandberg@arm.com * modified or unmodified, in source code or in binary form.
1314209Sandreas.sandberg@arm.com *
1414209Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without
1514209Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are
1614209Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright
1714209Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer;
1814209Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright
1914209Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the
2014209Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution;
2114209Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its
2214209Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from
2314209Sandreas.sandberg@arm.com * this software without specific prior written permission.
2414209Sandreas.sandberg@arm.com *
2514209Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2614209Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2714209Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2814209Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2914209Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
3014209Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
3114209Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3214209Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3314209Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3414209Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3514209Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3614209Sandreas.sandberg@arm.com *
3714209Sandreas.sandberg@arm.com * Authors: Andreas Sandberg
3814209Sandreas.sandberg@arm.com */
3914209Sandreas.sandberg@arm.com
4014209Sandreas.sandberg@arm.com#ifndef __BASE_STATS_HDF5_HH__
4114209Sandreas.sandberg@arm.com#define __BASE_STATS_HDF5_HH__
4214209Sandreas.sandberg@arm.com
4314209Sandreas.sandberg@arm.com#include <H5Cpp.h>
4414209Sandreas.sandberg@arm.com
4514209Sandreas.sandberg@arm.com#include <memory>
4614209Sandreas.sandberg@arm.com#include <stack>
4714209Sandreas.sandberg@arm.com#include <string>
4814209Sandreas.sandberg@arm.com#include <vector>
4914209Sandreas.sandberg@arm.com
5014209Sandreas.sandberg@arm.com#include "base/output.hh"
5114209Sandreas.sandberg@arm.com#include "base/stats/output.hh"
5214209Sandreas.sandberg@arm.com#include "base/stats/types.hh"
5314209Sandreas.sandberg@arm.com
5414209Sandreas.sandberg@arm.comnamespace Stats {
5514209Sandreas.sandberg@arm.com
5614209Sandreas.sandberg@arm.comclass Hdf5 : public Output
5714209Sandreas.sandberg@arm.com{
5814209Sandreas.sandberg@arm.com  public:
5914209Sandreas.sandberg@arm.com    Hdf5(const std::string &file, unsigned chunking, bool desc, bool formulas);
6014209Sandreas.sandberg@arm.com
6114209Sandreas.sandberg@arm.com    ~Hdf5();
6214209Sandreas.sandberg@arm.com
6314209Sandreas.sandberg@arm.com    Hdf5() = delete;
6414209Sandreas.sandberg@arm.com    Hdf5(const Hdf5 &other) = delete;
6514209Sandreas.sandberg@arm.com
6614209Sandreas.sandberg@arm.com  public: // Output interface
6714209Sandreas.sandberg@arm.com    void begin() override;
6814209Sandreas.sandberg@arm.com    void end() override;
6914209Sandreas.sandberg@arm.com    bool valid() const override;
7014209Sandreas.sandberg@arm.com
7114209Sandreas.sandberg@arm.com    void beginGroup(const char *name) override;
7214209Sandreas.sandberg@arm.com    void endGroup() override;
7314209Sandreas.sandberg@arm.com
7414209Sandreas.sandberg@arm.com    void visit(const ScalarInfo &info) override;
7514209Sandreas.sandberg@arm.com    void visit(const VectorInfo &info) override;
7614209Sandreas.sandberg@arm.com    void visit(const DistInfo &info) override;
7714209Sandreas.sandberg@arm.com    void visit(const VectorDistInfo &info) override;
7814209Sandreas.sandberg@arm.com    void visit(const Vector2dInfo &info) override;
7914209Sandreas.sandberg@arm.com    void visit(const FormulaInfo &info) override;
8014209Sandreas.sandberg@arm.com    void visit(const SparseHistInfo &info) override;
8114209Sandreas.sandberg@arm.com
8214209Sandreas.sandberg@arm.com  protected:
8314209Sandreas.sandberg@arm.com    /**
8414209Sandreas.sandberg@arm.com     * Helper function to append vector stats and set their metadata.
8514209Sandreas.sandberg@arm.com     */
8614209Sandreas.sandberg@arm.com    H5::DataSet appendVectorInfo(const VectorInfo &info);
8714209Sandreas.sandberg@arm.com
8814209Sandreas.sandberg@arm.com    /**
8914209Sandreas.sandberg@arm.com     * Helper function to append an n-dimensional double stat to the
9014209Sandreas.sandberg@arm.com     * file.
9114209Sandreas.sandberg@arm.com     *
9214209Sandreas.sandberg@arm.com     * This helper function assumes that all stats include a time
9314209Sandreas.sandberg@arm.com     * component. I.e., a Stat::Scalar is a 1-dimensional stat.
9414209Sandreas.sandberg@arm.com     *
9514209Sandreas.sandberg@arm.com     * @param info Stat info structure.
9614209Sandreas.sandberg@arm.com     * @param rank Stat dimensionality (including time).
9714209Sandreas.sandberg@arm.com     * @param dims Size of each of the dimensions.
9814209Sandreas.sandberg@arm.com     */
9914209Sandreas.sandberg@arm.com    H5::DataSet appendStat(const Info &info, int rank, hsize_t *dims,
10014209Sandreas.sandberg@arm.com                           const double *data);
10114209Sandreas.sandberg@arm.com
10214209Sandreas.sandberg@arm.com    /**
10314209Sandreas.sandberg@arm.com     * Helper function to add a string vector attribute to a stat.
10414209Sandreas.sandberg@arm.com     *
10514209Sandreas.sandberg@arm.com     * @param loc Parent location in the file.
10614209Sandreas.sandberg@arm.com     * @param name Attribute name.
10714209Sandreas.sandberg@arm.com     * @param values Attribute value.
10814209Sandreas.sandberg@arm.com     */
10914209Sandreas.sandberg@arm.com    void addMetaData(H5::DataSet &loc, const char *name,
11014209Sandreas.sandberg@arm.com                     const std::vector<const char *> &values);
11114209Sandreas.sandberg@arm.com
11214209Sandreas.sandberg@arm.com    /**
11314209Sandreas.sandberg@arm.com     * Helper function to add a string vector attribute to a stat.
11414209Sandreas.sandberg@arm.com     *
11514209Sandreas.sandberg@arm.com     * @param loc Parent location in the file.
11614209Sandreas.sandberg@arm.com     * @param name Attribute name.
11714209Sandreas.sandberg@arm.com     * @param values Attribute value.
11814209Sandreas.sandberg@arm.com     */
11914209Sandreas.sandberg@arm.com    void addMetaData(H5::DataSet &loc, const char *name,
12014209Sandreas.sandberg@arm.com                     const std::vector<std::string> &values);
12114209Sandreas.sandberg@arm.com
12214209Sandreas.sandberg@arm.com    /**
12314209Sandreas.sandberg@arm.com     * Helper function to add a string attribute to a stat.
12414209Sandreas.sandberg@arm.com     *
12514209Sandreas.sandberg@arm.com     * @param loc Parent location in the file.
12614209Sandreas.sandberg@arm.com     * @param name Attribute name.
12714209Sandreas.sandberg@arm.com     * @param value Attribute value.
12814209Sandreas.sandberg@arm.com     */
12914209Sandreas.sandberg@arm.com    void addMetaData(H5::DataSet &loc, const char *name,
13014209Sandreas.sandberg@arm.com                     const std::string &value);
13114209Sandreas.sandberg@arm.com
13214209Sandreas.sandberg@arm.com    /**
13314209Sandreas.sandberg@arm.com     * Helper function to add a double attribute to a stat.
13414209Sandreas.sandberg@arm.com     *
13514209Sandreas.sandberg@arm.com     * @param loc Parent location in the file.
13614209Sandreas.sandberg@arm.com     * @param name Attribute name.
13714209Sandreas.sandberg@arm.com     * @param value Attribute value.
13814209Sandreas.sandberg@arm.com     */
13914209Sandreas.sandberg@arm.com    void addMetaData(H5::DataSet &loc, const char *name, double value);
14014209Sandreas.sandberg@arm.com
14114209Sandreas.sandberg@arm.com  protected:
14214209Sandreas.sandberg@arm.com    const std::string fname;
14314209Sandreas.sandberg@arm.com    const hsize_t timeChunk;
14414209Sandreas.sandberg@arm.com    const bool enableDescriptions;
14514209Sandreas.sandberg@arm.com    const bool enableFormula;
14614209Sandreas.sandberg@arm.com
14714209Sandreas.sandberg@arm.com    std::stack<H5::Group> path;
14814209Sandreas.sandberg@arm.com
14914209Sandreas.sandberg@arm.com    unsigned dumpCount;
15014209Sandreas.sandberg@arm.com    H5::H5File h5File;
15114209Sandreas.sandberg@arm.com};
15214209Sandreas.sandberg@arm.com
15314209Sandreas.sandberg@arm.comstd::unique_ptr<Output> initHDF5(
15414209Sandreas.sandberg@arm.com    const std::string &filename,unsigned chunking = 10,
15514209Sandreas.sandberg@arm.com    bool desc = true, bool formulas = true);
15614209Sandreas.sandberg@arm.com
15714209Sandreas.sandberg@arm.com} // namespace Stats
15814209Sandreas.sandberg@arm.com
15914209Sandreas.sandberg@arm.com#endif // __BASE_STATS_HDF5_HH__
160