2014-04-03 5 views
0

나는 에 클래스 Histogram을 만들었는데,이 클래스는 Boost 1.54의 boost::accumulators::accumulator_set에 대한 래퍼로 사용된다.두 개의 boost :: accumulators :: accumulator_set이 서로 간섭한다

Histogram::Histogram(int bins, size_t cache) 
    : acc(accumulator_set<double, 
      features<tag::min, tag::max, tag::mean, tag::density>>(
       tag::density::num_bins = bins, 
       tag::density::cache_size = std::min(cache, MAX_CACHE_ENTRIES))) { 
} 

이 히스토그램 (main-metropolis.cpp에서 do_iterations())를 사용하는 코드가 시작 : Histogram.cpp에서 다음

using namespace boost::accumulators; 

class Histogram { 
    public: 
     Histogram(int bins, size_t cache); 
     accumulator_set<double, 
         features<tag::min, tag::max, tag::mean, tag::density>> acc; 
}; 

내가 생성자가 : 내 문제에 중요한 보이는 일들이 Histogram.hpp 파일에서 그 라인이다 다음과 같습니다.

Histogram position_histogram{settings.position_hist_bins, settings.time_sites * settings.iterations}; 
//Histogram action_histogram{settings.action_hist_bins, settings.iterations}; 

두 번째 줄로 실행할 때 예상대로 작동합니다. d eactivated. 내 시뮬레이션, 일부 데이터 포인트를 생성 Histogram::acc에 그것을두고 내가 나중에 그것을 추출 할 수 있습니다 :

-2.86958 0 
-2.37393 0.0002 
-1.87829 0.0071 
-1.38265 0.06621 
-0.887001 0.23902 
-0.391356 0.33247 
0.104288 0.2342 
0.599932 0.08449 
1.09558 0.02843 
1.59122 0.00775 
2.08687 0.00012 
2.58251 1e-05 
# Min -2.37393 
# Max 2.58251 
# Mean -0.0809983 

가 그럼 난 라인을 활성화하고 정말 이상한 방법으로 position_histogram 작품. 쓰레기통은 모두 0이지만 데이터는 첫 번째와 마지막 bin에 오버 플로우 쓰레기통에 배포됩니다 내가 라인을 바꿀 경우

0 0.57785 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0 
0 0.42215 
# Min -2.37393 
# Max 2.58251 
# Mean -0.0809983 

, 그것은 휴식 action_histogram입니다. 따라서 두 번째 것은 항상 첫 번째 것을 깨뜨립니다. 왜 초의 초기화가 Histogram이고 따라서 두 번째 accumulator_set이 첫 번째 것이 깨지게할까요? 당신이 the code를 탐색 할 때이 작업을 계속하기 위해 지금 내 자신의 히스토그램 구현을 구축하기 때문에


개정 d3081a1ef7을 사용하십시오.

답변

2

이 문제를 디버깅하거나 추가 정보를 제공해야합니다.

나는 연구 결과 증명 개념에서 누적기를 사용하고 항상 둘 이상의 인스턴스를 동시에 사용했지만이 문제가 발생하지 않았습니다. 그렇다면 나는 density 히스토그램을 병렬로 사용하지 않는다는 것을 깨달았습니다. 그래서 그것을 테스트 해 보았습니다.

그것은 당신의 선언에 따라 내 테스트에서 프라이팬, 그것을 Live On Coliru를 참조하십시오

#include <boost/accumulators/statistics.hpp> 
#include <boost/accumulators/accumulators.hpp> 
#include <boost/random.hpp> 
#include <boost/bind.hpp> 

using namespace boost::accumulators; 

static const size_t MAX_CACHE_ENTRIES = 32; 

class Histogram { 
    public: 
     Histogram(int bins, size_t cache) 
      : acc(accumulator_set<double, 
        features<tag::min, tag::max, tag::mean, tag::density>>(
         tag::density::num_bins = bins, 
         tag::density::cache_size = std::min(cache, MAX_CACHE_ENTRIES))) { 
      }   

     accumulator_set<double, 
         features<tag::min, tag::max, tag::mean, tag::density>> acc; 
}; 

int main() 
{ 
    Histogram position_histogram { 10, 32 }; 
    Histogram action_histogram { 10, 32 }; 

    auto random = boost::bind(boost::uniform_real<double>(-100,100), boost::mt19937(42)); 

    size_t samples = 1<<20; 
    while (samples--) 
    { 
     auto v = random(); 
     position_histogram.acc(v); 
     action_histogram.acc(v); 
    } 

    for (auto& acc : { position_histogram.acc, action_histogram.acc }) 
    { 
     auto hist = density(acc); 

     double total = 0.0; 

     for(int i = 0; i < hist.size(); i++) 
     { 
      std::cout << "Bin lower bound: " << hist[i].first << ", Value: " << hist[i].second << std::endl; 
      total += hist[i].second; 
     } 

     std::cout << "Total: " << total << std::endl; //should be 1 (and it is) 
    } 
} 

출력, 예상대로 :

또한
Bin lower bound: -119.673, Value: 0.000766754 
Bin lower bound: -99.8442, Value: 0.099205 
Bin lower bound: -80.0156, Value: 0.0987797 
Bin lower bound: -60.1869, Value: 0.0990477 
Bin lower bound: -40.3583, Value: 0.0991993 
Bin lower bound: -20.5296, Value: 0.0989904 
Bin lower bound: -0.700967, Value: 0.0993652 
Bin lower bound: 19.1277, Value: 0.0993567 
Bin lower bound: 38.9563, Value: 0.0993252 
Bin lower bound: 58.785, Value: 0.0993109 
Bin lower bound: 78.6137, Value: 0.0989342 
Bin lower bound: 98.4423, Value: 0.00771904 
Total: 1 
Bin lower bound: -119.673, Value: 0.000766754 
Bin lower bound: -99.8442, Value: 0.099205 
Bin lower bound: -80.0156, Value: 0.0987797 
Bin lower bound: -60.1869, Value: 0.0990477 
Bin lower bound: -40.3583, Value: 0.0991993 
Bin lower bound: -20.5296, Value: 0.0989904 
Bin lower bound: -0.700967, Value: 0.0993652 
Bin lower bound: 19.1277, Value: 0.0993567 
Bin lower bound: 38.9563, Value: 0.0993252 
Bin lower bound: 58.785, Value: 0.0993109 
Bin lower bound: 78.6137, Value: 0.0989342 
Bin lower bound: 98.4423, Value: 0.00771904 
Total: 1 

, 먹이 때 모두 다른 샘플 축전지, I 명백한 오작동을 표시하지 못했습니다. 이것은 당신이 (예를 들어, 당신이 실제로 모두가 올바른 샘플 축전지 공급합니까?)

나는 소스에 대한 링크를 추가 1.53-1.55

+0

내가 부스트와 함께 테스트를했습니다 상황에 대해 다른 무엇을 실현하는 데 도움이

희망 문제의 코드. 누적 기가 올바른 샘플을 가져와야합니다. 그 중 하나가 작동하고 합리적인 히스토그램을 보여주기 때문입니다. 'template '는 무엇을합니까? –

+0

그 태그에 대해 죄송합니다. 그것은 잠재적 인 문제를 진단해야한다는 아이디어의 남은 것입니다. 그것은 불필요한 것으로 밝혀졌습니다.태그를 무시하십시오 :) – sehe

+0

이 기능에 이름이 있습니까? 나는 C++을 배우면서이 책에 대해 읽고 싶습니다. - 그래서 내 코드의 문제가 다른 복잡도의 어딘가에서 생성 된 것 같습니다. –