IMP  2.4.0
The Integrative Modeling Platform
domino/interactive.py

IMP::domino::DominoSampler supports an interactive mode where by 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 where by 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.
3 #
4 
5 import IMP.domino
6 import IMP.algebra
7 import IMP.container
8 import IMP
9 
10 m = IMP.kernel.Model()
11 
12 # create some particles
13 ps = [IMP.core.XYZ.setup_particle(IMP.kernel.Particle(m)) for x in range(0, 3)]
14 
17  [(ps[i[0]], ps[i[1]]) for i in [(0, 1), (1, 2)]])
18 print([(p[0].get_name(), p[1].get_name()) for p in lpc.get_particle_pairs()])
20 r.set_maximum_score(.1)
21 
22 space = IMP.domino.XYZStates(
23  [IMP.algebra.Vector3D(i, 0, 0) for i in range(0, 6)])
24 
26 for p in ps:
27  pst.set_particle_states(p, space)
28 
29 m.set_log_level(IMP.base.SILENT)
30 
31 # make sure to break up the
32 mt = IMP.domino.get_merge_tree([r], pst)
33 try:
34  IMP.show_graphviz(mt)
35 except:
36  print("Unable to display graph using 'dot'")
37 
38 ds = IMP.domino.DominoSampler(m, pst)
39 # use the default setup for filters
40 ds.set_scoring_function([r])
41 ds.set_merge_tree(mt)
42 ds.set_log_level(IMP.base.SILENT)
43 
44 # recurse down the tree getting the assignments and printing them
45 
46 
47 def get_assignments(vertex):
48  on = mt.get_out_neighbors(vertex)
49  if len(on) == 0:
50  # we have a leaf
51  ret = ds.get_vertex_assignments(vertex)
52  else:
53  # recurse on the two children
54  if on[0] > on[1]:
55  # the get_vertex_assignment methods expects the children in sorted
56  # order
57  on = [on[1], on[0]]
58  a0 = get_assignments(on[0])
59  a1 = get_assignments(on[1])
60  ret = ds.get_vertex_assignments(vertex, a0, a1)
61  print(mt.get_vertex_name(vertex), [str(r) for r in ret])
62  return ret
63 
64 # the root is the last vetex
65 get_assignments(mt.get_vertices()[-1])
66 
67 
68 schedule = []
69 # we could instead decompose the tree into independent sets of jobs
70 
71 
72 def schedule_job(vertex):
73  # first figure out the maximum phase for my children, then add me to the
74  # next higher phase
75  on = mt.get_out_neighbors(vertex)
76  max_child_time = -1
77  for n in on:
78  max_child_time = max(schedule_job(n), max_child_time)
79  my_time = max_child_time + 1
80  while len(schedule) < my_time + 1:
81  schedule.append([])
82  # add myself to the next free phase
83  schedule[my_time].append(vertex)
84  return my_time
85 
86 schedule_job(mt.get_vertices()[-1])
87 print("The merging can be scheduled as", schedule)