Skip to content

Release interface workflows, AI pipelines, and research environment - #3

Merged
ShaneLogic merged 12 commits into
mainfrom
devel
Oct 1, 2026
Merged

ShaneLogic merged 12 commits into
mainfrom
devel

Conversation

@ShaneLogic

@ShaneLogic ShaneLogic commented Oct 1, 2026 •

Copy link
Copy Markdown
Owner

Promotes the accumulated development work to main, adding AI component generation, active-learning orchestration, coherent interface construction, and CP2K/SLURM preparation to the research workflow. Provides a reproducible ARM64 CPU environment with InterfaceML Web, JupyterLab, and a persistent research workspace.

The release also includes the earlier fullerene/perovskite model work, web and batch interface refactoring, packaging fixes, documentation updates, and lint/format cleanup. Coherent interface construction preserves site metadata and termination ordering; DFT preparation retains fixed-atom constraints and returns actionable failures.

Scope

Validation

  • The Add interface construction, DFT preparation, and research containers #2 merge tree exactly matches its approved head, 645ff74c3038e123ddb163e19107d6d0a2cb3e2a.
  • Post-merge devel CI passed: Python 3.9-3.13, ML tests, and Ruff lint/format checks. The mypy job completed under the existing advisory configuration.
  • The reviewed source passed 104 tests in an isolated research container; all 42 checked Python files passed formatting and Ruff reported zero findings.
  • Previously verified browser flows include FAPbI3/C70 input, a 250-atom interface, interactive 3D rendering, and DFT archive download on desktop and mobile.
  • The ARM64 research image, notebook execution, dependency consistency, service health, and workspace persistence were verified.
  • This PR's merge CI also passed all 8 jobs against the proposed merge into main.

Validation Limits

  • Existing model weights and historical training claims have not been scientifically revalidated in this release process. Model checkpoints are not bundled into the research image and must be mounted explicitly when needed.
  • The research environment targets ARM64 CPU. CP2K execution, HPC submission, and accelerator training were not validated.
  • Arbitrary film rotation is a geometric operation; periodic commensurability after rotation is not certified.
  • Mypy remains informational (continue-on-error); a successful workflow does not establish a clean type-check result.

