home
about
news
download
doc
source
systems
tests
bugs
contact
IMP Reference Guide
2.23.0
The Integrative Modeling Platform
IMP Manual
Reference Guide
Tutorial Index
Modules
Classes
Examples
include
IMP
version 2.23.0
triplet_macros.h
Go to the documentation of this file.
1
// Autogenerated by ../../../../tmp/nightly-build-469/imp-2.23.0/tools/build/make_containers.py
2
// from ../../../../tmp/nightly-build-469/imp-2.23.0/tools/build/container_templates/kernel/classname_macros.h
3
// Do not edit - any changes will be lost!
4
5
/**
6
* \file IMP/triplet_macros.h
7
* \brief Macros for various classes.
8
*
9
* Copyright 2007-2025 IMP Inventors. All rights reserved.
10
*/
11
12
#ifndef IMPKERNEL_TRIPLET_MACROS_H
13
#define IMPKERNEL_TRIPLET_MACROS_H
14
15
#include "internal/TupleRestraint.h"
16
#include "internal/functors.h"
17
#include "
container_macros.h
"
18
#include <
IMP/object_macros.h
>
19
#include <algorithm>
20
21
/** Define
22
- IMP::TripletScore::evaluate_indexes()
23
- IMP::TripletScore::evaluate_if_good_indexes()
24
*/
25
#define IMP_TRIPLET_SCORE_METHODS(Name) \
26
double evaluate_indexes(Model *m, const ParticleIndexTriplets &p, \
27
DerivativeAccumulator *da, unsigned int lower_bound, \
28
unsigned int upper_bound, \
29
bool all_indexes_checked=false) \
30
const override final { \
31
IMP_UNUSED(all_indexes_checked); \
32
double ret = 0; \
33
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
34
ret += evaluate_index(m, p[i], da); \
35
} \
36
return ret; \
37
} \
38
double evaluate_indexes_scores( \
39
Model *m, const ParticleIndexTriplets &p, \
40
DerivativeAccumulator *da, unsigned int lower_bound, \
41
unsigned int upper_bound, \
42
std::vector<double> &score, \
43
bool all_indexes_checked=false) \
44
const override final { \
45
IMP_UNUSED(all_indexes_checked); \
46
double ret = 0; \
47
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
48
double s = evaluate_index(m, p[i], da); \
49
score[i] = s; \
50
ret += s; \
51
} \
52
return ret; \
53
} \
54
double evaluate_indexes_delta( \
55
Model *m, const ParticleIndexTriplets &p, \
56
DerivativeAccumulator *da, \
57
const std::vector<unsigned> &indexes, \
58
std::vector<double> &score, \
59
bool all_indexes_checked=false) \
60
const override final { \
61
IMP_UNUSED(all_indexes_checked); \
62
double ret = 0; \
63
for (std::vector<unsigned>::const_iterator it = indexes.begin(); \
64
it != indexes.end(); ++it) { \
65
double s = evaluate_index(m, p[*it], da); \
66
ret = ret - score[*it] + s; \
67
score[*it] = s; \
68
} \
69
return ret; \
70
} \
71
double evaluate_if_good_indexes( \
72
Model *m, const ParticleIndexTriplets &p, DerivativeAccumulator *da, \
73
double max, unsigned int lower_bound, \
74
unsigned int upper_bound, \
75
bool all_indexes_checked=false) const override { \
76
IMP_UNUSED(all_indexes_checked); \
77
double ret = 0; \
78
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
79
ret += evaluate_if_good_index(m, p[i], da, max - ret); \
80
if (ret > max) return std::numeric_limits<double>::max(); \
81
} \
82
return ret; \
83
}
84
85
/** Like IMP_TRIPLET_SCORE_METHODS but the Evaluate method can be overridden
86
when checks are disabled (it should use the Model, m; the particle
87
index(es), p[i]; and the DerivativeAccumulator, da). Additionally,
88
some one-time unchecked setup can be done. This should be used in
89
combination with an override of check_indexes().
90
*/
91
#define IMP_TRIPLET_SCORE_METHODS_UNCHECKED(Name, Setup, Evaluate) \
92
double evaluate_indexes(Model *m, const ParticleIndexTriplets &p, \
93
DerivativeAccumulator *da, unsigned int lower_bound, \
94
unsigned int upper_bound, \
95
bool all_indexes_checked=false) \
96
const override final { \
97
double ret = 0; \
98
if (all_indexes_checked) { \
99
Setup; \
100
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
101
ret += Evaluate; \
102
} \
103
} else { \
104
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
105
ret += evaluate_index(m, p[i], da); \
106
} \
107
} \
108
return ret; \
109
} \
110
double evaluate_indexes_scores( \
111
Model *m, const ParticleIndexTriplets &p, \
112
DerivativeAccumulator *da, unsigned int lower_bound, \
113
unsigned int upper_bound, \
114
std::vector<double> &score, \
115
bool all_indexes_checked=false) \
116
const override final { \
117
double ret = 0; \
118
if (all_indexes_checked) { \
119
Setup; \
120
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
121
double s = Evaluate; \
122
score[i] = s; \
123
ret += s; \
124
} \
125
} else { \
126
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
127
double s = evaluate_index(m, p[i], da); \
128
score[i] = s; \
129
ret += s; \
130
} \
131
} \
132
return ret; \
133
} \
134
double evaluate_indexes_delta( \
135
Model *m, const ParticleIndexTriplets &p, \
136
DerivativeAccumulator *da, \
137
const std::vector<unsigned> &indexes, \
138
std::vector<double> &score, \
139
bool all_indexes_checked=false) \
140
const override final { \
141
double ret = 0; \
142
if (all_indexes_checked) { \
143
Setup; \
144
for (unsigned int i : indexes) { \
145
double s = Evaluate; \
146
ret = ret - score[i] + s; \
147
score[i] = s; \
148
} \
149
} else { \
150
for (std::vector<unsigned>::const_iterator it = indexes.begin(); \
151
it != indexes.end(); ++it) { \
152
double s = evaluate_index(m, p[*it], da); \
153
ret = ret - score[*it] + s; \
154
score[*it] = s; \
155
} \
156
} \
157
return ret; \
158
} \
159
double evaluate_if_good_indexes( \
160
Model *m, const ParticleIndexTriplets &p, DerivativeAccumulator *da, \
161
double max, unsigned int lower_bound, unsigned int upper_bound, \
162
bool all_indexes_checked=false) const override { \
163
IMP_UNUSED(all_indexes_checked); \
164
double ret = 0; \
165
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
166
ret += evaluate_if_good_index(m, p[i], da, max - ret); \
167
if (ret > max) return std::numeric_limits<double>::max(); \
168
} \
169
return ret; \
170
}
171
172
//! Define extra the functions needed for a TripletPredicate
173
#define IMP_TRIPLET_PREDICATE_METHODS(Name) \
174
int get_value(const ParticleTriplet& a) const { \
175
return get_value_index(IMP::internal::get_model(a), \
176
IMP::internal::get_index(a)); \
177
} \
178
Ints get_value(const ParticleTripletsTemp &o) const { \
179
Ints ret(o.size()); \
180
for (unsigned int i = 0; i < o.size(); ++i) { \
181
ret[i] += Name::get_value(o[i]); \
182
} \
183
return ret; \
184
} \
185
Ints get_value_index(Model *m, const ParticleIndexTriplets &o) const override { \
186
Ints ret(o.size()); \
187
for (unsigned int i = 0; i < o.size(); ++i) { \
188
ret[i] += Name::get_value_index(m, o[i]); \
189
} \
190
return ret; \
191
} \
192
IMP_IMPLEMENT_INLINE_NO_SWIG( \
193
void remove_if_equal(Model *m, ParticleIndexTriplets &ps, \
194
int value) const, \
195
{ \
196
ps.erase( \
197
std::remove_if(ps.begin(), ps.end(), \
198
IMP::internal::PredicateEquals<Name, true>( \
199
this, m, value)), \
200
ps.end()); \
201
}); \
202
IMP_IMPLEMENT_INLINE_NO_SWIG(void remove_if_not_equal(Model *m, \
203
ParticleIndexTriplets &ps, \
204
int value) const, \
205
{ \
206
ps.erase( \
207
std::remove_if(ps.begin(), ps.end(), \
208
IMP::internal::PredicateEquals<Name, false>( \
209
this, m, value)), \
210
ps.end()); \
211
});
212
213
//! Use IMP_TRIPLET_MODIFIER() instead
214
#define IMP_TRIPLET_DERIVATIVE_MODIFIER(Name) IMP_TRIPLET_MODIFIER(Name)
215
216
/** Define
217
- IMP::TripletModifier::apply_indexes()
218
*/
219
#define IMP_TRIPLET_MODIFIER_METHODS(Name) \
220
virtual void apply_indexes(Model *m, const ParticleIndexTriplets &o, \
221
unsigned int lower_bound, \
222
unsigned int upper_bound) \
223
const override final { \
224
for (unsigned int i = lower_bound; i < upper_bound; ++i) { \
225
apply_index(m, o[i]); \
226
} \
227
}
228
229
//! Use IMP_INDEX_TRIPLET_MODIFIER instead
230
#define IMP_INDEX_TRIPLET_DERIVATIVE_MODIFIER(Name) \
231
IMP_INDEX_TRIPLET_MODIFIER(Name)
232
233
#ifndef IMP_DOXYGEN
234
#define IMP_IMPLEMENT_TRIPLET_CONTAINER(Name) \
235
IMP_IMPLEMENT_INLINE(void do_apply(const TripletModifier *sm) const, \
236
{ apply_generic(sm); }); \
237
IMP_IMPLEMENT_INLINE(void do_apply_moved(const TripletModifier *sm, \
238
const ParticleIndexes &moved_pis, \
239
const ParticleIndexes &reset_pis) const, \
240
{ apply_generic_moved(sm, moved_pis, reset_pis); }); \
241
virtual ParticleIndexes get_all_possible_indexes() const override; \
242
IMP_OBJECT_METHODS(Name)
243
#endif
244
245
/** Use this to fill in container methods
246
IMP::TripletContainer::do_apply()
247
IMP::TripletContainer::do_apply_moved()
248
*/
249
#define IMP_TRIPLET_CONTAINER_METHODS(Name) \
250
void do_apply(const TripletModifier *sm) const override { \
251
apply_generic(sm); } \
252
void do_apply_moved(const TripletModifier *sm, \
253
const ParticleIndexes &moved_pis, \
254
const ParticleIndexes &reset_pis) const override { \
255
apply_generic_moved(sm, moved_pis, reset_pis); }
256
257
#endif
/* IMPKERNEL_TRIPLET_MACROS_H */
object_macros.h
Helper macros for implementing IMP Objects.
container_macros.h
Macros to define containers of objects.