{"id":47281785,"url":"https://github.com/jigonzalez930209/sci-form","last_synced_at":"2026-04-05T19:01:04.203Z","repository":{"id":344312479,"uuid":"1174408622","full_name":"jigonzalez930209/sci-form","owner":"jigonzalez930209","description":"High-performance 3D molecular conformer generation inspired by RDKit's ETKDG algorithm. Built with Rust for maximum speed, providing scientific accuracy and native support for Python, TypeScript (WASM), and CLI.","archived":false,"fork":false,"pushed_at":"2026-03-30T22:27:53.000Z","size":26088,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-02T02:45:10.721Z","etag":null,"topics":["cheminformatics","chemistry","conformer-generation","molecular-dynamics","molecular-modeling","python-bindings","rust","science","smiles","webassembly"],"latest_commit_sha":null,"homepage":"https://jigonzalez930209.github.io/sci-form/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jigonzalez930209.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-03-06T12:08:28.000Z","updated_at":"2026-03-30T22:27:59.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/jigonzalez930209/sci-form","commit_stats":null,"previous_names":["jigonzalez930209/sci-form"],"tags_count":38,"template":false,"template_full_name":null,"purl":"pkg:github/jigonzalez930209/sci-form","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jigonzalez930209%2Fsci-form","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jigonzalez930209%2Fsci-form/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jigonzalez930209%2Fsci-form/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jigonzalez930209%2Fsci-form/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jigonzalez930209","download_url":"https://codeload.github.com/jigonzalez930209/sci-form/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jigonzalez930209%2Fsci-form/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31446531,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-05T15:22:31.103Z","status":"ssl_error","status_checked_at":"2026-04-05T15:22:00.205Z","response_time":75,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cheminformatics","chemistry","conformer-generation","molecular-dynamics","molecular-modeling","python-bindings","rust","science","smiles","webassembly"],"created_at":"2026-03-16T01:30:36.921Z","updated_at":"2026-04-05T19:01:04.196Z","avatar_url":"https://github.com/jigonzalez930209.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# sci-form\n\n**High-performance 3D molecular conformer generation and quantum-chemistry-inspired property computation**, written in pure Rust.\n\nGenerates chemically valid 3D coordinates from SMILES strings with RDKit-quality accuracy (ETKDGv2), and provides a full suite of computational chemistry tools: Extended Hückel Theory, semi-empirical quantum chemistry (PM3, PM3(tm), GFN0/GFN1/GFN2-xTB), ab-initio methods (HF-3c, UHF/ROHF, CISD), neural network potentials (ANI-2x, ANI-TM), electrostatic potentials, density of states, population analysis, molecular alignment, force field energy evaluation (UFF + MMFF94), partial charges, SASA, stereochemistry, NMR/IR/UV-Vis spectroscopy, CIF crystallography, and materials framework assembly.\n\nNative bindings for **Rust**, **Python**, **TypeScript/JavaScript (WASM)**, and a **cross-platform CLI**.\n\n[![crates.io](https://img.shields.io/crates/v/sci-form)](https://crates.io/crates/sci-form)\n[![PyPI](https://img.shields.io/pypi/v/sciforma)](https://pypi.org/project/sciforma)\n[![npm](https://img.shields.io/npm/v/sci-form-wasm)](https://www.npmjs.com/package/sci-form-wasm)\n[![License: MIT](https://img.shields.io/badge/license-MIT-blue)](LICENSE)\n\n## Features\n\n### Conformer Generation\n- **ETKDGv2 Distance Geometry** — CSD torsion preferences (846 SMARTS patterns), matches RDKit accuracy\n- **High Accuracy** — 0.00% heavy-atom RMSD \u003e 0.5 Å vs RDKit on GDB-20 (2000 molecules, ensemble comparison)\n- **Fast** — 60+ molecules/second in Rust, parallel batch processing via rayon\n- **Full chemical coverage** — organics, stereocenters, macrocycles, fused rings, metals, halogens (He→Bi)\n\n### Quantum Chemistry (EHT)\n- **Extended Hückel Theory** — Wolfsberg-Helmholtz Hamiltonian, Löwdin orthogonalization, HOMO/LUMO gaps\n- **Mulliken \u0026 Löwdin population analysis** — atomic orbital contributions per atom (parallel, Z=1–86 including lanthanides)\n- **Molecular dipole moment** — bond dipoles + lone-pair contributions in Debye\n- **Volumetric orbital grids** — STO-3G basis, chunked evaluation for large molecules, marching cubes isosurfaces\n- **Density of States** — total DOS + per-atom PDOS with Gaussian smearing, JSON export, MSE metric\n\n### Semi-Empirical \u0026 Tight-Binding Methods\n- **PM3 / PM3(tm)** — NDDO semi-empirical SCF with Gaussian core-core corrections, heat of formation, HOMO/LUMO; transition metal support (Ti–Au)\n- **GFN0/GFN1/GFN2-xTB** — Tight-binding DFT family with Broyden SCC mixing, shell-resolved charges, D3/D4 dispersion, halogen bonding\n- **EEQ Charges** — Extended Electronegativity Equalization with improved Gaussian damping\n\n### Ab-Initio Methods\n- **HF-3c** — Minimal-basis Hartree-Fock with D3-BJ dispersion, gCP, and SRB corrections\n- **UHF / ROHF** — Unrestricted and restricted open-shell Hartree-Fock SCF with configurable level shift and damping\n- **CISD** — Configuration Interaction Singles+Doubles for excited states\n- **AO→MO Integral Transform** — 4-index integral transform with 4-fold symmetry for post-HF methods\n\n### Spectroscopy\n- **UV-Vis** — sTDA-xTB vertical excitations, Gaussian/Lorentzian broadening\n- **IR** — Numerical Hessian vibrational analysis, dipole intensities, thermochemistry (RRHO), peak assignment\n- **NMR** — Chemical shifts via HOSE codes, J-coupling (Karplus 2J–5J including long-range), ensemble averaging\n\n### Machine Learning\n- **ANI-2x / ANI-TM** — Neural network potentials with analytical gradients (24 elements including transition metals)\n- **ML Properties** — LogP, molar refractivity, solubility, Lipinski Ro5, druglikeness\n- **3D Descriptors** — WHIM, RDF, GETAWAY molecular descriptors\n- **ML Models** — Decision Trees, Random Forest, Gradient Boosting with cross-validation\n\n### Experimental RHF Engine\n- **Isolated `experimental_2` namespace** — next-generation Roothaan-Hall RHF engine without affecting stable APIs\n- **Analytical Gaussian integrals** — overlap, kinetic, nuclear attraction, core Hamiltonian, and two-electron ERIs\n- **SCF with DIIS + parallel ERI** — deterministic RHF/STO-3G workflow with rayon acceleration for the expensive $O(N^4)$ step\n- **Experimental spectroscopy stack** — prototype sTDA UV-Vis, GIAO-like NMR shielding, and semi-numerical IR/Hessian workflows\n- **GPU-oriented architecture** — WGSL shader stubs, orbital grid evaluation, and marching-cubes rendering pipeline prepared for future `wgpu` enablement\n\n### Electrostatics \u0026 Surface\n- **Electrostatic Potential (ESP)** — Coulomb grid from Mulliken charges, color mapping (red/white/blue), `.cube` export\n- **Parallel ESP** — rayon-accelerated grid computation (`parallel` feature)\n- **Solvent-Accessible Surface Area (SASA)** — Shrake-Rupley algorithm, Fibonacci sphere, Bondi radii, parallelized per-atom evaluation\n- **Gasteiger-Marsili partial charges** — 6-iteration electronegativity equalization\n\n### Parallel Computation\n- **Automatic rayon thread pool** — all compute functions (DOS, ESP SASA, population, dipole, etc.) parallelized with work-stealing queue\n- **Zero-configuration** — no API changes needed; parallelization enabled by default via `parallel` feature\n- **Intra-library parallelism** — grid point loops, per-atom evaluation, force field term accumulation all use `par_iter()`\n- **CPU-aware workload balancing** — handles small molecules (sequential) and large molecules (parallel) automatically\n\n### Force Fields\n- **UFF** — Universal Force Field for 50+ element types (including transition metals Ti–Zn, Pd, Pt, Au)\n- **MMFF94** — Merck force field (stretch, bend, torsion, van der Waals, electrostatics via 14-7 potential)\n- **BFGS / L-BFGS minimizers** — dense BFGS for small molecules, L-BFGS for large systems\n\n### Molecular Alignment\n- **Kabsch alignment** — SVD-based optimal rotation, minimizes RMSD\n- **Quaternion alignment** — Coutsias 2004 4×4 eigenproblem (faster for large molecules)\n- **RMSD computation** — after optimal superposition\n\n### Materials\n- **Periodic unit cells** — lattice parameters (a, b, c, α, β, γ) to Cartesian tensor\n- **Secondary Building Units (SBUs)** — node/linker topology with coordination sites\n- **Framework assembly** — MOF-type crystal structure generation from SBUs + topology\n- **230 space groups** — full ITC space group library with equivalent position generation\n- **CIF import/export** — parse and write CIF 1.1 crystallographic files with uncertainty notation support\n\n### Platform\n- **Multi-platform** — Rust lib, Python (PyO3), TypeScript/JS (WASM), CLI (Linux/macOS/Windows)\n- **Zero runtime dependencies** — pure Rust, no C++ toolchain needed\n- **SMILES, SMARTS, SMIRKS** — full parser, substructure matcher, and reaction transforms (multi-component); 60+ bracket elements\n\n---\n\n## Quick Start\n\n### Rust\n\n```toml\n[dependencies]\nsci-form = \"0.13\"\n# For parallel batch + ESP:\nsci-form = { version = \"0.13\", features = [\"parallel\"] }\n```\n\n```rust\nuse sci_form::{embed, compute_charges, compute_esp, compute_dos, compute_population};\n\n// 3D conformer\nlet result = sci_form::embed(\"CCO\", 42);\nprintln!(\"Atoms: {}, Time: {:.1}ms\", result.num_atoms, result.time_ms);\n\n// Gasteiger–Marsili charges\nlet charges = sci_form::compute_charges(\"CCO\").unwrap();\nprintln!(\"Charges: {:?}\", charges.charges);\n\n// EHT → population analysis\nlet mol = sci_form::parse(\"CCO\").unwrap();\nlet elements: Vec\u003cu8\u003e = /* ... */ vec![8, 6, 6, 1, 1, 1, 1, 1, 1];\nlet positions: Vec\u003c[f64; 3]\u003e = /* ... from result.coords */ vec![];\nlet pop = sci_form::compute_population(\u0026elements, \u0026positions).unwrap();\nprintln!(\"HOMO: {:.3} eV\", pop.homo_energy);\n\n// ESP grid\nlet esp = sci_form::compute_esp(\u0026elements, \u0026positions, 0.5, 3.0).unwrap();\n\n// DOS / PDOS\nlet dos = sci_form::compute_dos(\u0026elements, \u0026positions, 0.2, -20.0, 5.0, 200).unwrap();\nprintln!(\"HOMO–LUMO gap: {:.3} eV\", dos.homo_lumo_gap.unwrap_or(0.0));\n```\n\n→ [Full Rust API reference](https://jigonzalez930209.github.io/sci-form/api/rust) · [Guide](https://jigonzalez930209.github.io/sci-form/guide/rust)\n\n---\n\n### Python\n\n```bash\npip install sciforma\n```\n\n```python\nimport sci_form\n\n# 3D conformer\nresult = sci_form.embed(\"CCO\")\nprint(f\"Atoms: {result.num_atoms}, Time: {result.time_ms:.1f}ms\")\n\n# Batch\nresults = sci_form.embed_batch([\"CCO\", \"c1ccccc1\", \"CC(=O)O\"])\n\n# Gasteiger charges\ncharges = sci_form.compute_charges(\"CCO\")\nprint(charges[\"charges\"])  # per-atom charges\n\n# EHT + population analysis\nelements = [8, 6, 6, 1, 1, 1, 1, 1, 1]\npositions = [[0.0, 0.0, 0.0], ...]   # from result.coords\npop = sci_form.compute_population(elements, positions)\nprint(f\"HOMO: {pop['homo_energy']:.3f} eV\")\n\n# DOS / PDOS\ndos = sci_form.compute_dos(elements, positions, sigma=0.2, e_min=-20.0, e_max=5.0, n_points=200)\nprint(f\"Gap: {dos['homo_lumo_gap']:.3f} eV\")\n```\n\n→ [Full Python API reference](https://jigonzalez930209.github.io/sci-form/api/python) · [Guide](https://jigonzalez930209.github.io/sci-form/guide/python)\n\n---\n\n### TypeScript / JavaScript (WASM)\n\n```bash\nnpm install sci-form-wasm\n```\n\n```typescript\nimport init, {\n  embed, embed_coords_typed,\n  compute_esp_grid_typed, compute_esp_grid_info,\n  eht_calculate, eht_orbital_mesh, eht_orbital_grid_typed,\n  compute_charges, compute_dos\n} from 'sci-form-wasm';\n\nawait init();\n\n// Conformer as JSON\nconst result = JSON.parse(embed('CCO', 42));\nconsole.log(result.num_atoms);\n\n// Typed-array conformer (faster, no JSON overhead)\nconst coords: Float64Array = embed_coords_typed('CCO', 42);\n\n// EHT calculation\nconst eht = JSON.parse(eht_calculate('[6,8,6,1,1,1,1,1,1]', coords.toString(), 1.75));\nconsole.log(`HOMO: ${eht.homo_energy} eV, LUMO: ${eht.lumo_energy} eV`);\n\n// Orbital isosurface mesh\nconst mesh = JSON.parse(eht_orbital_mesh('[6,8,6,1,1,1,1,1,1]', coords.toString(), 1.75, 0, 0.02));\n// mesh.vertices, mesh.normals, mesh.indices\n\n// ESP grid (typed array)\nconst espData: Float64Array = compute_esp_grid_typed('CCO', 42, 0.5, 3.0);\nconst espInfo = JSON.parse(compute_esp_grid_info('CCO', 42, 0.5, 3.0));\nconsole.log(`Grid: ${espInfo.nx}×${espInfo.ny}×${espInfo.nz}`);\n\n// DOS\nconst dos = JSON.parse(compute_dos('[6,8,6,1,1,1,1,1,1]', coords.toString(), 0.2, -20.0, 5.0, 200));\n```\n\n→ [Full TypeScript API reference](https://jigonzalez930209.github.io/sci-form/api/typescript) · [Guide](https://jigonzalez930209.github.io/sci-form/guide/typescript)\n\n---\n\n### CLI\n\n```bash\ncargo install sci-form-cli\n```\n\n```bash\n# Single molecule\nsci-form embed \"CCO\" --format xyz\n\n# Batch processing\nsci-form batch -i molecules.smi -o output.sdf --format sdf --threads 8\n\n# Parse only (no 3D)\nsci-form parse \"c1ccccc1\"\n\n# Gasteiger charges\nsci-form charges \"CCO\"\n\n# UFF energy\nsci-form energy \"CCO\" --coords coords.json\n\n# Version / features\nsci-form info\n```\n\nPrebuilt binaries available at [GitHub Releases](https://github.com/jigonzalez930209/sci-form/releases):\n\n| Platform | File |\n|----------|------|\n| Linux x86_64 | `sci-form-linux-x86_64` |\n| Linux aarch64 | `sci-form-linux-aarch64` |\n| macOS x86_64 | `sci-form-macos-x86_64` |\n| macOS Apple Silicon | `sci-form-macos-aarch64` |\n| Windows x86_64 | `sci-form-windows-x86_64.exe` |\n\n→ [Full CLI reference](https://jigonzalez930209.github.io/sci-form/api/cli) · [Guide](https://jigonzalez930209.github.io/sci-form/guide/cli)\n\n---\n\n## Experimental Engine\n\nThe repository now includes an isolated experimental quantum-chemistry stack under `sci_form::experimental_2`.\n\n### Phase Status\n\n| Phase | Status | Scope |\n|------|--------|-------|\n| Phase 1 | Complete | GPU infrastructure scaffolding, aligned types, CPU fallback, WGSL interface stubs |\n| Phase 2 | Complete | Gaussian basis, overlap/kinetic/nuclear/core matrices, ERIs, validation helpers |\n| Phase 3 | Complete | RHF SCF loop, Löwdin orthogonalization, DIIS, Mulliken analysis, gradients, optimizer, parallel ERI |\n| Phase 4 | Prototype complete | Experimental sTDA UV-Vis, GIAO-style NMR shielding, Hessian/IR workflows |\n| Phase 5 | Prototype complete | Orbital grid evaluation, marching cubes, isosurface generation, GPU-ready rendering path |\n\n### Current Practical Status\n\n- Stable production APIs remain unchanged; the experimental work is isolated in `experimental_2`\n- Real acceleration today is CPU parallelism via rayon in the ERI build path\n- GPU execution is not enabled yet; `phase1_gpu_infrastructure` currently exposes a CPU fallback plus WGSL-ready interfaces\n- The main known scientific limitation is absolute RHF/STO-3G total energy scaling in the experimental engine; comparative gaps and regression behavior are the primary validation target today\n\n### Validation Snapshot\n\nThe experimental stack is covered by dedicated regression suites:\n\n```bash\n# Build all library + test targets\ncargo check --tests\n\n# Base experimental regression suite\ncargo test --test regression test_experimental_comparison -- --nocapture\n\n# Extended complex-molecule battery (fast active tests)\ncargo test --test regression test_extended_molecules -- --nocapture\n\n# Heavy experimental benchmarks and long-running tests\ncargo test --release --test regression test_extended_molecules -- --include-ignored\n```\n\nCurrent verified results on this repository state:\n\n| Command | Result |\n|--------|--------|\n| `cargo check --tests` | passes |\n| `cargo test --test regression test_experimental_comparison` | **54 passed, 0 failed** |\n| `cargo test --test regression test_extended_molecules` | **14 passed, 0 failed, 7 ignored** |\n\nMore detailed coverage notes live in [TESTING.md](TESTING.md), and the broader project plan remains in [ROADMAP.md](ROADMAP.md).\n\n---\n\n## Benchmark Results\n\n### Conformer Generation — Diverse Molecules (131 molecules, all functional groups)\n\n| Metric | Value |\n|--------|-------|\n| Parse success | 100% |\n| Embed success | 97.7% |\n| Geometry quality | 97.7% |\n| Throughput | 60 mol/s |\n\n### RDKit Comparison — Heavy-atom pairwise-distance RMSD\n\n| Metric | Value |\n|--------|-------|\n| Average RMSD | 0.064 Å |\n| Median RMSD | 0.011 Å |\n| \u003c 0.5 Å | 98.4% |\n| \u003c 0.3 Å | 94.4% |\n\n### GDB-20 Ensemble (2000 molecules × 10 seeds vs 21 RDKit seeds)\n\n| Metric | All-atom | Heavy-atom |\n|--------|----------|------------|\n| Avg RMSD | 0.035 Å | 0.018 Å |\n| \u003e 0.5 Å | 0.95% | **0.00%** |\n\n---\n\n## Module Overview\n\n| Module | Description |\n|--------|-------------|\n| `sci_form::embed` | ETKDGv2 3D conformer generation from SMILES |\n| `sci_form::embed_batch` | Parallel batch conformer generation (rayon) |\n| `sci_form::parse` | SMILES → molecular graph |\n| `sci_form::compute_charges` | Gasteiger-Marsili partial charges |\n| `sci_form::compute_sasa` | Solvent-accessible surface area (SASA) |\n| `sci_form::compute_population` | Mulliken \u0026 Löwdin population analysis (EHT) |\n| `sci_form::compute_dipole` | Molecular dipole moment in Debye (EHT) |\n| `sci_form::compute_esp` | Electrostatic potential grid (Mulliken charges) |\n| `sci_form::compute_dos` | Density of states + PDOS (EHT orbital energies) |\n| `sci_form::compute_rmsd` | RMSD after Kabsch alignment |\n| `sci_form::compute_pm3` | PM3/PM3(tm) semi-empirical SCF |\n| `sci_form::compute_xtb` | GFN0-xTB tight-binding with Broyden SCC |\n| `sci_form::compute_uhf` | Unrestricted Hartree-Fock SCF |\n| `sci_form::compute_rohf` | Restricted open-shell Hartree-Fock SCF |\n| `sci_form::compute_uff_energy` | UFF force field energy evaluation |\n| `sci_form::compute_mmff94_energy` | MMFF94 force field energy evaluation |\n| `sci_form::parse_cif` | CIF crystallographic file import |\n| `sci_form::write_cif` | CIF crystallographic file export |\n| `sci_form::create_unit_cell` | Periodic unit cell from lattice parameters |\n| `sci_form::assemble_framework` | MOF-type framework assembly from SBUs |\n\n### Sub-modules\n\n| Module Path | Key API |\n|-------------|---------|\n| `sci_form::eht` | `solve_eht()`, `EhtResult`, `evaluate_orbital_on_grid_chunked()`, `marching_cubes()` |\n| `sci_form::pm3` | `compute_pm3()`, PM3/PM3(tm) SCF, Gaussian core-core corrections |\n| `sci_form::xtb` | `compute_xtb()`, GFN0 SCC with Broyden mixing; `xtb::gfn1`, `xtb::gfn2` |\n| `sci_form::scf::uhf` | `run_uhf()`, `run_rohf()`, open-shell SCF with spin contamination analysis |\n| `sci_form::hf` | `solve_hf3c()`, CISD, `mo_transform::ao_to_mo_transform()` |\n| `sci_form::esp` | `compute_esp_grid_parallel()`, `esp_color_map()`, `esp_grid_to_colors()`, `export_cube()`, `read_cube()` |\n| `sci_form::dos` | `compute_dos()`, `compute_pdos()`, `dos_mse()`, `export_dos_json()` |\n| `sci_form::alignment` | `align_coordinates()`, `align_quaternion()`, `compute_rmsd()` |\n| `sci_form::forcefield` | `build_uff_force_field()`, `Mmff94Builder::build()` |\n| `sci_form::charges::gasteiger` | `gasteiger_marsili_charges()` |\n| `sci_form::charges_eeq` | `compute_eeq_charges()` — improved Gaussian damping |\n| `sci_form::surface::sasa` | `compute_sasa()` |\n| `sci_form::materials` | `UnitCell`, `Sbu`, `Topology`, `assemble_framework()` |\n| `sci_form::materials::cif` | `parse_cif()`, `write_cif()`, `CifStructure`, `CifAtomSite` |\n| `sci_form::nmr` | `predict_nmr_shifts()`, `predict_j_couplings()` (2J–5J) |\n| `sci_form::smirks` | `apply_smirks()`, `apply_smirks_multi()`, `parse_smirks()` |\n| `sci_form::stereo` | `analyze_stereo()` — R/S, E/Z, helical, atropisomeric |\n| `sci_form::population` | `compute_population()`, `compute_bond_orders()`, parallel variants |\n| `sci_form::transport` | `pack_batch_arrow()`, `ChunkedIterator`, `WorkerTask` |\n\n---\n\n## The Conformer Pipeline\n\nsci-form implements ETKDGv2 (Experimental Torsion Knowledge Distance Geometry):\n\n1. **SMILES Parsing** → Molecular graph with atoms, bonds, hybridization  \n2. **Bounds Matrix** → 1-2, 1-3, 1-4, and VdW distance bounds from topology  \n3. **Triangle Smoothing** → Floyd-Warshall triangle inequality enforcement  \n4. **Distance Picking** → Random distances from smoothed bounds (MinstdRand)  \n5. **Metric Matrix Embedding** → Eigendecomposition → 4D coordinates  \n6. **Bounds Force Field** → BFGS minimization in 4D to satisfy distance constraints  \n7. **Projection to 3D** → Drop lowest-variance dimension  \n8. **ETKDG 3D Refinement** → Force field with CSD torsion preferences (846 patterns)  \n9. **Validation** → Tetrahedral centers, planarity, double-bond geometry\n\nSee the [algorithm documentation](https://jigonzalez930209.github.io/sci-form/algorithm/overview) for mathematical derivations and diagrams.\n\n---\n\n## Building from Source\n\n```bash\n# Library + CLI\ncargo build --release\n\n# Python bindings\ncd crates/python \u0026\u0026 pip install maturin \u0026\u0026 maturin develop --release\n\n# WASM bindings\ncd crates/wasm \u0026\u0026 ./build.sh --web-only --web-features \"parallel experimental-gpu\"\n\n# With parallel feature\ncargo build --release --features parallel\n```\n\n---\n\n## Testing\n\n```bash\n# All unit tests\ncargo test --lib\n\n# Smoke battery (CI gate)\ncargo test --release --test ci -- --nocapture\n\n# Full integration suites\ncargo test --release --test regression -- --nocapture\ncargo test --release --test analysis -- --nocapture\ncargo test --release --test debug -- --nocapture\ncargo test --release --test benchmarks -- --nocapture\n\n# Lint \u0026 format\ncargo fmt --all -- --check\ncargo clippy --all-targets -- -D warnings\n```\n\n---\n\n## Releasing a New Version\n\nUse the provided bump script. It updates all version strings, commits, tags, and pushes:\n\n```bash\n# Auto-increment patch (0.1.7 → 0.1.8)\n./scripts/bump_version.sh\n\n# Set a specific version\n./scripts/bump_version.sh 0.2.0\n```\n\nThis updates versions in:\n- `Cargo.toml` (root lib)\n- `crates/cli/Cargo.toml`\n- `crates/python/Cargo.toml`\n- `crates/wasm/Cargo.toml`\n- `crates/python/pyproject.toml`\n- `crates/wasm/pkg/package.json`\n- `pkg/package.json` \u0026 `pkg-node/package.json`\n\nThen creates a `vX.Y.Z` git tag, which triggers the [release workflow](.github/workflows/release.yml) to publish to **crates.io**, **PyPI**, and **npm** automatically.\n\n**Required repository secrets:**\n\n| Secret | Used for |\n|--------|----------|\n| `CARGO_REGISTRY_TOKEN` | Publishing to crates.io |\n| `PYPI_API_TOKEN` | Publishing to PyPI (`sciforma`) |\n| `NPM_TOKEN` | Publishing to npm (`sci-form-wasm`) — must be a **Granular Automation token** |\n\n---\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjigonzalez930209%2Fsci-form","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjigonzalez930209%2Fsci-form","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjigonzalez930209%2Fsci-form/lists"}