IMP logo
IMP Reference Guide  develop.63b38c487d,2024/12/22
The Integrative Modeling Platform
interactive.py
1 ## \example domino/interactive.py
2 # IMP::domino::DominoSampler supports an interactive mode whereby each step
3 # of the sampling process is called explicitly and all intermediate results
4 # are exposed. This usage mode can be used to help understand how domino
5 # behaves as well as to distribute a domino computation to multiple cores
6 # or multiple machines. For the latter, it is useful to use the
7 # IMP::domino::get_assignments() and IMP::domino::set_assignments()
8 # functions to save the states to a file.
9 
10 import IMP.domino
11 import IMP.algebra
12 import IMP.container
13 import IMP
14 import sys
15 
16 IMP.setup_from_argv(sys.argv, "interactive")
17 
18 m = IMP.Model()
19 
20 # create some particles
22  for x in range(0, 3)])
23 
26  m, [(ps[i[0]], ps[i[1]]) for i in [(0, 1), (1, 2)]])
27 print([(m.get_particle_name(p[0]), m.get_particle_name(p[1]))
28  for p in lpc.get_contents()])
30 r.set_maximum_score(.1)
31 
32 space = IMP.domino.XYZStates(
33  [IMP.algebra.Vector3D(i, 0, 0) for i in range(0, 6)])
34 
36 for p in ps:
37  pst.set_particle_states(m.get_particle(p), space)
38 
39 m.set_log_level(IMP.SILENT)
40 
41 # make sure to break up the
42 mt = IMP.domino.get_merge_tree([r], pst)
43 try:
45 except:
46  print("Unable to display graph using 'dot'")
47 
48 ds = IMP.domino.DominoSampler(m, pst)
49 # use the default setup for filters
50 ds.set_restraints([r])
51 ds.set_scoring_function([r])
52 ds.set_merge_tree(mt)
53 ds.set_log_level(IMP.SILENT)
54 
55 # recurse down the tree getting the assignments and printing them
56 
57 
58 def get_assignments(vertex):
59  on = mt.get_out_neighbors(vertex)
60  if len(on) == 0:
61  # we have a leaf
62  ret = ds.get_vertex_assignments(vertex)
63  else:
64  # recurse on the two children
65  if on[0] > on[1]:
66  # the get_vertex_assignment methods expects the children in sorted
67  # order
68  on = [on[1], on[0]]
69  a0 = get_assignments(on[0])
70  a1 = get_assignments(on[1])
71  ret = ds.get_vertex_assignments(vertex, a0, a1)
72  print(mt.get_vertex_name(vertex), [str(r) for r in ret])
73  return ret
74 
75 
76 # the root is the last vertex
77 get_assignments(mt.get_vertices()[-1])
78 
79 schedule = []
80 # we could instead decompose the tree into independent sets of jobs
81 
82 
83 def schedule_job(vertex):
84  # first figure out the maximum phase for my children, then add me to the
85  # next higher phase
86  on = mt.get_out_neighbors(vertex)
87  max_child_time = -1
88  for n in on:
89  max_child_time = max(schedule_job(n), max_child_time)
90  my_time = max_child_time + 1
91  while len(schedule) < my_time + 1:
92  schedule.append([])
93  # add myself to the next free phase
94  schedule[my_time].append(vertex)
95  return my_time
96 
97 
98 schedule_job(mt.get_vertices()[-1])
99 print("The merging can be scheduled as", schedule)
Strings setup_from_argv(const Strings &argv, std::string description, std::string positional_description, int num_positional)
Various classes to hold sets of particles.
Sample best solutions using Domino.
Definition: DominoSampler.h:32
Score distance between two particle centers using a harmonic function.
static XYZ setup_particle(Model *m, ParticleIndex pi)
Definition: XYZ.h:51
Class for storing model, its restraints, constraints, and particles.
Definition: Model.h:86
Store a list of ParticleIndexPairs.
ParticleIndexPairs get_indexes(const ParticlePairsTemp &ps)
Get the indexes from a list of particle pairs.
General purpose algebraic and geometric methods that are expected to be used by a wide variety of IMP...
MergeTree get_merge_tree(const SubsetGraph &junction_tree)
VectorD< 3 > Vector3D
Definition: VectorD.h:408
Class to handle individual particles of a Model object.
Definition: Particle.h:43
std::string show_graphviz(Graph g)
Applies a PairScore to each Pair in a list.
Divide-and-conquer inferential optimization in discrete space.