12#ifndef RD_FINGERPRINTGEN_H_2018_05
13#define RD_FINGERPRINTGEN_H_2018_05
22#include <boost/property_tree/ptree_fwd.hpp>
30 std::map<std::uint64_t,
31 std::vector<std::pair<std::uint32_t, std::uint32_t>>>;
32 using bitPathsType = std::map<std::uint64_t, std::vector<std::vector<int>>>;
35 std::map<std::uint64_t, std::vector<std::vector<int>>>;
77 std::unique_ptr<atomToBitsType> atomToBitsHolder;
78 std::unique_ptr<bitInfoMapType> bitInfoMapHolder;
79 std::unique_ptr<bitPathsType> bitPathsHolder;
80 std::unique_ptr<atomCountsType> atomCountsHolder;
81 std::unique_ptr<atomsPerBitType> atomsPerBitHolder;
93 const std::vector<std::uint32_t> countBounds,
95 std::uint32_t numBitsPerFeature = 1,
96 bool includeChirality =
false);
110 virtual void toJSON(boost::property_tree::ptree &pt)
const;
111 virtual void fromJSON(
const boost::property_tree::ptree &pt);
130template <
typename OutputType>
145 const std::vector<std::uint32_t> *atomInvariants,
146 const std::vector<std::uint32_t> *bondInvariants,
148 const bool hashResults =
false,
149 const std::uint64_t fpSize = 0)
const = 0;
151 size_t bitId)
const = 0;
160template <
typename OutputType>
162 :
private boost::noncopyable {
193 const std::vector<std::uint32_t> *fromAtoms =
nullptr,
194 const std::vector<std::uint32_t> *ignoreAtoms =
nullptr,
196 const std::vector<std::uint32_t> *atomInvariants =
nullptr,
197 const std::vector<std::uint32_t> *bondInvariants =
nullptr,
198 const bool hashResults =
false)
const = 0;
207 virtual void toJSON(boost::property_tree::ptree &)
const {};
208 virtual void fromJSON(
const boost::property_tree::ptree &) {};
227 :
private boost::noncopyable {
238 const ROMol &mol)
const = 0;
247 virtual void toJSON(boost::property_tree::ptree &)
const {};
248 virtual void fromJSON(
const boost::property_tree::ptree &) {};
259 :
private boost::noncopyable {
270 const ROMol &mol)
const = 0;
279 virtual void toJSON(boost::property_tree::ptree &)
const {};
280 virtual void fromJSON(
const boost::property_tree::ptree &) {};
301 const std::vector<std::uint32_t> *fromAtoms_arg,
302 const std::vector<std::uint32_t> *ignoreAtoms_arg,
int confId_arg,
304 const std::vector<std::uint32_t> *customAtomInvariants_arg,
305 const std::vector<std::uint32_t> *customBondInvariants_arg)
319template <
typename OutputType>
321 :
private boost::noncopyable {
326 const bool df_ownsAtomInvGenerator;
327 const bool df_ownsBondInvGenerator;
329 std::unique_ptr<SparseIntVect<OutputType>> getFingerprintHelper(
331 const std::uint64_t fpSize = 0)
const;
339 bool ownsAtomInvGenerator =
false,
bool ownsBondInvGenerator =
false);
345 return dp_fingerprintArguments;
361 const std::vector<const ROMol *> &mols,
int numThreads = 1)
const;
364 const std::vector<const ROMol *> &mols,
int numThreads = 1)
const;
366 std::vector<std::unique_ptr<SparseIntVect<std::uint32_t>>>
368 int numThreads = 1)
const;
370 std::vector<std::unique_ptr<SparseIntVect<OutputType>>>
372 int numThreads = 1)
const;
375 const ROMol &mol,
const std::vector<std::uint32_t> *fromAtoms =
nullptr,
376 const std::vector<std::uint32_t> *ignoreAtoms =
nullptr,
int confId = -1,
378 const std::vector<std::uint32_t> *customAtomInvariants =
nullptr,
379 const std::vector<std::uint32_t> *customBondInvariants =
nullptr)
const {
381 additionalOutput, customAtomInvariants,
382 customBondInvariants);
387 const ROMol &mol,
const std::vector<std::uint32_t> *fromAtoms =
nullptr,
388 const std::vector<std::uint32_t> *ignoreAtoms =
nullptr,
int confId = -1,
390 const std::vector<std::uint32_t> *customAtomInvariants =
nullptr,
391 const std::vector<std::uint32_t> *customBondInvariants =
nullptr)
const {
393 additionalOutput, customAtomInvariants,
394 customBondInvariants);
399 const ROMol &mol,
const std::vector<std::uint32_t> *fromAtoms =
nullptr,
400 const std::vector<std::uint32_t> *ignoreAtoms =
nullptr,
int confId = -1,
402 const std::vector<std::uint32_t> *customAtomInvariants =
nullptr,
403 const std::vector<std::uint32_t> *customBondInvariants =
nullptr)
const {
405 additionalOutput, customAtomInvariants,
406 customBondInvariants);
411 const ROMol &mol,
const std::vector<std::uint32_t> *fromAtoms =
nullptr,
412 const std::vector<std::uint32_t> *ignoreAtoms =
nullptr,
int confId = -1,
414 const std::vector<std::uint32_t> *customAtomInvariants =
nullptr,
415 const std::vector<std::uint32_t> *customBondInvariants =
nullptr)
const {
417 additionalOutput, customAtomInvariants,
418 customBondInvariants);
423 void toJSON(boost::property_tree::ptree &pt)
const;
424 void fromJSON(
const boost::property_tree::ptree &pt);
427template <
typename OutputType>
438 const ROMol &,
const std::vector<std::uint32_t> *,
440 const std::vector<std::uint32_t> *,
441 const std::vector<std::uint32_t> *)
const;
444 const ROMol &,
const std::vector<std::uint32_t> *,
446 const std::vector<std::uint32_t> *,
447 const std::vector<std::uint32_t> *)
const;
450 const ROMol &,
const std::vector<std::uint32_t> *,
452 const std::vector<std::uint32_t> *,
453 const std::vector<std::uint32_t> *)
const;
456 const ROMol &,
const std::vector<std::uint32_t> *,
458 const std::vector<std::uint32_t> *,
459 const std::vector<std::uint32_t> *)
const;
462 const ROMol &,
const std::vector<std::uint32_t> *,
464 const std::vector<std::uint32_t> *,
465 const std::vector<std::uint32_t> *)
const;
468 const ROMol &,
const std::vector<std::uint32_t> *,
470 const std::vector<std::uint32_t> *,
471 const std::vector<std::uint32_t> *)
const;
474 const ROMol &,
const std::vector<std::uint32_t> *,
476 const std::vector<std::uint32_t> *,
477 const std::vector<std::uint32_t> *)
const;
480 const ROMol &,
const std::vector<std::uint32_t> *,
482 const std::vector<std::uint32_t> *,
483 const std::vector<std::uint32_t> *)
const;
495 :
public std::exception {
502 const char *
what() const noexcept
override {
return _msg.c_str(); }
527 const std::vector<const
ROMol *> molVector,
FPType fPType);
533 const std::vector<const
ROMol *> molVector,
FPType fPType);
a class for bit vectors that are densely occupied
abstract base class that generates atom-environments from a molecule
virtual ~AtomEnvironmentGenerator()
virtual void toJSON(boost::property_tree::ptree &) const
virtual void fromJSON(const boost::property_tree::ptree &)
virtual std::vector< AtomEnvironment< OutputType > * > getEnvironments(const ROMol &mol, FingerprintArguments *arguments, const std::vector< std::uint32_t > *fromAtoms=nullptr, const std::vector< std::uint32_t > *ignoreAtoms=nullptr, const int confId=-1, const AdditionalOutput *additionalOutput=nullptr, const std::vector< std::uint32_t > *atomInvariants=nullptr, const std::vector< std::uint32_t > *bondInvariants=nullptr, const bool hashResults=false) const =0
generate and return all atom-envorinments from a molecule
const FingerprintArguments * dp_fingerprintArguments
virtual std::string infoString() const =0
method that returns information about this /c AtomEnvironmentGenerator and its arguments if any
virtual OutputType getResultSize() const =0
Returns the size of the fingerprint based on arguments.
abstract base class that holds atom-environments that will be hashed to generate the fingerprint
virtual ~AtomEnvironment()
virtual void updateAdditionalOutput(AdditionalOutput *AdditionalOutput, size_t bitId) const =0
virtual OutputType getBitId(FingerprintArguments *arguments, const std::vector< std::uint32_t > *atomInvariants, const std::vector< std::uint32_t > *bondInvariants, AdditionalOutput *AdditionalOutput, const bool hashResults=false, const std::uint64_t fpSize=0) const =0
calculates and returns the bit id to be set for this atom-environment
abstract base class for atom invariants generators
virtual void toJSON(boost::property_tree::ptree &) const
virtual ~AtomInvariantsGenerator()
virtual std::string infoString() const =0
method that returns information about this /c AtomInvariantsGenerator and its arguments
virtual AtomInvariantsGenerator * clone() const =0
virtual void fromJSON(const boost::property_tree::ptree &)
virtual std::vector< std::uint32_t > * getAtomInvariants(const ROMol &mol) const =0
get atom invariants from a molecule
abstract base class for bond invariants generators
virtual std::string infoString() const =0
method that returns information about this /c BondInvariantsGenerator and its arguments
virtual ~BondInvariantsGenerator()
virtual BondInvariantsGenerator * clone() const =0
virtual void toJSON(boost::property_tree::ptree &) const
virtual std::vector< std::uint32_t > * getBondInvariants(const ROMol &mol) const =0
get bond invariants from a molecule
virtual void fromJSON(const boost::property_tree::ptree &)
Abstract base class that holds molecule independent arguments that are common amongst all fingerprint...
virtual void toJSON(boost::property_tree::ptree &pt) const
virtual ~FingerprintArguments()
virtual std::string infoString() const =0
method that returns information string about the fingerprint specific argument set and the arguments ...
FingerprintArguments()=default
virtual void fromJSON(const boost::property_tree::ptree &pt)
FingerprintArguments(bool countSimulation, const std::vector< std::uint32_t > countBounds, std::uint32_t fpSize, std::uint32_t numBitsPerFeature=1, bool includeChirality=false)
std::uint32_t d_numBitsPerFeature
std::string commonArgumentsString() const
method that returns information string about common fingerprinting arguments' values
std::vector< std::uint32_t > d_countBounds
class that generates same fingerprint style for different output formats
std::unique_ptr< SparseBitVect > getSparseFingerprint(const ROMol &mol, FingerprintFuncArguments &args) const
FingerprintGenerator(AtomEnvironmentGenerator< OutputType > *atomEnvironmentGenerator, FingerprintArguments *fingerprintArguments, AtomInvariantsGenerator *atomInvariantsGenerator=nullptr, BondInvariantsGenerator *bondInvariantsGenerator=nullptr, bool ownsAtomInvGenerator=false, bool ownsBondInvGenerator=false)
std::unique_ptr< ExplicitBitVect > getFingerprint(const ROMol &mol, FingerprintFuncArguments &args) const
std::string infoString() const
std::unique_ptr< SparseIntVect< std::uint32_t > > getCountFingerprint(const ROMol &mol, FingerprintFuncArguments &args) const
std::vector< std::unique_ptr< ExplicitBitVect > > getFingerprints(const std::vector< const ROMol * > &mols, int numThreads=1) const
void fromJSON(const boost::property_tree::ptree &pt)
std::vector< std::unique_ptr< SparseIntVect< OutputType > > > getSparseCountFingerprints(const std::vector< const ROMol * > &mols, int numThreads=1) const
std::vector< std::unique_ptr< SparseIntVect< std::uint32_t > > > getCountFingerprints(const std::vector< const ROMol * > &mols, int numThreads=1) const
std::vector< std::unique_ptr< SparseBitVect > > getSparseFingerprints(const std::vector< const ROMol * > &mols, int numThreads=1) const
std::unique_ptr< SparseIntVect< OutputType > > getSparseCountFingerprint(const ROMol &mol, FingerprintFuncArguments &args) const
SparseIntVect< std::uint32_t > * getCountFingerprint(const ROMol &mol, const std::vector< std::uint32_t > *fromAtoms=nullptr, const std::vector< std::uint32_t > *ignoreAtoms=nullptr, int confId=-1, AdditionalOutput *additionalOutput=nullptr, const std::vector< std::uint32_t > *customAtomInvariants=nullptr, const std::vector< std::uint32_t > *customBondInvariants=nullptr) const
SparseBitVect * getSparseFingerprint(const ROMol &mol, const std::vector< std::uint32_t > *fromAtoms=nullptr, const std::vector< std::uint32_t > *ignoreAtoms=nullptr, int confId=-1, AdditionalOutput *additionalOutput=nullptr, const std::vector< std::uint32_t > *customAtomInvariants=nullptr, const std::vector< std::uint32_t > *customBondInvariants=nullptr) const
void toJSON(boost::property_tree::ptree &pt) const
ExplicitBitVect * getFingerprint(const ROMol &mol, const std::vector< std::uint32_t > *fromAtoms=nullptr, const std::vector< std::uint32_t > *ignoreAtoms=nullptr, int confId=-1, AdditionalOutput *additionalOutput=nullptr, const std::vector< std::uint32_t > *customAtomInvariants=nullptr, const std::vector< std::uint32_t > *customBondInvariants=nullptr) const
FingerprintArguments * getOptions()
SparseIntVect< OutputType > * getSparseCountFingerprint(const ROMol &mol, const std::vector< std::uint32_t > *fromAtoms=nullptr, const std::vector< std::uint32_t > *ignoreAtoms=nullptr, int confId=-1, AdditionalOutput *additionalOutput=nullptr, const std::vector< std::uint32_t > *customAtomInvariants=nullptr, const std::vector< std::uint32_t > *customBondInvariants=nullptr) const
const FingerprintArguments * getOptions() const
a class for efficiently storing sparse vectors of ints
UnimplementedFPException(const char *msg)
construct with an error message
~UnimplementedFPException() noexcept override=default
UnimplementedFPException(std::string msg)
construct with an error message
const char * what() const noexcept override
get the error message
a class for bit vectors that are sparsely occupied.
#define RDKIT_FINGERPRINTS_EXPORT
RDKIT_FINGERPRINTS_EXPORT SparseBitVect * getSparseFP(const ROMol &mol, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT std::vector< SparseBitVect * > * getSparseFPBulk(const std::vector< const ROMol * > molVector, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT std::vector< ExplicitBitVect * > * getFPBulk(const std::vector< const ROMol * > molVector, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT std::string generatorToJSON(const FingerprintGenerator< OutputType > &generator)
generate JSON representation of a FingerprintGenerator
RDKIT_FINGERPRINTS_EXPORT SparseIntVect< std::uint64_t > * getSparseCountFP(const ROMol &mol, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT std::vector< SparseIntVect< std::uint32_t > * > * getCountFPBulk(const std::vector< const ROMol * > molVector, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT std::unique_ptr< FingerprintGenerator< std::uint64_t > > generatorFromJSON(const std::string &jsonStr)
RDKIT_FINGERPRINTS_EXPORT std::vector< SparseIntVect< std::uint64_t > * > * getSparseCountFPBulk(const std::vector< const ROMol * > molVector, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT SparseIntVect< std::uint32_t > * getCountFP(const ROMol &mol, FPType fPType)
RDKIT_FINGERPRINTS_EXPORT ExplicitBitVect * getFP(const ROMol &mol, FPType fPType)
std::vector< std::vector< std::uint64_t > > atomToBitsType
void allocateAtomCounts()
std::vector< unsigned int > atomCountsType
bitInfoMapType * bitInfoMap
atomToBitsType * atomToBits
std::map< std::uint64_t, std::vector< std::vector< int > > > atomsPerBitType
void allocateBitInfoMap()
void allocateAtomToBits()
std::map< std::uint64_t, std::vector< std::vector< int > > > bitPathsType
std::map< std::uint64_t, std::vector< std::pair< std::uint32_t, std::uint32_t > > > bitInfoMapType
atomCountsType * atomCounts
void allocateAtomsPerBit()
atomsPerBitType * atomsPerBit
struct that makes calling the fingerprint generation functions easier
const std::vector< std::uint32_t > * customAtomInvariants
AdditionalOutput * additionalOutput
const std::vector< std::uint32_t > * customBondInvariants
const std::vector< std::uint32_t > * fromAtoms
const std::vector< std::uint32_t > * ignoreAtoms
FingerprintFuncArguments(const std::vector< std::uint32_t > *fromAtoms_arg, const std::vector< std::uint32_t > *ignoreAtoms_arg, int confId_arg, AdditionalOutput *additionalOutput_arg, const std::vector< std::uint32_t > *customAtomInvariants_arg, const std::vector< std::uint32_t > *customBondInvariants_arg)
FingerprintFuncArguments()=default