//------------------------------------------------------------
// $Id: statistics.h,v 1.1.1.1.2.1 2000/06/14 17:46:35 yamauchi Exp $
//------------------------------------------------------------
//	(M\pi)^2 statistics 統計情報
//	1996/1/13
//	Copyright (C) 1996--1998 YAMAUCHI Hitoshi 山内 斉
//	statistics を使う場合には、GET_STAT フラグをたててコンパイル
//	する．動作として不可欠なものは GET_STAT の影響を受けない
//	不可欠なもの
//		mNumberOfGenHC
//------------------------------------------------------------
#ifndef _statistics_h
#define _statistics_h 1

#include "mpi2_funcs.h"

// for PE statistics
class StatisticsClass {
private:
    StatisticsClass(const StatisticsClass& rhs);
    const StatisticsClass& operator=(const StatisticsClass& rhs);
    
protected:
    // HemiCube の生成数
    int    mNumberOfGenHC;
    
#ifdef GET_STAT
    // mNumOfProcRayTraces processingRayTrace の call された回数    : PE.cc
    // mNumofRayTraceProc  processingOneRayTrace の call された回数 : PE.cc
    // これらから平均何本づつ ray を処理したかわかる。
    double mNumOfProcRayTraces;
    double mOneRayTraceProcs;
    double mNumOfProcRadiosities;
    double mOneRadioProcs;
    
    // recv Buffer がいくつ同時に利用されたかの最大値
    int    mMaxRecvBuffUsingNum;
#endif
    
public:    
    StatisticsClass(void)
    {
	this->mNumberOfGenHC		=   0;
#ifdef GET_STAT
	this->mNumOfProcRayTraces 	= 0.0;
	this->mOneRayTraceProcs		= 0.0;
	this->mNumOfProcRadiosities	= 0.0;
	this->mOneRadioProcs		= 0.0;
	this->mMaxRecvBuffUsingNum	=   0;
#endif
    }
    
    // HemiCube の生産数
    void incHCGenNum(void) 		{ this->mNumberOfGenHC++;	}
    int  getHCGenNum(void) const 	{ return(this->mNumberOfGenHC);	}
    
    // radiosity において一度の通信でいくつの ray を処理したかの統計
    void addRadioProcsAtOnce(int radioprocs)
    {
#ifdef GET_STAT
	assert(radioprocs > 0);
	this->mNumOfProcRadiosities += 1.0;
	this->mOneRadioProcs   += double(radioprocs);
#endif
	return;
	radioprocs = radioprocs;
    }
    // ray-trace において一度の通信でいくつの ray を処理したかの統計
    void addRayTraceProcsAtOnce(int rayprocs)
    {
#ifdef GET_STAT
	assert(rayprocs > 0);
	this->mNumOfProcRayTraces += 1.0;
	this->mOneRayTraceProcs   += double(rayprocs);
#endif
	return;
	rayprocs = rayprocs;	// for -Wall
    }
    
    // recv buffer が同時に利用された最大値の記録
    void maxRecvBuffSize(int nowUsingBufferNum)
    {
#ifdef GET_STAT
	if(this->mMaxRecvBuffUsingNum < nowUsingBufferNum)
	{
	    this->mMaxRecvBuffUsingNum = nowUsingBufferNum;
	    //cout<<"## mMaxRecvBuffUsingNum = " << this->mMaxRecvBuffUsingNum
	    // << endl;
	}
#endif
	return;
	nowUsingBufferNum = nowUsingBufferNum;
    }
    
    void print(const char *pHead, const IntVec3& PEid) const 
    {
	const char* pMes = genHd(pHead, PEid);
	// HemiCube の生成数
	cout << pMes << "total No. gen HC " << this->getHCGenNum() << endl;
	
#ifdef GET_STAT
	// radiosity の平均レイ処理数
	cout << pMes << "stat procradios: " << this->mNumOfProcRadiosities;
	if(this->mNumOfProcRadiosities > 0)
	{
	    cout << ",\t" << 
	    (this->mOneRadioProcs/ this->mNumOfProcRadiosities);
	    cout << " oneprocs";
	}
	cout << endl;
	
	// ray trace の平均レイ処理数
	cout << pMes << "stat procrays  : " << this->mNumOfProcRayTraces;
	if(this->mNumOfProcRayTraces > 0)
	{
	    cout << ",\t" << 
	    (this->mOneRayTraceProcs / this->mNumOfProcRayTraces);
	    cout << " oneprocs";
	}
	cout << endl;
	// 受信バッファの使用状況
	cout << pMes << ",\tmaxRecvBuffNum "<<this->mMaxRecvBuffUsingNum<<endl;
#endif
    }
};


// for host statistics
class HostStatisticsClass {
private:
    HostStatisticsClass(const HostStatisticsClass& rhs);
    const HostStatisticsClass& operator=(const HostStatisticsClass& rhs);
protected:
    // host が受信した PEstat の数
    double mHostGetPEStats;
    
public:
    HostStatisticsClass(void)
    {
	this->init();
    }
    void init(void)
    {
	this->mHostGetPEStats = 0.0;
    }
    void incrGetPEStatsNum(void) { this->mHostGetPEStats++;	}
    void print(void) const 
    {
	// cout << "// host :: get PEstat num " << this->mHostGetPEStats << endl;
    }
};



#ifdef THIS_IS_GLOBAL_DEFINE_FILE
class StatisticsClass Statistics;
class HostStatisticsClass HostStat;
#else
extern class StatisticsClass Statistics;
extern class HostStatisticsClass HostStat;
#endif

#endif				// #define _statistics_h 1
