File: determinebinwidth.hpp

package info (click to toggle)
libpwiz 3.0.18342-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 14,888 kB
  • sloc: cpp: 157,552; sh: 4,182; makefile: 317
file content (93 lines) | stat: -rw-r--r-- 2,504 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
//
// $Id$
//
//
// Original author: Witold Wolski <wewolski@gmail.com>
//
// Copyright : ETH Zurich
//
// Licensed under the Apache License, Version 2.0 (the "License"); 
// you may not use this file except in compliance with the License. 
// You may obtain a copy of the License at 
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software 
// distributed under the License is distributed on an "AS IS" BASIS, 
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 
// See the License for the specific language governing permissions and 
// limitations under the License.
// 
#ifndef DETERMINEBINWIDTHUTILITIES_H
#define DETERMINEBINWIDTHUTILITIES_H

#include <functional>
#include <boost/cstdint.hpp>
#include <algorithm>

namespace ralab
{
  namespace base
  {
    namespace resample
    {

      typedef boost::int32_t int32_t;
      namespace utilities{

        template<class T>
        struct meanfunctor : std::binary_function<T,T,T>{
          T operator()(const T & x, const T& y){
            return (x+y)/2.;
          }
        };


        template <
            typename InputIterator,
            typename OutputIterator,
            typename TN //= int32_t
            >
        OutputIterator summ
        (
            InputIterator begin, //!< [in] begin
            InputIterator end, //!< [in] end
            OutputIterator destBegin, //!< [out] dest begin
            TN lag = 1//!< [in] an integer indicating which lag to use.
            )
        {
          return( std::transform(begin + lag
                                 , end
                                 , begin
                                 , destBegin
                                 , meanfunctor<typename InputIterator::value_type>())
                  );
        }

        template<typename TRealI>
        double determine(TRealI begin, TRealI end,double maxj=5.){
          //BOOST_ASSERT(!boost::range::is_sorted(begin,end));
          double j = 1.;
          double average = *begin;
          double sum = average;
          int32_t i = 1;
          for(; begin != end ; ++begin, ++i){
              while(*begin > (j+0.5) *average){
                  ++j;
                }
              if(j > maxj){
                  break;
                }
              sum += *begin/j;
              average = sum/static_cast<double>(i);
            }
          return average;

        }
      }


    }
  }
}
#endif