sci-form 0.2.0

High-performance 3D molecular conformer generation using ETKDG distance geometry
Documentation
# Roadmap: VeloSci 3D Conformer Engine (RDKit -> Rust)

**Objetivo Principal:** Traducir y aislar el pipeline de generación de conformaciones 3D de RDKit (C++) a Rust idiomático, eliminando dependencias pesadas (Boost, Eigen) para compilar un módulo `.wasm` ultra-ligero y rápido para la web. Una vez estable, el motor evolucionará a una plataforma de simulación de materiales porosos y electroquímica nativa en la web (Visión Post-Core).

**Pila Tecnológica:**
* **Lenguaje:** Rust (Target: `wasm32-unknown-unknown`)
* **Álgebra Lineal:** `nalgebra` o `ndarray` (Reemplazo de Eigen)
* **Teoría de Grafos:** `petgraph` (Reemplazo de Boost.Graph)
* **Testing Oracle:** Python + RDKit nativo

---

## 🏗 Estructura de Datos Base Propuesta (sci-form)
Para soportar componentes avanzados (como periodicidad para MOFs, análisis electrostático e integración de memoria "zero-copy" con Arrow), la estructura en Rust debe diseñarse con visión a futuro desde el inicio:

```rust
use nalgebra::Vector3;

pub struct Atom {
    pub element: u8,            // Número atómico
    pub position: Vector3<f32>, // Coordenadas (x, y, z)
    pub charge: f32,            // Carga parcial calculada (Fase 6)
    pub formal_charge: i8,      
    pub hybridization: Hybridization,
}

pub struct Bond {
    pub start: usize,           // Índice del átomo A
    pub end: usize,             // Índice del átomo B
    pub order: BondOrder,       // Single, Double, Triple, Aromatic
}

pub struct Molecule {
    pub atoms: Vec<Atom>,
    pub bonds: Vec<Bond>,
    pub metadata: MoleculeMeta, // Nombre, SMILES original, etc.
    // Para la Fase 7 (Materiales Complejos):
    pub unit_cell: Option<UnitCell>, 
}
```

> **Nota de Desarrollo:** No intentes traducir archivo por archivo linealmente. C++ orientado a objetos con herencia múltiple no se traduce bien a Rust. Extrae la **lógica matemática** de las funciones en C++ e impleméntala usando la composición basada en traits de Rust.

---

## ⚙️ Módulos Core: Generador de Conformaciones 3D

### Fase 1: Infraestructura y Estructuras de Datos Base (Mes 1)
El objetivo de esta fase no es hacer química, sino preparar el terreno matemático y la arquitectura de pruebas.

- [ ] **1.1 Setup del Entorno y Repositorio:**
  - Inicializar el proyecto con `cargo new --lib sci-form`.
  - Configurar `wasm-bindgen` para las pruebas iniciales de interoperabilidad.
- [ ] **1.2 Pipeline de Differential Testing:**
  - Crear un script en Python (`oracle.py`) que tome un dataset de 1000 SMILES de prueba, genere coordenadas 3D locales con RDKit (`AllChem.EmbedMolecule`) y las guarde en JSON o XYZ.
  - Escribir la suite de tests en Rust que calcule el RMSD entre las coordenadas generadas por el WASM en Rust y las de C++ como fuente de verdad.
- [ ] **1.3 Replicar `ROMol` (El Grafo Molecular):**
  - Implementar la estructura central usando `petgraph` basada en la propuesta de `Atom`, `Bond` y `Molecule`.
  - *Opcional/Atajo:* Evaluar usar crates de Rust existentes como `purr` para el parsing de SMILES a Grafo 2D y no reinventar esa rueda.

### Fase 2: Geometría de Distancias y Matriz de Límites (Meses 2-3)
Aquí comienza la traducción pura de RDKit (*namespace* `DistGeom`).

- [ ] **2.1 Implementar la *Bounds Matrix*:**
  - Escribir la lógica para calcular las distancias mínimas y máximas permitidas entre átomos basándose en las topologías de enlace (1-2, 1-3, 1-4).
  - Programar la suavización de la matriz usando el algoritmo del camino más corto de Floyd-Warshall o Dijkstra.
- [ ] **2.2 Embebimiento Métrico (Metric Geometry):**
  - Traducir la selección de distancias aleatorias dentro de los límites de la matriz.
  - Implementar la matriz de distancias cuadráticas y el centrado de la matriz.
- [ ] **2.3 Diagonalización y Proyección 3D:**
  - Usar `nalgebra` para calcular los autovalores y autovectores (Eigenvalue decomposition) de la matriz de distancias.
  - Proyectar los 3 autovectores principales para obtener las coordenadas $(x, y, z)$ iniciales en bruto.

### Fase 3: Refinamiento Químico y Estereoquímica (Mes 4)
Las coordenadas de la Fase 2 serán físicamente inestables. Se aplican reglas empíricas para acercarlas a la realidad química.

