25 #include "ns3/nstime.h"
27 #include "data-collector.h"
28 #include "data-calculator.h"
29 #include "omnet-data-output.h"
38 OmnetDataOutput::OmnetDataOutput()
40 m_filePrefix =
"data";
44 OmnetDataOutput::~OmnetDataOutput()
59 inline bool isNumeric (
const std::string& s) {
60 bool decimalPtSeen =
false;
61 bool exponentSeen =
false;
64 for (std::string::const_iterator it = s.begin (); it != s.end (); it++)
66 if ((*it ==
'.') && (decimalPtSeen))
70 else if ((*it ==
'e') && exponentSeen)
75 decimalPtSeen =
false;
77 else if (*it ==
'-' && it != s.begin () && last !=
'e')
89 std::ofstream scalarFile;
90 std::string fn = m_filePrefix +
"-"+dc.GetRunLabel ()+
".sca";
91 scalarFile.open (fn.c_str (), std::ios_base::out);
94 scalarFile <<
"run " << dc.GetRunLabel () << std::endl;
95 scalarFile <<
"attr experiment \"" << dc.GetExperimentLabel ()
97 scalarFile <<
"attr strategy \"" << dc.GetStrategyLabel ()
99 scalarFile <<
"attr measurement \"" << dc.GetInputLabel ()
100 <<
"\"" << std::endl;
101 scalarFile <<
"attr description \"" << dc.GetDescription ()
102 <<
"\"" << std::endl;
104 for (MetadataList::iterator i = dc.MetadataBegin ();
105 i != dc.MetadataEnd (); i++) {
106 std::pair<std::string, std::string> blob = (*i);
107 scalarFile <<
"attr \"" << blob.first <<
"\" \"" << blob.second <<
"\""
111 scalarFile << std::endl;
112 if (isNumeric (dc.GetInputLabel ())) {
113 scalarFile <<
"scalar . measurement \"" << dc.GetInputLabel ()
114 <<
"\"" << std::endl;
116 for (MetadataList::iterator i = dc.MetadataBegin ();
117 i != dc.MetadataEnd (); i++) {
118 std::pair<std::string, std::string> blob = (*i);
119 if (isNumeric (blob.second)) {
120 scalarFile <<
"scalar . \"" << blob.first <<
"\" \"" << blob.second <<
"\""
124 OmnetOutputCallback callback (&scalarFile);
126 for (DataCalculatorList::iterator i = dc.DataCalculatorBegin ();
127 i != dc.DataCalculatorEnd (); i++) {
128 (*i)->Output (callback);
131 scalarFile << std::endl << std::endl;
138 OmnetDataOutput::OmnetOutputCallback::OmnetOutputCallback
139 (std::ostream *scalar) :
145 OmnetDataOutput::OmnetOutputCallback::OutputStatistic (std::string context,
153 (*m_scalar) <<
"statistic " << context <<
" " << name << std::endl;
155 (*m_scalar) <<
"field count " << statSum->
getCount () << std::endl;
156 if (!isNaN (statSum->
getSum ()))
157 (*m_scalar) <<
"field sum " << statSum->
getSum () << std::endl;
158 if (!isNaN (statSum->
getMean ()))
159 (*m_scalar) <<
"field mean " << statSum->
getMean () << std::endl;
160 if (!isNaN (statSum->
getMin ()))
161 (*m_scalar) <<
"field min " << statSum->
getMin () << std::endl;
162 if (!isNaN (statSum->
getMax ()))
163 (*m_scalar) <<
"field max " << statSum->
getMax () << std::endl;
165 (*m_scalar) <<
"field sqrsum " << statSum->
getSqrSum () << std::endl;
167 (*m_scalar) <<
"field stddev " << statSum->
getStddev () << std::endl;
171 OmnetDataOutput::OmnetOutputCallback::OutputSingleton (std::string context,
179 (*m_scalar) <<
"scalar " << context <<
" " << name <<
" " << val << std::endl;
184 OmnetDataOutput::OmnetOutputCallback::OutputSingleton (std::string context,
192 (*m_scalar) <<
"scalar " << context <<
" " << name <<
" " << val << std::endl;
197 OmnetDataOutput::OmnetOutputCallback::OutputSingleton (std::string context,
205 (*m_scalar) <<
"scalar " << context <<
" " << name <<
" " << val << std::endl;
210 OmnetDataOutput::OmnetOutputCallback::OutputSingleton (std::string context,
218 (*m_scalar) <<
"scalar " << context <<
" " << name <<
" " << val << std::endl;
223 OmnetDataOutput::OmnetOutputCallback::OutputSingleton (std::string context,
231 (*m_scalar) <<
"scalar " << context <<
" " << name <<
" " << val.
GetTimeStep () << std::endl;
virtual double getMin() const =0
virtual double getSqrSum() const =0
#define NS_LOG_COMPONENT_DEFINE(name)
#define NS_LOG_FUNCTION_NOARGS()
virtual double getStddev() const =0
virtual double getMean() const =0
virtual double getMax() const =0
int64_t GetTimeStep(void) const
virtual double getSum() const =0
virtual long getCount() const =0