1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
|
//# Copyright (C) 2000,2001
//# Associated Universities, Inc. Washington DC, USA.
//#
//# This library is free software; you can redistribute it and/or modify it
//# under the terms of the GNU Library General Public License as published by
//# the Free Software Foundation; either version 2 of the License, or (at your
//# option) any later version.
//#
//# This library is distributed in the hope that it will be useful, but WITHOUT
//# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
//# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
//# License for more details.
//#
//# You should have received a copy of the GNU Library General Public License
//# along with this library; if not, write to the Free Software Foundation,
//# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA.
//#
//# Correspondence concerning AIPS++ should be addressed as follows:
//# Internet email: casa-feedback@nrao.edu.
//# Postal address: AIPS++ Project Office
//# National Radio Astronomy Observatory
//# 520 Edgemont Road
//# Charlottesville, VA 22903-2475 USA
//#
#ifndef SCIMATH_STATSDATAPROVIDER_H
#define SCIMATH_STATSDATAPROVIDER_H
#include <casacore/scimath/StatsFramework/StatisticsTypes.h>
#include <casacore/casa/aips.h>
namespace casacore {
// Abstract base class which defines interface for providing "datasets" to the
// statistics framework in cases where the data structure involved does not
// allow for a trivial means of doing so (eg, in the case of a Lattice).
template <
class AccumType, class DataIterator, class MaskIterator=const Bool *,
class WeightsIterator=DataIterator
>
class StatsDataProvider {
public:
virtual ~StatsDataProvider();
// increment the data provider to the next dataset, mask, range set, and
// weights.
virtual void operator++() = 0;
// Are there any data sets left to provide?
virtual Bool atEnd() const = 0;
// Take any actions necessary to finalize the provider. This will be called
// when atEnd() returns True.
virtual void finalize() = 0;
// get the count of elements in the current data set. When implementing this
// method, be certain to take stride into account; ie for a data set with
// nominally 100 elements that is to have a stride of two, this method
// should return 50.
virtual uInt64 getCount() = 0;
// get an iterator to the first element of the current dataset
virtual DataIterator getData() = 0;
// Get an iterator to the first element of the mask for the current dataset.
// Only called if hasMask() returns True;
virtual MaskIterator getMask() = 0;
// Get the stride for the current mask.
// Only called if hasMask() returns True.
virtual uInt getMaskStride() = 0;
// If OpenMP is enabled and statistics methods are being called in a
// multi-threaded context, get maximum number of threads that should be
// used. If zero is returned, the statistics classes will use the maximum
// number of threads available to openmp. Returning less than that helps to
// decrease overhead used by statistics methods when the maximum number of
// threads available to openmp are unnecessary. The base class
// implmentation returns 0.
virtual uInt getNMaxThreads() const;
// Get the associated range(s) of the current dataset. Only called if
// hasRanges() returns True;
virtual DataRanges getRanges() = 0;
// Get the stride for the current data set.
virtual uInt getStride() = 0;
// Get an iterator to the first weights element of the current dataset.
// Only called if hasWeights() returns True;
virtual WeightsIterator getWeights() = 0;
// Does the current data set have an associated mask?
virtual Bool hasMask() const = 0;
// Does the current data set have associated range(s)?
virtual Bool hasRanges() const = 0;
// Does the current data set have associated weights?
virtual Bool hasWeights() const = 0;
// If the associated data set has ranges, are these include (return True) or
// exclude (return False) ranges?
virtual Bool isInclude() const = 0;
// reset the provider to point to the beginning of the first data set it
// manages.
virtual void reset() = 0;
// <group>
// In general, unless you are writing statistics algorithm code, you
// shouldn't need to call these methods.
// The statistics framework calls these methods when the min and max
// posiitons are updated. It passes in the relevant index of the current sub
// dataset it is processing. Data providers can use this information to
// transform into something more useful, eg an IPosition for lattice data
// providers, so that they may be retreived easily after statistics have
// been calculated. The default implementations do nothing.
virtual void updateMaxPos(const LocationType&) {}
virtual void updateMinPos(const LocationType&) {}
// </group>
protected:
StatsDataProvider();
};
}
#ifndef CASACORE_NO_AUTO_TEMPLATES
#include <casacore/scimath/StatsFramework/StatsDataProvider.tcc>
#endif //# CASACORE_NO_AUTO_TEMPLATES
#endif
|