ShaneLogic and others added 12 commits January 30, 2026 11:53
	deleted:    _tmp_poscar_write_check/layer1.vasp
	deleted:    _tmp_poscar_write_check/layer2.vasp
	deleted:    _tmp_poscar_write_check/layer3.vasp
	modified:   dataset/fullerenes/fullerene_xyz/analysis_20260122/structures.csv
	new file:   fullerene_diffusion_poc/README.md
	new file:   fullerene_diffusion_poc/api.py
	new file:   fullerene_diffusion_poc/checkpoints/best_model.pt
	new file:   fullerene_diffusion_poc/checkpoints/checkpoint_epoch_10.pt
	new file:   fullerene_diffusion_poc/checkpoints/checkpoint_epoch_20.pt
	new file:   fullerene_diffusion_poc/config.yaml
	new file:   fullerene_diffusion_poc/dataset.py
	new file:   fullerene_diffusion_poc/diffusion_utils.py
	new file:   fullerene_diffusion_poc/evaluate.py
	new file:   fullerene_diffusion_poc/generate.py
	new file:   fullerene_diffusion_poc/generated/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_005.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_006.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_007.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_008.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_009.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_010.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_011.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_012.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_013.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_014.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_015.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_016.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_017.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_018.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_019.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_020.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_021.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_022.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_023.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_024.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_025.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_026.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_027.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_028.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_029.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_030.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_031.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_032.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_033.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_034.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_035.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_036.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_037.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_038.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_039.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_040.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_041.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_042.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_043.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_044.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_045.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_046.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_047.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_048.xyz
	new file:   fullerene_diffusion_poc/generated/C60_sample_049.xyz
	new file:   fullerene_diffusion_poc/generated/evaluation_comprehensive.png
	new file:   fullerene_diffusion_poc/model.py
	new file:   fullerene_diffusion_poc/requirements.txt
	new file:   fullerene_diffusion_poc/server.py
	new file:   fullerene_diffusion_poc/train.py
	modified:   interfaceml/__pycache__/__init__.cpython-38.pyc
	modified:   interfaceml/core/__pycache__/__init__.cpython-38.pyc
	modified:   interfaceml/core/__pycache__/io.cpython-38.pyc
	modified:   interfaceml/core/__pycache__/layering.cpython-38.pyc
	modified:   interfaceml/web/app.py
	modified:   interfaceml/web/static/css/style.css
	modified:   interfaceml/web/static/js/app.js
	modified:   interfaceml/web/templates/index.html
	deleted:    fullerene_diffusion_poc/checkpoints/best_model.pt
	deleted:    fullerene_diffusion_poc/checkpoints/checkpoint_epoch_10.pt
	deleted:    fullerene_diffusion_poc/checkpoints/checkpoint_epoch_20.pt
	modified:   fullerene_diffusion_poc/config.yaml
	modified:   fullerene_diffusion_poc/generate.py
	deleted:    fullerene_diffusion_poc/generated/C60_sample_000.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_001.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_002.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_003.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_004.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_005.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_006.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_007.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_008.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_009.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_010.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_011.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_012.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_013.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_014.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_015.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_016.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_017.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_018.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_019.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_020.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_021.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_022.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_023.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_024.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_025.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_026.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_027.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_028.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_029.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_030.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_031.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_032.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_033.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_034.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_035.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_036.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_037.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_038.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_039.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_040.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_041.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_042.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_043.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_044.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_045.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_046.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_047.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_048.xyz
	deleted:    fullerene_diffusion_poc/generated/C60_sample_049.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_10/metrics.json
	new file:   fullerene_diffusion_poc/generated/epoch_20/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_20/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_20/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_20/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_20/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_20/metrics.json
	new file:   fullerene_diffusion_poc/generated/epoch_30/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_30/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_30/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_30/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_30/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_30/metrics.json
	new file:   fullerene_diffusion_poc/generated/epoch_40/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_40/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_40/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_40/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_40/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_40/metrics.json
	new file:   fullerene_diffusion_poc/generated/epoch_50/C60_sample_000.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_50/C60_sample_001.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_50/C60_sample_002.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_50/C60_sample_003.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_50/C60_sample_004.xyz
	new file:   fullerene_diffusion_poc/generated/epoch_50/metrics.json
	modified:   fullerene_diffusion_poc/model.py
	new file:   fullerene_diffusion_poc/monitor_training.py
	new file:   fullerene_diffusion_poc/run_complete_pipeline.py
	modified:   fullerene_diffusion_poc/train.py
	new file:   fullerene_diffusion_poc/training_log.txt
	modified:   INTEGRATION_GUIDE.md
	modified:   QUICK_START.md
	modified:   README.md
	modified:   START_HERE.md
	modified:   build_heterojunctions/README.md
	deleted:    build_heterojunctions/__pycache__/__init__.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/_utils_layering.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/_utils_structures.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/_utils_xyz.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/auto_interface_builder.cpython-310.pyc
	deleted:    build_heterojunctions/__pycache__/auto_interface_builder.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/delta_density_cube.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/fix_interface_layers.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/fixed_atoms_from_xyz.cpython-313.pyc
	deleted:    build_heterojunctions/__pycache__/interface_builder.cpython-313.pyc
	modified:   build_heterojunctions/_utils_layering.py
	modified:   build_heterojunctions/_utils_structures.py
	modified:   build_heterojunctions/_utils_xyz.py
	new file:   build_heterojunctions/batch_adsorbate_builder.py
	modified:   build_heterojunctions/fix_interface_layers.py
	modified:   docs/DOS_PHYSICS_EXPLANATION.md
	modified:   docs/GETTING_STARTED.md
	new file:   docs/HIGH_THROUGHPUT_WORKFLOW.md
	modified:   docs/LAYER_SPLITTING.md
	new file:   docs/MATHEMATICAL_OVERVIEW.md
	modified:   docs/SMART_SPLITTING_ALGORITHM.md
	modified:   interfaceml/__pycache__/__init__.cpython-313.pyc
	modified:   interfaceml/__pycache__/__init__.cpython-38.pyc
	new file:   interfaceml/ai/__init__.py
	new file:   interfaceml/ai/interface_generator.py
	new file:   interfaceml/ai/local_gnn.py
	modified:   interfaceml/core/__init__.py
	modified:   interfaceml/core/__pycache__/__init__.cpython-313.pyc
	modified:   interfaceml/core/__pycache__/__init__.cpython-38.pyc
	modified:   interfaceml/core/__pycache__/io.cpython-313.pyc
	modified:   interfaceml/core/__pycache__/io.cpython-38.pyc
	modified:   interfaceml/core/__pycache__/layering.cpython-313.pyc
	modified:   interfaceml/core/__pycache__/layering.cpython-38.pyc
	new file:   interfaceml/core/adsorbate.py
	deleted:    interfaceml/utils/__pycache__/__init__.cpython-313.pyc
	deleted:    interfaceml/utils/__pycache__/geometry.cpython-313.pyc
	deleted:    interfaceml/web/__pycache__/app.cpython-313.pyc
	new file:   interfaceml/web/ai.py
	modified:   interfaceml/web/app.py
	new file:   interfaceml/web/core.py
	new file:   interfaceml/web/dos.py
	new file:   interfaceml/web/routes/__init__.py
	new file:   interfaceml/web/routes/ai_routes.py
	new file:   interfaceml/web/routes/common.py
	new file:   interfaceml/web/routes/dos_routes.py
	new file:   interfaceml/web/routes/interface.py
	new file:   interfaceml/web/static/css/docs.css
	modified:   interfaceml/web/static/css/style.css
	modified:   interfaceml/web/static/js/app.js
	new file:   interfaceml/web/static/js/docs.js
	new file:   interfaceml/web/templates/docs.html
	modified:   interfaceml/web/templates/index.html
	new file:   interfaceml/web/utils.py
	deleted:    relax_slab/.DS_Store
	modified:   setup.py
	deleted:    structures/.DS_Store
	deleted:    structures/etl/.DS_Store
	deleted:    structures/heterojunctions/.DS_Store
	deleted:    structures/perovskites/.DS_Store
	modified:   templates/README_templates.md
	new file:   tests/conftest.py
	new file:   tests/test_web_health.py
