NepTrainKit 2.8.3.dev0__tar.gz → 2.8.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/.gitignore +3 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/PKG-INFO +2 -2
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/README.md +1 -1
- neptrainkit-2.8.4/skills/make-dataset-card-dev/SKILL.md +167 -0
- neptrainkit-2.8.4/skills/make-dataset-card-dev/agents/openai.yaml +4 -0
- neptrainkit-2.8.4/skills/make-dataset-card-dev/references/card-touchpoints.md +38 -0
- neptrainkit-2.8.4/skills/make-dataset-card-dev/references/requirements-to-card-spec-template.md +84 -0
- neptrainkit-2.8.4/skills/make-dataset-card-dev/references/validation-playbook.md +79 -0
- neptrainkit-2.8.4/skills/make-dataset-card-dev/scripts/run_card_checks.py +165 -0
- neptrainkit-2.8.4/src/NepTrainKit/_version.py +24 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/__init__.py +2 -2
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/alloy.py +45 -14
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/calculator.py +25 -25
- neptrainkit-2.8.4/src/NepTrainKit/core/card_manager.py +211 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/__init__.py +14 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/alloy.py +905 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/defect.py +483 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/filter.py +131 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/lattice.py +588 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/magnetism.py +1635 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/operation.py +42 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/cards/structure.py +757 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/dataset/manager.py +59 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/dataset/seed.py +733 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/dataset/services.py +0 -26
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/energy_shift.py +22 -21
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/base.py +1569 -7
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/deepmd.py +46 -162
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/importers.py +63 -43
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/nep.py +70 -181
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/sampler.py +20 -2
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/magnetism.py +182 -1
- neptrainkit-2.8.4/src/NepTrainKit/core/message.py +157 -0
- neptrainkit-2.8.4/src/NepTrainKit/core/precision.py +44 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/structure.py +132 -60
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/types.py +95 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/utils.py +5 -5
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/main.py +32 -13
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/src_rc.py +194 -102
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/base/canvas.py +1 -1
- neptrainkit-2.8.4/src/NepTrainKit/ui/canvas/base/distribution.py +32 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/canvas/canvas_factory.py +98 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/canvas/distribution_factory.py +30 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/pyqtgraph/canvas.py +60 -8
- neptrainkit-2.8.4/src/NepTrainKit/ui/canvas/pyqtgraph/distribution.py +184 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/vispy/canvas.py +58 -7
- neptrainkit-2.8.4/src/NepTrainKit/ui/canvas/vispy/distribution.py +237 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/messages.py +3 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/pages/data_manager.py +2 -2
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/pages/makedata.py +147 -16
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/pages/settings.py +20 -1
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/pages/show_nep.py +37 -20
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/threads.py +45 -8
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/__init__.py +21 -1
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/cell_scaling_card.py +59 -105
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/cell_strain_card.py +48 -100
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/composition_gradient_card.py +138 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/composition_sweep_card.py +253 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/conditional_replace_card.py +129 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/correlated_random_spin_card.py +223 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/crystal_prototype_builder_card.py +46 -95
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/folded_helix_card.py +264 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/fps_filter_card.py +44 -92
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/geometry_filter_card.py +121 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/group_label_card.py +35 -59
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/interstitial_adsorbate_card.py +66 -163
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/layer_copy_card.py +267 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/magmom_rotation_card.py +179 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/magnetic_order_card.py +83 -223
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/organic_mol_config_pbc_card.py +98 -127
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/perturb_card.py +64 -106
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/random_doping_card.py +147 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/random_occupancy_card.py +61 -90
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/random_packing_card.py +131 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/random_slab_card.py +52 -64
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/random_vacancy_card.py +52 -77
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/set_magnetic_moments_card.py +207 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/shear_angle_card.py +43 -71
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/shear_matrix_card.py +47 -77
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/small_angle_spin_tilt_card.py +463 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/spin_disorder_card.py +205 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/spin_spiral_card.py +320 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/stacking_fault_card.py +105 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/super_cell_card.py +221 -0
- neptrainkit-2.8.4/src/NepTrainKit/ui/views/_card/vacancy_defect_card.py +195 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/vibration_perturb_card.py +55 -88
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/cards.py +59 -1
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/nep.py +173 -75
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/toolbar.py +23 -1
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/__init__.py +47 -44
- neptrainkit-2.8.4/src/NepTrainKit/ui/widgets/card_metadata.py +472 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/card_widget.py +146 -11
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/dialog.py +1106 -238
- neptrainkit-2.8.4/src/NepTrainKit/ui/widgets/doping_rule.py +340 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/input.py +5 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/search_widget.py +3 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/vacancy_rule.py +57 -10
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/utils.py +0 -41
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/version.py +33 -5
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/PKG-INFO +2 -2
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/SOURCES.txt +31 -1
- neptrainkit-2.8.3.dev0/CHANGELOG.md +0 -55
- neptrainkit-2.8.3.dev0/src/NepTrainKit/_version.py +0 -34
- neptrainkit-2.8.3.dev0/src/NepTrainKit/core/card_manager.py +0 -109
- neptrainkit-2.8.3.dev0/src/NepTrainKit/core/dataset/manager.py +0 -841
- neptrainkit-2.8.3.dev0/src/NepTrainKit/core/message.py +0 -137
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/composition_sweep_card.py +0 -255
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/conditional_replace_card.py +0 -447
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/layer_copy_card.py +0 -465
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/magmom_rotation_card.py +0 -273
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/random_doping_card.py +0 -248
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/stacking_fault_card.py +0 -116
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/super_cell_card.py +0 -375
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/views/_card/vacancy_defect_card.py +0 -213
- neptrainkit-2.8.3.dev0/src/NepTrainKit/ui/widgets/doping_rule.py +0 -230
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/.gitattributes +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/.readthedocs.yml +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/LICENSE +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/MANIFEST.in +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/THIRD_PARTY_NOTICES.md +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/pyproject.toml +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/pyrightconfig.json +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/requirements.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/setup.cfg +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/setup.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/Config/config.sqlite +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/Config/nep.json +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/Config/nep89.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/Config/ptable.json +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/config.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/_fastxyz.cpp +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/config_type.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/cstdio_redirect.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/dataset/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/dataset/database.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/dataset/models.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/fast_float.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/registry.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/io/tace.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/core/torsion_guard_pbc.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/paths.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/base/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/pyqtgraph/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/pyqtgraph/structure.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/vispy/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/canvas/vispy/structure.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/dialogs.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/pages/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/update.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/updater.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/__init__.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/_card/card_group.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/dataset_widget.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/project_view.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/views/structure.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/button.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/completer.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/docker.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/label.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/layout.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/settingscard.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/table.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit/ui/widgets/tree.py +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/dependency_links.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/entry_points.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/not-zip-safe +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/requires.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/NepTrainKit.egg-info/top_level.txt +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/README.md +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/dftd3para.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/ewald_nep.cpp +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/ewald_nep.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/neighbor_nep.cpp +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/neighbor_nep.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/nep.cpp +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/nep.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/nep_cpu.cpp +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_cpu/nep_utilities.h +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/README.md +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/dataset.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/dataset.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/fitness.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/fitness.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/main.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/mic.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/nep.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/nep.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/nep_charge.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/nep_charge.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/parameters.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/parameters.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/potential.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/snes.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/snes.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/structure.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/structure.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/tnep.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/main_nep/tnep.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/nep_desc.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/nep_desc.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/nep_gpu.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/nep_parameters.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/nep_parameters.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/common.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/cusolver_wrapper.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/cusolver_wrapper.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/error.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/error.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/gnep_utilities.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/gpu_macro.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/gpu_vector.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/least_square.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/main_common.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/main_common.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/nep_utilities.cuh +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/read_file.cu +0 -0
- {neptrainkit-2.8.3.dev0 → neptrainkit-2.8.4}/src/nep_gpu/utilities/read_file.cuh +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: NepTrainKit
|
|
3
|
-
Version: 2.8.
|
|
3
|
+
Version: 2.8.4
|
|
4
4
|
Summary: NepTrainKit is a Python package for visualizing and manipulating training datasets for NEP.
|
|
5
5
|
Author: Chen Cheng bing
|
|
6
6
|
Author-email: Chen Cheng bing <1747193328@qq.com>
|
|
@@ -167,7 +167,7 @@ A standalone executable is available for Windows users.
|
|
|
167
167
|
For detailed usage documentation and examples, please refer to the official documentation:
|
|
168
168
|
[https://neptrainkit.readthedocs.io/en/latest/index.html](https://neptrainkit.readthedocs.io/en/latest/index.html)
|
|
169
169
|
|
|
170
|
-
- What's new: see
|
|
170
|
+
- What's new: see [GitHub Releases](https://github.com/aboys-cb/NepTrainKit/releases).
|
|
171
171
|
|
|
172
172
|
---
|
|
173
173
|
|
|
@@ -121,7 +121,7 @@ A standalone executable is available for Windows users.
|
|
|
121
121
|
For detailed usage documentation and examples, please refer to the official documentation:
|
|
122
122
|
[https://neptrainkit.readthedocs.io/en/latest/index.html](https://neptrainkit.readthedocs.io/en/latest/index.html)
|
|
123
123
|
|
|
124
|
-
- What's new: see
|
|
124
|
+
- What's new: see [GitHub Releases](https://github.com/aboys-cb/NepTrainKit/releases).
|
|
125
125
|
|
|
126
126
|
---
|
|
127
127
|
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: make-dataset-card-dev
|
|
3
|
+
description: 将“需求描述”或“已有小脚本”转化为 NepTrainKit 的 Make Dataset 卡片实现或维护现有卡片。适用于新增、迁移、重构 Make Dataset 卡片时,按 Operation/Params 架构拆分 core 业务逻辑与 PySide UI,完成卡片注册、参数序列化、文档、测试和 `tools/docs/audit_card_docs.py` 检查。
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Make Dataset Card Dev
|
|
7
|
+
|
|
8
|
+
## 目标
|
|
9
|
+
|
|
10
|
+
把需求文本、已有脚本或现有卡片重构需求稳定转换为可交付卡片:
|
|
11
|
+
|
|
12
|
+
1. 业务逻辑在 `src/NepTrainKit/core/cards/`,不依赖 PySide、qfluentwidgets 或 MessageManager。
|
|
13
|
+
2. UI 只负责控件、参数读写、序列化和调用 operation。
|
|
14
|
+
3. `Params dataclass`、operation、UI、文档、测试保持同一套参数契约。
|
|
15
|
+
4. 注册、在线文档路径、测试和文档审计闭环。
|
|
16
|
+
|
|
17
|
+
## 协作规则
|
|
18
|
+
|
|
19
|
+
先从需求本质确认卡片类型,再动代码。以下情况先和用户确认:
|
|
20
|
+
|
|
21
|
+
1. 需求表述存在多种合理解读。
|
|
22
|
+
2. 方案会改变已有行为、默认值或旧 JSON 兼容性。
|
|
23
|
+
3. 需要引入新依赖、跨页改运行时框架,或影响已有工作流。
|
|
24
|
+
4. 存在明显更短或更稳的实现路径。
|
|
25
|
+
|
|
26
|
+
当存在更优路径时,先给出“当前方案 vs 替代方案”的简短对比(收益、代价、风险),由用户拍板后再实施。
|
|
27
|
+
|
|
28
|
+
## 先判定卡片语义
|
|
29
|
+
|
|
30
|
+
不要强行把所有卡片塞进同一个接口。先选 operation 类型:
|
|
31
|
+
|
|
32
|
+
- `StructureOperation`: 单结构变换,签名为 `run_structure(structure, params) -> list[Atoms]`。
|
|
33
|
+
- `DatasetOperation`: 全数据集过滤或排序,签名为 `run_dataset(dataset, params) -> list[Atoms]`。
|
|
34
|
+
- `GeneratorOperation`: 无输入生成结构,签名为 `generate(params) -> list[Atoms]`。
|
|
35
|
+
|
|
36
|
+
对应参数必须用 frozen dataclass 表达,例如 `FooParams`。UI 通过 `get_params()` 构造 dataclass,通过 `set_params(params)` 恢复控件。
|
|
37
|
+
|
|
38
|
+
## 工作流
|
|
39
|
+
|
|
40
|
+
### 1. 需求/脚本解析为卡片规格
|
|
41
|
+
|
|
42
|
+
先产出一个“卡片规格草案”,至少包含:
|
|
43
|
+
|
|
44
|
+
- `card_name`、`group`、`menu_icon`、`requires_input_dataset`
|
|
45
|
+
- operation 类型:`StructureOperation` / `DatasetOperation` / `GeneratorOperation`
|
|
46
|
+
- `Params dataclass` 字段清单:名称、类型、默认值、范围、是否必填
|
|
47
|
+
- 处理逻辑摘要:输入对象 -> 输出结构列表
|
|
48
|
+
- 随机性与 seed 策略
|
|
49
|
+
- `Config_type` 标签策略
|
|
50
|
+
|
|
51
|
+
如果是脚本输入,额外提取:
|
|
52
|
+
|
|
53
|
+
- 脚本里的硬编码常量,改为 Params 字段和 UI 参数。
|
|
54
|
+
- 文件 I/O 副作用,改为内存数据流;不要覆盖用户文件。
|
|
55
|
+
- 随机数入口,明确是否暴露 `use_seed` 和 `seed`。
|
|
56
|
+
|
|
57
|
+
### 2. 实现 core operation
|
|
58
|
+
|
|
59
|
+
优先在已有模块里放置逻辑:
|
|
60
|
+
|
|
61
|
+
- 晶格/结构变换:`core/cards/lattice.py` 或 `core/cards/structure.py`
|
|
62
|
+
- 随机/组成/替换:`core/cards/alloy.py`
|
|
63
|
+
- 缺陷/表面:`core/cards/defect.py`
|
|
64
|
+
- 磁性:`core/cards/magnetism.py`
|
|
65
|
+
- 数据集过滤:`core/cards/filter.py`
|
|
66
|
+
|
|
67
|
+
实现规则:
|
|
68
|
+
|
|
69
|
+
- operation 不导入 `PySide6`、`qfluentwidgets`、`MessageManager`。
|
|
70
|
+
- 参数校验失败时抛出明确异常;UI 层负责展示错误。
|
|
71
|
+
- 结构变换后使用 `append_config_tag(...)` 写入可追溯标签。
|
|
72
|
+
- 不做静默物理替换、降级模型或伪成功返回;unsupported 就明确失败。
|
|
73
|
+
- 若需要序列化 dataclass,用 `params_to_dict(params)`;tuple 字段在 UI `to_dict()` 中按文档契约转成 list。
|
|
74
|
+
|
|
75
|
+
### 3. 实现 UI 卡片
|
|
76
|
+
|
|
77
|
+
UI 类放在 `src/NepTrainKit/ui/views/_card/*.py`,遵循现有风格:
|
|
78
|
+
|
|
79
|
+
- 新卡片默认继承 `MakeDataCard`。不要因为 operation 是 dataset 级别就新建 `FilterDataCard` 子类;当前 `FilterDataCard` 只保留给既有过滤卡的显示差异。
|
|
80
|
+
- `init_ui()` 构建控件。
|
|
81
|
+
- 数值参数用 `SpinBoxUnitInputFrame`,枚举用 `ComboBox`,开关用 `CheckBox` / `RadioButton`,字符串用 `LineEdit`。
|
|
82
|
+
- 提供 `create_operation()`、`get_params()`、`set_params(params)`。
|
|
83
|
+
- 所有卡片禁止覆盖 `run()`:基类 `MakeDataCard.run()` 已根据 `create_operation()` 返回的 operation 类型自动分发到正确线程。
|
|
84
|
+
- `process_structure()` 若保留,只能作为兼容委托层。结构卡调用 `run_structure(...)`;dataset/generator 卡片不要新增伪 `process_structure()` 通路。
|
|
85
|
+
- 生成型卡片使用 `GeneratorOperation` 和 `requires_input_dataset = False`。
|
|
86
|
+
|
|
87
|
+
### 4. 完成序列化
|
|
88
|
+
|
|
89
|
+
绑定必须完整:
|
|
90
|
+
|
|
91
|
+
- `to_dict()` 写入 `"params": params_to_dict(self.get_params())`。
|
|
92
|
+
- 保留必要的旧 key,保证旧 JSON 可加载。旧 key 双写是过渡态;新增持久化格式时再引入版本字段清理。
|
|
93
|
+
- `from_dict()` 优先读 `params`,没有时按旧 key 构造 Params,再调用 `set_params(params)`。
|
|
94
|
+
- 文档里的 `serialized_keys`、默认值和运行时 `to_dict()` 一致。
|
|
95
|
+
|
|
96
|
+
### 5. 注册、文档和在线路径
|
|
97
|
+
|
|
98
|
+
- 类上加 `@CardManager.register_card`。
|
|
99
|
+
- 在 `src/NepTrainKit/ui/views/_card/__init__.py` 导入并加入 `__all__`。
|
|
100
|
+
- 每张内置卡片必须有对应文档:
|
|
101
|
+
- 源码:`src/NepTrainKit/ui/views/_card/foo_bar_card.py`
|
|
102
|
+
- 文档:`docs/source/module/make-dataset-cards/cards/foo-bar-card.md`
|
|
103
|
+
- 在线链接:`https://neptrainkit.readthedocs.io/en/latest/module/make-dataset-cards/cards/foo-bar-card.html`
|
|
104
|
+
|
|
105
|
+
**文档写作核心原则:从训练集诊断出发。**
|
|
106
|
+
|
|
107
|
+
操作示例必须回答"模型哪里不行 → 训练集缺什么 → 这张卡怎么补 → 怎么验证改善",而不是只写"设参数→得结果"。禁止以下内容:
|
|
108
|
+
|
|
109
|
+
- 模板填充句:"先用默认值跑小样本;只有当你能明确说明它会改变当前结果分布时再偏离"
|
|
110
|
+
- 同义反复开关建议:"需要启用 XXX 时开启 / 希望保持默认时关闭"
|
|
111
|
+
- 把 `params`(序列化实现细节)作为用户参数列出
|
|
112
|
+
- 三档预设 JSON 几乎一样(Safe/Balanced/Aggressive 应有实质性参数差异)
|
|
113
|
+
|
|
114
|
+
详细规范见 `docs/source/module/make-dataset-cards/writing-guide.md`。
|
|
115
|
+
|
|
116
|
+
参数文档必须按 `Params dataclass` 字段逐项落标题:无功能组时使用 `### 参数名(key)`,有功能组时使用 `### 功能组` + `#### 参数名(key)`。不要把多个 key 合在一个标题里;枚举表必须写真实选项,不能写“以 UI 下拉项为准”;物理直觉不能用可套在任何参数上的模板句。`tools/docs/audit_card_docs.py` 会按这一契约检查。
|
|
117
|
+
|
|
118
|
+
### 6. 测试
|
|
119
|
+
|
|
120
|
+
最少覆盖:
|
|
121
|
+
|
|
122
|
+
- operation 可脱离 UI 直接运行,不需要 `QApplication` 或 Qt 控件。
|
|
123
|
+
- UI `get_params()` / `set_params()` / `to_dict()` / `from_dict()` 往返一致。
|
|
124
|
+
- 关键参数生效。
|
|
125
|
+
- 文档审计通过。
|
|
126
|
+
|
|
127
|
+
新建或实质修改卡片时,测试不能只验证“不报错”。必须在 `tests/cards/` 对应领域文件中覆盖该卡片的核心输出语义:
|
|
128
|
+
|
|
129
|
+
- 每个用户可选模式、关键参数分支和随机 seed 策略都要有代表性用例。
|
|
130
|
+
- 边界条件和非法参数要验证明确失败原因,不做静默降级或伪成功。
|
|
131
|
+
- 输出结构要检查可决策结果,例如数量、元素组成、cell/position/magmom 变化、过滤保留/剔除集合、`Config_type` 追踪标签。
|
|
132
|
+
- 随机型卡片要验证固定 seed 的可复现性;没有 seed 的随机分布只检查物理/几何约束,不写脆弱的逐坐标快照。
|
|
133
|
+
- dataset/generator 卡片要直接测 `run_dataset(...)` 或 `generate(...)` 的输入输出契约;UI 往返测试只验证参数绑定,不能替代 operation 行为测试。
|
|
134
|
+
|
|
135
|
+
## 验证
|
|
136
|
+
|
|
137
|
+
从仓库根目录运行 `python skills/make-dataset-card-dev/scripts/run_card_checks.py --quick`。更多模式见 `references/validation-playbook.md`。
|
|
138
|
+
|
|
139
|
+
## 交付格式
|
|
140
|
+
|
|
141
|
+
执行此 skill 时,输出按以下结构组织:
|
|
142
|
+
|
|
143
|
+
1. 卡片规格摘要
|
|
144
|
+
2. 实现清单
|
|
145
|
+
3. 验证结果
|
|
146
|
+
4. 未覆盖风险
|
|
147
|
+
|
|
148
|
+
## 质量门槛
|
|
149
|
+
|
|
150
|
+
- core operation 与 UI 解耦。
|
|
151
|
+
- UI 参数、Params dataclass、文档默认值一一对应。
|
|
152
|
+
- 没有“UI 有参数但逻辑没用”的死参数。
|
|
153
|
+
- 没有“逻辑硬编码但 UI 没暴露”的隐含参数。
|
|
154
|
+
- `to_dict` / `from_dict` 无丢字段和错类型。
|
|
155
|
+
- `tools/docs/audit_card_docs.py` 和相关 pytest 通过。
|
|
156
|
+
|
|
157
|
+
## Resources
|
|
158
|
+
|
|
159
|
+
### references/
|
|
160
|
+
|
|
161
|
+
- `references/card-touchpoints.md`:代码/文档/测试触点。
|
|
162
|
+
- `references/validation-playbook.md`:验证与排错路径。
|
|
163
|
+
- `references/requirements-to-card-spec-template.md`:把需求/脚本先落成实现规格。
|
|
164
|
+
|
|
165
|
+
### scripts/
|
|
166
|
+
|
|
167
|
+
- `scripts/run_card_checks.py`:统一执行交付检查,并包含 operation 架构审计。
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# Card Touchpoints
|
|
2
|
+
|
|
3
|
+
Use this map to edit only what is needed.
|
|
4
|
+
|
|
5
|
+
## Core code paths
|
|
6
|
+
|
|
7
|
+
- `src/NepTrainKit/core/cards/operation.py`: `StructureOperation`, `DatasetOperation`, `GeneratorOperation`, and `params_to_dict`.
|
|
8
|
+
- `src/NepTrainKit/core/cards/*.py`: UI-independent Params dataclasses and operation implementations.
|
|
9
|
+
- `src/NepTrainKit/ui/views/_card/*.py`: PySide card UI, parameter binding, serialization, and operation delegation.
|
|
10
|
+
- `src/NepTrainKit/ui/views/_card/__init__.py`: card imports and exports.
|
|
11
|
+
- `src/NepTrainKit/core/card_manager.py`: registration mechanics.
|
|
12
|
+
- `src/NepTrainKit/ui/widgets/card_widget.py`: base `MakeDataCard` operation dispatch.
|
|
13
|
+
- `src/NepTrainKit/ui/threads.py`: operation execution threads.
|
|
14
|
+
- `src/NepTrainKit/ui/pages/makedata.py`: workflow runtime integration.
|
|
15
|
+
|
|
16
|
+
## Docs paths
|
|
17
|
+
|
|
18
|
+
- `docs/source/module/make-dataset-cards/cards/*.md`: per-card docs.
|
|
19
|
+
- `docs/source/module/make-dataset-cards/writing-guide.md`: **authoritative doc style reference.** Read before writing any card doc.
|
|
20
|
+
- `tools/docs/audit_card_docs.py`: minimal integrity check (key consistency, code-doc defaults match). Does NOT enforce style — style is enforced by the writing guide.
|
|
21
|
+
- `skills/make-dataset-card-dev/references/requirements-to-card-spec-template.md`: pre-coding card spec template.
|
|
22
|
+
|
|
23
|
+
## Tests to touch first
|
|
24
|
+
|
|
25
|
+
- `tests/test_makedata_source_card.py`: source-card execution in MakeData page.
|
|
26
|
+
- `tests/cards/`: operation, card transformation, and serialization tests grouped by card domain.
|
|
27
|
+
- Operation tests should avoid Qt setup: call `Operation().run_structure(atoms, Params(...))`, `run_dataset(...)`, or `generate(...)` directly.
|
|
28
|
+
|
|
29
|
+
## CI references
|
|
30
|
+
|
|
31
|
+
- `.github/workflows/pytest.yml`: local checks expected by CI.
|
|
32
|
+
|
|
33
|
+
## Architecture audit
|
|
34
|
+
|
|
35
|
+
- Built-in `MakeDataCard` and `FilterDataCard` subclasses should provide `create_operation()`.
|
|
36
|
+
- Structure cards use `StructureOperation`; dataset filters use `DatasetOperation`; no-input generators use `GeneratorOperation`.
|
|
37
|
+
- `src/NepTrainKit/core/cards/*.py` must not import `PySide6`, `qfluentwidgets`, or `MessageManager`.
|
|
38
|
+
- Built-in cards should not override `run()`; dispatch belongs in `MakeDataCard.run()`.
|
neptrainkit-2.8.4/skills/make-dataset-card-dev/references/requirements-to-card-spec-template.md
ADDED
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
# 需求/脚本到卡片规格模板
|
|
2
|
+
|
|
3
|
+
按下面模板先产出规格,再写代码。
|
|
4
|
+
|
|
5
|
+
## 1. 输入信息
|
|
6
|
+
|
|
7
|
+
- 输入类型:需求描述 / 小脚本 / 现有卡片迁移
|
|
8
|
+
- 原始输入摘要:
|
|
9
|
+
- 目标数据处理动作:
|
|
10
|
+
|
|
11
|
+
## 2. 卡片基础定义
|
|
12
|
+
|
|
13
|
+
- 类名:
|
|
14
|
+
- `card_name`:
|
|
15
|
+
- `group`:
|
|
16
|
+
- `menu_icon`:
|
|
17
|
+
- `requires_input_dataset`:
|
|
18
|
+
- Operation 类型:`StructureOperation` / `DatasetOperation` / `GeneratorOperation`
|
|
19
|
+
- Core 模块:`lattice.py` / `structure.py` / `alloy.py` / `defect.py` / `magnetism.py` / `filter.py`
|
|
20
|
+
|
|
21
|
+
## 3. 操作示例(先写这个)
|
|
22
|
+
|
|
23
|
+
在写代码前先把操作示例定下来。必须从训练集诊断出发:
|
|
24
|
+
|
|
25
|
+
- **模型故障现象:** 模型在什么任务上、什么指标变差了
|
|
26
|
+
- **根因诊断:** 训练集缺了什么数据导致这个问题
|
|
27
|
+
- **输入结构:** 具体是什么输入
|
|
28
|
+
- **预期改善:** 加入这批数据后,重训模型应该看到什么变化
|
|
29
|
+
- **参数设置:** 解决这个问题大概需要什么参数/量级
|
|
30
|
+
- **验证方法:** 怎么判断训练集质量确实改善了
|
|
31
|
+
|
|
32
|
+
## 4. 参数设计(Params + UI)
|
|
33
|
+
|
|
34
|
+
对每个参数填写:
|
|
35
|
+
|
|
36
|
+
- 参数名(代码 key):
|
|
37
|
+
- Params 字段类型:
|
|
38
|
+
- UI 控件类型(SpinBoxUnitInputFrame / ComboBox / CheckBox / LineEdit):
|
|
39
|
+
- 类型与范围:
|
|
40
|
+
- 默认值:
|
|
41
|
+
- 使用建议(场景 + 量级,不要泛化模板句):
|
|
42
|
+
- 参数联动 / 生效条件(仅在条件生效时写):
|
|
43
|
+
|
|
44
|
+
## 4. 业务逻辑设计
|
|
45
|
+
|
|
46
|
+
- Operation 方法:`run_structure(structure, params)` / `run_dataset(dataset, params)` / `generate(params)`
|
|
47
|
+
- 输入对象:
|
|
48
|
+
- 输出对象:`list[ase.Atoms]`
|
|
49
|
+
- 核心算法步骤(3-8 条):
|
|
50
|
+
- 随机性与 seed 策略:
|
|
51
|
+
- 异常处理策略(core 抛异常,UI 展示错误):
|
|
52
|
+
- `Config_type` 标签策略:
|
|
53
|
+
|
|
54
|
+
## 5. 绑定与序列化
|
|
55
|
+
|
|
56
|
+
- 哪些 UI 字段参与运行时逻辑:
|
|
57
|
+
- `create_operation()` 返回什么:
|
|
58
|
+
- `get_params()` 如何从 UI 构造 Params:
|
|
59
|
+
- `set_params(params)` 如何恢复 UI:
|
|
60
|
+
- `to_dict` 字段清单:
|
|
61
|
+
- 是否写入 `"params"`:
|
|
62
|
+
- `from_dict` 默认值与兼容策略:
|
|
63
|
+
- 如果 `process_structure()` 存在,是否只做兼容委托:
|
|
64
|
+
- Structure: `return self.create_operation().run_structure(structure, self.get_params())`
|
|
65
|
+
- Dataset / Generator: 不新增伪 `process_structure()` 通路
|
|
66
|
+
- 是否覆盖 `run()`:必须为否
|
|
67
|
+
|
|
68
|
+
## 6. 接入与验证
|
|
69
|
+
|
|
70
|
+
- 注册改动:
|
|
71
|
+
- 文档改动:
|
|
72
|
+
- 测试改动:
|
|
73
|
+
- operation 直接测试:
|
|
74
|
+
- UI 参数往返测试:
|
|
75
|
+
- 验证命令:
|
|
76
|
+
|
|
77
|
+
## 7. 评审检查点
|
|
78
|
+
|
|
79
|
+
- core operation 是否完全不依赖 UI?
|
|
80
|
+
- UI 是否只委托 operation,而不是实现算法?
|
|
81
|
+
- 是否存在“UI 有参数但逻辑没用”的死参数?
|
|
82
|
+
- 是否存在“逻辑有硬编码但 UI 没暴露”的隐含参数?
|
|
83
|
+
- 参数名/默认值在代码和文档是否一致?
|
|
84
|
+
- 老配置 JSON 能否安全加载?
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# Validation Playbook
|
|
2
|
+
|
|
3
|
+
Run from repo root.
|
|
4
|
+
|
|
5
|
+
## Quick path (default)
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
python skills/make-dataset-card-dev/scripts/run_card_checks.py --quick
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Runs:
|
|
12
|
+
|
|
13
|
+
- operation architecture audit
|
|
14
|
+
- `pytest tests/test_makedata_source_card.py tests/cards -q`
|
|
15
|
+
- `python tools/docs/audit_card_docs.py`
|
|
16
|
+
|
|
17
|
+
## Include docs build
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
python skills/make-dataset-card-dev/scripts/run_card_checks.py --with-docs
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
Adds:
|
|
24
|
+
|
|
25
|
+
- `python -m sphinx -W -b html docs/source docs/build/html`
|
|
26
|
+
|
|
27
|
+
## Full regression path
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
python skills/make-dataset-card-dev/scripts/run_card_checks.py --full
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Runs:
|
|
34
|
+
|
|
35
|
+
- operation architecture audit
|
|
36
|
+
- `pytest tests/`
|
|
37
|
+
- `python tools/docs/audit_card_docs.py`
|
|
38
|
+
- `python -m sphinx -W -b html docs/source docs/build/html`
|
|
39
|
+
|
|
40
|
+
## Card generation benchmark
|
|
41
|
+
|
|
42
|
+
Use this when a new or changed card may be slow:
|
|
43
|
+
|
|
44
|
+
```bash
|
|
45
|
+
python tools/benchmark_card_operations.py
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
This benchmarks structure-generating operations directly, without Qt UI startup. It also runs lightweight semantic checks on every scenario, so a faster path must still generate the expected output shape, tags, composition, geometry, or magnetic moments. Useful filters:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
python tools/benchmark_card_operations.py --only spin --repeat 5
|
|
52
|
+
python tools/benchmark_card_operations.py --profile count50
|
|
53
|
+
python tools/benchmark_card_operations.py --only slab --json card_bench.json
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
## Triage order
|
|
57
|
+
|
|
58
|
+
1. Fix operation architecture violations first; do not leave core logic in UI cards.
|
|
59
|
+
2. Fix code/runtime errors from pytest.
|
|
60
|
+
3. Fix schema/section mismatches reported by `audit_card_docs.py`.
|
|
61
|
+
4. Fix docs warnings or broken references from Sphinx.
|
|
62
|
+
|
|
63
|
+
## New card test bar
|
|
64
|
+
|
|
65
|
+
When adding a card, update `tests/cards/` in the domain file that matches the card. The test must prove the card behavior, not only that execution finishes:
|
|
66
|
+
|
|
67
|
+
- cover each public mode and key parameter branch;
|
|
68
|
+
- cover invalid or boundary params with explicit errors;
|
|
69
|
+
- assert output semantics such as structure count, composition, cell/position/magmom changes, dataset filter decisions, generated tags, and `Config_type`;
|
|
70
|
+
- cover deterministic seed behavior for random operations;
|
|
71
|
+
- keep UI round-trip tests focused on parameter binding and serialization; operation behavior belongs in direct operation tests.
|
|
72
|
+
|
|
73
|
+
## Operation architecture audit
|
|
74
|
+
|
|
75
|
+
The validation script checks:
|
|
76
|
+
|
|
77
|
+
- every built-in `MakeDataCard` / `FilterDataCard` subclass has `create_operation()`;
|
|
78
|
+
- no built-in card has a custom `run()` unless the architecture is explicitly changed;
|
|
79
|
+
- `src/NepTrainKit/core/cards/*.py` does not import `PySide6`, `qfluentwidgets`, or `MessageManager`.
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#!/usr/bin/env python
|
|
2
|
+
"""Run focused validation checks for Make Dataset card development."""
|
|
3
|
+
|
|
4
|
+
from __future__ import annotations
|
|
5
|
+
|
|
6
|
+
import argparse
|
|
7
|
+
import os
|
|
8
|
+
import subprocess
|
|
9
|
+
import sys
|
|
10
|
+
from pathlib import Path
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
def find_repo_root(start: Path) -> Path:
|
|
14
|
+
"""Return the nearest parent containing pyproject.toml."""
|
|
15
|
+
current = start.resolve()
|
|
16
|
+
for candidate in [current, *current.parents]:
|
|
17
|
+
if (candidate / "pyproject.toml").exists():
|
|
18
|
+
return candidate
|
|
19
|
+
raise FileNotFoundError("Could not locate repo root (pyproject.toml not found).")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def audit_operation_architecture(repo_root: Path) -> int:
|
|
23
|
+
"""Check Make Dataset cards follow the core operation architecture."""
|
|
24
|
+
import ast
|
|
25
|
+
|
|
26
|
+
errors: list[str] = []
|
|
27
|
+
card_dir = repo_root / "src" / "NepTrainKit" / "ui" / "views" / "_card"
|
|
28
|
+
core_cards_dir = repo_root / "src" / "NepTrainKit" / "core" / "cards"
|
|
29
|
+
|
|
30
|
+
for path in sorted(card_dir.glob("*.py")):
|
|
31
|
+
if path.name == "__init__.py":
|
|
32
|
+
continue
|
|
33
|
+
tree = ast.parse(path.read_text(encoding="utf-8-sig"), filename=str(path))
|
|
34
|
+
for node in tree.body:
|
|
35
|
+
if not isinstance(node, ast.ClassDef):
|
|
36
|
+
continue
|
|
37
|
+
bases = []
|
|
38
|
+
for base in node.bases:
|
|
39
|
+
if isinstance(base, ast.Name):
|
|
40
|
+
bases.append(base.id)
|
|
41
|
+
elif isinstance(base, ast.Attribute):
|
|
42
|
+
bases.append(base.attr)
|
|
43
|
+
if not any(base in {"MakeDataCard", "FilterDataCard"} for base in bases):
|
|
44
|
+
continue
|
|
45
|
+
|
|
46
|
+
methods = {item.name for item in node.body if isinstance(item, ast.FunctionDef)}
|
|
47
|
+
if "create_operation" not in methods:
|
|
48
|
+
errors.append(f"{path.relative_to(repo_root)}:{node.name} missing create_operation()")
|
|
49
|
+
if "run" in methods:
|
|
50
|
+
errors.append(f"{path.relative_to(repo_root)}:{node.name} defines custom run()")
|
|
51
|
+
|
|
52
|
+
forbidden_modules = ("PySide6", "qfluentwidgets")
|
|
53
|
+
forbidden_names = {"MessageManager"}
|
|
54
|
+
for path in sorted(core_cards_dir.glob("*.py")):
|
|
55
|
+
tree = ast.parse(path.read_text(encoding="utf-8-sig"), filename=str(path))
|
|
56
|
+
for node in ast.walk(tree):
|
|
57
|
+
if isinstance(node, ast.Import):
|
|
58
|
+
for alias in node.names:
|
|
59
|
+
root_name = alias.name.split(".", 1)[0]
|
|
60
|
+
if root_name in forbidden_modules or alias.name in forbidden_names:
|
|
61
|
+
errors.append(f"{path.relative_to(repo_root)} imports UI dependency {alias.name}")
|
|
62
|
+
elif isinstance(node, ast.ImportFrom):
|
|
63
|
+
module = node.module or ""
|
|
64
|
+
root_name = module.split(".", 1)[0]
|
|
65
|
+
if root_name in forbidden_modules:
|
|
66
|
+
errors.append(f"{path.relative_to(repo_root)} imports UI dependency {module}")
|
|
67
|
+
for alias in node.names:
|
|
68
|
+
if alias.name in forbidden_names:
|
|
69
|
+
source = module or "."
|
|
70
|
+
errors.append(f"{path.relative_to(repo_root)} imports UI dependency {source}.{alias.name}")
|
|
71
|
+
|
|
72
|
+
if errors:
|
|
73
|
+
print("[fail] operation architecture audit failed")
|
|
74
|
+
for error in errors:
|
|
75
|
+
print(f" - {error}")
|
|
76
|
+
return 1
|
|
77
|
+
|
|
78
|
+
print("[ok] operation architecture audit passed")
|
|
79
|
+
return 0
|
|
80
|
+
|
|
81
|
+
|
|
82
|
+
def run_commands(commands: list[list[str]], cwd: Path) -> int:
|
|
83
|
+
"""Run commands sequentially and stop at first failure."""
|
|
84
|
+
audit_result = audit_operation_architecture(cwd)
|
|
85
|
+
if audit_result != 0:
|
|
86
|
+
return audit_result
|
|
87
|
+
env = os.environ.copy()
|
|
88
|
+
src_path = str(cwd / "src")
|
|
89
|
+
env["PYTHONPATH"] = src_path if not env.get("PYTHONPATH") else src_path + os.pathsep + env["PYTHONPATH"]
|
|
90
|
+
for cmd in commands:
|
|
91
|
+
print(f"[run] {' '.join(cmd)}")
|
|
92
|
+
result = subprocess.run(cmd, cwd=cwd, env=env)
|
|
93
|
+
if result.returncode != 0:
|
|
94
|
+
print(f"[fail] exit code {result.returncode}")
|
|
95
|
+
return result.returncode
|
|
96
|
+
print("[ok] all checks passed")
|
|
97
|
+
return 0
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
def build_commands(full: bool, with_docs: bool) -> list[list[str]]:
|
|
101
|
+
"""Build command list based on mode flags."""
|
|
102
|
+
py = sys.executable
|
|
103
|
+
if full:
|
|
104
|
+
return [
|
|
105
|
+
[py, "-m", "pytest", "tests/"],
|
|
106
|
+
[py, "tools/docs/audit_card_docs.py"],
|
|
107
|
+
[py, "-m", "sphinx", "-W", "-b", "html", "docs/source", "docs/build/html"],
|
|
108
|
+
]
|
|
109
|
+
|
|
110
|
+
commands: list[list[str]] = [
|
|
111
|
+
[py, "-m", "pytest", "tests/test_makedata_source_card.py", "tests/cards", "-q"],
|
|
112
|
+
[py, "tools/docs/audit_card_docs.py"],
|
|
113
|
+
]
|
|
114
|
+
if with_docs:
|
|
115
|
+
commands.append([py, "-m", "sphinx", "-W", "-b", "html", "docs/source", "docs/build/html"])
|
|
116
|
+
return commands
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
def parse_args() -> argparse.Namespace:
|
|
120
|
+
parser = argparse.ArgumentParser(description=__doc__)
|
|
121
|
+
parser.add_argument(
|
|
122
|
+
"--quick",
|
|
123
|
+
action="store_true",
|
|
124
|
+
help="Run focused tests and doc audit (default mode if no flags provided).",
|
|
125
|
+
)
|
|
126
|
+
parser.add_argument(
|
|
127
|
+
"--with-docs",
|
|
128
|
+
action="store_true",
|
|
129
|
+
help="Include Sphinx docs build in quick mode.",
|
|
130
|
+
)
|
|
131
|
+
parser.add_argument(
|
|
132
|
+
"--full",
|
|
133
|
+
action="store_true",
|
|
134
|
+
help="Run full test suite plus docs audit and docs build.",
|
|
135
|
+
)
|
|
136
|
+
parser.add_argument(
|
|
137
|
+
"--dry-run",
|
|
138
|
+
action="store_true",
|
|
139
|
+
help="Print commands without executing them.",
|
|
140
|
+
)
|
|
141
|
+
return parser.parse_args()
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
def main() -> int:
|
|
145
|
+
args = parse_args()
|
|
146
|
+
if args.full and args.quick:
|
|
147
|
+
print("Choose either --full or --quick, not both.")
|
|
148
|
+
return 2
|
|
149
|
+
|
|
150
|
+
script_path = Path(__file__).resolve()
|
|
151
|
+
repo_root = find_repo_root(script_path.parent)
|
|
152
|
+
commands = build_commands(full=args.full, with_docs=args.with_docs)
|
|
153
|
+
|
|
154
|
+
if args.dry_run:
|
|
155
|
+
print(f"[info] repo root: {repo_root}")
|
|
156
|
+
print("[dry-run] operation architecture audit")
|
|
157
|
+
for cmd in commands:
|
|
158
|
+
print(f"[dry-run] {' '.join(cmd)}")
|
|
159
|
+
return 0
|
|
160
|
+
|
|
161
|
+
return run_commands(commands, cwd=repo_root)
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
if __name__ == "__main__":
|
|
165
|
+
raise SystemExit(main())
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# file generated by vcs-versioning
|
|
2
|
+
# don't change, don't track in version control
|
|
3
|
+
from __future__ import annotations
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"__version__",
|
|
7
|
+
"__version_tuple__",
|
|
8
|
+
"version",
|
|
9
|
+
"version_tuple",
|
|
10
|
+
"__commit_id__",
|
|
11
|
+
"commit_id",
|
|
12
|
+
]
|
|
13
|
+
|
|
14
|
+
version: str
|
|
15
|
+
__version__: str
|
|
16
|
+
__version_tuple__: tuple[int | str, ...]
|
|
17
|
+
version_tuple: tuple[int | str, ...]
|
|
18
|
+
commit_id: str | None
|
|
19
|
+
__commit_id__: str | None
|
|
20
|
+
|
|
21
|
+
__version__ = version = '2.8.4'
|
|
22
|
+
__version_tuple__ = version_tuple = (2, 8, 4)
|
|
23
|
+
|
|
24
|
+
__commit_id__ = commit_id = 'g6a1cf180c'
|
|
@@ -19,10 +19,10 @@ from typing import Any
|
|
|
19
19
|
|
|
20
20
|
__all__ = [
|
|
21
21
|
'MessageManager',
|
|
22
|
-
'CardManager', 'load_cards_from_directory',
|
|
22
|
+
'CardManager', 'CardContributor', 'CardMetadata', 'load_cards_from_directory',
|
|
23
23
|
]
|
|
24
24
|
|
|
25
|
-
from .card_manager import CardManager, load_cards_from_directory
|
|
25
|
+
from .card_manager import CardContributor, CardManager, CardMetadata, load_cards_from_directory
|
|
26
26
|
from .message import MessageManager
|
|
27
27
|
|
|
28
28
|
# 可选:通过环境变量 NEP_NATIVE_STDIO 控制原生 stdout/stderr 重定向
|