- [ ] **3.1 Percepción de Estereoquímica:**
  - Implementar la lógica para detectar centros quirales (R/S) e isómeros (E/Z) a partir del grafo 2D.
  - Ajustar la matriz de límites para forzar los volúmenes quirales correctos.
- [ ] **3.2 Implementar ETKDG:**
  - Traducir el algoritmo *Experimental Torsion-Angle Preference* de RDKit.
  - Agregar penalizaciones de energía basadas en bibliotecas de torsión experimentales para garantizar pliegues de anillos correctos.

### Fase 4: Minimización de Energía (Force Fields) (Meses 5-6)
Las coordenadas crudas necesitan relajarse para alcanzar el mínimo de energía local.

- [ ] **4.1 Estructura del Campo de Fuerza (UFF):**
  - Traducir los parámetros del *Universal Force Field* (UFF) desde RDKit.
  - Implementar las funciones de energía para enlaces (stretching), ángulos (bending) y torsiones (dihedrals).
  - Implementar las fuerzas no enlazadas (Van der Waals / Lennard-Jones).
- [ ] **4.2 Motor de Minimización:**
  - Escribir un algoritmo iterativo (preferentemente L-BFGS por eficiencia) usando `nalgebra` para calcular gradientes de energía y relajar la molécula iterativamente.

### Fase 5: Optimización WASM y API Pública (Mes 6+)
Hacer que la librería sea usable en la web para el ecosistema VeloSci.

- [ ] **5.1 Bindings de WASM:**
  - Exponer una API limpia en `wasm-bindgen` (ej. `generate_3d_conformer(smiles: &str) -> String`).
- [ ] **5.2 Benchmarking:**
  - Medir tiempo de ejecución del código WASM en el navegador contra RDKit-JS (MinimalLib).
  - Optimizar cuellos de botella en asignación de memoria.
- [ ] **5.3 Reducción de Tamaño:**
  - Ajustar `Cargo.toml` (`lto = true`, `opt-level = 'z'`, stripping) buscando un WASM ultraligero (< 1MB).

---

## 🚀 Módulos "Killer" Post-Core: Visión de Futuro (sci-form)
Estas características transformarán este motor en una plataforma innovadora de simulación inorgánica web que superará a las herramientas web convencionales enfocadas solo en industria farmacéutica.

### Fase 6: Análisis Electrostático y Superficies (Meses 7-8)
**Objetivo:** Dotar a la molécula de "personalidad" química y modelar propiedades de interacción. El motor debe conocer la distribución electrónica para simulaciones reales de reactividad.
- [ ] **6.1 Implementación Nativa de Cargas Parciales (Gasteiger-Marsili):**
  - Desarrollar un solver iterativo para la ecualización de electronegatividad.
  - Asignar cargas parciales $q_i$ útiles en posteriores simulaciones (ej. Espectroscopía de Impedancia Electroquímica o reactividad de superficies).
- [ ] **6.2 Módulo SASA (Solvent Accessible Surface Area):**
  - Integrar un algoritmo tipo Shrake-Rupley acelerado en Rust en el paso de generación 3D.
  - Calcular Área de Superficie Accesible al Disolvente, volumen libre y tamaño de cavidades (vital para capacidades de filtrado y almacenamiento en materiales porosos).

### Fase 7: Ensamblaje de Materiales Complejos (Meses 9-10)
**Objetivo:** Romper la barrera de las moléculas orgánicas aisladas y crear un módulo de Ensamblaje Topológico para modelar inorgánica y polímeros periódicos (MOFs) en el navegador.
- [ ] **7.1 Arquitectura SBU (Secondary Building Units) y Nodos:**
  - Definir la lógica y algoritmia para centros metálicos y coordinación de redes de manera estérica (ej. acople geométrico de ligandos orgánicos con iones compuestos).
  - Permitir acople dinámico sin requerir pesados programas de escritorio.
- [ ] **7.2 Soporte de Periodicidad (Celdas Unitarias):**
  - Añadir estructuras y algoritmos de vectores de celda con condiciones de contorno periódicas (PBC).
  - Viabilizar cálculos y visualización en WASM de redes cristalinas infinitas por instanciación.

### Fase 8: Optimización de Datos para la Web (Mantenimiento Continuo)
**Objetivo:** Optimización de latencia en browser en interops JS <-> WASM. Eliminar cuellos de botella serializados para una experiencia interactiva instantánea.
- [ ] **8.1 Transferencia de Memoria "Zero-Copy" con Apache Arrow:**
  - Implementar soporte nativo del layout de memoria Arrow para compartir RAM directo con el Frontend de VeloSci. 
  - Evadir completamente la ineficiente traducción a JSON (`JSON.parse()`) al intercambiar matrices de 50,000+ coordenadas atómicas.
- [ ] **8.2 Multithreading con Web Workers:**
  - Paralelizar cálculos pesados (generación múltiple de conformadores, iteraciones del Force Field) usando librerías de concurrencia de Rust (ej. `rayon`) adaptadas a WASM (vía SharedArrayBuffer).