[mlpack-git] [mlpack/mlpack] Use move semantics to set a given reference tree in NeighborSearch class. (#765)
Ryan Curtin
notifications at github.com
Tue Aug 23 17:53:53 EDT 2016
Ok, I like the approach you have proposed. We avoid exposing the mappings problem to the user, and instead if they pass a tree that has been mapped, it is their responsibility to apply the mappings. My only suggestion is that we make it `Train(const TreeType& tree)`, so that the user knows their tree will not be modified but instead the tree will be copied.
Long ago, before we had C++11 which gave us rvalue references, this would have been a much trickier question, but now, you are right, we can just use `Train(TreeType&& tree)` so that the user can allow the `NeighborSearch` object to take ownership of the tree.
But, there is still one use case I want to consider that this approach doesn't address... what if the user wants to create their own tree that `NeighborSearch` can use, and they don't want to copy the tree when they call `Train()`, but they then want to use that tree for something else? Trees can be very large, so, if e.g. a user wanted to use a tree with `KNN` then with `KFN`, they should be able to do this without needing to copy the tree.
I guess it is possible to provide
``
TreeType&& ReferenceTree() { return std::move(*referenceTree); }
```
and then a user can do
```
TreeType getMyTreeBack = std::move(knn.ReferenceTree());
```
What do you think? Is there a better way to do this? It seems a bit odd to make the user go to weird lengths like this:
```
// Build custom tree and train the model.
TreeType myTree(myData);
KNN knn;
knn.Train(std::move(myTree));
arma::mat distances;
arma::Mat<size_t> neighbors;
knn.Search(3, neighbors, distances);
// Create a KFN model too and reuse the tree.
KFN kfn;
kfn.Train(std::move(knn.ReferenceTree()));
// I'm ignoring the fact that we have to reset the statistic for now...
arma::mat kfnDistances;
arma::Mat<size_t> kfnNeighbors;
kfn.Search(3, kfnNeighbors, kfnDistances);
```
That seems a bit awkward, but it's consistent with the rest of the code, so I am not sure if there is any better way to do it... let me know if you have any other ideas.
I'll try and find time to do a more detailed review of the code shortly.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/mlpack/mlpack/pull/765#issuecomment-241892195
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mailman.cc.gatech.edu/pipermail/mlpack-git/attachments/20160823/dae387d5/attachment-0001.html>
More information about the mlpack-git
mailing list