bioflow / scripts /verify_phase1.py
ramiiiiiiiiiiiiiiiiiiiiiiiiiiiiii's picture
Phase 1: FastAPI integration with DeepPurpose DTI predictor
adecc9b
import sys
import os
from pathlib import Path
# Add project root to path
sys.path.append(str(Path(__file__).parent.parent))
from bioflow.core import (
BioFlowOrchestrator,
ToolRegistry,
WorkflowConfig,
Modality,
BioEncoder,
BioPredictor,
BioRetriever,
EmbeddingResult,
PredictionResult,
RetrievalResult
)
# 1. Create Mock Tools for Verification
class MockEncoder(BioEncoder):
def encode(self, content, modality):
print(f" [Mock] Encoding {modality.value}: {content[:20]}...")
return EmbeddingResult(vector=[0.1]*768, modality=modality, dimension=768)
@property
def dimension(self): return 768
class MockPredictor(BioPredictor):
def predict(self, drug, target):
print(f" [Mock] Predicting interaction for drug candidate...")
return PredictionResult(score=0.85, confidence=0.9)
class MockRetriever(BioRetriever):
def search(self, query, limit=10, filters=None, **kwargs):
print(f" [Mock] Searching Vector DB for neighbors...")
return [RetrievalResult(id="mol_1", score=0.95, content="CCO", modality=Modality.SMILES)]
def ingest(self, content, modality, payload=None): return "1"
# 2. Setup Registry
print("--- πŸ› οΈ Step 1: Tool Registry Setup ---")
ToolRegistry.register_encoder("obm", MockEncoder())
ToolRegistry.register_predictor("deeppurpose", MockPredictor())
print(ToolRegistry.summary())
print()
# 3. Load and Visualize Workflow
print("--- πŸ—ΊοΈ Step 2: Workflow DAG Resolution ---")
workflow_path = Path("bioflow/workflows/drug_discovery.yaml")
import yaml
with open(workflow_path, 'r') as f:
config_dict = yaml.safe_load(f)
orchestrator = BioFlowOrchestrator()
orchestrator.set_retriever(MockRetriever()) # Configured the retriever
config = WorkflowConfig.from_dict(config_dict)
orchestrator.register_workflow(config)
# Show topological order
order = orchestrator._build_execution_order(config)
print(f"Workflow: {config.name}")
print("Execution Sequence (Topological Sort):")
for i, node in enumerate(order):
deps = f" (depends on: {', '.join(node.inputs)})" if node.inputs else ""
print(f" {i+1}. [{node.id}] Type: {node.type.value}{deps}")
print()
# 4. Perform Dry Run
print("--- πŸš€ Step 3: Pipeline Execution Dry Run ---")
input_smiles = "CN1C=NC2=C1C(=O)N(C(=O)N2C)C" # Caffeine
result = orchestrator.run("drug_discovery_basic", input_smiles)
print("\n--- πŸ“Š Final Report ---")
if result.success:
print(f"Status: βœ… SUCCESS")
print(f"Final Output Score: {result.output[0].score if isinstance(result.output, list) else result.output.score}")
print(f"Duration: {result.duration_ms:.2f} ms")
else:
print(f"Status: ❌ FAILED")
print(f"Errors: {result.context.errors}")