alpar@2389: /* -*- C++ -*- alpar@2389: * alpar@2389: * This file is a part of LEMON, a generic C++ optimization library alpar@2389: * alpar@2553: * Copyright (C) 2003-2008 alpar@2389: * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport alpar@2389: * (Egervary Research Group on Combinatorial Optimization, EGRES). alpar@2389: * alpar@2389: * Permission to use, modify and distribute this software is granted alpar@2389: * provided that this copyright notice appears in all copies. For alpar@2389: * precise terms see the accompanying LICENSE file. alpar@2389: * alpar@2389: * This software is provided "AS IS" with no warranty of any kind, alpar@2389: * express or implied, and with no claim as to its suitability for any alpar@2389: * purpose. alpar@2389: * alpar@2389: */ alpar@2389: alpar@2389: #ifndef LEMON_RANDOM_H alpar@2389: #define LEMON_RANDOM_H alpar@2389: alpar@2389: #include alpar@2389: #include alpar@2389: #include alpar@2389: alpar@2389: #include alpar@2389: alpar@2389: ///\ingroup misc alpar@2389: ///\file alpar@2389: ///\brief Measure a Distribution alpar@2389: /// alpar@2389: ///\todo Needs lot more docs alpar@2389: /// alpar@2389: alpar@2389: alpar@2389: namespace lemon { alpar@2389: alpar@2389: ///Measure a distribution alpar@2389: class DistLog alpar@2389: { alpar@2389: std::vector _dist; alpar@2389: double _lo,_up; alpar@2389: int _count; alpar@2389: bool _cut; alpar@2389: public: alpar@2389: ///\e alpar@2389: Dist(double lo,double up,int gr,bool cut=true) alpar@2389: : _dist(gr,0),_lo(lo),_up(up),_count(0),_cut(cut) {} alpar@2389: ///\e alpar@2389: void operator()(double v) alpar@2389: { alpar@2389: if(_cut) { alpar@2389: if(_lo<=v && v<_up) alpar@2389: _dist[int((v-_lo)/(_up-_lo)*_dist.size())]++; alpar@2389: } alpar@2389: else { alpar@2389: _dist[std::max(0,std::min(int(_dist.size())-1, alpar@2389: int((v-_lo)/(_up-_lo)*_dist.size()) alpar@2389: ))]++; alpar@2389: } alpar@2389: _count++; alpar@2389: } alpar@2389: ///\e alpar@2389: void dump(std::ostream& os=std::cout) alpar@2389: { alpar@2389: for(int i=0;i<_dist.size();i++) alpar@2389: os << _lo+(i+0.5)*(_up-_lo)/_dist.size() << ' ' alpar@2389: << double(_dist[i])/_count << std::endl; alpar@2389: } alpar@2389: ///\e alpar@2389: void dump(const std::string& file_name) alpar@2389: { alpar@2389: dump(std::ofstream(file_name.c_str())); alpar@2389: } alpar@2389: }; alpar@2389: alpar@2389: ///Measure a two dimensional distribution alpar@2389: class DistLog2 alpar@2389: { alpar@2389: public: alpar@2389: typedef dim2::Point Point; alpar@2389: private: alpar@2389: std::vector _dist; alpar@2389: int _gr; alpar@2389: Point _lo,_up; alpar@2389: int _count; alpar@2389: bool _cut; alpar@2389: public: alpar@2389: ///\e alpar@2389: Dist2(Point a,Point b,int gr,bool cut=true) : alpar@2389: _dist(gr*gr,0),_gr(gr), alpar@2389: _lo(a),_up(b),_count(0),_cut(cut) {} alpar@2389: ///\e alpar@2389: Dist2(double lox,double upx,double loy,double upy,int gr,bool cut=true) : alpar@2389: _dist(gr*gr,0),_gr(gr), alpar@2389: _lo(Point(lox,loy)),_up(Point(upx,upy)),_count(0),_cut(cut) {} alpar@2389: ///\e alpar@2389: void operator()(Point v) alpar@2389: { alpar@2389: if(_cut) alpar@2389: { alpar@2389: if(v.x>=_lo.x && v.x<_up.x && v.y>=_lo.y && v.y<_up.y) alpar@2389: _dist[int((v.x-_lo.x)/(_up.x-_lo.x)*_gr)*_gr+ alpar@2389: int((v.y-_lo.y)/(_up.y-_lo.y)*_gr)]++; alpar@2389: } alpar@2389: else { alpar@2389: _dist[std::max(0,std::min(_gr-1, alpar@2389: int((v.x-_lo.x)/(_up.x-_lo.x)*_gr) alpar@2389: ))*_gr+ alpar@2389: std::max(0,std::min(_gr-1, alpar@2389: int((v.y-_lo.y)/(_up.y-_lo.y)*_gr) alpar@2389: )) alpar@2389: ]++; alpar@2389: } alpar@2389: _count++; alpar@2389: } alpar@2389: ///\e alpar@2389: void dump(std::ostream& os=std::cout) alpar@2389: { alpar@2389: for(int i=0;i<_gr;i++) alpar@2389: { alpar@2389: for(int j=0;j<_gr;j++) alpar@2389: os << _lo.x+(i+0.5)*(_up.x-_lo.x)/_gr << ' ' alpar@2389: << _lo.y+(j+0.5)*(_up.y-_lo.y)/_gr << ' ' alpar@2389: << double(_dist[i*_gr+j])/_count << std::endl; alpar@2389: os << std::endl; alpar@2389: } alpar@2389: } alpar@2389: ///\e alpar@2389: void dump(const std::string& file_name) alpar@2389: { alpar@2389: dump(std::ofstream(file_name.c_str())); alpar@2389: } alpar@2389: }; alpar@2389: } alpar@2389: alpar@2389: #endif