IMP logo
IMP Reference Guide  2.13.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 from __future__ import print_function
11 import IMP.domino
12 import IMP.algebra
13 import IMP.container
14 import IMP
15 import sys
16 
17 IMP.setup_from_argv(sys.argv, "interactive")
18 
19 m = IMP.Model()
20 
21 # create some particles
23  for x in range(0, 3)])
24 
27  [(ps[i[0]], ps[i[1]]) for i in [(0, 1), (1, 2)]])
28 print([(p[0].get_name(), p[1].get_name()) for p in lpc.get_particle_pairs()])
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 # the root is the last vetex
76 get_assignments(mt.get_vertices()[-1])
77 
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 schedule_job(mt.get_vertices()[-1])
98 print("The merging can be scheduled as", schedule)