…T → retrain

Implements a 5-phase pipeline that connects the fullerene/perovskite generative
models with the batch interface builder and CP2K DFT calculations. The pipeline
generates structures, builds interfaces, prepares CP2K inputs + SLURM scripts
(user submits manually), then parses DFT results and prepares retraining data.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
	new file:   .github/workflows/ci.yml
	modified:   INTEGRATION_GUIDE.md
	modified:   README.md
	modified:   build_heterojunctions/batch_adsorbate_builder.py
	modified:   build_heterojunctions/expand_cif_cell.py
	modified:   build_heterojunctions/fix_interface_layers.py
	modified:   build_heterojunctions/interface_builder.py
	modified:   build_heterojunctions/stack_slabs_relax.py
	modified:   docs/HIGH_THROUGHPUT_WORKFLOW.md
	new file:   docs/figures/ai_painn_flow_interface_prostyle.py
	deleted:    fullerene_diffusion_poc/VERSION
	deleted:    fullerene_diffusion_poc/config.yaml
	deleted:    fullerene_diffusion_poc/generate.py
	deleted:    fullerene_diffusion_poc/model.py
	deleted:    fullerene_diffusion_poc/train.py
	renamed:    fullerene_diffusion_poc/.gitignore -> fullerene_e3gen/.gitignore
	renamed:    fullerene_diffusion_poc/CHANGELOG.md -> fullerene_e3gen/CHANGELOG.md
	renamed:    fullerene_diffusion_poc/README.md -> fullerene_e3gen/README.md
	new file:   fullerene_e3gen/VERSION
	new file:   fullerene_e3gen/_check_training.py
	new file:   fullerene_e3gen/_diagnose_interface.py
	renamed:    fullerene_diffusion_poc/api.py -> fullerene_e3gen/api.py
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/best_model.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_10.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_100.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_110.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_120.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_130.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_140.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_150.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_20.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_30.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_40.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_50.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_60.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_70.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_80.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/checkpoint_epoch_90.pt
	new file:   fullerene_e3gen/checkpoints/archive_v1_jan31/topology_gnn.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/best_model.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_100.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_150.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_200.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_250.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_300.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_350.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_400.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_450.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_50.pt
	new file:   fullerene_e3gen/checkpoints/archive_v4_collapsed/checkpoint_epoch_500.pt
	new file:   fullerene_e3gen/checkpoints/archive_v5_no_learning/best_model.pt
	new file:   fullerene_e3gen/checkpoints/archive_v6_invariant_bug/best_model.pt
	new file:   fullerene_e3gen/checkpoints/archive_v6_invariant_bug/checkpoint_epoch_100.pt
	new file:   fullerene_e3gen/checkpoints/archive_v6_invariant_bug/checkpoint_epoch_150.pt
	new file:   fullerene_e3gen/checkpoints/archive_v6_invariant_bug/checkpoint_epoch_50.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/best_model.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_100.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_150.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_200.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_250.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_300.pt
	new file:   fullerene_e3gen/checkpoints/painn_fm/checkpoint_epoch_50.pt
	new file:   fullerene_e3gen/config.yaml
	new file:   fullerene_e3gen/config_finetune.yaml
	new file:   fullerene_e3gen/config_painn_fm.yaml
	new file:   fullerene_e3gen/config_v2.yaml
	renamed:    fullerene_diffusion_poc/dataset.py -> fullerene_e3gen/dataset.py
	new file:   fullerene_e3gen/diagnose_v6.py
	renamed:    fullerene_diffusion_poc/diffusion_utils.py -> fullerene_e3gen/diffusion_utils.py
	renamed:    fullerene_diffusion_poc/docs/QUICKSTART_V3.md -> fullerene_e3gen/docs/QUICKSTART_V3.md
	renamed:    fullerene_diffusion_poc/docs/architecture.md -> fullerene_e3gen/docs/architecture.md
	renamed:    fullerene_diffusion_poc/docs/archive/COMPLETE_ANALYSIS.md -> fullerene_e3gen/docs/archive/COMPLETE_ANALYSIS.md
	renamed:    fullerene_diffusion_poc/docs/archive/CRITICAL_FIX_NORMALIZATION.md -> fullerene_e3gen/docs/archive/CRITICAL_FIX_NORMALIZATION.md
	renamed:    fullerene_diffusion_poc/docs/archive/DIAGNOSIS_SUMMARY.md -> fullerene_e3gen/docs/archive/DIAGNOSIS_SUMMARY.md
	renamed:    fullerene_diffusion_poc/docs/archive/FINAL_RECOMMENDATIONS.md -> fullerene_e3gen/docs/archive/FINAL_RECOMMENDATIONS.md
	renamed:    fullerene_diffusion_poc/docs/archive/FINAL_STATUS_REPORT.md -> fullerene_e3gen/docs/archive/FINAL_STATUS_REPORT.md
	renamed:    fullerene_diffusion_poc/docs/archive/geometry_optimization_guide.md -> fullerene_e3gen/docs/archive/geometry_optimization_guide.md
	renamed:    fullerene_diffusion_poc/docs/archive/improvements_v3.md -> fullerene_e3gen/docs/archive/improvements_v3.md
	renamed:    fullerene_diffusion_poc/docs/archive/training_report_20260130.md -> fullerene_e3gen/docs/archive/training_report_20260130.md
	renamed:    fullerene_diffusion_poc/evaluate.py -> fullerene_e3gen/evaluate.py
	new file:   fullerene_e3gen/flow_matching.py
	new file:   fullerene_e3gen/generate.py
	new file:   fullerene_e3gen/model.py
	new file:   fullerene_e3gen/model_painn.py
	renamed:    fullerene_diffusion_poc/monitor_training.py -> fullerene_e3gen/monitor_training.py
	renamed:    fullerene_diffusion_poc/requirements.txt -> fullerene_e3gen/requirements.txt
	renamed:    fullerene_diffusion_poc/server.py -> fullerene_e3gen/server.py
	renamed:    fullerene_diffusion_poc/synthetic_topology.py -> fullerene_e3gen/synthetic_topology.py
	renamed:    fullerene_diffusion_poc/template_bank.py -> fullerene_e3gen/template_bank.py
	renamed:    fullerene_diffusion_poc/templates/generate_templates.py -> fullerene_e3gen/templates/generate_templates.py
	renamed:    fullerene_diffusion_poc/topology_gnn.py -> fullerene_e3gen/topology_gnn.py
	renamed:    fullerene_diffusion_poc/topology_loss_v2.py -> fullerene_e3gen/topology_loss_v2.py
	new file:   fullerene_e3gen/train.py
	renamed:    fullerene_diffusion_poc/train_topology_gnn.py -> fullerene_e3gen/train_topology_gnn.py
	new file:   fullerene_e3gen/tune_guidance.py
	renamed:    fullerene_diffusion_poc/units.py -> fullerene_e3gen/units.py
	new file:   fullerene_e3gen/validate_output.py
	new file:   fullerene_e3gen/validate_v7.py
	renamed:    fullerene_diffusion_poc/validate_xyz.py -> fullerene_e3gen/validate_xyz.py
	deleted:    interfaceml/__pycache__/__init__.cpython-313.pyc
	deleted:    interfaceml/__pycache__/__init__.cpython-38.pyc
	modified:   interfaceml/ai/interface_generator.py
	modified:   interfaceml/ai/local_gnn.py
	deleted:    interfaceml/core/__pycache__/__init__.cpython-313.pyc
	deleted:    interfaceml/core/__pycache__/__init__.cpython-38.pyc
	deleted:    interfaceml/core/__pycache__/io.cpython-313.pyc
	deleted:    interfaceml/core/__pycache__/io.cpython-38.pyc
	deleted:    interfaceml/core/__pycache__/layering.cpython-313.pyc
	deleted:    interfaceml/core/__pycache__/layering.cpython-38.pyc
	modified:   interfaceml/core/adsorbate.py
	modified:   interfaceml/utils/geometry.py
	modified:   interfaceml/utils/performance.py
	modified:   interfaceml/web/ai.py
	modified:   interfaceml/web/app.py
	modified:   interfaceml/web/routes/ai_routes.py
	modified:   interfaceml/web/static/css/style.css
	modified:   interfaceml/web/static/js/app.js
	new file:   interfaceml/web/tasks.py
	modified:   interfaceml/web/templates/index.html
	new file:   perovskite_e3gen/__init__.py
	new file:   perovskite_e3gen/api.py
	new file:   perovskite_e3gen/config.yaml
	new file:   perovskite_e3gen/dataset.py
	new file:   perovskite_e3gen/evaluate.py
	new file:   perovskite_e3gen/flow_matching.py
	new file:   perovskite_e3gen/generate.py
	new file:   perovskite_e3gen/model.py
	new file:   perovskite_e3gen/physics_loss.py
	new file:   perovskite_e3gen/train.py
	new file:   perovskite_e3gen/units.py
	new file:   pyproject.toml
	modified:   setup.py
	modified:   start_web.sh
	new file:   tests/test_core_adsorbate.py
	new file:   tests/test_core_io.py
	new file:   tests/test_generate_utils.py
	new file:   tests/test_geometry.py
	new file:   tests/test_model_and_diffusion.py
	new file:   tests/test_performance.py
	new file:   tests/test_validation.py
	modified:   tests/test_web_health.py
	new file:   fullerene_diffusion_poc/README.md
	new file:   fullerene_diffusion_poc/VERSION
	new file:   fullerene_diffusion_poc/api.py
	new file:   fullerene_diffusion_poc/config.yaml
	new file:   fullerene_diffusion_poc/generate.py
	new file:   fullerene_diffusion_poc/model.py
	new file:   fullerene_diffusion_poc/synthetic_topology.py
	new file:   fullerene_diffusion_poc/topology_gnn.py
	new file:   fullerene_diffusion_poc/topology_loss_v2.py
	new file:   fullerene_diffusion_poc/train.py
	new file:   fullerene_diffusion_poc/train_topology_gnn.py
