RDKit
Open-source cheminformatics and machine learning.
Loading...
Searching...
No Matches
Embedder.h
Go to the documentation of this file.
1//
2// Copyright (C) 2004-2017 Greg Landrum and Rational Discovery LLC
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
11#include <RDGeneral/export.h>
12#ifndef RD_EMBEDDER_H_GUARD
13#define RD_EMBEDDER_H_GUARD
14
15#include <map>
16#include <utility>
17#include <Geometry/point.h>
18#include <GraphMol/ROMol.h>
19#include <boost/shared_ptr.hpp>
21
22namespace RDKit {
23namespace DGeomHelpers {
24
40
41//! Parameter object for controlling embedding
42/*!
43 numConfs Number of conformations to be generated
44 numThreads Sets the number of threads to use (more than one thread
45 will only be used if the RDKit was build with multithread
46 support) If set to zero, the max supported by the system will
47 be used.
48 maxIterations Max. number of times the embedding will be tried if
49 coordinates are not obtained successfully. The default
50 value is 10x the number of atoms.
51 randomSeed provides a seed for the random number generator (so that
52 the same coordinates can be obtained for a
53 molecule on multiple runs) If -1, the
54 RNG will not be seeded.
55 clearConfs Clear all existing conformations on the molecule
56 useRandomCoords Start the embedding from random coordinates instead of
57 using eigenvalues of the distance matrix.
58 boxSizeMult Determines the size of the box that is used for
59 random coordinates. If this is a positive number, the
60 side length will equal the largest element of the distance
61 matrix times \c boxSizeMult. If this is a negative number,
62 the side length will equal \c -boxSizeMult (i.e. independent
63 of the elements of the distance matrix).
64 randNegEig Picks coordinates at random when a embedding process produces
65 negative eigenvalues
66 numZeroFail Fail embedding if we find this many or more zero eigenvalues
67 (within a tolerance)
68 pruneRmsThresh Retain only the conformations out of 'numConfs' after
69 embedding that are at least this far apart from each other.
70 RMSD is computed on the heavy atoms.
71 Prunining is greedy; i.e. the first embedded conformation is
72 retained and from then on only those that are at least
73 \c pruneRmsThresh away from already
74 retained conformations are kept. The pruning is done
75 after embedding and bounds violation minimization.
76 No pruning by default.
77 coordMap a map of int to Point3D, between atom IDs and their locations
78 their locations. If this container is provided, the
79 coordinates are used to set distance constraints on the
80 embedding. The resulting conformer(s) should have distances
81 between the specified atoms that reproduce those between the
82 points in \c coordMap. Because the embedding produces a
83 molecule in an arbitrary reference frame, an alignment step
84 is required to actually reproduce the provided coordinates.
85 optimizerForceTol set the tolerance on forces in the DGeom optimizer
86 (this shouldn't normally be altered in client code).
87 ignoreSmoothingFailures try to embed the molecule even if triangle bounds
88 smoothing fails
89 enforceChirality enforce the correct chirality if chiral centers are present
90 useExpTorsionAnglePrefs impose experimental torsion-angle preferences
91 useBasicKnowledge impose "basic knowledge" terms such as flat
92 aromatic rings, ketones, etc.
93 ETversion version of the experimental torsion-angle preferences
94 verbose print output of experimental torsion-angle preferences
95 basinThresh set the basin threshold for the DGeom force field,
96 (this shouldn't normally be altered in client code).
97 onlyHeavyAtomsForRMS only use the heavy atoms when doing RMS filtering
98 boundsMat custom bound matrix to specify upper and lower bounds of atom
99 pairs
100 embedFragmentsSeparately embed each fragment of molecule in turn
101 useSmallRingTorsions optional torsions to improve small ring conformer
102 sampling
103 useMacrocycleTorsions optional torsions to improve macrocycle conformer
104 sampling
105 useMacrocycle14config If 1-4 distances bound heuristics for
106 macrocycles is used
107 timeout time out in seconds
108 CPCI custom columbic interactions between atom pairs
109 callback void pointer to a function for reporting progress,
110 will be called with the current iteration number.
111 forceTransAmides constrain amide bonds to be trans.
112 useSymmetryForPruning use molecule symmetry when doing the RMSD pruning.
113 NOTE that for reasons of computational efficiency,
114 setting this will also set onlyHeavyAtomsForRMS to
115 true.
116 trackFailures keep track of which checks during the embedding process fail
117 failures if trackFailures is true, this is used to track the number
118 of times each embedding check fails
119 enableSequentialRandomSeeds handle the random number seeds so that
120 conformer generation can be restarted
121*/
123 unsigned int maxIterations{0};
124 int numThreads{1};
125 int randomSeed{-1};
126 bool clearConfs{true};
127 bool useRandomCoords{false};
128 double boxSizeMult{2.0};
129 bool randNegEig{true};
130 unsigned int numZeroFail{1};
131 const std::map<int, RDGeom::Point3D> *coordMap{nullptr};
132 double optimizerForceTol{1e-3};
133 bool ignoreSmoothingFailures{false};
134 bool enforceChirality{true};
135 bool useExpTorsionAnglePrefs{false};
136 bool useBasicKnowledge{false};
137 bool verbose{false};
138 double basinThresh{5.0};
139 double pruneRmsThresh{-1.0};
140 bool onlyHeavyAtomsForRMS{true};
141 unsigned int ETversion{1};
142 boost::shared_ptr<const DistGeom::BoundsMatrix> boundsMat;
143 bool embedFragmentsSeparately{true};
144 bool useSmallRingTorsions{false};
145 bool useMacrocycleTorsions{false};
146 bool useMacrocycle14config{false};
147 unsigned int timeout{0};
148 std::shared_ptr<std::map<std::pair<unsigned int, unsigned int>, double>> CPCI;
149 void (*callback)(unsigned int);
150 bool forceTransAmides{true};
151 bool useSymmetryForPruning{true};
152 double boundsMatForceScaling{1.0};
153 bool trackFailures{false};
154 std::vector<unsigned int> failures;
155 bool enableSequentialRandomSeeds{false};
156 bool symmetrizeConjugatedTerminalGroupsForPruning{true};
157
158 EmbedParameters() : boundsMat(nullptr), CPCI(nullptr), callback(nullptr) {}
160 unsigned int maxIterations, int numThreads, int randomSeed,
161 bool clearConfs, bool useRandomCoords, double boxSizeMult,
162 bool randNegEig, unsigned int numZeroFail,
163 const std::map<int, RDGeom::Point3D> *coordMap, double optimizerForceTol,
164 bool ignoreSmoothingFailures, bool enforceChirality,
165 bool useExpTorsionAnglePrefs, bool useBasicKnowledge, bool verbose,
166 double basinThresh, double pruneRmsThresh, bool onlyHeavyAtomsForRMS,
167 unsigned int ETversion = 2,
168 const DistGeom::BoundsMatrix *boundsMat = nullptr,
169 bool embedFragmentsSeparately = true, bool useSmallRingTorsions = false,
170 bool useMacrocycleTorsions = false, bool useMacrocycle14config = false,
171 unsigned int timeout = 0,
172 std::shared_ptr<std::map<std::pair<unsigned int, unsigned int>, double>>
173 CPCI = nullptr,
174 void (*callback)(unsigned int) = nullptr)
175 : maxIterations(maxIterations),
176 numThreads(numThreads),
177 randomSeed(randomSeed),
178 clearConfs(clearConfs),
179 useRandomCoords(useRandomCoords),
180 boxSizeMult(boxSizeMult),
181 randNegEig(randNegEig),
182 numZeroFail(numZeroFail),
183 coordMap(coordMap),
184 optimizerForceTol(optimizerForceTol),
185 ignoreSmoothingFailures(ignoreSmoothingFailures),
186 enforceChirality(enforceChirality),
187 useExpTorsionAnglePrefs(useExpTorsionAnglePrefs),
188 useBasicKnowledge(useBasicKnowledge),
189 verbose(verbose),
190 basinThresh(basinThresh),
191 pruneRmsThresh(pruneRmsThresh),
192 onlyHeavyAtomsForRMS(onlyHeavyAtomsForRMS),
193 ETversion(ETversion),
194 boundsMat(boundsMat),
195 embedFragmentsSeparately(embedFragmentsSeparately),
196 useSmallRingTorsions(useSmallRingTorsions),
197 useMacrocycleTorsions(useMacrocycleTorsions),
198 useMacrocycle14config(useMacrocycle14config),
199 timeout(timeout),
200 CPCI(std::move(CPCI)),
201 callback(callback) {}
202};
203
204//! update parameters from a JSON string
206 EmbedParameters &params, const std::string &json);
207
208//! Embed multiple conformations for a molecule
210 unsigned int numConfs,
211 EmbedParameters &params);
212inline INT_VECT EmbedMultipleConfs(ROMol &mol, unsigned int numConfs,
213 EmbedParameters &params) {
215 EmbedMultipleConfs(mol, res, numConfs, params);
216 return res;
217}
218
219//! Compute an embedding (in 3D) for the specified molecule using Distance
220/// Geometry
221inline int EmbedMolecule(ROMol &mol, EmbedParameters &params) {
223 EmbedMultipleConfs(mol, confIds, 1, params);
224
225 int res;
226 if (confIds.size()) {
227 res = confIds[0];
228 } else {
229 res = -1;
230 }
231 return res;
232}
233
234//! Compute an embedding (in 3D) for the specified molecule using Distance
235/// Geometry
236/*!
237 The following operations are performed (in order) here:
238 -# Build a distance bounds matrix based on the topology, including 1-5
239 distances but not VDW scaling
240 -# Triangle smooth this bounds matrix
241 -# If step 2 fails - repeat step 1, this time without 1-5 bounds and with vdW
242 scaling, and repeat step 2
243 -# Pick a distance matrix at random using the bounds matrix
244 -# Compute initial coordinates from the distance matrix
245 -# Repeat steps 3 and 4 until maxIterations is reached or embedding is
246 successful
247 -# Adjust initial coordinates by minimizing a Distance Violation error
248 function
249 **NOTE**: if the molecule has multiple fragments, they will be embedded
250 separately,
251 this means that they will likely occupy the same region of space.
252 \param mol Molecule of interest
253 \param maxIterations Max. number of times the embedding will be tried if
254 coordinates are not obtained successfully. The default
255 value is 10x the number of atoms.
256 \param seed provides a seed for the random number generator (so that
257 the same coordinates can be obtained for a molecule on
258 multiple runs). If negative, the RNG will not be seeded.
259 \param clearConfs Clear all existing conformations on the molecule
260 \param useRandomCoords Start the embedding from random coordinates instead of
261 using eigenvalues of the distance matrix.
262 \param boxSizeMult Determines the size of the box that is used for
263 random coordinates. If this is a positive number, the
264 side length will equal the largest element of the
265 distance matrix times \c boxSizeMult. If this is a
266 negative number, the side length will equal
267 \c -boxSizeMult (i.e. independent of the elements of the
268 distance matrix).
269 \param randNegEig Picks coordinates at random when a embedding process
270 produces negative eigenvalues
271 \param numZeroFail Fail embedding if we find this many or more zero
272 eigenvalues (within a tolerance)
273 \param coordMap a map of int to Point3D, between atom IDs and their locations
274 their locations. If this container is provided, the
275 coordinates are used to set distance constraints on the
276 embedding. The resulting conformer(s) should have distances
277 between the specified atoms that reproduce those between the
278 points in \c coordMap. Because the embedding produces a
279 molecule in an arbitrary reference frame, an alignment step
280 is required to actually reproduce the provided coordinates.
281 \param optimizerForceTol set the tolerance on forces in the distgeom optimizer
282 (this shouldn't normally be altered in client code).
283 \param ignoreSmoothingFailures try to embed the molecule even if triangle
284 bounds smoothing fails
285 \param enforceChirality enforce the correct chirality if chiral centers are
286 present
287 \param useExpTorsionAnglePrefs impose experimental torsion-angle preferences
288 \param useBasicKnowledge impose "basic knowledge" terms such as flat
289 aromatic rings, ketones, etc.
290 \param verbose print output of experimental torsion-angle preferences
291 \param basinThresh set the basin threshold for the DGeom force field,
292 (this shouldn't normally be altered in client code).
293 \param onlyHeavyAtomsForRMS only use the heavy atoms when doing RMS filtering
294 \param ETversion version of torsion preferences to use
295 \param useSmallRingTorsions optional torsions to improve small ring
296 conformer sampling
297 \param useMacrocycleTorsions optional torsions to improve macrocycle
298 conformer sampling
299 \param useMacrocycle14config If 1-4 distances bound heuristics for
300 macrocycles is used
301
302 \return ID of the conformer added to the molecule, -1 if the emdedding failed
303*/
304inline int EmbedMolecule(
305 ROMol &mol, unsigned int maxIterations = 0, int seed = -1,
306 bool clearConfs = true, bool useRandomCoords = false,
307 double boxSizeMult = 2.0, bool randNegEig = true,
308 unsigned int numZeroFail = 1,
309 const std::map<int, RDGeom::Point3D> *coordMap = nullptr,
310 double optimizerForceTol = 1e-3, bool ignoreSmoothingFailures = false,
311 bool enforceChirality = true, bool useExpTorsionAnglePrefs = false,
312 bool useBasicKnowledge = false, bool verbose = false,
313 double basinThresh = 5.0, bool onlyHeavyAtomsForRMS = false,
314 unsigned int ETversion = 2, bool useSmallRingTorsions = false,
315 bool useMacrocycleTorsions = true, bool useMacrocycle14config = true) {
316 EmbedParameters params(
317 maxIterations, 1, seed, clearConfs, useRandomCoords, boxSizeMult,
318 randNegEig, numZeroFail, coordMap, optimizerForceTol,
319 ignoreSmoothingFailures, enforceChirality, useExpTorsionAnglePrefs,
320 useBasicKnowledge, verbose, basinThresh, -1.0, onlyHeavyAtomsForRMS,
321 ETversion, nullptr, true, useSmallRingTorsions, useMacrocycleTorsions,
322 useMacrocycle14config);
323 return EmbedMolecule(mol, params);
324};
325
326//*! Embed multiple conformations for a molecule
327/*!
328 This is kind of equivalent to calling EmbedMolecule multiple times - just that
329 the bounds
330 matrix is computed only once from the topology
331 **NOTE**: if the molecule has multiple fragments, they will be embedded
332 separately,
333 this means that they will likely occupy the same region of space.
334 \param mol Molecule of interest
335 \param res Used to return the resulting conformer ids
336 \param numConfs Number of conformations to be generated
337 \param numThreads Sets the number of threads to use (more than one thread
338 will only be used if the RDKit was build with
339 multithread
340 support). If set to zero, the max supported by the
341 system
342 will be used.
343 \param maxIterations Max. number of times the embedding will be tried if
344 coordinates are not obtained successfully. The default
345 value is 10x the number of atoms.
346 \param seed provides a seed for the random number generator (so that
347 the same coordinates can be obtained for a molecule on
348 multiple runs). If negative, the RNG will not be seeded.
349 \param clearConfs Clear all existing conformations on the molecule
350 \param useRandomCoords Start the embedding from random coordinates instead of
351 using eigenvalues of the distance matrix.
352 \param boxSizeMult Determines the size of the box that is used for
353 random coordinates. If this is a positive number, the
354 side length will equal the largest element of the
355 distance matrix times \c boxSizeMult. If this is a
356 negative number, the side length will equal
357 \c -boxSizeMult (i.e. independent of the elements of the
358 distance matrix).
359 \param randNegEig Picks coordinates at random when a embedding process
360 produces negative eigenvalues
361 \param numZeroFail Fail embedding if we find this many or more zero
362 eigenvalues (within a tolerance)
363 \param pruneRmsThresh Retain only the conformations out of 'numConfs' after
364 embedding that are at least this far apart from each
365 other. RMSD is computed on the heavy atoms.
366 Pruning is greedy; i.e. the first embedded conformation
367 is retained and from then on only those that are at
368 least
369 pruneRmsThresh away from already retained conformations
370 are kept. The pruning is done after embedding and
371 bounds violation minimization. No pruning by default.
372 \param coordMap a map of int to Point3D, between atom IDs and their locations
373 their locations. If this container is provided, the
374 coordinates are used to set distance constraints on the
375 embedding. The resulting conformer(s) should have distances
376 between the specified atoms that reproduce those between the
377 points in \c coordMap. Because the embedding produces a
378 molecule in an arbitrary reference frame, an alignment step
379 is required to actually reproduce the provided coordinates.
380 \param optimizerForceTol set the tolerance on forces in the DGeom optimizer
381 (this shouldn't normally be altered in client code).
382 \param ignoreSmoothingFailures try to embed the molecule even if triangle
383 bounds smoothing fails
384 \param enforceChirality enforce the correct chirality if chiral centers are
385 present
386 \param useExpTorsionAnglePrefs impose experimental torsion-angle preferences
387 \param useBasicKnowledge impose "basic knowledge" terms such as flat
388 aromatic rings, ketones, etc.
389 \param verbose print output of experimental torsion-angle preferences
390 \param basinThresh set the basin threshold for the DGeom force field,
391 (this shouldn't normally be altered in client code).
392 \param onlyHeavyAtomsForRMS only use the heavy atoms when doing RMS filtering
393 \param ETversion version of torsion preferences to use
394 \param useSmallRingTorsions optional torsions to improve small ring
395 conformer sampling
396 \param useMacrocycleTorsions optional torsions to improve macrocycle
397 conformer sampling
398 \param useMacrocycle14config If 1-4 distances bound heuristics for
399 macrocycles is used
400
401*/
403 ROMol &mol, INT_VECT &res, unsigned int numConfs = 10, int numThreads = 1,
404 unsigned int maxIterations = 30, int seed = -1, bool clearConfs = true,
405 bool useRandomCoords = false, double boxSizeMult = 2.0,
406 bool randNegEig = true, unsigned int numZeroFail = 1,
407 double pruneRmsThresh = -1.0,
408 const std::map<int, RDGeom::Point3D> *coordMap = nullptr,
409 double optimizerForceTol = 1e-3, bool ignoreSmoothingFailures = false,
410 bool enforceChirality = true, bool useExpTorsionAnglePrefs = false,
411 bool useBasicKnowledge = false, bool verbose = false,
412 double basinThresh = 5.0, bool onlyHeavyAtomsForRMS = false,
413 unsigned int ETversion = 2, bool useSmallRingTorsions = false,
414 bool useMacrocycleTorsions = true, bool useMacrocycle14config = true,
415 unsigned int timeout = 0) {
416 EmbedParameters params(
417 maxIterations, numThreads, seed, clearConfs, useRandomCoords, boxSizeMult,
418 randNegEig, numZeroFail, coordMap, optimizerForceTol,
419 ignoreSmoothingFailures, enforceChirality, useExpTorsionAnglePrefs,
420 useBasicKnowledge, verbose, basinThresh, pruneRmsThresh,
421 onlyHeavyAtomsForRMS, ETversion, nullptr, true, useSmallRingTorsions,
422 useMacrocycleTorsions, useMacrocycle14config, timeout);
423 EmbedMultipleConfs(mol, res, numConfs, params);
424};
425//! \overload
427 ROMol &mol, unsigned int numConfs = 10, unsigned int maxIterations = 30,
428 int seed = -1, bool clearConfs = true, bool useRandomCoords = false,
429 double boxSizeMult = 2.0, bool randNegEig = true,
430 unsigned int numZeroFail = 1, double pruneRmsThresh = -1.0,
431 const std::map<int, RDGeom::Point3D> *coordMap = nullptr,
432 double optimizerForceTol = 1e-3, bool ignoreSmoothingFailures = false,
433 bool enforceChirality = true, bool useExpTorsionAnglePrefs = false,
434 bool useBasicKnowledge = false, bool verbose = false,
435 double basinThresh = 5.0, bool onlyHeavyAtomsForRMS = false,
436 unsigned int ETversion = 2, bool useSmallRingTorsions = false,
437 bool useMacrocycleTorsions = false, bool useMacrocycle14config = false,
438 unsigned int timeout = 0) {
439 EmbedParameters params(
440 maxIterations, 1, seed, clearConfs, useRandomCoords, boxSizeMult,
441 randNegEig, numZeroFail, coordMap, optimizerForceTol,
442 ignoreSmoothingFailures, enforceChirality, useExpTorsionAnglePrefs,
443 useBasicKnowledge, verbose, basinThresh, pruneRmsThresh,
444 onlyHeavyAtomsForRMS, ETversion, nullptr, true, useSmallRingTorsions,
445 useMacrocycleTorsions, useMacrocycle14config, timeout);
447 EmbedMultipleConfs(mol, res, numConfs, params);
448 return res;
449};
450
451//! Parameters corresponding to Sereina Riniker's KDG approach
452RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters KDG;
453//! Parameters corresponding to Sereina Riniker's ETDG approach
454RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters ETDG;
455//! Parameters corresponding to Sereina Riniker's ETKDG approach
456RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters ETKDG;
457//! Parameters corresponding to Sereina Riniker's ETKDG approach - version 2
458RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters ETKDGv2;
459//! Parameters corresponding improved ETKDG by Wang, Witek, Landrum and Riniker
460//! (10.1021/acs.jcim.0c00025) - the macrocycle part
461RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters ETKDGv3;
462//! Parameters corresponding improved ETKDG by Wang, Witek, Landrum and Riniker
463//! (10.1021/acs.jcim.0c00025) - the small ring part
464RDKIT_DISTGEOMHELPERS_EXPORT extern const EmbedParameters srETKDGv3;
465} // namespace DGeomHelpers
466} // namespace RDKit
467
468#endif
Defines the primary molecule class ROMol as well as associated typedefs.
Class to store the distance bound.
#define RDKIT_DISTGEOMHELPERS_EXPORT
Definition export.h:121
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters ETKDGv2
Parameters corresponding to Sereina Riniker's ETKDG approach - version 2.
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters ETDG
Parameters corresponding to Sereina Riniker's ETDG approach.
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters ETKDGv3
RDKIT_DISTGEOMHELPERS_EXPORT void updateEmbedParametersFromJSON(EmbedParameters &params, const std::string &json)
update parameters from a JSON string
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters ETKDG
Parameters corresponding to Sereina Riniker's ETKDG approach.
RDKIT_DISTGEOMHELPERS_EXPORT void EmbedMultipleConfs(ROMol &mol, INT_VECT &res, unsigned int numConfs, EmbedParameters &params)
Embed multiple conformations for a molecule.
int EmbedMolecule(ROMol &mol, EmbedParameters &params)
Definition Embedder.h:221
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters srETKDGv3
RDKIT_DISTGEOMHELPERS_EXPORT const EmbedParameters KDG
Parameters corresponding to Sereina Riniker's KDG approach.
Std stuff.
std::vector< int > INT_VECT
Definition types.h:291
bool rdvalue_is(const RDValue_cast_t)
Parameter object for controlling embedding.
Definition Embedder.h:122
std::vector< unsigned int > failures
Definition Embedder.h:154
boost::shared_ptr< const DistGeom::BoundsMatrix > boundsMat
Definition Embedder.h:142
std::shared_ptr< std::map< std::pair< unsigned int, unsigned int >, double > > CPCI
Definition Embedder.h:148
EmbedParameters(unsigned int maxIterations, int numThreads, int randomSeed, bool clearConfs, bool useRandomCoords, double boxSizeMult, bool randNegEig, unsigned int numZeroFail, const std::map< int, RDGeom::Point3D > *coordMap, double optimizerForceTol, bool ignoreSmoothingFailures, bool enforceChirality, bool useExpTorsionAnglePrefs, bool useBasicKnowledge, bool verbose, double basinThresh, double pruneRmsThresh, bool onlyHeavyAtomsForRMS, unsigned int ETversion=2, const DistGeom::BoundsMatrix *boundsMat=nullptr, bool embedFragmentsSeparately=true, bool useSmallRingTorsions=false, bool useMacrocycleTorsions=false, bool useMacrocycle14config=false, unsigned int timeout=0, std::shared_ptr< std::map< std::pair< unsigned int, unsigned int >, double > > CPCI=nullptr, void(*callback)(unsigned int)=nullptr)
Definition Embedder.h:159