Skip to content

Commit cda4556

Browse files
committed
begin the process of wiring the DAG for both entropy and levels
1 parent cf0134d commit cda4556

14 files changed

+138
-72
lines changed

CodeEntropy/config/run.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
from CodeEntropy.config.arg_config_manager import ConfigManager
1818
from CodeEntropy.config.data_logger import DataLogger
1919
from CodeEntropy.config.logging_config import LoggingConfig
20-
from CodeEntropy.dihedral_tools import DihedralAnalysis
21-
from CodeEntropy.entropy import EntropyManager
22-
from CodeEntropy.group_molecules import GroupMolecules
23-
from CodeEntropy.levels import LevelManager
24-
from CodeEntropy.mda_universe_operations import UniverseOperations
20+
from CodeEntropy.entropy.entropy_manager import EntropyManager
21+
from CodeEntropy.group_molecules.group_molecules import GroupMolecules
22+
from CodeEntropy.levels.dihedral_tools import DihedralAnalysis
23+
from CodeEntropy.levels.level_manager import LevelManager
24+
from CodeEntropy.levels.mda_universe_operations import UniverseOperations
2525

2626
logger = logging.getLogger(__name__)
2727
console = LoggingConfig.get_console()

CodeEntropy/entropy/entropy_graph.py

Lines changed: 14 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import networkx as nx
22

3-
from CodeEntropy.entropy.nodes.configurational_entropy import ConfigurationalEntropyNode
4-
from CodeEntropy.entropy.nodes.entropy_aggregator import EntropyAggregatorNode
5-
from CodeEntropy.entropy.nodes.orientational_entropy import OrientationalEntropyNode
6-
from CodeEntropy.entropy.nodes.vibrational_entropy import VibrationalEntropyNode
3+
from CodeEntropy.entropy.nodes.configurational_entropy_node import (
4+
ConfigurationalEntropyNode,
5+
)
6+
from CodeEntropy.entropy.nodes.vibrational_entropy_node import VibrationalEntropyNode
77

88

99
class EntropyGraph:
@@ -23,23 +23,23 @@ def __init__(self):
2323
def build(self):
2424
self.add("vibrational_entropy", VibrationalEntropyNode())
2525

26-
self.add(
27-
"orientational_entropy",
28-
OrientationalEntropyNode(),
29-
depends_on=["vibrational_entropy"],
30-
)
26+
# self.add(
27+
# "orientational_entropy",
28+
# OrientationalEntropyNode(),
29+
# depends_on=["vibrational_entropy"],
30+
# )
3131

3232
self.add(
3333
"configurational_entropy",
3434
ConfigurationalEntropyNode(),
3535
depends_on=["orientational_entropy"],
3636
)
3737

38-
self.add(
39-
"aggregate_entropy",
40-
EntropyAggregatorNode(),
41-
depends_on=["configurational_entropy"],
42-
)
38+
# self.add(
39+
# "aggregate_entropy",
40+
# EntropyAggregatorNode(),
41+
# depends_on=["configurational_entropy"],
42+
# )
4343

4444
return self
4545

CodeEntropy/entropy/entropy_manager.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
from CodeEntropy.config.logging_config import LoggingConfig
88
from CodeEntropy.entropy.entropy_graph import EntropyGraph
99
from CodeEntropy.levels.hierarchy_graph import LevelDAG
10+
from CodeEntropy.levels.level_hierarchy import LevelHierarchy
1011

1112
logger = logging.getLogger(__name__)
1213
console = LoggingConfig.get_console()
@@ -71,7 +72,9 @@ def execute(self):
7172

7273
reduced_universe = self._get_reduced_universe()
7374

74-
number_molecules, levels = self._level_manager.select_levels(reduced_universe)
75+
level_hierarchy = LevelHierarchy()
76+
77+
number_molecules, levels = level_hierarchy.select_levels(reduced_universe)
7578

7679
groups = self._group_molecules.grouping_molecules(
7780
reduced_universe, self._args.grouping
@@ -112,7 +115,9 @@ def execute(self):
112115
"run_manager": self._run_manager,
113116
}
114117

115-
level_results = LevelDAG().build().execute(shared_data)
118+
logger.info(f"shared_data: {shared_data}")
119+
120+
level_results = LevelDAG(self._universe_operations).build().execute(shared_data)
116121

117122
shared_data.update(level_results)
118123

CodeEntropy/entropy/nodes/configurational_entropy_node.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import numpy as np
44

5-
from CodeEntropy.entropy.configurational_entropy import ConfigurationalEntropy
5+
from CodeEntropy.entropy.configurational_entropy import ConformationalEntropy
66

77
logger = logging.getLogger(__name__)
88

