text.cc revision 873
111308Santhony.gutierrez@amd.com/*
211308Santhony.gutierrez@amd.com * Copyright (c) 2003-2004 The Regents of The University of Michigan
311308Santhony.gutierrez@amd.com * All rights reserved.
411308Santhony.gutierrez@amd.com *
511308Santhony.gutierrez@amd.com * Redistribution and use in source and binary forms, with or without
611308Santhony.gutierrez@amd.com * modification, are permitted provided that the following conditions are
711308Santhony.gutierrez@amd.com * met: redistributions of source code must retain the above copyright
811308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer;
911308Santhony.gutierrez@amd.com * redistributions in binary form must reproduce the above copyright
1011308Santhony.gutierrez@amd.com * notice, this list of conditions and the following disclaimer in the
1111308Santhony.gutierrez@amd.com * documentation and/or other materials provided with the distribution;
1211308Santhony.gutierrez@amd.com * neither the name of the copyright holders nor the names of its
1311308Santhony.gutierrez@amd.com * contributors may be used to endorse or promote products derived from
1411308Santhony.gutierrez@amd.com * this software without specific prior written permission.
1511308Santhony.gutierrez@amd.com *
1611308Santhony.gutierrez@amd.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1711308Santhony.gutierrez@amd.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1811308Santhony.gutierrez@amd.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1911308Santhony.gutierrez@amd.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2011308Santhony.gutierrez@amd.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2111308Santhony.gutierrez@amd.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2211308Santhony.gutierrez@amd.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2311308Santhony.gutierrez@amd.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2411308Santhony.gutierrez@amd.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2511308Santhony.gutierrez@amd.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2611308Santhony.gutierrez@amd.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2711308Santhony.gutierrez@amd.com */
2811308Santhony.gutierrez@amd.com
2911308Santhony.gutierrez@amd.com#if defined(__APPLE__)
3011308Santhony.gutierrez@amd.com#define _GLIBCPP_USE_C99 1
3111308Santhony.gutierrez@amd.com#endif
3211308Santhony.gutierrez@amd.com
3311308Santhony.gutierrez@amd.com#include <iostream>
3411308Santhony.gutierrez@amd.com#include <fstream>
3511308Santhony.gutierrez@amd.com#include <string>
3611308Santhony.gutierrez@amd.com
3711308Santhony.gutierrez@amd.com#include "base/misc.hh"
3811308Santhony.gutierrez@amd.com#include "base/statistics.hh"
3911308Santhony.gutierrez@amd.com#include "base/stats/statdb.hh"
4011308Santhony.gutierrez@amd.com#include "base/stats/text.hh"
4111308Santhony.gutierrez@amd.com#include "base/stats/visit.hh"
4211308Santhony.gutierrez@amd.com
4311308Santhony.gutierrez@amd.comusing namespace std;
4411308Santhony.gutierrez@amd.com
4511308Santhony.gutierrez@amd.com#ifndef NAN
4611308Santhony.gutierrez@amd.comfloat __nan();
4711308Santhony.gutierrez@amd.com/** Define Not a number. */
4811308Santhony.gutierrez@amd.com#define NAN (__nan())
4911308Santhony.gutierrez@amd.com/** Need to define __nan() */
5011308Santhony.gutierrez@amd.com#define __M5_NAN
5111308Santhony.gutierrez@amd.com#endif
5211308Santhony.gutierrez@amd.com
5311308Santhony.gutierrez@amd.com#ifdef __M5_NAN
5411308Santhony.gutierrez@amd.comfloat
5511308Santhony.gutierrez@amd.com__nan()
5611308Santhony.gutierrez@amd.com{
5711308Santhony.gutierrez@amd.com    union {
5811308Santhony.gutierrez@amd.com        uint32_t ui;
5911308Santhony.gutierrez@amd.com        float f;
6011308Santhony.gutierrez@amd.com    } nan;
6111308Santhony.gutierrez@amd.com
6211308Santhony.gutierrez@amd.com    nan.ui = 0x7fc00000;
6311308Santhony.gutierrez@amd.com    return nan.f;
6411308Santhony.gutierrez@amd.com}
6511308Santhony.gutierrez@amd.com#endif
6611308Santhony.gutierrez@amd.com
6711308Santhony.gutierrez@amd.comnamespace Statistics {
6811308Santhony.gutierrez@amd.com
6911308Santhony.gutierrez@amd.comText::Text()
7011308Santhony.gutierrez@amd.com    : mystream(false), stream(NULL), compat(false), descriptions(false)
7111308Santhony.gutierrez@amd.com{
7211308Santhony.gutierrez@amd.com}
7311308Santhony.gutierrez@amd.com
7411308Santhony.gutierrez@amd.comText::Text(std::ostream &stream)
7511308Santhony.gutierrez@amd.com    : mystream(false), stream(NULL), compat(false), descriptions(false)
7611308Santhony.gutierrez@amd.com{
7711308Santhony.gutierrez@amd.com    open(stream);
7811308Santhony.gutierrez@amd.com}
7911308Santhony.gutierrez@amd.com
8011308Santhony.gutierrez@amd.comText::Text(const std::string &file)
8111308Santhony.gutierrez@amd.com    : mystream(false), stream(NULL), compat(false), descriptions(false)
8211308Santhony.gutierrez@amd.com{
8311308Santhony.gutierrez@amd.com    open(file);
8411308Santhony.gutierrez@amd.com}
8511308Santhony.gutierrez@amd.com
8611308Santhony.gutierrez@amd.com
8711308Santhony.gutierrez@amd.comText::~Text()
8811308Santhony.gutierrez@amd.com{
8911308Santhony.gutierrez@amd.com    if (mystream) {
9011308Santhony.gutierrez@amd.com        assert(stream);
9111308Santhony.gutierrez@amd.com        delete stream;
9211308Santhony.gutierrez@amd.com    }
9311308Santhony.gutierrez@amd.com}
9411308Santhony.gutierrez@amd.com
9511308Santhony.gutierrez@amd.comvoid
9611308Santhony.gutierrez@amd.comText::open(std::ostream &_stream)
9711308Santhony.gutierrez@amd.com{
9811308Santhony.gutierrez@amd.com    if (stream)
9911308Santhony.gutierrez@amd.com        panic("stream already set!");
10011308Santhony.gutierrez@amd.com
10111308Santhony.gutierrez@amd.com    mystream = false;
10211308Santhony.gutierrez@amd.com    stream = &_stream;
10311308Santhony.gutierrez@amd.com    assert(valid());
10411308Santhony.gutierrez@amd.com}
10511308Santhony.gutierrez@amd.com
10611308Santhony.gutierrez@amd.comvoid
10711308Santhony.gutierrez@amd.comText::open(const std::string &file)
10811308Santhony.gutierrez@amd.com{
10911308Santhony.gutierrez@amd.com    if (stream)
11011308Santhony.gutierrez@amd.com        panic("stream already set!");
11111308Santhony.gutierrez@amd.com
11211308Santhony.gutierrez@amd.com    mystream = true;
11311308Santhony.gutierrez@amd.com    stream = new ofstream(file.c_str(), ios::trunc);
11411308Santhony.gutierrez@amd.com    assert(valid());
11511308Santhony.gutierrez@amd.com}
11611308Santhony.gutierrez@amd.com
11711308Santhony.gutierrez@amd.combool
11811308Santhony.gutierrez@amd.comText::valid() const
11911308Santhony.gutierrez@amd.com{
12011308Santhony.gutierrez@amd.com    return stream != NULL;
12111308Santhony.gutierrez@amd.com}
12211308Santhony.gutierrez@amd.com
12311308Santhony.gutierrez@amd.comvoid
12411308Santhony.gutierrez@amd.comText::output()
12511308Santhony.gutierrez@amd.com{
12611308Santhony.gutierrez@amd.com    using namespace Database;
12711308Santhony.gutierrez@amd.com
12811308Santhony.gutierrez@amd.com    ccprintf(*stream, "\n---------- Begin Simulation Statistics ----------\n");
12911308Santhony.gutierrez@amd.com    if (bins().empty()) {
13011308Santhony.gutierrez@amd.com        stat_list_t::const_iterator i, end = stats().end();
13111308Santhony.gutierrez@amd.com        for (i = stats().begin(); i != end; ++i)
13211308Santhony.gutierrez@amd.com            (*i)->visit(*this);
13311308Santhony.gutierrez@amd.com    } else {
13411308Santhony.gutierrez@amd.com        ccprintf(*stream, "PRINTING BINNED STATS\n");
13511308Santhony.gutierrez@amd.com        bin_list_t::iterator i, end = bins().end();
13611308Santhony.gutierrez@amd.com        for (i = bins().begin(); i != end; ++i) {
13711308Santhony.gutierrez@amd.com            MainBin *bin = *i;
13811308Santhony.gutierrez@amd.com            bin->activate();
13911308Santhony.gutierrez@amd.com            ccprintf(*stream,"---%s Bin------------\n", bin->name());
14011308Santhony.gutierrez@amd.com            stat_list_t::const_iterator i, end = stats().end();
14111308Santhony.gutierrez@amd.com            for (i = stats().begin(); i != end; ++i)
14211308Santhony.gutierrez@amd.com                (*i)->visit(*this);
14311308Santhony.gutierrez@amd.com            ccprintf(*stream, "---------------------------------\n");
14411308Santhony.gutierrez@amd.com        }
14511308Santhony.gutierrez@amd.com    }
14611308Santhony.gutierrez@amd.com    ccprintf(*stream, "\n---------- End Simulation Statistics   ----------\n");
14711308Santhony.gutierrez@amd.com    stream->flush();
14811308Santhony.gutierrez@amd.com}
14911308Santhony.gutierrez@amd.com
15011308Santhony.gutierrez@amd.combool
15111308Santhony.gutierrez@amd.comText::noOutput(const StatData &data)
15211308Santhony.gutierrez@amd.com{
15311308Santhony.gutierrez@amd.com    if (!(data.flags & print))
15411308Santhony.gutierrez@amd.com        return true;
15511308Santhony.gutierrez@amd.com
15611308Santhony.gutierrez@amd.com    if (data.prereq && data.prereq->zero())
15711308Santhony.gutierrez@amd.com        return true;
15811308Santhony.gutierrez@amd.com
15911308Santhony.gutierrez@amd.com    return false;
16011308Santhony.gutierrez@amd.com}
16111308Santhony.gutierrez@amd.com
16211308Santhony.gutierrez@amd.comstring
16311308Santhony.gutierrez@amd.comValueToString(Result value, int precision, bool compat)
16411308Santhony.gutierrez@amd.com{
16511308Santhony.gutierrez@amd.com    stringstream val;
16611308Santhony.gutierrez@amd.com
16711308Santhony.gutierrez@amd.com    if (!isnan(value)) {
16811308Santhony.gutierrez@amd.com        if (precision != -1)
16911308Santhony.gutierrez@amd.com            val.precision(precision);
17011308Santhony.gutierrez@amd.com        else if (value == rint(value))
17111308Santhony.gutierrez@amd.com            val.precision(0);
17211308Santhony.gutierrez@amd.com
17311308Santhony.gutierrez@amd.com        val.unsetf(ios::showpoint);
17411308Santhony.gutierrez@amd.com        val.setf(ios::fixed);
17511308Santhony.gutierrez@amd.com        val << value;
17611308Santhony.gutierrez@amd.com    } else {
17711308Santhony.gutierrez@amd.com        val << (compat ? "<err: div-0>" : "no value");
17811308Santhony.gutierrez@amd.com    }
17911308Santhony.gutierrez@amd.com
18011308Santhony.gutierrez@amd.com    return val.str();
18111308Santhony.gutierrez@amd.com}
18211308Santhony.gutierrez@amd.com
18311308Santhony.gutierrez@amd.comstruct ScalarPrint
18411308Santhony.gutierrez@amd.com{
18511308Santhony.gutierrez@amd.com    Result value;
18611308Santhony.gutierrez@amd.com    string name;
18711308Santhony.gutierrez@amd.com    string desc;
18811308Santhony.gutierrez@amd.com    StatFlags flags;
18911308Santhony.gutierrez@amd.com    bool compat;
19011308Santhony.gutierrez@amd.com    bool descriptions;
19111308Santhony.gutierrez@amd.com    int precision;
19211308Santhony.gutierrez@amd.com    Result pdf;
19311308Santhony.gutierrez@amd.com    Result cdf;
19411308Santhony.gutierrez@amd.com
19511308Santhony.gutierrez@amd.com    void operator()(ostream &stream) const;
19611308Santhony.gutierrez@amd.com};
19711308Santhony.gutierrez@amd.com
19811308Santhony.gutierrez@amd.comvoid
19911308Santhony.gutierrez@amd.comScalarPrint::operator()(ostream &stream) const
20011308Santhony.gutierrez@amd.com{
20111308Santhony.gutierrez@amd.com    if (flags & nozero && value == 0.0 ||
20211308Santhony.gutierrez@amd.com        flags & nonan && isnan(value))
20311308Santhony.gutierrez@amd.com        return;
20411308Santhony.gutierrez@amd.com
20511308Santhony.gutierrez@amd.com    stringstream pdfstr, cdfstr;
20611308Santhony.gutierrez@amd.com
20711308Santhony.gutierrez@amd.com    if (!isnan(pdf))
20811308Santhony.gutierrez@amd.com        ccprintf(pdfstr, "%.2f%%", pdf * 100.0);
20911308Santhony.gutierrez@amd.com
21011308Santhony.gutierrez@amd.com    if (!isnan(cdf))
21111308Santhony.gutierrez@amd.com        ccprintf(cdfstr, "%.2f%%", cdf * 100.0);
21211308Santhony.gutierrez@amd.com
21311308Santhony.gutierrez@amd.com    if (compat && flags & __substat) {
21411308Santhony.gutierrez@amd.com        ccprintf(stream, "%32s %12s %10s %10s", name,
21511308Santhony.gutierrez@amd.com                 ValueToString(value, precision, compat), pdfstr, cdfstr);
21611308Santhony.gutierrez@amd.com    } else {
21711308Santhony.gutierrez@amd.com        ccprintf(stream, "%-40s %12s %10s %10s", name,
21811308Santhony.gutierrez@amd.com                 ValueToString(value, precision, compat), pdfstr, cdfstr);
21911308Santhony.gutierrez@amd.com    }
22011308Santhony.gutierrez@amd.com
22111308Santhony.gutierrez@amd.com    if (descriptions) {
22211308Santhony.gutierrez@amd.com        if (!desc.empty())
22311308Santhony.gutierrez@amd.com            ccprintf(stream, " # %s", desc);
22411308Santhony.gutierrez@amd.com    }
22511435Smitch.hayenga@arm.com    stream << endl;
22611308Santhony.gutierrez@amd.com}
22711308Santhony.gutierrez@amd.com
22811308Santhony.gutierrez@amd.comstruct VectorPrint
22911308Santhony.gutierrez@amd.com{
23011308Santhony.gutierrez@amd.com    string name;
23111308Santhony.gutierrez@amd.com    string desc;
23211308Santhony.gutierrez@amd.com    vector<string> subnames;
23311308Santhony.gutierrez@amd.com    vector<string> subdescs;
23411308Santhony.gutierrez@amd.com    StatFlags flags;
23511308Santhony.gutierrez@amd.com    bool compat;
23611308Santhony.gutierrez@amd.com    bool descriptions;
23711308Santhony.gutierrez@amd.com    int precision;
23811308Santhony.gutierrez@amd.com    VResult vec;
23911308Santhony.gutierrez@amd.com    Result total;
24011308Santhony.gutierrez@amd.com
24111308Santhony.gutierrez@amd.com    void operator()(ostream &stream) const;
24211308Santhony.gutierrez@amd.com};
24311308Santhony.gutierrez@amd.com
24411308Santhony.gutierrez@amd.comvoid
24511308Santhony.gutierrez@amd.comVectorPrint::operator()(std::ostream &stream) const
24611308Santhony.gutierrez@amd.com{
24711308Santhony.gutierrez@amd.com    int _size = vec.size();
24811308Santhony.gutierrez@amd.com    Result _total = 0.0;
24911308Santhony.gutierrez@amd.com
25011308Santhony.gutierrez@amd.com    if (flags & (pdf | cdf)) {
25111308Santhony.gutierrez@amd.com        for (int i = 0; i < _size; ++i) {
25211308Santhony.gutierrez@amd.com            _total += vec[i];
25311308Santhony.gutierrez@amd.com        }
25411308Santhony.gutierrez@amd.com    }
25511308Santhony.gutierrez@amd.com
25611308Santhony.gutierrez@amd.com    string base = name + (compat ? "_" : "::");
25711308Santhony.gutierrez@amd.com
25811308Santhony.gutierrez@amd.com    ScalarPrint print;
25911308Santhony.gutierrez@amd.com    print.name = name;
26011308Santhony.gutierrez@amd.com    print.desc = desc;
26111308Santhony.gutierrez@amd.com    print.precision = precision;
26211308Santhony.gutierrez@amd.com    print.descriptions = descriptions;
26311308Santhony.gutierrez@amd.com    print.flags = flags;
26411308Santhony.gutierrez@amd.com    print.pdf = NAN;
26511308Santhony.gutierrez@amd.com    print.cdf = NAN;
26611308Santhony.gutierrez@amd.com
26711308Santhony.gutierrez@amd.com    bool havesub = !subnames.empty();
26811308Santhony.gutierrez@amd.com
26911308Santhony.gutierrez@amd.com    if (_size == 1) {
27011308Santhony.gutierrez@amd.com        print.value = vec[0];
27111308Santhony.gutierrez@amd.com        print(stream);
27211308Santhony.gutierrez@amd.com    } else if (!compat) {
27311308Santhony.gutierrez@amd.com        for (int i = 0; i < _size; ++i) {
27411308Santhony.gutierrez@amd.com            if (havesub && (i >= subnames.size() || subnames[i].empty()))
27511435Smitch.hayenga@arm.com                continue;
27611308Santhony.gutierrez@amd.com
27711308Santhony.gutierrez@amd.com            print.name = base + (havesub ? subnames[i] : to_string(i));
27811308Santhony.gutierrez@amd.com            print.desc = subdescs.empty() ? desc : subdescs[i];
27911308Santhony.gutierrez@amd.com            print.value = vec[i];
28011308Santhony.gutierrez@amd.com
28111308Santhony.gutierrez@amd.com            if (_total && (flags & pdf)) {
28211308Santhony.gutierrez@amd.com                print.pdf = vec[i] / _total;
28311308Santhony.gutierrez@amd.com                print.cdf += print.pdf;
28411308Santhony.gutierrez@amd.com            }
28511308Santhony.gutierrez@amd.com
28611308Santhony.gutierrez@amd.com            print(stream);
28711308Santhony.gutierrez@amd.com        }
28811308Santhony.gutierrez@amd.com
28911308Santhony.gutierrez@amd.com        if (flags & ::Statistics::total) {
29011308Santhony.gutierrez@amd.com            print.name = base + "total";
29111308Santhony.gutierrez@amd.com            print.desc = desc;
29211308Santhony.gutierrez@amd.com            print.value = total;
29311308Santhony.gutierrez@amd.com            print(stream);
29411308Santhony.gutierrez@amd.com        }
29511308Santhony.gutierrez@amd.com    } else {
29611308Santhony.gutierrez@amd.com        if (flags & ::Statistics::total) {
29711308Santhony.gutierrez@amd.com            print.value = total;
29811308Santhony.gutierrez@amd.com            print(stream);
29911308Santhony.gutierrez@amd.com        }
30011308Santhony.gutierrez@amd.com
30111308Santhony.gutierrez@amd.com        Result _pdf = 0.0;
30211308Santhony.gutierrez@amd.com        Result _cdf = 0.0;
30311308Santhony.gutierrez@amd.com        if (flags & dist) {
30411308Santhony.gutierrez@amd.com            ccprintf(stream, "%s.start_dist\n", name);
30511308Santhony.gutierrez@amd.com            for (int i = 0; i < _size; ++i) {
30611308Santhony.gutierrez@amd.com                print.name = havesub ? subnames[i] : to_string(i);
30711308Santhony.gutierrez@amd.com                print.desc = subdescs.empty() ? desc : subdescs[i];
30811308Santhony.gutierrez@amd.com                print.flags |= __substat;
30911308Santhony.gutierrez@amd.com                print.value = vec[i];
31011308Santhony.gutierrez@amd.com
31111308Santhony.gutierrez@amd.com                if (_total) {
31211308Santhony.gutierrez@amd.com                    _pdf = vec[i] / _total;
31311308Santhony.gutierrez@amd.com                    _cdf += _pdf;
31411308Santhony.gutierrez@amd.com                }
31511308Santhony.gutierrez@amd.com
31611308Santhony.gutierrez@amd.com                if (flags & pdf)
31711308Santhony.gutierrez@amd.com                    print.pdf = _pdf;
31811308Santhony.gutierrez@amd.com                if (flags & cdf)
31911308Santhony.gutierrez@amd.com                    print.cdf = _cdf;
32011308Santhony.gutierrez@amd.com
32111308Santhony.gutierrez@amd.com                print(stream);
32211308Santhony.gutierrez@amd.com            }
32311308Santhony.gutierrez@amd.com            ccprintf(stream, "%s.end_dist\n", name);
32411308Santhony.gutierrez@amd.com        } else {
32511308Santhony.gutierrez@amd.com            for (int i = 0; i < _size; ++i) {
32611308Santhony.gutierrez@amd.com                if (havesub && subnames[i].empty())
32711308Santhony.gutierrez@amd.com                    continue;
32811308Santhony.gutierrez@amd.com
32911308Santhony.gutierrez@amd.com                print.name = base;
33011308Santhony.gutierrez@amd.com                print.name += havesub ? subnames[i] : to_string(i);
33111308Santhony.gutierrez@amd.com                print.desc = subdescs.empty() ? desc : subdescs[i];
33211308Santhony.gutierrez@amd.com                print.value = vec[i];
33311308Santhony.gutierrez@amd.com
33411308Santhony.gutierrez@amd.com                if (_total) {
33511308Santhony.gutierrez@amd.com                    _pdf = vec[i] / _total;
33611308Santhony.gutierrez@amd.com                    _cdf += _pdf;
33711308Santhony.gutierrez@amd.com                } else {
33811308Santhony.gutierrez@amd.com                    _pdf = _cdf = NAN;
33911308Santhony.gutierrez@amd.com                }
34011308Santhony.gutierrez@amd.com
34111308Santhony.gutierrez@amd.com                if (flags & pdf) {
34211308Santhony.gutierrez@amd.com                    print.pdf = _pdf;
34311308Santhony.gutierrez@amd.com                    print.cdf = _cdf;
34411308Santhony.gutierrez@amd.com                }
34511308Santhony.gutierrez@amd.com
34611308Santhony.gutierrez@amd.com                print(stream);
34711308Santhony.gutierrez@amd.com            }
34811308Santhony.gutierrez@amd.com        }
34911308Santhony.gutierrez@amd.com    }
35011308Santhony.gutierrez@amd.com}
35111308Santhony.gutierrez@amd.com
35211308Santhony.gutierrez@amd.comstruct DistPrint
35311308Santhony.gutierrez@amd.com{
35411308Santhony.gutierrez@amd.com    string name;
35511308Santhony.gutierrez@amd.com    string desc;
35611308Santhony.gutierrez@amd.com    StatFlags flags;
35711308Santhony.gutierrez@amd.com    bool compat;
35811308Santhony.gutierrez@amd.com    bool descriptions;
35911308Santhony.gutierrez@amd.com    int precision;
36011308Santhony.gutierrez@amd.com
36111308Santhony.gutierrez@amd.com    Result min_val;
36211308Santhony.gutierrez@amd.com    Result max_val;
36311308Santhony.gutierrez@amd.com    Result underflow;
36411308Santhony.gutierrez@amd.com    Result overflow;
36511308Santhony.gutierrez@amd.com    VResult vec;
36611308Santhony.gutierrez@amd.com    Result sum;
36711308Santhony.gutierrez@amd.com    Result squares;
36811308Santhony.gutierrez@amd.com    Result samples;
36911308Santhony.gutierrez@amd.com
37011308Santhony.gutierrez@amd.com    Counter min;
37111308Santhony.gutierrez@amd.com    Counter max;
37211308Santhony.gutierrez@amd.com    Counter bucket_size;
37311308Santhony.gutierrez@amd.com    int size;
37411308Santhony.gutierrez@amd.com    bool fancy;
37511308Santhony.gutierrez@amd.com
37611308Santhony.gutierrez@amd.com    void operator()(ostream &stream) const;
37711308Santhony.gutierrez@amd.com};
37811308Santhony.gutierrez@amd.com
37911308Santhony.gutierrez@amd.comvoid
38011308Santhony.gutierrez@amd.comDistPrint::operator()(ostream &stream) const
38111308Santhony.gutierrez@amd.com{
38211308Santhony.gutierrez@amd.com    if (fancy) {
38311308Santhony.gutierrez@amd.com        ScalarPrint print;
38411308Santhony.gutierrez@amd.com        string base = name + (compat ? "_" : "::");
38511308Santhony.gutierrez@amd.com
38611308Santhony.gutierrez@amd.com        print.precision = precision;
38711308Santhony.gutierrez@amd.com        print.flags = flags;
38811308Santhony.gutierrez@amd.com        print.compat = compat;
38911308Santhony.gutierrez@amd.com        print.descriptions = descriptions;
39011308Santhony.gutierrez@amd.com        print.desc = desc;
39111308Santhony.gutierrez@amd.com        print.pdf = NAN;
39211308Santhony.gutierrez@amd.com        print.cdf = NAN;
39311308Santhony.gutierrez@amd.com
39411308Santhony.gutierrez@amd.com        print.name = base + "mean";
395        print.value = samples ? sum / samples : NAN;
396        print(stream);
397
398        print.name = base + "stdev";
399        print.value = samples ? sqrt((samples * squares - sum * sum) /
400                                     (samples * (samples - 1.0))) : NAN;
401        print(stream);
402
403        print.name = "**Ignore: " + base + "TOT";
404        print.value = samples;
405        print(stream);
406        return;
407    }
408
409    assert(size == vec.size());
410
411    Result total = 0.0;
412
413    total += underflow;
414    for (int i = 0; i < size; ++i)
415        total += vec[i];
416    total += overflow;
417
418    string base = name + (compat ? "." : "::");
419
420    ScalarPrint print;
421    print.desc = compat ? "" : desc;
422    print.flags = flags;
423    print.compat = compat;
424    print.descriptions = descriptions;
425    print.precision = precision;
426    print.pdf = NAN;
427    print.cdf = NAN;
428
429    if (compat) {
430        ccprintf(stream, "%-42s", base + "start_dist");
431        if (descriptions && !desc.empty())
432            ccprintf(stream, "                     # %s", desc);
433        stream << endl;
434    }
435
436    print.name = base + "samples";
437    print.value = samples;
438    print(stream);
439
440    print.name = base + "min_value";
441    print.value = min_val;
442    print(stream);
443
444    if (!compat || underflow > 0.0) {
445        print.name = base + "underflows";
446        print.value = underflow;
447        if (!compat && total) {
448            print.pdf = underflow / total;
449            print.cdf += print.pdf;
450        }
451        print(stream);
452    }
453
454
455    if (!compat) {
456        for (int i = 0; i < size; ++i) {
457            stringstream namestr;
458            namestr << name;
459
460            Counter low = i * bucket_size + min;
461            Counter high = ::min(low + bucket_size, max);
462            namestr << low;
463            if (low < high)
464                namestr << "-" << high;
465
466            print.name = namestr.str();
467            print.value = vec[i];
468            if (total) {
469                print.pdf = vec[i] / total;
470                print.cdf += print.pdf;
471            }
472            print(stream);
473        }
474
475    } else {
476        Counter _min;
477        Result _pdf;
478        Result _cdf = 0.0;
479
480        print.flags = flags | __substat;
481
482        for (int i = 0; i < size; ++i) {
483            if (flags & nozero && vec[i] == 0.0 ||
484                flags & nonan && isnan(vec[i]))
485                continue;
486
487            _min = i * bucket_size + min;
488            _pdf = vec[i] / total * 100.0;
489            _cdf += _pdf;
490
491
492            print.name = ValueToString(_min, 0, compat);
493            print.value = vec[i];
494            print.pdf = (flags & pdf) ? _pdf : NAN;
495            print.cdf = (flags & cdf) ? _cdf : NAN;
496            print(stream);
497        }
498
499        print.flags = flags;
500    }
501
502    if (!compat || overflow > 0.0) {
503        print.name = base + "overflows";
504        print.value = overflow;
505        if (!compat && total) {
506            print.pdf = overflow / total;
507            print.cdf += print.pdf;
508        } else {
509            print.pdf = NAN;
510            print.cdf = NAN;
511        }
512        print(stream);
513    }
514
515    print.pdf = NAN;
516    print.cdf = NAN;
517
518    if (!compat) {
519        print.name = base + "total";
520        print.value = total;
521        print(stream);
522    }
523
524    print.name = base + "max_value";
525    print.value = max_val;
526    print(stream);
527
528    if (!compat && samples != 0) {
529        print.name = base + "mean";
530        print.value = sum / samples;
531        print(stream);
532
533        print.name = base + "stdev";
534        print.value = sqrt((samples * squares - sum * sum) /
535                           (samples * (samples - 1.0)));
536        print(stream);
537    }
538
539    if (compat)
540        ccprintf(stream, "%send_dist\n\n", base);
541}
542
543void
544Text::visit(const ScalarData &data)
545{
546    if (noOutput(data))
547        return;
548
549    ScalarPrint print;
550    print.value = data.result();
551    print.name = data.name;
552    print.desc = data.desc;
553    print.flags = data.flags;
554    print.compat = compat;
555    print.descriptions = descriptions;
556    print.precision = data.precision;
557    print.pdf = NAN;
558    print.cdf = NAN;
559
560    print(*stream);
561}
562
563void
564Text::visit(const VectorData &data)
565{
566    if (noOutput(data))
567        return;
568
569    int size = data.size();
570    VectorPrint print;
571
572    print.name = data.name;
573    print.desc = data.desc;
574    print.flags = data.flags;
575    print.compat = compat;
576    print.descriptions = descriptions;
577    print.precision = data.precision;
578    print.vec = data.result();
579    print.total = data.total();
580
581    if (!data.subnames.empty()) {
582        for (int i = 0; i < size; ++i) {
583            if (!data.subnames[i].empty()) {
584                print.subnames = data.subnames;
585                print.subnames.resize(size);
586                for (int i = 0; i < size; ++i) {
587                    if (!data.subnames[i].empty() &&
588                        !data.subdescs[i].empty()) {
589                        print.subdescs = data.subdescs;
590                        print.subdescs.resize(size);
591                        break;
592                    }
593                }
594                break;
595            }
596        }
597    }
598
599    print(*stream);
600}
601
602void
603Text::visit(const Vector2dData &data)
604{
605    if (noOutput(data))
606        return;
607
608    bool havesub = false;
609    VectorPrint print;
610
611    print.subnames = data.y_subnames;
612    print.flags = data.flags;
613    print.compat = compat;
614    print.descriptions = descriptions;
615    print.precision = data.precision;
616
617    if (!data.subnames.empty()) {
618        for (int i = 0; i < data.x; ++i)
619            if (!data.subnames[i].empty())
620                havesub = true;
621    }
622
623    VResult tot_vec(data.y);
624    Result super_total = 0.0;
625    for (int i = 0; i < data.x; ++i) {
626        if (havesub && (i >= data.subnames.size() || data.subnames[i].empty()))
627            continue;
628
629        int iy = i * data.y;
630        VResult yvec(data.y);
631
632        Result total = 0.0;
633        for (int j = 0; j < data.y; ++j) {
634            yvec[j] = data.cvec[iy + j];
635            tot_vec[j] += yvec[j];
636            total += yvec[j];
637            super_total += yvec[j];
638        }
639
640        print.name = data.name + "_" + (havesub ? data.subnames[i] : to_string(i));
641        print.desc = data.desc;
642        print.vec = yvec;
643        print.total = total;
644        print(*stream);
645    }
646
647    if ((data.flags & ::Statistics::total) && (data.x > 1)) {
648        print.name = data.name;
649        print.desc = data.desc;
650        print.vec = tot_vec;
651        print.total = super_total;
652        print(*stream);
653    }
654}
655
656void
657Text::visit(const DistData &data)
658{
659    if (noOutput(data))
660        return;
661
662    DistPrint print;
663
664    print.name = data.name;
665    print.desc = data.desc;
666    print.flags = data.flags;
667    print.compat = compat;
668    print.descriptions = descriptions;
669    print.precision = data.precision;
670
671    print.min_val = data.data.min_val;
672    print.max_val = data.data.max_val;
673    print.underflow = data.data.underflow;
674    print.overflow = data.data.overflow;
675    print.vec.resize(data.data.cvec.size());
676    for (int i = 0; i < print.vec.size(); ++i)
677        print.vec[i] = (Result)data.data.cvec[i];
678    print.sum = data.data.sum;
679    print.squares = data.data.squares;
680    print.samples = data.data.samples;
681
682    print.min = data.data.min;
683    print.max = data.data.max;
684    print.bucket_size = data.data.bucket_size;
685    print.size = data.data.size;
686    print.fancy = data.data.fancy;
687
688    print(*stream);
689}
690
691void
692Text::visit(const VectorDistData &data)
693{
694    if (noOutput(data))
695        return;
696
697    for (int i = 0; i < data.size(); ++i) {
698        DistPrint print;
699
700        print.name = data.name +
701            (data.subnames[i].empty() ? ("_" + to_string(i)) : data.subnames[i]);
702        print.desc = data.subdescs[i].empty() ? data.desc : data.subdescs[i];
703        print.flags = data.flags;
704        print.compat = compat;
705        print.descriptions = descriptions;
706        print.precision = data.precision;
707
708        print.min_val = data.data[i].min_val;
709        print.max_val = data.data[i].max_val;
710        print.underflow = data.data[i].underflow;
711        print.overflow = data.data[i].overflow;
712        print.vec.resize(data.data[i].cvec.size());
713        for (int j = 0; j < print.vec.size(); ++j)
714            print.vec[j] = (Result)data.data[i].cvec[j];
715        print.sum = data.data[i].sum;
716        print.squares = data.data[i].squares;
717        print.samples = data.data[i].samples;
718
719        print.min = data.data[i].min;
720        print.max = data.data[i].max;
721        print.bucket_size = data.data[i].bucket_size;
722        print.size = data.data[i].size;
723        print.fancy = data.data[i].fancy;
724
725        print(*stream);
726    }
727}
728
729void
730Text::visit(const FormulaData &data)
731{
732    visit((const VectorData &)data);
733}
734
735/* namespace Statistics */ }
736