You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
4.7 KiB
160 lines
4.7 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: TestSortDataArray.cxx,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
|
|
/*
|
|
* Copyright 2004 Sandia Corporation.
|
|
* Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
|
|
* license for use of this work by or on behalf of the
|
|
* U.S. Government. Redistribution and use in source and binary forms, with
|
|
* or without modification, are permitted provided that this Notice and any
|
|
* statement of authorship are reproduced on all copies.
|
|
*/
|
|
// -*- c++ -*- *******************************************************
|
|
|
|
#include "vtkSortDataArray.h"
|
|
#include "vtkIntArray.h"
|
|
#include "vtkMath.h"
|
|
#include "vtkTimerLog.h"
|
|
|
|
#define ARRAY_SIZE (2*1024*1024)
|
|
// #define ARRAY_SIZE 128
|
|
|
|
int TestSortDataArray(int, char *[])
|
|
{
|
|
vtkIdType i;
|
|
vtkTimerLog *timer = vtkTimerLog::New();
|
|
|
|
cout << "Building array" << endl;
|
|
vtkIntArray *keys = vtkIntArray::New();
|
|
keys->SetNumberOfComponents(1);
|
|
keys->SetNumberOfTuples(ARRAY_SIZE);
|
|
for (i = 0; i < ARRAY_SIZE; i++)
|
|
{
|
|
keys->SetComponent(i, 0, (int)vtkMath::Random(0, ARRAY_SIZE*4));
|
|
}
|
|
|
|
cout << "Sorting array" << endl;
|
|
timer->StartTimer();
|
|
vtkSortDataArray::Sort(keys);
|
|
timer->StopTimer();
|
|
|
|
cout << "Time to sort array: " << timer->GetElapsedTime() << " sec" << endl;
|
|
|
|
for (i = 0; i < ARRAY_SIZE-1; i++)
|
|
{
|
|
if (keys->GetComponent(i, 0) > keys->GetComponent(i+1, 0))
|
|
{
|
|
cout << "Array not properly sorted!" << endl;
|
|
break;
|
|
}
|
|
}
|
|
cout << "Array consistency check finished\n" << endl;
|
|
|
|
cout << "Sorting sorted array" << endl;
|
|
timer->StartTimer();
|
|
vtkSortDataArray::Sort(keys);
|
|
timer->StopTimer();
|
|
|
|
cout << "Time to sort array: " << timer->GetElapsedTime() << " sec" << endl;
|
|
|
|
for (i = 0; i < ARRAY_SIZE-1; i++)
|
|
{
|
|
if (keys->GetComponent(i, 0) > keys->GetComponent(i+1, 0))
|
|
{
|
|
cout << "Array not properly sorted!" << endl;
|
|
break;
|
|
}
|
|
}
|
|
cout << "Array consistency check finished\n" << endl;
|
|
|
|
cout << "Building key/value arrays\n" << endl;
|
|
vtkIntArray *values = vtkIntArray::New();
|
|
values->SetNumberOfComponents(2);
|
|
values->SetNumberOfTuples(ARRAY_SIZE);
|
|
for (i = 0; i < ARRAY_SIZE; i++)
|
|
{
|
|
keys->SetComponent(i, 0, (int)vtkMath::Random(0, ARRAY_SIZE*4));
|
|
values->SetComponent(i, 0, i);
|
|
values->SetComponent(i, 1, (int)vtkMath::Random(0, ARRAY_SIZE*4));
|
|
}
|
|
vtkIntArray *saveKeys = vtkIntArray::New();
|
|
saveKeys->DeepCopy(keys);
|
|
vtkIntArray *saveValues = vtkIntArray::New();
|
|
saveValues->DeepCopy(values);
|
|
|
|
cout << "Sorting arrays" << endl;
|
|
timer->StartTimer();
|
|
vtkSortDataArray::Sort(keys, values);
|
|
timer->StopTimer();
|
|
|
|
cout << "Time to sort array: " << timer->GetElapsedTime() << " sec" << endl;
|
|
|
|
for (i = 0; i < ARRAY_SIZE-1; i++)
|
|
{
|
|
int lookup = (int)values->GetComponent(i, 0);
|
|
if (keys->GetComponent(i, 0) > keys->GetComponent(i+1, 0))
|
|
{
|
|
cout << "Array not properly sorted!" << endl;
|
|
break;
|
|
}
|
|
if (keys->GetComponent(i, 0) != saveKeys->GetComponent(lookup, 0))
|
|
{
|
|
cout << "Values array not consistent with keys array!" << endl;
|
|
break;
|
|
}
|
|
if (values->GetComponent(i, 1) != saveValues->GetComponent(lookup, 1))
|
|
{
|
|
cout << "Values array not consistent with keys array!" << endl;
|
|
break;
|
|
}
|
|
}
|
|
cout << "Array consistency check finished\n" << endl;
|
|
|
|
cout << "Sorting sorted arrays" << endl;
|
|
timer->StartTimer();
|
|
vtkSortDataArray::Sort(keys, values);
|
|
timer->StopTimer();
|
|
|
|
cout << "Time to sort array: " << timer->GetElapsedTime() << " sec" << endl;
|
|
|
|
for (i = 0; i < ARRAY_SIZE-1; i++)
|
|
{
|
|
int lookup = (int)values->GetComponent(i, 0);
|
|
if (keys->GetComponent(i, 0) > keys->GetComponent(i+1, 0))
|
|
{
|
|
cout << "Array not properly sorted!" << endl;
|
|
break;
|
|
}
|
|
if (keys->GetComponent(i, 0) != saveKeys->GetComponent(lookup, 0))
|
|
{
|
|
cout << "Values array not consistent with keys array!" << endl;
|
|
break;
|
|
}
|
|
if (values->GetComponent(i, 1) != saveValues->GetComponent(lookup, 1))
|
|
{
|
|
cout << "Values array not consistent with keys array!" << endl;
|
|
break;
|
|
}
|
|
}
|
|
cout << "Array consistency check finished\n" << endl;
|
|
|
|
timer->Delete();
|
|
keys->Delete();
|
|
values->Delete();
|
|
saveKeys->Delete();
|
|
saveValues->Delete();
|
|
|
|
return 0;
|
|
}
|
|
|