Skip to content

Commit 80f5769

Browse files
committed
feat: unlock full batch parallel docking
1 parent 215f6e6 commit 80f5769

1 file changed

Lines changed: 35 additions & 21 deletions

File tree

backend/agents/DockingAgent.py

Lines changed: 35 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -66,28 +66,42 @@ async def _execute(self, state: dict) -> dict:
6666
pose_dir = Path(__file__).parent.parent / "data" / "docked_poses" / session_id
6767
pose_dir.mkdir(parents=True, exist_ok=True)
6868

69+
semaphore = asyncio.Semaphore(4)
6970
results = []
70-
for idx, mol in enumerate(molecules[:30], start=1):
71-
if state.get("cancelled"): break # Check local flag too
72-
73-
smiles = mol.get("smiles")
74-
if not smiles: continue
75-
76-
energy, pose_meta = await _dock_one_async(
77-
smiles, pocket, receptor_pdbqt, exe, mode, log,
78-
pose_dir=pose_dir, pose_id=_pose_id(smiles, idx)
79-
)
80-
81-
if energy is not None:
82-
results.append({
83-
"smiles": smiles,
84-
"compound_name": f"Lead-{len(results)+1}",
85-
"binding_energy": energy,
86-
"cnn_score": pose_meta.get("cnn_score") if pose_meta else None,
87-
"cnn_affinity": pose_meta.get("cnn_affinity") if pose_meta else None,
88-
"method": mode,
89-
"pose_id": pose_meta.get("pose_id") if pose_meta else None
90-
})
71+
72+
async def docked_task(idx, mol_data):
73+
async with semaphore:
74+
smiles = mol_data.get("smiles")
75+
if not smiles: return None
76+
77+
energy, pose_meta = await _dock_one_async(
78+
smiles, pocket, receptor_pdbqt, exe, mode, log,
79+
pose_dir=pose_dir, pose_id=_pose_id(smiles, idx)
80+
)
81+
82+
# Update progress for EACH completion
83+
current_prog = 30 + int((len(results) / len(molecules)) * 60)
84+
if hasattr(self, 'update_progress'):
85+
await self.update_progress(current_prog, f"Docking {len(results)+1}/{len(molecules)}...")
86+
87+
if energy is not None:
88+
return {
89+
"smiles": smiles,
90+
"compound_name": f"Lead-{idx+1}",
91+
"binding_energy": energy,
92+
"cnn_score": pose_meta.get("cnn_score") if pose_meta else None,
93+
"cnn_affinity": pose_meta.get("cnn_affinity") if pose_meta else None,
94+
"method": mode,
95+
"pose_id": pose_meta.get("pose_id") if pose_meta else None
96+
}
97+
return None
98+
99+
# Execute all tasks
100+
tasks = [docked_task(i, m) for i, m in enumerate(molecules)]
101+
docking_results_all = await asyncio.gather(*tasks)
102+
103+
# Filter out failed ones
104+
results = [r for r in docking_results_all if r is not None]
91105

92106
return {"docking_results": sorted(results, key=lambda x: x["binding_energy"])}
93107

0 commit comments

Comments
 (0)