IMP logo
IMP Reference Guide  2.22.0
The Integrative Modeling Platform
domino/interactive.py

IMP::domino::DominoSampler supports an interactive mode whereby each step of the sampling process is called explicitly and all intermediate results are exposed. This usage mode can be used to help understand how domino behaves as well as to distribute a domino computation to multiple cores or multiple machines. For the latter, it is useful to use the IMP::domino::get_assignments() and IMP::domino::set_assignments() functions to save the states to a file.

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)