     bbox operator()(bbox a, bbox b)
     {
         // lower left corner
-        float2 ll = make_float2(min(a.first.x, b.first.x), min(a.first.y, b.first.y));
+        point2d ll(min(a.first.x, b.first.x), min(a.first.y, b.first.y));
         
         // upper right corner
-        float2 ur = make_float2(max(a.second.x, b.second.x), max(a.second.y, b.second.y));
+        point2d ur(max(a.second.x, b.second.x), max(a.second.y, b.second.y));
 
         return bbox(ll, ur);
     }

struct bbox_transformation
{
    __host__ __device__
    bbox operator()(float2 point)
    {
        return bbox(point, point);
    }

    const size_t N = 40;
    
    // allocate storage for points
    thrust::device_vector<point2d> points(N);

    // generate some random points in the unit square
    for(size_t i = 0; i < N; i++)
        points[i] = point2d( ((float) rand() / (RAND_MAX + 1.0)), ((float) rand() / (RAND_MAX + 1.0)) );

    // initial bounding box contains first point
    bbox init = bbox(points[0], points[0]);
