RDKit: SparseBitVect.h Source File

| RDKit Open-source cheminformatics and machine learning.

Loading...
Searching...
No Matches
SparseBitVect.h
Go to the documentation of this file.
1//
2// Copyright (C) 2007-2024 Greg Landrum and other RDKit contributors
3//
4// @@ All Rights Reserved @@
5// This file is part of the RDKit.
6// The contents are covered by the terms of the BSD license
7// which is included in the file license.txt, found at the root
8// of the RDKit source tree.
9//
10#include <RDGeneral/export.h>
11#ifndef __RD_SPARSEBITVECTS_H__
12#define __RD_SPARSEBITVECTS_H__
13
14#include "BitVect.h"
15
16#include <set>
17using std::set;
18#include <iterator>
19#include <algorithm>
20#include <limits>
21
22 typedef set<int> IntSet;
23 typedef IntSet::iterator IntSetIter;
24 typedef IntSet::const_iterator IntSetConstIter;
25
26//! a class for bit vectors that are sparsely occupied.
27/*!
28 SparseBitVect objects store only their on bits, in an
29 std::set.
30
31 They are, as you might expect, quite memory efficient for sparsely populated
32 vectors but become rather a nightmare if they need to be negated.
33
34 */
35 class RDKIT_DATASTRUCTS_EXPORT SparseBitVect : public BitVect {
36 public:
37 SparseBitVect() {}
38 //! initialize with a particular size;
39 explicit SparseBitVect(unsigned int size) : dp_bits(nullptr), d_size(0) {
40 _initForSize(size);
41 }
42
43 //! copy constructor
44 SparseBitVect(const SparseBitVect &other) : BitVect(other) {
45 d_size = 0;
46 dp_bits = nullptr;
47 _initForSize(other.getNumBits());
48 IntSet *bv = other.dp_bits;
49 std::copy(bv->begin(), bv->end(), std::inserter(*dp_bits, dp_bits->end()));
50 }
51 //! construct from a string pickle
52 SparseBitVect(const std::string &pkl);
53 //! construct from a text pickle
54 SparseBitVect(const char *data, const unsigned int dataLen);
55
56 SparseBitVect &operator=(const SparseBitVect &);
57 ~SparseBitVect() override { delete dp_bits; }
58
59 bool operator[](const unsigned int which) const override;
60 SparseBitVect operator|(const SparseBitVect &) const;
61 SparseBitVect operator&(const SparseBitVect &) const;
62 SparseBitVect operator^(const SparseBitVect &) const;
63 SparseBitVect operator~() const;
64
65 //! returns a (const) pointer to our raw storage
66 const IntSet *getBitSet() const { return dp_bits; }
67
68 unsigned int getNumBits() const override { return d_size; }
69 bool setBit(const unsigned int which) override;
70 bool setBit(const IntSetIter which);
71 bool unsetBit(const unsigned int which) override;
72 bool getBit(const unsigned int which) const override;
73 bool getBit(const IntVectIter which) const;
74 bool getBit(const IntSetIter which) const;
75
76 unsigned int getNumOnBits() const override {
77 return static_cast<unsigned int>(dp_bits->size());
78 }
79 unsigned int getNumOffBits() const override {
80 return d_size - static_cast<unsigned int>(dp_bits->size());
81 }
82
83 std::string toString() const override;
84
85 void getOnBits(IntVect &v) const override;
86 void clearBits() override { dp_bits->clear(); }
87 IntSet *dp_bits{
88 nullptr}; //!< our raw data, exposed for the sake of efficiency
89
90 bool operator==(const SparseBitVect &o) const {
91 return *dp_bits == *o.dp_bits;
92 }
93 bool operator!=(const SparseBitVect &o) const {
94 return *dp_bits != *o.dp_bits;
95 }
96
97 private:
98 unsigned int d_size{0};
99 void _initForSize(const unsigned int size) override;
100 bool checkIndex(const unsigned int idx) const {
101 return idx < d_size || (idx == d_size &&
102 d_size == std::numeric_limits<unsigned int>::max());
103 }
104 template <typename T>
105 bool checkIndex(const T which) const {
106 return *which >= 0 && static_cast<unsigned int>(*which) < d_size;
107 }
108};
109
110#endif
BitVect.h
IntVect
std::vector< int > IntVect
Definition BitVect.h:17
IntVectIter
IntVect::iterator IntVectIter
Definition BitVect.h:18
IntSetIter
IntSet::iterator IntSetIter
Definition SparseBitVect.h:23
IntSetConstIter
IntSet::const_iterator IntSetConstIter
Definition SparseBitVect.h:24
IntSet
set< int > IntSet
Definition SparseBitVect.h:22
BitVect
Abstract base class for storing BitVectors.
Definition BitVect.h:24
BitVect::size
unsigned int size() const
Definition BitVect.h:62
SparseBitVect::setBit
bool setBit(const unsigned int which) override
sets a particular bit and returns its original value
SparseBitVect::getNumOffBits
unsigned int getNumOffBits() const override
returns the number of off bits
Definition SparseBitVect.h:79
SparseBitVect::getBit
bool getBit(const IntSetIter which) const
SparseBitVect::SparseBitVect
SparseBitVect()
Definition SparseBitVect.h:37
SparseBitVect::getNumBits
unsigned int getNumBits() const override
returns the number of bits (the length of the BitVect)
Definition SparseBitVect.h:68
SparseBitVect::operator|
SparseBitVect operator|(const SparseBitVect &) const
SparseBitVect::getBit
bool getBit(const unsigned int which) const override
returns the value of a particular bit
SparseBitVect::clearBits
void clearBits() override
clears (sets to off) all of our bits
Definition SparseBitVect.h:86
SparseBitVect::operator&
SparseBitVect operator&(const SparseBitVect &) const
SparseBitVect::~SparseBitVect
~SparseBitVect() override
Definition SparseBitVect.h:57
SparseBitVect::unsetBit
bool unsetBit(const unsigned int which) override
unsets a particular bit and returns its original value
SparseBitVect::operator=
SparseBitVect & operator=(const SparseBitVect &)
SparseBitVect::operator~
SparseBitVect operator~() const
SparseBitVect::getNumOnBits
unsigned int getNumOnBits() const override
returns the number of on bits
Definition SparseBitVect.h:76
SparseBitVect::getOnBits
void getOnBits(IntVect &v) const override
replaces the contents of v with indices of our on bits
SparseBitVect::operator!=
bool operator!=(const SparseBitVect &o) const
Definition SparseBitVect.h:93
SparseBitVect::SparseBitVect
SparseBitVect(const char *data, const unsigned int dataLen)
construct from a text pickle
SparseBitVect::setBit
bool setBit(const IntSetIter which)
SparseBitVect::operator[]
bool operator[](const unsigned int which) const override
SparseBitVect::operator==
bool operator==(const SparseBitVect &o) const
Definition SparseBitVect.h:90
SparseBitVect::operator^
SparseBitVect operator^(const SparseBitVect &) const
SparseBitVect::SparseBitVect
SparseBitVect(unsigned int size)
initialize with a particular size;
Definition SparseBitVect.h:39
SparseBitVect::dp_bits
IntSet * dp_bits
our raw data, exposed for the sake of efficiency
Definition SparseBitVect.h:87
SparseBitVect::toString
std::string toString() const override
returns a serialized (pickled) version of this BitVect
SparseBitVect::getBit
bool getBit(const IntVectIter which) const
SparseBitVect::SparseBitVect
SparseBitVect(const SparseBitVect &other)
copy constructor
Definition SparseBitVect.h:44
SparseBitVect::SparseBitVect
SparseBitVect(const std::string &pkl)
construct from a string pickle
SparseBitVect::getBitSet
const IntSet * getBitSet() const
returns a (const) pointer to our raw storage
Definition SparseBitVect.h:66
export.h
RDKIT_DATASTRUCTS_EXPORT
#define RDKIT_DATASTRUCTS_EXPORT
Definition export.h:89