emmet-api 0.87.0.dev1__tar.gz → 0.87.0.dev2__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.
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/PKG-INFO +1 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/documentation.py +1 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/query_operators.py +37 -10
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/query_operators.py +27 -10
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/resources.py +1 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/PKG-INFO +1 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/material_resources.py +11 -6
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/deployment.txt +1 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/test_query_operators.py +50 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/similarity/test_query_operators.py +16 -5
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_adaptor.py +1 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_adaptor_synpro.py +2 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_utils.py +6 -2
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/test_query_operators.py +2 -2
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/test_utils.py +5 -2
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_utils.py +2 -1
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/Dockerfile +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/app.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/defect_resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/API.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/api.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/assets/mp_logo.svg +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/assets/mp_logo_small.png +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/global_header.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/core/settings.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/default_responses.yaml +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/models.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/py.typed +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/core.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/dynamic.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/pagination.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/sorting.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/sparse_fields.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/query_operator/submission.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/aggregation.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/core.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/post_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/read_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/submission.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/resource/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/query_operator.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/query_operator.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/query_operator.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/defects/tasks/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/defects/tasks/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/dois/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/dois/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/charge_density/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/conversion_electrodes/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/conversion_electrodes/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/electronic_structure/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/eos/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/eos/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/fermi/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/fermi/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/grain_boundary/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/insertion_electrodes/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/magnetism/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/materials/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/query_operator.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/mpcomplete/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/oxidation_states/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/phonon/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/piezo/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/provenance/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/provenance/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/robocrys/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/similarity/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/substrates/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/summary/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/surface_properties/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/data_adaptor.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/data_adaptor_synpro.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/synthesis/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/tasks/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/thermo/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/xas/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/association/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/association/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/bonds/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/electric/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/metal_binding/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/molecules/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/orbitals/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/orbitals/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_charges/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_charges/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_spins/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/partial_spins/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/redox/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/summary/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/tasks/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/thermo/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/vibrations/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/molecules/vibrations/resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/SOURCES.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/dependency_links.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/requires.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet_api.egg-info/top_level.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/healthcheck.sh +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/molecule_resources.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/pyproject.toml +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.11.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.11_extras.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.12.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.12_extras.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.13.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/requirements/ubuntu-latest_py3.13_extras.txt +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/setup.cfg +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/start.sh +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_consumer/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_consumer/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_general_store/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/_general_store/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/async_mongomock.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/conftest.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/core/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/core/test_mapi.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/legacy/molecules/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/legacy/molecules/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_aggregation_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_api.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_post_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_read_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_submission_resource.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/mapi/test_utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/bonds/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/bonds/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/charge_density/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/charge_density/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/chemenv/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/chemenv/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/dielectric/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/dielectric/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/elasticity/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/elasticity/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electrodes/test_utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electronic_structure/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/electronic_structure/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/eos/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/grain_boundary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/grain_boundary/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/magnetism/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/magnetism/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/test_utils.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/mpcomplete/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/mpcomplete/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/oxidation_states/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/oxidation_states/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/piezo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/piezo/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/robocrys/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/robocrys/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/similarity/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/substrates/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/substrates/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/test_hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/summary/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/surface_properties/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/surface_properties/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/thermo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/thermo/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/xas/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/xas/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/bonds/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/bonds/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/electric/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/electric/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/metal_binding/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/metal_binding/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/test_hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/molecules/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/redox/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/redox/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/summary/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/summary/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_hint_scheme.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/tasks/test_query_operators.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/thermo/__init__.py +0 -0
- {emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/molecules/thermo/test_query_operators.py +0 -0
|
@@ -133,7 +133,7 @@ tags_meta = [
|
|
|
133
133
|
methodology discussed by Zimmerman *et al.* in [10.3389/fmats.2017.00034](https://doi.org/10.3389/fmats.2017.00034) \
|
|
134
134
|
and [10.1039/C9RA07755C](https://doi.org/10.1039/C9RA07755C). \
|
|
135
135
|
Note that similarity data has not been calculated for all materials in the Materials \
|
|
136
|
-
Project database. See the `
|
|
136
|
+
Project database. See the `SimilarityDoc` schema for a full list of fields returned by this route.",
|
|
137
137
|
},
|
|
138
138
|
{
|
|
139
139
|
"name": "Materials XAS",
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from itertools import permutations
|
|
2
|
-
from typing import Literal
|
|
2
|
+
from typing import Literal, Any
|
|
3
3
|
|
|
4
4
|
from fastapi import Body, HTTPException, Query
|
|
5
5
|
from emmet.api.query_operator import QueryOperator
|
|
@@ -15,6 +15,9 @@ from emmet.api.routes.materials.materials.utils import (
|
|
|
15
15
|
)
|
|
16
16
|
from emmet.core.symmetry import CrystalSystem
|
|
17
17
|
from emmet.core.vasp.calc_types import RunType
|
|
18
|
+
from emmet.core.vasp.material import BlessedCalcs
|
|
19
|
+
|
|
20
|
+
BLESSED_CALC_RUN_TYPES = sorted(BlessedCalcs.model_fields)
|
|
18
21
|
|
|
19
22
|
|
|
20
23
|
class FormulaQuery(QueryOperator):
|
|
@@ -212,7 +215,7 @@ class BlessedCalcsQuery(QueryOperator):
|
|
|
212
215
|
|
|
213
216
|
def query(
|
|
214
217
|
self,
|
|
215
|
-
run_type: RunType = Query(
|
|
218
|
+
run_type: Literal[*BLESSED_CALC_RUN_TYPES] | RunType = Query( # type: ignore[valid-type]
|
|
216
219
|
..., description="Calculation run type of blessed task data"
|
|
217
220
|
),
|
|
218
221
|
energy_min: float | None = Query(
|
|
@@ -222,26 +225,50 @@ class BlessedCalcsQuery(QueryOperator):
|
|
|
222
225
|
None, description="Maximum total uncorrected DFT energy in eV/atom"
|
|
223
226
|
),
|
|
224
227
|
) -> STORE_PARAMS:
|
|
225
|
-
crit = {f"entries.{run_type}.energy": {}} # type: dict
|
|
226
228
|
|
|
227
|
-
|
|
228
|
-
|
|
229
|
+
parsed_run_type: str | None = None
|
|
230
|
+
if isinstance(run_type, RunType):
|
|
231
|
+
aliases = {
|
|
232
|
+
RunType.PBE: "GGA",
|
|
233
|
+
RunType.PBE_U: "GGA_U",
|
|
234
|
+
RunType.GGA: "GGA",
|
|
235
|
+
RunType.GGA_U: "GGA_U",
|
|
236
|
+
RunType.SCAN: "SCAN",
|
|
237
|
+
RunType.r2SCAN: "R2SCAN",
|
|
238
|
+
RunType.HSE06: "HSE",
|
|
239
|
+
}
|
|
240
|
+
parsed_run_type = aliases.get(run_type)
|
|
241
|
+
|
|
242
|
+
elif run_type in BLESSED_CALC_RUN_TYPES:
|
|
243
|
+
parsed_run_type = run_type
|
|
244
|
+
|
|
245
|
+
if parsed_run_type is None:
|
|
246
|
+
raise ValueError(
|
|
247
|
+
f"Unsupported {run_type=}, please choose one of "
|
|
248
|
+
f"{', '.join(BLESSED_CALC_RUN_TYPES)}"
|
|
249
|
+
)
|
|
250
|
+
|
|
251
|
+
crit: dict[str, Any] = {f"entries.{parsed_run_type}.energy": {}}
|
|
252
|
+
|
|
253
|
+
if energy_min is not None:
|
|
254
|
+
crit[f"entries.{parsed_run_type}.energy"].update({"$gte": energy_min})
|
|
229
255
|
|
|
230
|
-
if energy_max:
|
|
231
|
-
crit[f"entries.{
|
|
256
|
+
if energy_max is not None:
|
|
257
|
+
crit[f"entries.{parsed_run_type}.energy"].update({"$lte": energy_max})
|
|
232
258
|
|
|
233
|
-
if not crit[f"entries.{
|
|
234
|
-
return {"criteria": {f"entries.{
|
|
259
|
+
if not crit[f"entries.{parsed_run_type}.energy"]:
|
|
260
|
+
return {"criteria": {f"entries.{parsed_run_type}": {"$ne": None}}}
|
|
235
261
|
|
|
236
262
|
return {"criteria": crit}
|
|
237
263
|
|
|
238
264
|
def post_process(self, docs, query):
|
|
265
|
+
"""Return only the blessed entry."""
|
|
239
266
|
run_type = list(query["criteria"].keys())[0].split(".")[1]
|
|
240
267
|
|
|
241
268
|
return_data = [
|
|
242
269
|
{
|
|
243
270
|
"material_id": doc["material_id"],
|
|
244
|
-
"
|
|
271
|
+
"entries": {run_type: doc["entries"][run_type]},
|
|
245
272
|
}
|
|
246
273
|
for doc in docs
|
|
247
274
|
]
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
from fastapi import HTTPException, Query
|
|
4
4
|
|
|
5
|
-
from emmet.core.similarity import SimilarityMethod
|
|
5
|
+
from emmet.core.similarity import SimilarityMethod, _vector_from_hex_and_norm
|
|
6
6
|
|
|
7
7
|
from emmet.api.query_operator import QueryOperator
|
|
8
8
|
from emmet.api.utils import STORE_PARAMS
|
|
@@ -16,15 +16,27 @@ SIM_METHOD_TO_FEAT_VEC_LENGTH = {
|
|
|
16
16
|
class SimilarityFeatureVectorQuery(QueryOperator):
|
|
17
17
|
"""Generate a feature-vector-based query.
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
19
|
+
The feature_vector_hex field is limited to 3_000 characters
|
|
20
|
+
to prevent malicious submission of overly-long string data.
|
|
21
|
+
|
|
22
|
+
In the worst case, a random unit vector of floats with
|
|
23
|
+
length 130 has roughly a hex string length of 2,100 characters.
|
|
24
|
+
|
|
25
|
+
Note that we pass unit vectors through only.
|
|
26
|
+
Passing vectors with non-unit norm would increase the lenght of
|
|
27
|
+
`feature_vector_hex` uncontrollably.
|
|
22
28
|
"""
|
|
23
29
|
|
|
24
30
|
def query(
|
|
25
31
|
self,
|
|
26
|
-
|
|
27
|
-
...,
|
|
32
|
+
feature_vector_hex: str = Query(
|
|
33
|
+
...,
|
|
34
|
+
description="A compressed, hex representation of a row unit vector of floats.",
|
|
35
|
+
max_length=3_000,
|
|
36
|
+
),
|
|
37
|
+
feature_vector_norm: float = Query(
|
|
38
|
+
...,
|
|
39
|
+
description="The norm of the feature vector",
|
|
28
40
|
),
|
|
29
41
|
method: str | SimilarityMethod | None = Query(
|
|
30
42
|
None,
|
|
@@ -37,6 +49,9 @@ class SimilarityFeatureVectorQuery(QueryOperator):
|
|
|
37
49
|
) -> STORE_PARAMS:
|
|
38
50
|
"""Identify similar materials."""
|
|
39
51
|
|
|
52
|
+
feature_vector = _vector_from_hex_and_norm(
|
|
53
|
+
feature_vector_hex, feature_vector_norm
|
|
54
|
+
)
|
|
40
55
|
if method is None:
|
|
41
56
|
try:
|
|
42
57
|
method = next(
|
|
@@ -65,8 +80,10 @@ class SimilarityFeatureVectorQuery(QueryOperator):
|
|
|
65
80
|
):
|
|
66
81
|
raise HTTPException(
|
|
67
82
|
status_code=400,
|
|
68
|
-
detail=
|
|
69
|
-
|
|
83
|
+
detail=(
|
|
84
|
+
f"Invalid feature vector for method {method.value}: " # type: ignore[union-attr]
|
|
85
|
+
f"should be a list of {ref_fv_len} floats.",
|
|
86
|
+
),
|
|
70
87
|
)
|
|
71
88
|
|
|
72
89
|
index_name = "similarity_feature_vector"
|
|
@@ -74,7 +91,7 @@ class SimilarityFeatureVectorQuery(QueryOperator):
|
|
|
74
91
|
# and I was not forward thinking in naming it.
|
|
75
92
|
# TODO: homogenize once we have other data built out
|
|
76
93
|
if method != SimilarityMethod.CRYSTALNN:
|
|
77
|
-
index_name += f"_{method.value.lower()}"
|
|
94
|
+
index_name += f"_{method.value.lower()}" # type: ignore[union-attr]
|
|
78
95
|
|
|
79
96
|
pipeline = [
|
|
80
97
|
{
|
|
@@ -100,7 +117,7 @@ class SimilarityFeatureVectorQuery(QueryOperator):
|
|
|
100
117
|
}
|
|
101
118
|
|
|
102
119
|
def post_process(self, docs, query):
|
|
103
|
-
self.total_doc = docs
|
|
120
|
+
self.total_doc = len(docs)
|
|
104
121
|
return docs
|
|
105
122
|
|
|
106
123
|
def meta(self):
|
|
@@ -156,9 +156,17 @@ from emmet.api.routes.materials.eos.resources import eos_resource
|
|
|
156
156
|
materials_resources.extend([eos_resource(eos_store)])
|
|
157
157
|
|
|
158
158
|
# Similarity
|
|
159
|
-
from emmet.api.routes.materials.similarity.resources import
|
|
159
|
+
from emmet.api.routes.materials.similarity.resources import (
|
|
160
|
+
similarity_resource,
|
|
161
|
+
similarity_feature_vector_resource,
|
|
162
|
+
)
|
|
160
163
|
|
|
161
|
-
materials_resources.extend(
|
|
164
|
+
materials_resources.extend(
|
|
165
|
+
[
|
|
166
|
+
similarity_resource(similarity_store),
|
|
167
|
+
similarity_feature_vector_resource(similarity_store),
|
|
168
|
+
]
|
|
169
|
+
)
|
|
162
170
|
|
|
163
171
|
# XAS
|
|
164
172
|
from emmet.api.routes.materials.xas.resources import xas_resource
|
|
@@ -242,12 +250,9 @@ materials_resources.extend([provenance_resource(provenance_store)])
|
|
|
242
250
|
# Summary
|
|
243
251
|
from emmet.api.routes.materials.summary.resources import (
|
|
244
252
|
summary_resource,
|
|
245
|
-
summary_stats_resource,
|
|
246
253
|
)
|
|
247
254
|
|
|
248
|
-
materials_resources.extend(
|
|
249
|
-
[summary_stats_resource(summary_store), summary_resource(summary_store)]
|
|
250
|
-
)
|
|
255
|
+
materials_resources.extend([summary_resource(summary_store)])
|
|
251
256
|
|
|
252
257
|
# Electronic Structure
|
|
253
258
|
from emmet.api.routes.materials.electronic_structure.resources import (
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/materials/test_query_operators.py
RENAMED
|
@@ -4,6 +4,7 @@ from pymatgen.core.structure import Structure
|
|
|
4
4
|
|
|
5
5
|
from emmet.api.core.settings import MAPISettings
|
|
6
6
|
from emmet.api.routes.materials.materials.query_operators import (
|
|
7
|
+
BlessedCalcsQuery,
|
|
7
8
|
ChemsysQuery,
|
|
8
9
|
DeprecationQuery,
|
|
9
10
|
ElementsQuery,
|
|
@@ -15,6 +16,55 @@ from emmet.api.routes.materials.materials.query_operators import (
|
|
|
15
16
|
SymmetryQuery,
|
|
16
17
|
)
|
|
17
18
|
from emmet.core.symmetry import CrystalSystem
|
|
19
|
+
from emmet.core.vasp.calc_types import RunType
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
def test_blessed_calcs_query():
|
|
23
|
+
|
|
24
|
+
op = BlessedCalcsQuery()
|
|
25
|
+
for mapped, possible_user_input in {
|
|
26
|
+
"GGA": ["GGA", RunType.GGA, RunType.PBE],
|
|
27
|
+
"GGA_U": ["GGA_U", RunType.PBE_U],
|
|
28
|
+
"R2SCAN": ["R2SCAN", RunType.r2SCAN],
|
|
29
|
+
"SCAN": ["SCAN", RunType.SCAN],
|
|
30
|
+
"HSE": ["HSE", RunType.HSE06],
|
|
31
|
+
}.items():
|
|
32
|
+
|
|
33
|
+
assert all(
|
|
34
|
+
op.query(run_type=user_inp, energy_min=None, energy_max=None)
|
|
35
|
+
== {"criteria": {f"entries.{mapped}": {"$ne": None}}}
|
|
36
|
+
for user_inp in possible_user_input
|
|
37
|
+
)
|
|
38
|
+
|
|
39
|
+
assert all(
|
|
40
|
+
op.query(
|
|
41
|
+
run_type=user_inp,
|
|
42
|
+
energy_min=0.0,
|
|
43
|
+
energy_max=None,
|
|
44
|
+
)
|
|
45
|
+
== {"criteria": {f"entries.{mapped}.energy": {"$gte": 0.0}}}
|
|
46
|
+
for user_inp in possible_user_input
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
assert all(
|
|
50
|
+
op.query(
|
|
51
|
+
run_type=user_inp,
|
|
52
|
+
energy_min=None,
|
|
53
|
+
energy_max=5.0,
|
|
54
|
+
)
|
|
55
|
+
== {"criteria": {f"entries.{mapped}.energy": {"$lte": 5.0}}}
|
|
56
|
+
for user_inp in possible_user_input
|
|
57
|
+
)
|
|
58
|
+
|
|
59
|
+
assert all(
|
|
60
|
+
op.query(
|
|
61
|
+
run_type=user_inp,
|
|
62
|
+
energy_min=0.0,
|
|
63
|
+
energy_max=5.0,
|
|
64
|
+
)
|
|
65
|
+
== {"criteria": {f"entries.{mapped}.energy": {"$gte": 0.0, "$lte": 5.0}}}
|
|
66
|
+
for user_inp in possible_user_input
|
|
67
|
+
)
|
|
18
68
|
|
|
19
69
|
|
|
20
70
|
def test_formula_query():
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/similarity/test_query_operators.py
RENAMED
|
@@ -1,13 +1,17 @@
|
|
|
1
1
|
"""Test crystalline similarity vector search."""
|
|
2
2
|
|
|
3
|
+
import numpy as np
|
|
3
4
|
import pytest
|
|
4
5
|
|
|
5
|
-
from emmet.core.similarity import
|
|
6
|
+
from emmet.core.similarity import (
|
|
7
|
+
SimilarityMethod,
|
|
8
|
+
_vector_to_hex_and_norm,
|
|
9
|
+
_vector_from_hex_and_norm,
|
|
10
|
+
)
|
|
6
11
|
from emmet.api.routes.materials.similarity.query_operators import (
|
|
7
12
|
SimilarityFeatureVectorQuery,
|
|
8
13
|
SIM_METHOD_TO_FEAT_VEC_LENGTH,
|
|
9
14
|
)
|
|
10
|
-
import numpy as np
|
|
11
15
|
|
|
12
16
|
|
|
13
17
|
@pytest.mark.parametrize(
|
|
@@ -19,6 +23,8 @@ def test_similarity_structure_search(test_dir, method):
|
|
|
19
23
|
fv = np.random.rand(
|
|
20
24
|
SIM_METHOD_TO_FEAT_VEC_LENGTH[SimilarityMethod.CRYSTALNN]
|
|
21
25
|
).tolist()
|
|
26
|
+
fv_hex, fv_norm = _vector_to_hex_and_norm(fv)
|
|
27
|
+
|
|
22
28
|
limit = 10
|
|
23
29
|
q = {
|
|
24
30
|
"pipeline": [
|
|
@@ -26,7 +32,7 @@ def test_similarity_structure_search(test_dir, method):
|
|
|
26
32
|
"$vectorSearch": {
|
|
27
33
|
"index": "similarity_feature_vector",
|
|
28
34
|
"path": "feature_vector",
|
|
29
|
-
"queryVector":
|
|
35
|
+
"queryVector": _vector_from_hex_and_norm(fv_hex, fv_norm),
|
|
30
36
|
"numCandidates": limit,
|
|
31
37
|
"limit": limit,
|
|
32
38
|
}
|
|
@@ -42,9 +48,14 @@ def test_similarity_structure_search(test_dir, method):
|
|
|
42
48
|
]
|
|
43
49
|
}
|
|
44
50
|
|
|
45
|
-
manual_q = op.query(
|
|
51
|
+
manual_q = op.query(
|
|
52
|
+
feature_vector_hex=fv_hex,
|
|
53
|
+
feature_vector_norm=fv_norm,
|
|
54
|
+
method=method,
|
|
55
|
+
_limit=limit,
|
|
56
|
+
)
|
|
46
57
|
assert manual_q == q
|
|
47
58
|
|
|
48
59
|
doc = [{"meta": {"count": {"total": limit}}}]
|
|
49
60
|
assert op.post_process(doc, q) == doc
|
|
50
|
-
assert op.meta()
|
|
61
|
+
assert "total_doc" in op.meta()
|
|
@@ -19,7 +19,7 @@ def test_string2comp():
|
|
|
19
19
|
|
|
20
20
|
def test_convert_recipe():
|
|
21
21
|
with zopen(
|
|
22
|
-
os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor.json.gz")
|
|
22
|
+
os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor.json.gz"), "rt"
|
|
23
23
|
) as file:
|
|
24
24
|
synth_doc = load(file)
|
|
25
25
|
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/synthesis/test_adaptor_synpro.py
RENAMED
|
@@ -112,7 +112,8 @@ def test_get_material_formula():
|
|
|
112
112
|
|
|
113
113
|
def test_convert_one():
|
|
114
114
|
with zopen(
|
|
115
|
-
os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor_synpro.json.gz")
|
|
115
|
+
os.path.join(MAPISettings().TEST_FILES, "synth_doc_adaptor_synpro.json.gz"),
|
|
116
|
+
"rt",
|
|
116
117
|
) as file:
|
|
117
118
|
synth_doc = load(file)
|
|
118
119
|
|
|
@@ -20,7 +20,9 @@ def test_make_ellipsis():
|
|
|
20
20
|
|
|
21
21
|
|
|
22
22
|
def test_mask_paragraphs():
|
|
23
|
-
with zopen(
|
|
23
|
+
with zopen(
|
|
24
|
+
os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz"), "rt"
|
|
25
|
+
) as file:
|
|
24
26
|
synth_doc = load(file)
|
|
25
27
|
|
|
26
28
|
doc = SynthesisSearchResultModel(**synth_doc)
|
|
@@ -30,7 +32,9 @@ def test_mask_paragraphs():
|
|
|
30
32
|
|
|
31
33
|
|
|
32
34
|
def test_mask_highlights():
|
|
33
|
-
with zopen(
|
|
35
|
+
with zopen(
|
|
36
|
+
os.path.join(MAPISettings().TEST_FILES, "synth_doc.json.gz"), "rt"
|
|
37
|
+
) as file:
|
|
34
38
|
synth_doc = load(file)
|
|
35
39
|
|
|
36
40
|
doc = SynthesisSearchResultModel(**synth_doc)
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/tests/materials/tasks/test_query_operators.py
RENAMED
|
@@ -30,7 +30,7 @@ def test_entries_query():
|
|
|
30
30
|
assert op.query(task_ids=" mp-149, mp-13") == q
|
|
31
31
|
|
|
32
32
|
with zopen(
|
|
33
|
-
os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz")
|
|
33
|
+
os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz"), "rt"
|
|
34
34
|
) as file:
|
|
35
35
|
tasks = json.load(file)
|
|
36
36
|
docs = op.post_process(tasks, q)
|
|
@@ -45,7 +45,7 @@ def test_trajectory_query():
|
|
|
45
45
|
assert op.query(task_ids=" mp-149, mp-13") == q
|
|
46
46
|
|
|
47
47
|
with zopen(
|
|
48
|
-
os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz")
|
|
48
|
+
os.path.join(MAPISettings().TEST_FILES, "tasks_Li_Fe_V.json.gz"), "rt"
|
|
49
49
|
) as file:
|
|
50
50
|
tasks = json.load(file)
|
|
51
51
|
docs = op.post_process(tasks, q)
|
|
@@ -11,7 +11,8 @@ from emmet.api.routes.materials.tasks.utils import (
|
|
|
11
11
|
|
|
12
12
|
def test_calcs_reversed_to_trajectory():
|
|
13
13
|
with zopen(
|
|
14
|
-
os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mp_1031016.json.gz")
|
|
14
|
+
os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mp_1031016.json.gz"),
|
|
15
|
+
"rt",
|
|
15
16
|
) as file:
|
|
16
17
|
calcs_reversed = load(file)
|
|
17
18
|
trajectories = calcs_reversed_to_trajectory(calcs_reversed)
|
|
@@ -27,7 +28,9 @@ def test_calcs_reversed_to_trajectory():
|
|
|
27
28
|
|
|
28
29
|
|
|
29
30
|
def test_task_to_entry():
|
|
30
|
-
with zopen(
|
|
31
|
+
with zopen(
|
|
32
|
+
os.path.join(MAPISettings().TEST_FILES, "test_task.json.gz"), "rt"
|
|
33
|
+
) as file:
|
|
31
34
|
doc = load(file)
|
|
32
35
|
|
|
33
36
|
entry_dict = task_to_entry(doc)
|
|
@@ -8,7 +8,8 @@ from emmet.api.routes.molecules.tasks.utils import calcs_reversed_to_trajectory
|
|
|
8
8
|
|
|
9
9
|
def test_calcs_reversed_to_trajectory():
|
|
10
10
|
with zopen(
|
|
11
|
-
os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mpcule_36097.json.gz")
|
|
11
|
+
os.path.join(MAPISettings().TEST_FILES, "calcs_reversed_mpcule_36097.json.gz"),
|
|
12
|
+
"rt",
|
|
12
13
|
) as file:
|
|
13
14
|
calcs_reversed = load(file)
|
|
14
15
|
trajectories = calcs_reversed_to_trajectory(calcs_reversed)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_consumer/query_operator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/query_operator.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_general_store/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/_messages/query_operator.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/legacy/jcesr/query_operators.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/__init__.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/absorption/resources.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/__init__.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/query_operators.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/alloys/resources.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/__init__.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/query_operators.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/bonds/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/chemenv/resources.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/dielectric/resources.py
RENAMED
|
File without changes
|
{emmet_api-0.87.0.dev1 → emmet_api-0.87.0.dev2}/emmet/api/routes/materials/elasticity/__init__.py
RENAMED
|
File without changes
|
|
File without changes
|