IMP logo
IMP Reference Guide  2.5.0
The Integrative Modeling Platform
Model.h
Go to the documentation of this file.
1 /**
2  * \file IMP/Model.h
3  * \brief Storage of a model, its restraints, constraints and particles.
4  *
5  * Copyright 2007-2015 IMP Inventors. All rights reserved.
6  *
7  */
8 
9 #ifndef IMPKERNEL_MODEL_H
10 #define IMPKERNEL_MODEL_H
11 
12 #include <IMP/kernel_config.h>
13 #include "ModelObject.h"
14 #include "ScoringFunction.h"
15 #include "Restraint.h"
16 #include "RestraintSet.h"
17 #include "ScoreState.h"
18 #include "container_macros.h"
19 #include "base_types.h"
20 //#include "Particle.h"
21 #include "Undecorator.h"
22 #include "internal/AttributeTable.h"
23 #include "internal/attribute_tables.h"
24 #include <IMP/Object.h>
25 #include <IMP/Pointer.h>
26 #include <boost/unordered_map.hpp>
27 #include <boost/unordered_set.hpp>
28 #include <IMP/tuple_macros.h>
29 #include <boost/iterator/transform_iterator.hpp>
30 #include <boost/iterator/filter_iterator.hpp>
31 
32 #include <limits>
33 
34 IMPKERNEL_BEGIN_NAMESPACE
35 
36 class ModelObject;
37 class Undecorator;
38 class Particle;
39 
40 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
41 namespace internal {
42 enum Stage {
43  NOT_EVALUATING,
44  BEFORE_EVALUATING,
45  EVALUATING,
46  AFTER_EVALUATING,
47  COMPUTING_DEPENDENCIES
48 };
49 }
50 #endif
51 
52 class Model;
53 
54 //! Class for storing model, its restraints, constraints, and particles.
55 /** The Model maintains a standard \imp container for each of Particle,
56  ScoreState and Restraint object types.
57 
58  Each Float attribute has an associated range which reflects the
59  range of values that it is expected to take on during optimization.
60  The optimizer can use these ranges to make the optimization process
61  more efficient. By default, the range estimates are simply the
62  range of values for that attribute in the various particles, but
63  it can be set to another value. For example, an attribute storing
64  an angle could have the range set to (0,PI).
65 
66  The ranges are not enforced; they are just guidelines. In order to
67  enforce ranges, see, for example,
68  IMP::example::ExampleSingletonModifier.
69 
70  \headerfile Model.h "IMP/Model.h"
71  */
72 class IMPKERNELEXPORT Model : public Object
73 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
74  ,
75  public internal::Masks,
76  // The attribute tables provide fast access to
77  // e.g. particle attributes, etc.
78  public internal::FloatAttributeTable,
79  public internal::StringAttributeTable,
80  public internal::IntAttributeTable,
81  public internal::ObjectAttributeTable,
82  public internal::WeakObjectAttributeTable,
83  public internal::IntsAttributeTable,
84  public internal::ObjectsAttributeTable,
85  public internal::ParticleAttributeTable,
86  public internal::ParticlesAttributeTable
87 #endif
88  {
90  // must be up top
91  // we don't want any liveness checks
92  IMP_NAMED_TUPLE_5(NodeInfo, NodeInfos, Edges, inputs, Edges, input_outputs,
93  Edges, outputs, Edges, readers, Edges, writers, );
94  typedef boost::unordered_map<const ModelObject *, NodeInfo> DependencyGraph;
95  DependencyGraph dependency_graph_;
96  boost::unordered_set<const ModelObject *> no_dependencies_;
97  boost::unordered_map<const ModelObject *, ScoreStatesTemp>
98  required_score_states_;
99 
100  // basic representation
101  boost::unordered_map<FloatKey, FloatRange> ranges_;
102 
103  ParticleIndexes free_particles_;
106 
107  Vector<PointerMember<Object> > model_data_;
108  ////////////// DEPRECATED
109  // for old code that uses the model for the scoring function
110  PointerMember<RestraintSet> restraints_;
111 
112  void do_add_dependencies(const ModelObject *mo);
113  void do_clear_required_score_states(ModelObject *mo);
114  void do_check_required_score_states(const ModelObject *mo) const;
115  void do_check_update_order(const ScoreState *ss) const;
116  void do_check_inputs_and_outputs(const ModelObject *mo) const;
117  void do_check_readers_and_writers(const ModelObject *mo) const;
118  void do_check_not_in_readers_and_writers(const ModelObject *mo) const;
119  void do_clear_dependencies(const ModelObject *mo);
120 #if !defined(IMP_DOXYGEN) && !defined(SWIG)
121  // things the evaluate template functions need, can't be bothered with friends
122  public:
123 #endif
124  // check more things on the first call
125  bool first_call_;
126  // the stage of evaluation
127  internal::Stage cur_stage_;
128 
129  ModelObjectsTemp get_dependency_graph_inputs(const ModelObject *mo) const;
130  ModelObjectsTemp get_dependency_graph_outputs(const ModelObject *mo) const;
131  bool do_get_has_dependencies(const ModelObject *mo) const {
132  return no_dependencies_.find(mo) == no_dependencies_.end();
133  }
134  void do_set_has_dependencies(const ModelObject *mo, bool tf);
135  void do_set_has_all_dependencies(bool tf);
136 
137  void validate_computed_derivatives() const {}
138  void set_has_all_dependencies(bool tf);
139  bool get_has_all_dependencies() const;
140  void check_dependency_invariants() const;
141  void check_dependency_invariants(const ModelObject *mo) const;
142  ScoreStatesTemp get_ancestor_score_states(const ModelObject *mo) const;
143  ScoreStatesTemp get_descendent_score_states(const ModelObject *mo) const;
144 
145  void before_evaluate(const ScoreStatesTemp &states);
146  void after_evaluate(const ScoreStatesTemp &states, bool calc_derivs);
147 
148  internal::Stage get_stage() const { return cur_stage_; }
149  ParticleIndex add_particle_internal(Particle *p);
150  static void do_remove_score_state(ScoreState *obj);
151  void do_add_score_state(ScoreState *obj);
152  void do_remove_particle(ParticleIndex pi);
153  bool do_get_has_required_score_states(const ModelObject *mo) const;
154  void do_set_has_required_score_states(ModelObject *mo, bool tf);
155  const ScoreStatesTemp &do_get_required_score_states(const ModelObject *mo)
156  const {
157  IMP_USAGE_CHECK(do_get_has_required_score_states(mo),
158  "Doesn't have score states");
159  return required_score_states_.find(mo)->second;
160  }
161  void do_add_model_object(ModelObject *mo);
162  void do_remove_model_object(ModelObject *mo);
163 
164  public:
165  /** Construct an empty model */
166  Model(std::string name = "Model %1%");
167 
168  public:
169 #if !defined(SWIG) && !defined(IMP_DOXYGEN)
170  IMP_MODEL_IMPORT(internal::FloatAttributeTable);
171  IMP_MODEL_IMPORT(internal::StringAttributeTable);
172  IMP_MODEL_IMPORT(internal::IntAttributeTable);
173  IMP_MODEL_IMPORT(internal::ObjectAttributeTable);
174  IMP_MODEL_IMPORT(internal::WeakObjectAttributeTable);
175  IMP_MODEL_IMPORT(internal::IntsAttributeTable);
176  IMP_MODEL_IMPORT(internal::ObjectsAttributeTable);
177  IMP_MODEL_IMPORT(internal::ParticleAttributeTable);
178  IMP_MODEL_IMPORT(internal::ParticlesAttributeTable);
179 #endif
180  /** Clear all the cache attributes of a given particle.*/
181  void clear_particle_caches(ParticleIndex pi);
182 
183  //! Add particle to the model
184  ParticleIndex add_particle(std::string name);
185 
186  //! Get the name of a particle
187  std::string get_particle_name(ParticleIndex pi);
188 
189  /** Add the passed Undecorator to the particle.*/
190  void add_undecorator(ParticleIndex pi, Undecorator *d);
191 
192  /** @name States
193 
194  ScoreStates can be added to the Model in order to keep them
195  alive as long as the model is alive. Being added does affect
196  their ability to perform their required action. See ScoreState
197  for more information.
198 
199  \advancedmethod
200  */
201  /**@{*/
202  IMP_LIST_ACTION(public, ScoreState, ScoreStates, score_state, score_states,
203  ScoreState *, ScoreStates, do_add_score_state(obj), {},
204  do_remove_score_state(obj));
205  /**@}*/
206 
207  public:
208 #ifndef SWIG
209  using Object::clear_caches;
210 #endif
211 
212  //! Sometimes it is useful to be able to make sure the model is up to date
213  /** This method updates all the state but does not necessarily compute the
214  score. Use this to make sure that your containers and rigid bodies are
215  up to date.
216  */
217  void update();
218 
219 #ifdef IMP_DOXYGEN
220  /** \name Accessing attributes
221  \anchor model_attributes
222  All the attribute data associated with each Particle is stored in the
223  Model. For each type of attribute, there are the methods detailed below
224  (where, eg, TypeKey is FloatKey or StringKey)
225  @{
226  */
227  /** \pre get_has_attribute(attribute_key, particle) is false*/
228  void add_attribute(TypeKey attribute_key, ParticleIndex particle, Type value);
229 
230  /** \pre get_has_attribute(attribute_key, particle) is true*/
231  void remove_attribute(TypeKey attribute_key, ParticleIndex particle);
232 
233  bool get_has_attribute(TypeKey attribute_key, ParticleIndex particle) const;
234 
235  /** \pre get_has_attribute(attribute_key, particle) is true*/
236  void set_attribute(TypeKey attribute_key, ParticleIndex particle, Type value);
237 
238  /** \pre get_has_attribute(attribute_key, particle) is true*/
239  Type get_attribute(TypeKey attribute_key, ParticleIndex particle);
240 
241  /** Cache attributes, unklike normal attributes, can be added during
242  evaluation. They are also cleared by the clear_cache_attributes() method.
243  Cache attributes should be used when one is adding data to a particle
244  to aid scoring (eg cache the rigid body collision acceleration structure).
245 
246  When some pertinent aspect of the particle changes, the clear method
247  should
248  be called (yes, this is a bit vague). Examples where it should be cleared
249  include changing the set of members of a core::RigidBody or their
250  coordinates, changing the members of an atom::Hierarchy.
251  */
252  void add_cache_attribute(TypeKey attribute_key, ParticleIndex particle,
253  Type value);
254 
255  //! Optimized attributes are the parameters of the model
256  /** They will be modified by the samplers and optimizers.
257  */
258  void set_is_optimized(TypeKey attribute_key, ParticleIndex particle,
259  bool true_or_false);
260 /** @} */
261 #endif
262 
263 #ifdef SWIG
264 #define IMP_MODEL_ATTRIBUTE_METHODS(Type, Value) \
265  void add_attribute(Type##Key attribute_key, ParticleIndex particle, \
266  Value value); \
267  void remove_attribute(Type##Key attribute_key, ParticleIndex particle); \
268  bool get_has_attribute(Type##Key attribute_key, \
269  ParticleIndex particle) const; \
270  void set_attribute(Type##Key attribute_key, ParticleIndex particle, \
271  Value value); \
272  Value get_attribute(Type##Key attribute_key, ParticleIndex particle); \
273  void add_cache_attribute(Type##Key attribute_key, ParticleIndex particle, \
274  Value value)
275 
276  IMP_MODEL_ATTRIBUTE_METHODS(Float, Float);
277  IMP_MODEL_ATTRIBUTE_METHODS(Int, Int);
278  IMP_MODEL_ATTRIBUTE_METHODS(Ints, Ints);
279  IMP_MODEL_ATTRIBUTE_METHODS(String, String);
280  IMP_MODEL_ATTRIBUTE_METHODS(ParticleIndexes, ParticleIndexes);
281  IMP_MODEL_ATTRIBUTE_METHODS(ParticleIndex, ParticleIndex);
282  IMP_MODEL_ATTRIBUTE_METHODS(Object, Object *);
283  IMP_MODEL_ATTRIBUTE_METHODS(WeakObject, Object *);
284  void set_is_optimized(FloatKey, ParticleIndex, bool);
285  void add_to_derivative(FloatKey k, ParticleIndex particle, double v,
286  const DerivativeAccumulator &da);
287 #endif
288 
289  /** Get the particle from an index. */
290  Particle *get_particle(ParticleIndex p) const;
291 
292  /** Get the particle from an index. */
293  bool get_has_particle(ParticleIndex p) const;
294 
295  /** Get all particle indexes */
296  ParticleIndexes get_particle_indexes();
297 
298  /** Get all the ModelObjects associated with this Model.
299  */
300  ModelObjectsTemp get_model_objects() const;
301 
302  /** Remove a particle from the Model. The particle will then be inactive and
303  cannot be used for anything and all data stored in the particle is lost.
304  */
305  void remove_particle(ParticleIndex pi);
306 
307  /** \name Storing data in the model
308 
309  One can store data associated with the model. This is used, for example,
310  to keep a central ScoreState to normalize rigid body rotational variables.
311  @{ */
312  /** Store a piece of data in the model referenced by the key. */
313  void add_data(ModelKey mk, Object *o);
314  /** Get back some data stored in the model. */
315  Object *get_data(ModelKey mk) const;
316  /** Remove data stored in the model. */
317  void remove_data(ModelKey mk);
318  /** Check if the model has a certain piece of data attached. */
319  bool get_has_data(ModelKey mk) const;
320  /** @} */
321 
323 
324  public:
325  /** \deprecated_at{2.1} Use a ScoringFunction instead. */
326  IMPKERNEL_DEPRECATED_METHOD_DECL(2.1)
327  ScoringFunction *create_model_scoring_function();
328 
329  /** \deprecated_at{2.1} Add to a ScoringFunction instead. */
330  IMPKERNEL_DEPRECATED_METHOD_DECL(2.1)
331  void add_restraint(Restraint *r);
332 
333 #if !defined(IMP_DOXYGEN)
334  virtual void do_destroy() IMP_OVERRIDE;
335 #endif
336 
337  /** \deprecated_at{2.1} Use a ScoringFunction instead.*/
338  IMPKERNEL_DEPRECATED_METHOD_DECL(2.1)
339  double evaluate(bool tf, bool warn = true);
340  /** \deprecated_at{2.1} Using a ScoringFunction instead. */
341  IMPKERNEL_DEPRECATED_METHOD_DECL(2.1)
342  RestraintSet *get_root_restraint_set();
343 };
344 
345 IMPKERNEL_END_NAMESPACE
346 
347 // This is needed for per cpp compilations, a not even sure why
348 // (perhaps cause Model returns ParticleIterator here and there?)
349 // - Feel free to remove if you *really* know what you're doing
350 #include "IMP/Particle.h"
351 
352 #endif /* IMPKERNEL_MODEL_H */
Used to hold a set of related restraints.
boost::graph DependencyGraph
A directed graph on the interactions between the various objects in the model.
The base class for decorators.
#define IMP_OBJECT_METHODS(Name)
Define the basic things needed by any Object.
Definition: object_macros.h:25
void add_particle(RMF::FileHandle fh, Particle *hs)
Various general useful macros for IMP.
virtual void clear_caches()
Definition: Object.h:227
Object used to hold a set of restraints.
Definition: RestraintSet.h:36
Class for storing model, its restraints, constraints, and particles.
Definition: Model.h:72
void add_restraint(RMF::FileHandle fh, Restraint *hs)
virtual void do_destroy()
Definition: Object.h:231
Common base class for heavy weight IMP objects.
Definition: Object.h:106
ScoreStates maintain invariants in the Model.
Definition: ScoreState.h:53
A smart pointer to a ref-counted Object that is a class member.
Definition: Pointer.h:146
Shared score state.
Single variable function.
A nullptr-initialized pointer to an IMP Object.
Represents a scoring function on the model.
A shared base class to help in debugging and things.
Represents a scoring function on the model.
double Float
Basic floating-point value (could be float, double...)
Definition: types.h:20
Class to handle individual model particles.
Definition: Particle.h:37
#define IMP_USAGE_CHECK(expr, message)
A runtime test for incorrect usage of a class or method.
Definition: check_macros.h:168
Abstract base class for all restraints.
int Int
Basic integer value.
Definition: types.h:35
std::string String
Basic string value.
Definition: types.h:44
#define IMP_OVERRIDE
Cause a compile error if this method does not override a parent method.
Class for adding derivatives from restraints to the model.
A restraint is a term in an IMP ScoringFunction.
Definition: Restraint.h:52