@@ -14,7 +14,7 @@ class ConfigurationalEntropyNode:
1414
"""
1515

1616
def __init__(self, data_logger):
17-
self._ce = ConfigurationalEntropy()
17+
self._ce = ConformationalEntropy()
1818
self._data_logger = data_logger
1919

2020
def run(self, shared_data, **_):
Lines changed: 37 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,44 +1,65 @@
1+
import logging
2+
13
import networkx as nx
24

35
from CodeEntropy.levels.nodes.build_beads import BuildBeadsNode
4-
from CodeEntropy.levels.nodes.build_conformations import BuildConformationsNode
56
from CodeEntropy.levels.nodes.build_covariance_matrices import (
67
BuildCovarianceMatricesNode,
78
)
89
from 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
1111
from CodeEntropy.levels.nodes.compute_weighted_forces import ComputeWeightedForcesNode
1212
from CodeEntropy.levels.nodes.compute_weighted_torques import ComputeWeightedTorquesNode
1313
from CodeEntropy.levels.nodes.detect_levels import DetectLevelsNode
1414
from CodeEntropy.levels.nodes.detect_molecules import DetectMoleculesNode
1515

16+
logger = logging.getLogger(__name__)
17+
1618

1719
class 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)

CodeEntropy/levels/nodes/build_conformations.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
from CodeEntropy.levels.dihedral_tools import DihedralTools
1+
from CodeEntropy.levels.dihedral_tools import DihedralAnalysis
22

33

44
class BuildConformationsNode:
55
def __init__(self):
6-
self._dih = DihedralTools()
6+
self._dih = DihedralAnalysis()
77

88
def run(self, shared_data):
99
dihedrals = shared_data["dihedrals"]

CodeEntropy/levels/nodes/build_covariance_matrices.py

Lines changed: 5 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,18 +6,13 @@ def __init__(self):
66
self._ft = ForceTorqueManager()
77

88
def run(self, shared_data):
9-
"""
10-
Build force and torque covariance matrices from weighted forces/torques.
11-
"""
12-
13-
weighted_forces = shared_data["weighted_forces"]
14-
weighted_torques = shared_data["weighted_torques"]
9+
forces = shared_data["weighted_forces"]
10+
torques = shared_data["weighted_torques"]
1511

1612
force_cov, torque_cov, frame_counts = self._ft.build_covariance_matrices(
17-
weighted_forces,
18-
weighted_torques,
13+
forces, torques
1914
)
2015

21-
shared_data["force_covariance"] = force_cov
22-
shared_data["torque_covariance"] = torque_cov
16+
shared_data["force_covariances"] = force_cov
17+
shared_data["torque_covariances"] = torque_cov
2318
shared_data["frame_counts"] = frame_counts
Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import logging
2+
13
from CodeEntropy.levels.coordinate_system import CoordinateSystem
24

5+
logger = logging.getLogger(__name__)
6+
37

48
class ComputeAxesNode:
59
def __init__(self):
@@ -8,16 +12,26 @@ def __init__(self):
812
def run(self, shared_data):
913
beads = shared_data["beads"]
1014

11-
axes = {}
15+
trans_axes = {}
16+
rot_axes = {}
1217
avg_pos = {}
1318

1419
for key, bead_list in beads.items():
15-
axes[key] = []
20+
trans_axes[key] = []
21+
rot_axes[key] = []
1622
avg_pos[key] = []
1723

1824
for bead in bead_list:
19-
avg_pos[key].append(self._coord.get_avg_pos(bead))
20-
axes[key].append(self._coord.get_axes(bead))
25+
t_ax, r_ax = self._coord.get_axes(
26+
bead.data_container, bead.level, bead.index
27+
)
28+
29+
trans_axes[key].append(t_ax)
30+
rot_axes[key].append(r_ax)
31+
avg_pos[key].append(
32+
self._coord.get_avg_pos(bead.atoms, bead.atoms.center_of_mass())
33+
)
2134

22-
shared_data["axes"] = axes
35+
shared_data["trans_axes"] = trans_axes
36+
shared_data["rot_axes"] = rot_axes
2337
shared_data["avg_positions"] = avg_pos
Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,34 @@
1-
from CodeEntropy.levels.dihedral_tools import DihedralTools
1+
from CodeEntropy.levels.dihedral_tools import DihedralAnalysis
22

33

4-
class ComputeDihedralsNode:
5-
def __init__(self):
6-
self._dih = DihedralTools()
4+
class ComputeConformationalStatesNode:
5+
def __init__(self, universe_operations):
6+
self._dih = DihedralAnalysis(universe_operations)
77

88
def run(self, shared_data):
9-
beads = shared_data["beads"]
10-
shared_data["dihedrals"] = self._dih.get_dihedrals(beads)
9+
u = shared_data["universe"]
10+
levels = shared_data["levels"]
11+
groups = shared_data["groups"]
12+
13+
start = shared_data["start"]
14+
end = shared_data["end"]
15+
step = shared_data["step"]
16+
bin_width = shared_data["args"].bin_width
17+
18+
states_ua, states_res = self._dih.build_conformational_states(
19+
data_container=u,
20+
levels=levels,
21+
groups=groups,
22+
start=start,
23+
end=end,
24+
step=step,
25+
bin_width=bin_width,
26+
)
27+
28+
shared_data["states_united_atom"] = states_ua
29+
shared_data["states_residue"] = states_res
30+
31+
return {
32+
"states_united_atom": states_ua,
33+
"states_residue": states_res,
34+
}
Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
from CodeEntropy.levels.dihedral_tools import DihedralTools
1+
from CodeEntropy.levels.neighbours import Neighbours
22

33

4-
class BuildConformationsNode:
4+
class ComputeNeighboursNode:
55
def __init__(self):
6-
self._dih = DihedralTools()
6+
self._nb = Neighbours()
77

88
def run(self, shared_data):
9-
dihedrals = shared_data["dihedrals"]
10-
shared_data["conformations"] = self._dih.build_conformational_states(dihedrals)
9+
beads = shared_data["beads"]
10+
shared_data["neighbours"] = self._nb.compute(beads)

0 commit comments

Comments
 (0)