Add interface construction, DFT preparation, and research containers

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry, we are unable to review this pull request

The GitHub API does not allow us to fetch diffs exceeding 20000 lines

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 131e91a36e

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment on lines +84 to +85
sys.path.insert(0, str(Path(__file__).resolve().parent.parent / "perovskite_e3gen"))
from api import PerovskiteAPI

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Import the perovskite API under a distinct module name

The normal generate_round order imports the fullerene implementation first, which registers fullerene_e3gen/api.py as sys.modules["api"]. Inserting perovskite_e3gen at the front of sys.path here does not replace that cached module, so this import looks for PerovskiteAPI in the fullerene module and raises ImportError before any perovskite structures or interfaces can be generated. Use package-qualified imports or load each implementation under a unique module name.

Useful? React with 👍 / 👎.

Comment on lines +8 to +12
checkpoint: "fullerene_e3gen/checkpoints/best_model.pt"
C_values: [60, 70, 80] # Carbon counts to generate
num_samples_per_C: 5
perovskite:
checkpoint: "perovskite_e3gen/checkpoints/best_model.pt"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P1 Badge Point the active-learning defaults at available checkpoints

A stock python -m active_learning run passes these exact paths to FullereneAPI and PerovskiteAPI, but neither fullerene_e3gen/checkpoints/best_model.pt nor any perovskite_e3gen/checkpoints/best_model.pt is included in this commit. The generation phase therefore fails with a missing-checkpoint error before the workflow can produce components; ship the intended models, select the tracked PaiNN checkpoint where appropriate, or make the required external checkpoint locations explicit and configurable.

Useful? React with 👍 / 👎.

@ShaneLogic
ShaneLogic merged commit 64dd7ab into main Oct 1, 2026
17 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant