Skip to content

Commit b0851a8

Browse files
Merge pull request #917 from epam/feature/521_std_multimap_molecule_rgroups_composition
Issue #521: core: replace MultiMap in MoleculeRGroupsComposition class
2 parents 1baef9b + e12c272 commit b0851a8

File tree

2 files changed

+18
-30
lines changed

2 files changed

+18
-30
lines changed

api/tests/integration/ref/composition/basic.py.out

+9-9
Original file line numberDiff line numberDiff line change
@@ -367,15 +367,15 @@ molecule 01: C1(C2CCCC2)=C(C2CCCC2)C=CC=C1 |RG:_R1={C1CCCC1},{C1CCCC1}|
367367
fragment 1: C1CCCC1
368368
fragment 2: C1CCCC1
369369
===================================================
370-
molecule 02: C1(C2CCCCC2)=C(C2CCCC2)C=CC=C1 |RG:_R1={C1CCCC1},{C1CCCCC1}|
370+
molecule 02: C1(C2CCCCC2)=C(C2CCCC2)C=CC=C1 |RG:_R1={C1CCCCC1},{C1CCCC1}|
371371
rgroup 1
372-
fragment 1: C1CCCC1
373-
fragment 2: C1CCCCC1
372+
fragment 1: C1CCCCC1
373+
fragment 2: C1CCCC1
374374
===================================================
375-
molecule 03: C1(C2=CC=CC=C2)=C(C2CCCC2)C=CC=C1 |RG:_R1={C1CCCC1},{C1=CC=CC=C1}|
375+
molecule 03: C1(C2=CC=CC=C2)=C(C2CCCC2)C=CC=C1 |RG:_R1={C1=CC=CC=C1},{C1CCCC1}|
376376
rgroup 1
377-
fragment 1: C1CCCC1
378-
fragment 2: C1=CC=CC=C1
377+
fragment 1: C1=CC=CC=C1
378+
fragment 2: C1CCCC1
379379
===================================================
380380
molecule 04: C1(C2CCCC2)=C(C2CCCCC2)C=CC=C1 |RG:_R1={C1CCCC1},{C1CCCCC1}|
381381
rgroup 1
@@ -387,10 +387,10 @@ molecule 05: C1(C2CCCCC2)=C(C2CCCCC2)C=CC=C1 |RG:_R1={C1CCCCC1},{C1CCCCC1}|
387387
fragment 1: C1CCCCC1
388388
fragment 2: C1CCCCC1
389389
===================================================
390-
molecule 06: C1(C2=CC=CC=C2)=C(C2CCCCC2)C=CC=C1 |RG:_R1={C1CCCCC1},{C1=CC=CC=C1}|
390+
molecule 06: C1(C2=CC=CC=C2)=C(C2CCCCC2)C=CC=C1 |RG:_R1={C1=CC=CC=C1},{C1CCCCC1}|
391391
rgroup 1
392-
fragment 1: C1CCCCC1
393-
fragment 2: C1=CC=CC=C1
392+
fragment 1: C1=CC=CC=C1
393+
fragment 2: C1CCCCC1
394394
===================================================
395395
molecule 07: C1(C2CCCC2)=C(C2=CC=CC=C2)C=CC=C1 |RG:_R1={C1CCCC1},{C1=CC=CC=C1}|
396396
rgroup 1

core/indigo-core/molecule/src/molecule_rgroups_composition.cpp

+9-21
Original file line numberDiff line numberDiff line change
@@ -132,40 +132,28 @@ MoleculeIter::SourceRGroups::SourceRGroups(const MoleculeIter& m)
132132
{
133133
Array<int> fs;
134134
m._at.dump(fs);
135-
MultiMap<int, int> rgroup2fragment;
135+
std::multimap<int, int> rgroup2fragment;
136136
std::map<Fragment, int> fragment2count;
137137
for (auto i = 0; i < fs.size(); i++)
138138
{
139139
auto x = m._parent._fragment_coordinates(i, fs[i]);
140-
if (rgroup2fragment.find(x.rgroup, x.fragment))
141-
{
142-
int count = fragment2count.at(x);
143-
fragment2count.erase(x);
144-
fragment2count.emplace(x, count + 1);
145-
}
146-
else
147-
{
148-
rgroup2fragment.insert(x.rgroup, x.fragment);
149-
fragment2count.emplace(x, 1);
150-
}
140+
rgroup2fragment.emplace(x.rgroup, x.fragment);
141+
fragment2count.emplace(x, 1);
151142
}
152143

153-
const RedBlackSet<int>& rgroups = rgroup2fragment.keys();
154-
for (auto i = rgroups.begin(); i != rgroups.end(); i = rgroups.next(i))
144+
for (auto it = rgroup2fragment.begin(); it != rgroup2fragment.end(); it = rgroup2fragment.upper_bound(it->first))
155145
{
156-
auto r = rgroups.key(i);
157146
RGroup& rgroup = _rgroups.push();
158-
RGroup& source = m._parent._rgroups.getRGroup(r);
147+
RGroup& source = m._parent._rgroups.getRGroup(it->first);
159148

160-
const RedBlackSet<int>& fs_r = rgroup2fragment[r];
161-
for (auto j = fs_r.begin(); j != fs_r.end(); j = fs_r.next(j))
149+
const auto it_end = rgroup2fragment.upper_bound(it->first);
150+
for (auto it_fs_r = rgroup2fragment.lower_bound(it->first); it_fs_r != it_end; it_fs_r++)
162151
{
163-
auto f = fs_r.key(j);
164-
for (auto k = 0; k < fragment2count.at({r, f}); k++)
152+
for (auto k = 0; k < fragment2count.at({it->first, it_fs_r->second}); k++)
165153
{
166154
int fr_idx = rgroup.fragments.add(new Molecule());
167155
BaseMolecule* fragment = rgroup.fragments.at(fr_idx);
168-
fragment->clone(*source.fragments[f], nullptr, nullptr);
156+
fragment->clone(*source.fragments[it_fs_r->second], nullptr, nullptr);
169157
fragment->removeAttachmentPoints();
170158
}
171159
}

0 commit comments

Comments
 (0)