44#ifndef TPETRA_DETAILS_FIXEDHASHTABLE_DECL_HPP
45#define TPETRA_DETAILS_FIXEDHASHTABLE_DECL_HPP
47#include "Tpetra_Details_Hash.hpp"
50#include "Teuchos_Describable.hpp"
51#include "Teuchos_FancyOStream.hpp"
52#include "Teuchos_VerbosityLevel.hpp"
53#include "Kokkos_Core.hpp"
54#include "Kokkos_ArithTraits.hpp"
84template<
class KeyType,
89 typedef typename DeviceType::execution_space execution_space;
90 typedef typename DeviceType::memory_space memory_space;
91 typedef Kokkos::Device<execution_space, memory_space> device_type;
103 typedef typename Kokkos::View<
const offset_type*, Kokkos::LayoutLeft,
104 device_type> ptr_type;
111 typedef typename Kokkos::View<const Kokkos::pair<KeyType, ValueType>*,
112 Kokkos::LayoutLeft, device_type> val_type;
120 KOKKOS_INLINE_FUNCTION
bool hasContiguousValues ()
const {
121 return contiguousValues_;
128 typedef Kokkos::View<const KeyType*, Kokkos::LayoutLeft, device_type>
keys_type;
167 const ValueType startingValue);
181 const ValueType startingValue);
202 const KeyType firstContigKey,
203 const KeyType lastContigKey,
204 const ValueType startingValue);
222 const KeyType firstContigKey,
223 const KeyType lastContigKey,
224 const ValueType startingValue);
235 const Teuchos::ArrayView<const ValueType>& vals);
237 template<
class K,
class V,
class D>
245 template<
class InDeviceType>
247 typename std::enable_if<! std::is_same<DeviceType, InDeviceType>::value,
int>::type* = NULL)
249 using Kokkos::ViewAllocateWithoutInitializing;
250 typedef typename ptr_type::non_const_type nonconst_ptr_type;
251 typedef typename val_type::non_const_type nonconst_val_type;
261 nonconst_ptr_type ptr (ViewAllocateWithoutInitializing (
"Tpetra::FixedHashTable::ptr"),
262 src.ptr_.extent (0));
264 nonconst_val_type val (ViewAllocateWithoutInitializing (
"Tpetra::FixedHashTable::val"),
265 src.val_.extent (0));
269 Kokkos::deep_copy (execution_space(), val, src.val_);
273 this->minKey_ = src.minKey_;
274 this->maxKey_ = src.maxKey_;
275 this->minVal_ = src.minVal_;
276 this->maxVal_ = src.maxVal_;
277 this->firstContigKey_ = src.firstContigKey_;
278 this->lastContigKey_ = src.lastContigKey_;
279 this->contiguousValues_ = src.contiguousValues_;
280 this->checkedForDuplicateKeys_ = src.checkedForDuplicateKeys_;
281 this->hasDuplicateKeys_ = src.hasDuplicateKeys_;
285 KOKKOS_INLINE_FUNCTION ValueType
get (
const KeyType& key)
const {
286 const offset_type size = this->getSize ();
290 return Tpetra::Details::OrdinalTraits<ValueType>::invalid ();
295 if (this->hasContiguousValues () &&
296 key >= firstContigKey_ && key <= lastContigKey_) {
297 return static_cast<ValueType
> (key - firstContigKey_) + this->
minVal ();
303 const offset_type start = ptr_[hashVal];
304 const offset_type end = ptr_[hashVal+1];
305 for (offset_type k = start; k < end; ++k) {
306 if (val_[k].first == key) {
307 return val_[k].second;
313 return Tpetra::Details::OrdinalTraits<ValueType>::invalid ();
319 KOKKOS_INLINE_FUNCTION offset_type
numPairs ()
const {
325 if (this->hasContiguousValues ()) {
326 return val_.extent (0) +
static_cast<offset_type
> (lastContigKey_ - firstContigKey_);
329 return val_.extent (0);
341 KOKKOS_INLINE_FUNCTION KeyType
minKey ()
const {
353 KOKKOS_INLINE_FUNCTION KeyType
maxKey ()
const {
364 KOKKOS_INLINE_FUNCTION ValueType
minVal ()
const {
375 KOKKOS_INLINE_FUNCTION ValueType
maxVal ()
const {
404 describe (Teuchos::FancyOStream &out,
405 const Teuchos::EVerbosityLevel verbLevel=
406 Teuchos::Describable::verbLevel_default)
const;
420 KeyType minKey_ = ::Kokkos::Details::ArithTraits<KeyType>::max();
427 KeyType maxKey_ = ::Kokkos::Details::ArithTraits<KeyType>::is_integer ?
428 ::Kokkos::Details::ArithTraits<KeyType>::min() :
429 -::Kokkos::
Details::ArithTraits<KeyType>::max();
435 ValueType minVal_ = ::Kokkos::Details::ArithTraits<ValueType>::max();
441 ValueType maxVal_ = ::Kokkos::Details::ArithTraits<ValueType>::is_integer ?
442 ::Kokkos::Details::ArithTraits<ValueType>::min() :
443 -::Kokkos::
Details::ArithTraits<ValueType>::max();
451 KeyType firstContigKey_ = ::Kokkos::Details::ArithTraits<KeyType>::max();
459 KeyType lastContigKey_ = ::Kokkos::Details::ArithTraits<KeyType>::is_integer ?
460 ::Kokkos::Details::ArithTraits<KeyType>::min() :
461 -::Kokkos::
Details::ArithTraits<KeyType>::max();
469 bool contiguousValues_ =
true;
477 bool checkedForDuplicateKeys_ =
true;
482 bool hasDuplicateKeys_ =
false;
488 bool checkForDuplicateKeys ()
const;
491 KOKKOS_INLINE_FUNCTION offset_type getSize ()
const {
492 return ptr_.extent (0) == 0 ?
493 static_cast<offset_type
> (0) :
494 static_cast<offset_type
> (ptr_.extent (0) - 1);
497 typedef Kokkos::View<
const KeyType*,
498 typename ptr_type::HostMirror::array_layout,
499 typename ptr_type::HostMirror::execution_space,
500 Kokkos::MemoryUnmanaged> host_input_keys_type;
502 typedef Kokkos::View<
const ValueType*,
503 typename ptr_type::HostMirror::array_layout,
504 typename ptr_type::HostMirror::execution_space,
505 Kokkos::MemoryUnmanaged> host_input_vals_type;
515 const ValueType startingValue,
518 KeyType firstContigKey,
519 KeyType lastContigKey,
520 const bool computeInitContigKeys);
529 init (
const host_input_keys_type& keys,
530 const host_input_vals_type& vals,
Import KokkosSparse::OrdinalTraits, a traits class for "invalid" (flag) values of integer types,...
Declare and define Tpetra::Details::copyOffsets, an implementation detail of Tpetra (in particular,...
KOKKOS_INLINE_FUNCTION ValueType minVal() const
The minimum value in the table.
std::string description() const
Implementation of Teuchos::Describable interface.
bool hasDuplicateKeys()
Whether the table has any duplicate keys.
FixedHashTable(const FixedHashTable< KeyType, ValueType, InDeviceType > &src, typename std::enable_if<! std::is_same< DeviceType, InDeviceType >::value, int >::type *=NULL)
"Copy" constructor that takes a FixedHashTable with the same KeyType and ValueType,...
KOKKOS_INLINE_FUNCTION offset_type numPairs() const
Number of (key, value) pairs in the table.
Kokkos::View< const KeyType *, Kokkos::LayoutLeft, device_type > keys_type
Type of a 1-D Kokkos::View (array) used to store keys.
KOKKOS_INLINE_FUNCTION KeyType maxKey() const
The maximum key in the table.
KOKKOS_INLINE_FUNCTION ValueType maxVal() const
The maximum value in the table.
KOKKOS_INLINE_FUNCTION KeyType minKey() const
The minimum key in the table.
KOKKOS_DEFAULTED_FUNCTION FixedHashTable()=default
Default constructor; makes an empty table.
KOKKOS_INLINE_FUNCTION ValueType get(const KeyType &key) const
Get the value corresponding to the given key.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print this object with the given verbosity to the output stream.
Implementation details of Tpetra.
void copyOffsets(const OutputViewType &dst, const InputViewType &src)
Copy row offsets (in a sparse graph or matrix) from src to dst. The offsets may have different types.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
The hash function for FixedHashTable.
ResultType result_type
Type of the return value of the hash function.
static KOKKOS_INLINE_FUNCTION result_type hashFunc(const argument_type &key, const offset_type &size)
The hash function.
OffsetType offset_type
Type of offsets into the hash table's array of (key,value) pairs.