Boost logo

Boost Users :

Subject: [Boost-users] c++: boost::multi_array - in a class
From: Hannan Sadar (hannan.sadar_at_[hidden])
Date: 2010-01-12 15:59:46


Hi to all,

i wrote a class (Influx), where i try to define there a
boost::multi_arry occ_sign_change.
Once i tried in Influx::Influx to write:
occ_sign_change = vec::uint32_1d_t ( boost::extents[ num_elements ] );
i was able to compile, but at run time i got the following error:
randum.rc3_64: /usr/include/boost/multi_array/multi_array_ref.hpp:487:
boost::multi_array_ref<T, NumDims>& boost::multi_array_ref<T,
NumDims>::operator=(const ConstMultiArray&) [with ConstMultiArray =
boost::multi_array<unsigned int, 1ul, std::allocator<unsigned int> >, T =
unsigned int, long unsigned int NumDims = 1ul]: Assertion
`std::equal(other.shape(),other.shape()+this->num_dimensions(),
this->shape())' failed.

that is why i rewrote the above line as following:
vec::uint32_1d_t occ_sign_change ( boost::extents[ num_elements ] );

but now, when i call for the size of occ_sign_change in Influx::Clean, i get
that the size is zero.

how could i solve this problem?

regards

#include <boost/random/uniform_01.hpp>
#include <boost/random.hpp>
#include "randum.rc3.hpp"

namespace vec {
  typedef boost::multi_array< uint32_t , 1> uint32_1d_t;
  typedef boost::multi_array< uint32_t , 2> uint32_2d_t;
  typedef boost::multi_array< uint32_t , 3> uint32_3d_t;
  typedef boost::multi_array< uint32_t , 1> uint32_1d_t;
  typedef boost::multi_array< uint32_t , 2> uint32_2d_t;
  typedef boost::multi_array< double , 1> double_1d_t;
  typedef boost::multi_array< double , 2> double_2d_t;
  typedef uint32_1d_t::index index_t;
}

class Influx {
  public:
    Influx ( uint32_t num_elements , double p_, double kappa_ ,
vec::uint32_2d_t *Pointer_ , threshold_t threshold_ , uint32_t num_bits ,
uint16_t max_runs_ );
    void Update ();
    void Validity ( const uint32_t i );
    void Clean( uint32_t run );
    boost::dynamic_bitset<> occupied;
    vec::uint32_1d_t occupied_counter;
    vec::uint32_1d_t num_neighbours;
    vec::uint32_1d_t occ_sign_change;

  private:
    std::vector< uint32_t > remove_node_v;
    vec::uint32_2d_t *Pointer;
    std::vector< uint32_t > num_neighbours_epoch;
    double p;
    double kappa;
    threshold_t threshold;
    uint16_t max_runs;
    uint32_t bits_mask;
    uint32_t complement_num;

};

Influx::Influx ( uint32_t num_elements , double p_, double kappa_ ,
vec::uint32_2d_t *Pointer_ , threshold_t threshold_ , uint32_t num_bits ,
uint16_t max_runs_ ) {
    bits_mask = ( 1 << num_bits ) - 1;
    Pointer = Pointer_;
    p = p_;
    kappa = kappa_;
    threshold = threshold_;
    max_runs = max_runs_;
    complement_num = 0;

    num_neighbours_epoch = std::vector< uint32_t > ( num_elements , 0);
    occupied = boost::dynamic_bitset<> ( num_elements , 0 ); // all 0's by
default
    vec::uint32_1d_t occupied_counter ( boost::extents[ num_elements ] );
    vec::uint32_1d_t occ_sign_change ( boost::extents[ num_elements ] );
    vec::uint32_1d_t num_neighbours ( boost::extents[ num_elements ] );
    remove_node_v.reserve( num_elements );
    std::fill_n( occupied_counter.begin() , occupied_counter.num_elements()
, 0 );
    std::fill_n( occ_sign_change.begin() , occ_sign_change.num_elements()
, 0 );
    std::fill_n( num_neighbours.origin() , num_neighbours.num_elements()
, 0 );

}

void Influx::Clean ( uint32_t run ) {

    for ( vec::uint32_1d_t::size_type i = 0 ; i < remove_node_v.size() ; i++
) {
        occupied[ remove_node_v[i] ] = 0;
        if ( run >= max_runs ) {
           std::cout << "size occ_sign_change: " << occ_sign_change.size()
<< std::endl;
           occ_sign_change[ remove_node_v[i] ]++;
        }
    }

    remove_node_v.clear();

}



Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net