1+ import logging
2+
13import networkx as nx
24
35from CodeEntropy .levels .nodes .build_beads import BuildBeadsNode
4- from CodeEntropy .levels .nodes .build_conformations import BuildConformationsNode
56from CodeEntropy .levels .nodes .build_covariance_matrices import (
67 BuildCovarianceMatricesNode ,
78)
89from CodeEntropy .levels .nodes .compute_axes import ComputeAxesNode
9- from CodeEntropy .levels .nodes .compute_dihedrals import ComputeDihedralsNode
10- from CodeEntropy .levels .nodes .compute_neighbours import ComputeNeighboursNode
10+ from CodeEntropy .levels .nodes .compute_dihedrals import ComputeConformationalStatesNode
1111from CodeEntropy .levels .nodes .compute_weighted_forces import ComputeWeightedForcesNode
1212from CodeEntropy .levels .nodes .compute_weighted_torques import ComputeWeightedTorquesNode
1313from CodeEntropy .levels .nodes .detect_levels import DetectLevelsNode
1414from CodeEntropy .levels .nodes .detect_molecules import DetectMoleculesNode
1515
16+ logger = logging .getLogger (__name__ )
17+
1618
1719class LevelDAG :
20+ """
21+ DAG for computing level-resolved structural quantities.
22+ Uses shared_data as the single state container.
23+ """
1824
19- def __init__ (self ):
25+ def __init__ (self , universe_operations ):
2026 self .graph = nx .DiGraph ()
2127 self .nodes = {}
28+ self ._universe_operations = universe_operations
2229
2330 def build (self ):
2431 self .add ("detect_molecules" , DetectMoleculesNode ())
2532 self .add ("detect_levels" , DetectLevelsNode (), ["detect_molecules" ])
33+
2634 self .add ("build_beads" , BuildBeadsNode (), ["detect_levels" ])
35+
2736 self .add ("compute_axes" , ComputeAxesNode (), ["build_beads" ])
37+
2838 self .add (
29- "compute_weighted_forces" , ComputeWeightedForcesNode (), ["compute_axes" ]
39+ "compute_weighted_forces" ,
40+ ComputeWeightedForcesNode (),
41+ ["compute_axes" ],
3042 )
3143 self .add (
32- "compute_weighted_torques" , ComputeWeightedTorquesNode (), ["compute_axes" ]
44+ "compute_weighted_torques" ,
45+ ComputeWeightedTorquesNode (),
46+ ["compute_axes" ],
3347 )
48+
3449 self .add (
3550 "build_covariance" ,
3651 BuildCovarianceMatricesNode (),
37- ["compute_weighted_forces" , "compute_weighted_torques" ],
52+ [
53+ "compute_weighted_forces" ,
54+ "compute_weighted_torques" ,
55+ ],
56+ )
57+
58+ self .add (
59+ "compute_conformational_states" ,
60+ ComputeConformationalStatesNode (self ._universe_operations ),
61+ ["detect_levels" ],
3862 )
39- self .add ("compute_dihedrals" , ComputeDihedralsNode (), ["build_beads" ])
40- self .add ("build_conformations" , BuildConformationsNode (), ["compute_dihedrals" ])
41- self .add ("compute_neighbours" , ComputeNeighboursNode (), ["build_beads" ])
4263
4364 return self
4465
@@ -50,5 +71,9 @@ def add(self, name, obj, deps=None):
5071 self .graph .add_edge (d , name )
5172
5273 def execute (self , shared_data ):
53- for node in nx .topological_sort (self .graph ):
54- self .nodes [node ].run (shared_data )
74+ """
75+ Execute DAG in topological order.
76+ Nodes mutate shared_data in-place.
77+ """
78+ for node_name in nx .topological_sort (self .graph ):
79+ self .nodes [node_name ].run (shared_data )
0 commit comments