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