[WIP] Add Leader picker implementation (#2724)

* initial commit of Roger's contrib

* add the new file to the headers list

* clang-format

* stub of the python wrapper

* code added for testing

* code added for testing

* add LeaderPicker.seq.h

* default pickSize value

* first crude python wrapper

* Add C++ tests for the LeaderPicker
combine the thread and non-thread versions

* that was not really a test

* support providing a functor from Python

* no longer need the .seq header

* temporarily disable the threaded version to allow CI runs to pass

* some refactoring and cleanup
This commit is contained in:
Greg Landrum
2019-10-24 13:14:15 +02:00
committed by GitHub
parent 66d92b1be0
commit 6cfc8f36a7
12 changed files with 1025 additions and 108 deletions

View File

@@ -16,6 +16,8 @@
#include <numpy/arrayobject.h>
#include <map>
#include "PickerHelpers.h"
#include <DataStructs/BitVects.h>
#include <DataStructs/BitOps.h>
#include <SimDivPickers/DistPicker.h>
@@ -55,18 +57,6 @@ RDKit::INT_VECT MaxMinPicks(MaxMinPicker *picker, python::object distMat,
return res;
}
class pyobjFunctor {
public:
pyobjFunctor(python::object obj) : dp_obj(std::move(obj)) {}
~pyobjFunctor() {}
double operator()(unsigned int i, unsigned int j) {
return python::extract<double>(dp_obj(i, j));
}
private:
python::object dp_obj;
};
namespace {
template <typename T>
void LazyMaxMinHelper(MaxMinPicker *picker, T functor, unsigned int poolSize,
@@ -107,37 +97,6 @@ python::tuple LazyMaxMinPicksWithThreshold(
return python::make_tuple(res, threshold);
}
// NOTE: TANIMOTO and DICE provably return the same results for the diversity
// picking this is still here just in case we ever later want to support other
// methods.
typedef enum { TANIMOTO = 1, DICE } DistanceMethod;
template <typename BV>
class pyBVFunctor {
public:
pyBVFunctor(const std::vector<const BV *> &obj, DistanceMethod method)
: d_obj(obj), d_method(method) {}
~pyBVFunctor() {}
double operator()(unsigned int i, unsigned int j) {
double res = 0.0;
switch (d_method) {
case TANIMOTO:
res = 1. - TanimotoSimilarity(*d_obj[i], *d_obj[j]);
break;
case DICE:
res = 1. - DiceSimilarity(*d_obj[i], *d_obj[j]);
break;
default:
throw_value_error("unsupported similarity value");
}
return res;
}
private:
const std::vector<const BV *> &d_obj;
DistanceMethod d_method;
};
RDKit::INT_VECT LazyVectorMaxMinPicks(MaxMinPicker *picker, python::object objs,
int poolSize, int pickSize,
python::object firstPicks, int seed,