lemon/dist_log.h
author kpeter
Thu, 13 Nov 2008 16:17:50 +0000
changeset 2630 d239741cfd44
parent 2391 14a343be7a5a
permissions -rw-r--r--
Various improvements in NetworkSimplex.

- Faster variant of "Altering Candidate List" pivot rule using make_heap
instead of partial_sort.
- Doc improvements.
- Removing unecessary inline keywords.
     1 /* -*- C++ -*-
     2  *
     3  * This file is a part of LEMON, a generic C++ optimization library
     4  *
     5  * Copyright (C) 2003-2008
     6  * Egervary Jeno Kombinatorikus Optimalizalasi Kutatocsoport
     7  * (Egervary Research Group on Combinatorial Optimization, EGRES).
     8  *
     9  * Permission to use, modify and distribute this software is granted
    10  * provided that this copyright notice appears in all copies. For
    11  * precise terms see the accompanying LICENSE file.
    12  *
    13  * This software is provided "AS IS" with no warranty of any kind,
    14  * express or implied, and with no claim as to its suitability for any
    15  * purpose.
    16  *
    17  */
    18 
    19 #ifndef LEMON_RANDOM_H
    20 #define LEMON_RANDOM_H
    21 
    22 #include<iostream>
    23 #include<fstream>
    24 #include<string>
    25 
    26 #include <lemon/dim2.h>
    27 
    28 ///\ingroup misc
    29 ///\file
    30 ///\brief Measure a Distribution
    31 ///
    32 ///\todo Needs lot more docs
    33 ///
    34 
    35 
    36 namespace lemon {
    37 
    38   ///Measure a distribution
    39   class DistLog
    40   {
    41     std::vector<int> _dist;
    42     double _lo,_up;
    43     int _count;
    44     bool _cut;
    45   public:
    46     ///\e
    47     Dist(double lo,double up,int gr,bool cut=true) 
    48       : _dist(gr,0),_lo(lo),_up(up),_count(0),_cut(cut) {}
    49     ///\e
    50     void operator()(double v)
    51     {
    52       if(_cut) {
    53 	if(_lo<=v && v<_up)
    54 	  _dist[int((v-_lo)/(_up-_lo)*_dist.size())]++;
    55       }
    56       else {
    57 	_dist[std::max(0,std::min(int(_dist.size())-1,
    58 				  int((v-_lo)/(_up-_lo)*_dist.size())
    59 				  ))]++;
    60       }
    61       _count++;
    62     }
    63     ///\e
    64     void dump(std::ostream& os=std::cout)
    65     {
    66       for(int i=0;i<_dist.size();i++)
    67 	os << _lo+(i+0.5)*(_up-_lo)/_dist.size() << ' '
    68 	   << double(_dist[i])/_count << std::endl;
    69     }
    70     ///\e
    71     void dump(const std::string& file_name)
    72     {
    73       dump(std::ofstream(file_name.c_str()));
    74     }
    75   };
    76   
    77   ///Measure a two dimensional distribution
    78   class DistLog2
    79   {
    80   public:
    81     typedef dim2::Point<double> Point;
    82   private:
    83     std::vector<int> _dist;
    84     int _gr;
    85     Point _lo,_up;
    86     int _count;
    87     bool _cut;
    88   public:  
    89     ///\e
    90     Dist2(Point a,Point b,int gr,bool cut=true) :
    91       _dist(gr*gr,0),_gr(gr),
    92       _lo(a),_up(b),_count(0),_cut(cut) {}
    93     ///\e
    94     Dist2(double lox,double upx,double loy,double upy,int gr,bool cut=true) :
    95       _dist(gr*gr,0),_gr(gr),
    96       _lo(Point(lox,loy)),_up(Point(upx,upy)),_count(0),_cut(cut) {}
    97     ///\e
    98     void operator()(Point v)
    99     {
   100       if(_cut)
   101 	{
   102 	  if(v.x>=_lo.x && v.x<_up.x && v.y>=_lo.y && v.y<_up.y)
   103 	    _dist[int((v.x-_lo.x)/(_up.x-_lo.x)*_gr)*_gr+
   104 		  int((v.y-_lo.y)/(_up.y-_lo.y)*_gr)]++;
   105 	}
   106       else {
   107 	_dist[std::max(0,std::min(_gr-1,
   108 				  int((v.x-_lo.x)/(_up.x-_lo.x)*_gr)
   109 				  ))*_gr+
   110 	      std::max(0,std::min(_gr-1,
   111 				  int((v.y-_lo.y)/(_up.y-_lo.y)*_gr)
   112 				  ))
   113 	      ]++;
   114       }
   115       _count++;
   116     }
   117     ///\e
   118     void dump(std::ostream& os=std::cout)
   119     {
   120       for(int i=0;i<_gr;i++)
   121 	{
   122 	  for(int j=0;j<_gr;j++)
   123 	    os << _lo.x+(i+0.5)*(_up.x-_lo.x)/_gr << ' '
   124 	       << _lo.y+(j+0.5)*(_up.y-_lo.y)/_gr << ' '
   125 	       << double(_dist[i*_gr+j])/_count << std::endl;
   126 	  os << std::endl;
   127 	}
   128     }
   129     ///\e
   130     void dump(const std::string& file_name)
   131     {
   132       dump(std::ofstream(file_name.c_str()));
   133     }
   134   };
   135 }
   136 
   137 #endif