---
name: "mlpack_tree_TreeTraits"
section: "3"
platform: "linux"
package: "mlpack-doc"
version: "1.0.10-1"
release: "Debian 8 (Jessie)"
platforms: ["linux"]
url: "https://new.carta.tech/mlpack_tree_TreeTraits"
---

# mlpack\_tree\_TreeTraits(3)

The TreeTraits class provides compile-time information on the characteristics of a given tree type.

## NAME

mlpack::tree::TreeTraits\< TreeType \> -

The **TreeTraits** class provides compile-time information on the characteristics of a given tree type.

## SYNOPSIS

### Static Public Attributes

static const bool **FirstPointIsCentroid** = false\
 *This is true if Point(0) is the centroid of the node.*  static const bool **HasOverlappingChildren** = true\
 *This is true if the subspaces represented by the children of a node can overlap.*  static const bool **HasSelfChildren** = false\
 *This is true if the points contained in the first child of a node (Child(0)) are also contained in that node.*  static const bool **RearrangesDataset** = false\
 *This is true if the tree rearranges points in the dataset when it is built.*

## Detailed Description

### template\<typename TreeType\>class mlpack::tree::TreeTraits\< TreeType \>

The **TreeTraits** class provides compile-time information on the characteristics of a given tree type.

These include traits such as whether or not a node knows the distance to its parent node, or whether or not the subspaces represented by children can overlap.

These traits can be used for static compile-time optimization:

```
// This if statement will be optimized out at compile time!
if (TreeTraits<TreeType>::HasOverlappingChildren == false)
{
  // Do a simpler computation because no children overlap.
}
else
{
  // Do the full, complex calculation.
}
```

The traits can also be used in conjunction with SFINAE to write specialized versions of functions:

```
template<typename TreeType>
void Compute(TreeType& node,
             boost::enable_if<
                 TreeTraits<TreeType>::RearrangesDataset>::type*)
{
  // Computation where special dataset-rearranging tree constructor is
  // called.
}
template<typename TreeType>
void Compute(TreeType& node,
             boost::enable_if<
                 !TreeTraits<TreeType>::RearrangesDataset>::type*)
{
  // Computation where normal tree constructor is called.
}
```

In those two examples, the boost::enable\_if\<\> class takes a boolean template parameter which allows that function to be called when the boolean is true.

Each trait must be a static const value and not a function; only const values can be used as template parameters (with the exception of constexprs, which are a C++11 feature; but MLPACK is not using C++11). By default (the unspecialized implementation of **TreeTraits**), each parameter is set to make as few assumptions about the tree as possible; so, even if **TreeTraits** is not specialized for a particular tree type, tree-based algorithms should still work.

When you write your own tree, you must specialize the **TreeTraits** class to your tree type and set the corresponding values appropriately. See **mlpack/core/tree/binary\_space\_tree/traits.hpp** for an example.

Definition at line 88 of file tree\_traits.hpp.

## Member Data Documentation

### template\<typename TreeType \> const bool mlpack::tree::TreeTraits\< TreeType \>::FirstPointIsCentroid = false` [static]`

This is true if Point(0) is the centroid of the node.

Definition at line 100 of file tree\_traits.hpp.

### template\<typename TreeType \> const bool mlpack::tree::TreeTraits\< TreeType \>::HasOverlappingChildren = true` [static]`

This is true if the subspaces represented by the children of a node can overlap.

Definition at line 95 of file tree\_traits.hpp.

### template\<typename TreeType \> const bool mlpack::tree::TreeTraits\< TreeType \>::HasSelfChildren = false` [static]`

This is true if the points contained in the first child of a node (Child(0)) are also contained in that node.

Definition at line 106 of file tree\_traits.hpp.

### template\<typename TreeType \> const bool mlpack::tree::TreeTraits\< TreeType \>::RearrangesDataset = false` [static]`

This is true if the tree rearranges points in the dataset when it is built.

Definition at line 111 of file tree\_traits.hpp.

## Author

Generated automatically by Doxygen for MLPACK from the source code.
