MantisBT - VTK
View Issue Details
0013819VTK(No Category)public2013-01-23 23:582014-10-03 04:50
Trevor 
Joachim Pouderoux 
normalminoralways
closedfixed 
5.10.1 
6.2.0 
TBD
incorrect functionality
0013819: vtkHyperOctree->DeepCopy() provides shallow copy.
As reported on vtkUsers mailing list: http://www.vtk.org/pipermail/vtkusers/2013-January/127166.html [^]

The DeepCopy() method of vtkHyperOctree actually provides a shallow copy.
This can be seen in the following example:

/**
  @file File exhibiting possible error in VTK
  @author Trevor Irons
  @date 01/15/2013
  @version 0.0
 **/

#include <iostream>
#include "vtkHyperOctree.h"
#include "vtkHyperOctreeCursor.h"
#include "vtkDoubleArray.h"
#include "vtkDataSetAttributes.h"

using namespace std;
int main() {

    vtkHyperOctree* Octree1 = vtkHyperOctree::New();
        Octree1->SetDimension(3);
        Octree1->SetOrigin(0,0,0);


    cout << "Octree1 GetNum Leaves "<< Octree1->GetNumberOfLeaves() << std::endl;

    vtkHyperOctree* Octree2 = vtkHyperOctree::New();
        Octree1->SetDimension(3);
        Octree1->SetOrigin(0,0,0);
    cout << "Octree2 Num Leaves " << Octree2->GetNumberOfLeaves() << std::endl;

    // Now modify one of them
    vtkHyperOctreeCursor* Cursor = Octree1->NewCellCursor();
        Cursor->ToRoot();
        Octree1->SubdivideLeaf(Cursor);

    // set some leaf data
    vtkDoubleArray *leafData = vtkDoubleArray::New();
    for (int i=0; i<8; ++i) {
        leafData->InsertNextTuple1(i);
    }
    leafData->SetName("da leaf data");
    Octree1->GetLeafData()->SetScalars( leafData );

    // copy
    Octree2->DeepCopy(Octree1);

    cout << "After Subdivide Octree1 GetNum Leaves = " << Octree1->GetNumberOfLeaves() << std::endl;
    cout << "Octree2 Num Leaves (expect changed) = " << Octree2->GetNumberOfLeaves() << std::endl;

    // Leaf Data
    cout << Octree1->GetLeafData()->GetScalars() << std::endl;
    cout << Octree2->GetLeafData()->GetScalars() << std::endl;
    for (int i=0; i<8; ++i) {
        cout << Octree1->GetLeafData()->GetScalars()->GetTuple1(i) << std::endl;
        cout << Octree2->GetLeafData()->GetScalars()->GetTuple1(i) << std::endl;
    }

    // muck with Octree1
    Cursor->ToRoot();
    for (int i=0; i<8; ++i) {
        Cursor->ToChild(i);
        Octree1->SubdivideLeaf(Cursor);
        Cursor->ToParent();
    }

    cout << "After Subdivide Octree1 GetNum Leaves = " << Octree1->GetNumberOfLeaves() << std::endl;
    cout << "Octree2 Num Leaves (expect NOT changed) = " << Octree2->GetNumberOfLeaves() << std::endl;


    Octree1->Delete();
    Octree2->Delete();
    Cursor->Delete();
    leafData->Delete();
}

It is clear that DeepCopy is providing a shallow copy.
No tags attached.
Issue History
2013-01-23 23:58TrevorNew Issue
2014-10-02 10:02Berk GeveciAssigned To => Joachim Pouderoux
2014-10-02 11:40Joachim PouderouxNote Added: 0033470
2014-10-02 11:43Joachim PouderouxStatusbacklog => active development
2014-10-02 11:44Joachim PouderouxDescription Updatedbug_revision_view_page.php?rev_id=851#r851
2014-10-02 11:44Joachim PouderouxSteps to Reproduce Updatedbug_revision_view_page.php?rev_id=853#r853
2014-10-03 04:49Joachim PouderouxReproducibilityhave not tried => always
2014-10-03 04:49Joachim PouderouxStatusactive development => gerrit review
2014-10-03 04:49Joachim PouderouxTarget Version => 6.2.0
2014-10-03 04:50Joachim PouderouxNote Added: 0033564
2014-10-03 04:50Joachim PouderouxStatusgerrit review => closed
2014-10-03 04:50Joachim PouderouxResolutionopen => fixed

Notes
(0033470)
Joachim Pouderoux   
2014-10-02 11:40   
Change I393b4447: Fix vtkHyperOctree copy functions.
http://review.source.kitware.com/#/c/17328/ [^]

DeepCopy used to perform a ShallowCopy instead.
A new DeepCopy operator has been added to the internal structure
in order to copy the tree correctly.

Change-Id: I393b4447b2f1014604e9fdbd6e7286f8ec563701

------------------------------
The new output of the test is:
----------------

Octree1 GetNum Leaves 1
Octree2 Num Leaves 1
After Subdivide Octree1 GetNum Leaves = 8
Octree2 Num Leaves (expect changed) = 8
0000000000226400
0000000000226780
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
After Subdivide Octree1 GetNum Leaves = 64
Octree2 Num Leaves (expect NOT changed) = 8
(0033564)
Joachim Pouderoux   
2014-10-03 04:50   
From Trevor:
"
Addresses/resolves my particular use-case. Thank you for this fix.
"
Topic merged in master.