Boost logo

Boost Users :

Subject: [Boost-users] boost::multi_array SWIG binding
From: NJ Duncan (n.j.duncan_at_[hidden])
Date: 2009-06-10 13:29:24


Hi all,

I'm fairly new to C++ and learning as I go, but there is very little info
out there on my particular problem.

I am trying to turn a model I've written in C++ into a python module
using SWIG.
The main problems I'm having are initializing Boost multiarray containers then
getting data into and out of them.

Here is some sample code:

#include <iostream>
#include <vector>
#include <algorithm>
#include "boost/multi_array.hpp"

typedef boost::multi_array<double,2> array_typef;
typedef boost::multi_array<int,2> array_typei;

class G2G_hydro_model {
public:

array_typei A;
array_typef S;

G2G_hydro_model(int A_ncols,int A_nrows,int S_ncols,int S_nrows):,
A(boost::extents[A_ncols][A_nrows]), S(boost::extents[S_ncols][S_nrows])
{};

~G2G_hydro_model(void)
{};

void read_floating(int x, int y, array_typef& data, double& element);

void write_floating(int x, int y, array_typef& data, double& element);

void write_integer(int x, int y, array_typei& data, int& element);

void functions_to_do_stuff(array_typef&,array_typei&)

};

void G2G_hydro_model::read_floating(int x, int y, array_typef data,
double element)
{element = data[x][y];}

void G2G_hydro_model::write_floating(int x, int y, double element,
array_typef data)
{data[x][y] = element;}

void G2G_hydro_model::write_integer(int x, int y, int element,
array_typei data)
{data[x][y] = element;}

Code is pushed through SWIG to create bindings, then compiled as a
linked library.
Compiles ok with no warnings and Python accepts the module.

But when I try to use with Python code like this:

import sys
import numpy as np
import G2G

h = G2G4.G2G_hydro_model(A.cols,A.nrows,S.cols,S.rows)

element = 9

for x in range(0,A.cols)
     for y in range(0,A.rows)
         h.write_integer(x, y, element, h.A)

Unfortunately I get the following error message:

python: /usr/include/boost/multi_array/multi_array_ref.hpp:481:
boost::multi_array_ref<T,
NumDims>& boost::multi_array_ref<T, NumDims>::operator=(const
ConstMultiArray&)
[with ConstMultiArray = boost::multi_array<double, 2ul,
std::allocator<double> >,
T = double, long unsigned int NumDims = 2ul]: Assertion
`std::equal(other.shape(),
other.shape()+this->num_dimensions(), this->shape())' failed.

I think I have assigned the array extents incorrectly,
but I'm not sure of the proper way to do this as part of a C++ class.

Any ideas, I'm starting to pull my hair out, I hope there is a simple answer.

Many Thanks

Niall

-- 
__________________________________________________________________
Niall Duncan, Postgraduate Student
Institute for Energy Systems, School of Engineering and Electronics
The University of Edinburgh
www.see.ed.ac.uk
-- 
The University of Edinburgh is a charitable body, registered in
Scotland, with registration number SC005336.

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